From 9d1ed58ea1ffff7b5c48554c0a1d34561feedbe9 Mon Sep 17 00:00:00 2001 From: wandalen Date: Sat, 1 Jun 2024 08:37:50 +0300 Subject: [PATCH] major milestone --- .cargo/config.toml | 7 + .editorconfig | 9 + .gitattributes | 4 + .github/workflows/Readme.md | 133 ++ .github/workflows/appropriate_branch.yml | 58 + .github/workflows/appropriate_branch_beta.yml | 17 + .../workflows/appropriate_branch_master.yml | 18 + .github/workflows/auto_merge_to_beta.yml | 95 + .github/workflows/auto_pr.yml | 36 + .github/workflows/auto_pr_to_alpha.yml | 29 + .github/workflows/auto_pr_to_beta.yml | 17 + .github/workflows/auto_pr_to_master.yml | 17 + .github/workflows/for_pr_rust_push.yml | 72 + .github/workflows/module_cargo_will_push.yml | 23 + .../workflows/module_clone_dyn_meta_push.yml | 23 + .github/workflows/module_clone_dyn_push.yml | 23 + .../module_collection_tools_push.yml | 23 + .../workflows/module_crates_tools_push.yml | 23 + .github/workflows/module_data_type_push.yml | 23 + .../module_derive_tools_meta_push.yml | 23 + .../workflows/module_derive_tools_push.yml | 23 + .../module_deterministic_rand_push.yml | 23 + .../module_diagnostics_tools_push.yml | 23 + .github/workflows/module_error_tools_push.yml | 23 + .github/workflows/module_exe_tools_push.yml | 23 + .github/workflows/module_file_tools_push.yml | 23 + .github/workflows/module_for_each_push.yml | 23 + .github/workflows/module_former_meta_push.yml | 23 + .github/workflows/module_former_push.yml | 23 + .../workflows/module_former_types_push.yml | 23 + .github/workflows/module_fs_tools_push.yml | 23 + .../module_fundamental_data_type_push.yml | 23 + .../workflows/module_graphs_tools_push.yml | 23 + .github/workflows/module_image_tools_push.yml | 23 + .github/workflows/module_implements_push.yml | 23 + .../module_impls_index_meta_push.yml | 23 + .github/workflows/module_impls_index_push.yml | 23 + .github/workflows/module_include_md_push.yml | 23 + .../workflows/module_inspect_type_push.yml | 23 + .github/workflows/module_instance_of_push.yml | 23 + .../module_interval_adapter_push.yml | 23 + .github/workflows/module_is_slice_push.yml | 23 + .github/workflows/module_iter_tools_push.yml | 23 + .github/workflows/module_macro_tools_push.yml | 23 + .github/workflows/module_math_tools_push.yml | 23 + .github/workflows/module_mem_tools_push.yml | 23 + .github/workflows/module_meta_tools_push.yml | 23 + .../module_mod_interface_meta_push.yml | 23 + .../workflows/module_mod_interface_push.yml | 23 + .github/workflows/module_multilayer_push.yml | 23 + .../module_optimization_tools_push.yml | 23 + .../workflows/module_plot_interface_push.yml | 23 + .../module_proc_macro_tools_push.yml | 23 + .../workflows/module_process_tools_push.yml | 23 + .../workflows/module_program_tools_push.yml | 23 + .../module_proper_path_tools_push.yml | 23 + .../workflows/module_proper_tools_push.yml | 23 + .github/workflows/module_refiner_push.yml | 23 + .../module_reflect_tools_meta_push.yml | 23 + .../workflows/module_reflect_tools_push.yml | 23 + .github/workflows/module_rustql_push.yml | 23 + .github/workflows/module_sqlx_query_push.yml | 23 + .github/workflows/module_strs_tools_push.yml | 23 + .../module_test_experimental_a_push.yml | 23 + .../module_test_experimental_b_push.yml | 23 + .../module_test_experimental_c_push.yml | 23 + .github/workflows/module_test_tools_push.yml | 23 + .github/workflows/module_time_tools_push.yml | 23 + .../workflows/module_typing_tools_push.yml | 23 + .github/workflows/module_unitore_push.yml | 23 + .../workflows/module_variadic_from_push.yml | 23 + .github/workflows/module_w_4_d_push.yml | 23 + .github/workflows/module_wca_push.yml | 23 + .github/workflows/module_werror_push.yml | 23 + .github/workflows/module_willbe_2_push.yml | 23 + .github/workflows/module_willbe_old_push.yml | 23 + .github/workflows/module_willbe_push.yml | 23 + .github/workflows/module_winterval_push.yml | 23 + .github/workflows/module_wlang_push.yml | 23 + .github/workflows/module_wplot_push.yml | 23 + .github/workflows/module_wproc_macro_push.yml | 23 + .../workflows/module_wstring_tools_push.yml | 23 + .github/workflows/module_wtest_basic_push.yml | 23 + .github/workflows/module_wtest_push.yml | 23 + .github/workflows/module_wtools_push.yml | 23 + .github/workflows/runs_clean.yml | 38 + .../workflows/standard_rust_pull_request.yml | 51 + .github/workflows/standard_rust_push.yml | 157 ++ .github/workflows/standard_rust_scheduled.yml | 20 + .github/workflows/standard_rust_status.yml | 39 + .../workflows/status_checks_rules_update.yml | 77 + .gitignore | 32 + .gitpod.yml | 27 + Cargo.toml | 490 +++++ License | 23 + Makefile | 151 ++ Readme.md | 76 + asset/img/docsrs.svg | 1 + asset/img/graph_logo_v1_trans.ico | Bin 0 -> 179846 bytes asset/img/graph_logo_v1_trans.png | Bin 0 -> 6625 bytes asset/img/logo_edge_trans.png | Bin 0 -> 163918 bytes asset/img/logo_trans.png | Bin 0 -> 123626 bytes asset/img/logo_v2_light.png | Bin 0 -> 382946 bytes asset/img/logo_v2_trans.png | Bin 0 -> 527274 bytes asset/img/logo_v2_trans_rect.png | Bin 0 -> 464894 bytes asset/img/logo_v2_trans_rect_small.png | Bin 0 -> 62757 bytes asset/img/logo_v2_wide_trans.png | Bin 0 -> 549014 bytes asset/img/logo_v3_light.png | Bin 0 -> 262628 bytes asset/img/logo_v3_trans.png | Bin 0 -> 331673 bytes asset/img/logo_v3_trans_square.png | Bin 0 -> 59247 bytes asset/img/logo_v3_trans_square_icon_small.ico | Bin 0 -> 165662 bytes asset/img/logo_v3_trans_square_icon_small.png | Bin 0 -> 19578 bytes .../logo_v3_trans_square_icon_small_v2.ico | Bin 0 -> 165662 bytes .../logo_v3_trans_square_icon_small_v2.png | Bin 0 -> 20403 bytes asset/img/logo_v3_trans_wide.png | Bin 0 -> 348186 bytes asset/img/logo_white.png | Bin 0 -> 97184 bytes asset/test/file1 | Bin 0 -> 1024 bytes asset/test/file2 | Bin 0 -> 1024 bytes asset/test/file3 | Bin 0 -> 1024 bytes asset/test/file4.pdf | Bin 0 -> 1024 bytes asset/test/small | 1 + asset/test/small2 | 1 + asset/test/small3 | 1 + asset/test/small4 | 1 + asset/test/small5 | 1 + asset/test/small6 | 1 + asset/test/small7 | 1 + asset/test/test.exe | Bin 0 -> 52224 bytes bash.exe.stackdump | 38 + debug | 3 + doc/DevEnvForWindows.md | 25 + doc/Readme.md | 3 + doc/modules/wca | 1 + doc/rust/Cd.md | 34 + doc/rust/LibConventions.md | 274 +++ doc/rust/Readme.md | 4 + doc/rust/WhatStdIsMissing.md | 41 + module/alias/cargo_will/Cargo.toml | 45 + module/alias/cargo_will/License | 22 + module/alias/cargo_will/Readme.md | 35 + module/alias/cargo_will/src/bin/cargo-will.rs | 13 + module/alias/cargo_will/src/bin/will.rs | 16 + module/alias/cargo_will/src/bin/willbe.rs | 12 + module/alias/cargo_will/src/lib.rs | 9 + module/alias/cargo_will/tests/smoke_test.rs | 14 + module/alias/cargo_will/tests/willbe_tests.rs | 10 + module/alias/file_tools/Cargo.toml | 36 + module/alias/file_tools/License | 22 + module/alias/file_tools/Readme.md | 31 + module/alias/file_tools/src/lib.rs | 11 + module/alias/file_tools/tests/smoke_test.rs | 14 + module/alias/fundamental_data_type/Cargo.toml | 44 + module/alias/fundamental_data_type/License | 22 + module/alias/fundamental_data_type/Readme.md | 24 + module/alias/fundamental_data_type/src/lib.rs | 14 + .../fundamental_data_type/tests/smoke_test.rs | 14 + .../fundamental_data_type/tests/tests.rs | 8 + module/alias/instance_of/Cargo.toml | 62 + module/alias/instance_of/License | 23 + module/alias/instance_of/Readme.md | 42 + .../instance_of_trivial_sample/Cargo.toml | 8 + .../instance_of_trivial_sample/src/main.rs | 11 + .../instance_of/src/typing/implements_impl.rs | 36 + .../instance_of/src/typing/implements_lib.rs | 108 + .../src/typing/inspect_type_lib.rs | 104 + .../instance_of/src/typing/instance_of_lib.rs | 9 + .../instance_of/src/typing/is_slice_lib.rs | 111 ++ module/alias/instance_of/src/typing/mod.rs | 11 + module/alias/instance_of/src/typing/typing.rs | 60 + .../src/typing/typing_tools_lib.rs | 30 + .../instance_of/tests/instance_of_tests.rs | 2 + module/alias/instance_of/tests/smoke_test.rs | 14 + module/alias/multilayer/Cargo.toml | 61 + module/alias/multilayer/License | 23 + module/alias/multilayer/Readme.md | 29 + .../mod_interface/front/multilayer_lib.rs | 20 + .../multilayer/tests/multilayer_tests.rs | 4 + module/alias/multilayer/tests/smoke_test.rs | 14 + module/alias/proc_macro_tools/Cargo.toml | 41 + module/alias/proc_macro_tools/License | 22 + module/alias/proc_macro_tools/Readme.md | 33 + .../examples/proc_macro_tools_trivial.rs | 19 + module/alias/proc_macro_tools/src/lib.rs | 18 + .../tests/proc_macro_tool_tests.rs | 6 + .../proc_macro_tools/tests/smoke_test.rs | 14 + module/alias/proper_tools/Cargo.toml | 36 + module/alias/proper_tools/License | 22 + module/alias/proper_tools/Readme.md | 33 + module/alias/proper_tools/src/lib.rs | 11 + module/alias/proper_tools/tests/smoke_test.rs | 14 + module/alias/werror/Cargo.toml | 55 + module/alias/werror/License | 22 + module/alias/werror/Readme.md | 45 + .../werror/examples/werror_tools_trivial.rs | 21 + module/alias/werror/src/lib.rs | 17 + module/alias/werror/tests/smoke_test.rs | 14 + module/alias/werror/tests/werror_tests.rs | 8 + module/alias/willbe2/Cargo.toml | 38 + module/alias/willbe2/License | 22 + module/alias/willbe2/Readme.md | 33 + module/alias/willbe2/src/lib.rs | 11 + module/alias/willbe2/src/main.rs | 16 + module/alias/willbe2/tests/smoke_test.rs | 14 + module/alias/winterval/Cargo.toml | 40 + module/alias/winterval/License | 22 + module/alias/winterval/Readme.md | 101 + .../winterval/examples/winterval_more.rs | 30 + .../examples/winterval_non_iterable.rs | 21 + .../winterval/examples/winterval_trivial.rs | 26 + module/alias/winterval/src/lib.rs | 20 + .../alias/winterval/tests/interval_tests.rs | 7 + module/alias/winterval/tests/smoke_test.rs | 12 + module/alias/wproc_macro/Cargo.toml | 37 + module/alias/wproc_macro/License | 22 + module/alias/wproc_macro/Readme.md | 33 + module/alias/wproc_macro/src/lib.rs | 9 + module/alias/wproc_macro/tests/smoke_test.rs | 14 + .../wproc_macro/tests/wproc_macro_tests.rs | 3 + module/alias/wstring_tools/Cargo.toml | 79 + module/alias/wstring_tools/License | 22 + module/alias/wstring_tools/Readme.md | 51 + .../examples/wstring_toolst_trivial_sample.rs | 28 + module/alias/wstring_tools/src/lib.rs | 18 + .../alias/wstring_tools/tests/smoke_test.rs | 14 + .../tests/wstring_tools_tests.rs | 7 + module/alias/wtest/Cargo.toml | 49 + module/alias/wtest/License | 23 + module/alias/wtest/Readme.md | 58 + .../wtest/examples/wtest_trivial_sample.rs | 31 + module/alias/wtest/src/test/commands/init.rs | 26 + module/alias/wtest/src/test/commands/mod.rs | 13 + module/alias/wtest/src/test/commands/smoke.rs | 328 ++++ module/alias/wtest/src/test/lib.rs | 23 + module/alias/wtest/src/test/main.rs | 48 + module/alias/wtest/tests/smoke_test.rs | 15 + module/alias/wtest/tests/wtest_basic_tests.rs | 8 + module/alias/wtest_basic/Cargo.toml | 80 + module/alias/wtest_basic/License | 22 + module/alias/wtest_basic/Readme.md | 59 + .../wtest_basic_trivial_sample/Cargo.toml | 12 + .../wtest_basic_trivial_sample/Readme.md | 5 + .../wtest_basic_trivial_sample/src/main.rs | 4 + .../test/trivial_test.rs | 30 + .../alias/wtest_basic/src/_blank/empty_lib.rs | 0 .../wtest_basic/src/_blank/standard_lib.rs | 56 + .../wtest_basic/src/test/basic/helper.rs | 85 + .../alias/wtest_basic/src/test/basic/mod.rs | 16 + .../wtest_basic/src/test/wtest_basic_lib.rs | 85 + module/alias/wtest_basic/tests/smoke_test.rs | 15 + .../wtest_basic/tests/wtest_basic_tests.rs | 2 + module/blank/exe_tools/Cargo.toml | 36 + module/blank/exe_tools/License | 22 + module/blank/exe_tools/Readme.md | 35 + module/blank/exe_tools/src/lib.rs | 11 + .../blank/exe_tools/tests/inc/basic_test.rs | 7 + module/blank/exe_tools/tests/inc/mod.rs | 4 + module/blank/exe_tools/tests/smoke_test.rs | 14 + module/blank/exe_tools/tests/tests.rs | 10 + module/blank/image_tools/Cargo.toml | 36 + module/blank/image_tools/License | 22 + module/blank/image_tools/Readme.md | 33 + module/blank/image_tools/src/lib.rs | 11 + module/blank/image_tools/tests/smoke_test.rs | 14 + module/blank/math_tools/Cargo.toml | 36 + module/blank/math_tools/License | 22 + module/blank/math_tools/Readme.md | 34 + module/blank/math_tools/src/lib.rs | 6 + module/blank/math_tools/tests/smoke_test.rs | 14 + module/blank/rustql/Cargo.toml | 34 + module/blank/rustql/License | 22 + module/blank/rustql/Readme.md | 33 + module/blank/rustql/src/lib.rs | 11 + module/blank/rustql/tests/inc/basic_test.rs | 7 + module/blank/rustql/tests/inc/mod.rs | 4 + module/blank/rustql/tests/smoke_test.rs | 14 + module/blank/rustql/tests/tests.rs | 10 + module/blank/w4d/Cargo.toml | 36 + module/blank/w4d/License | 22 + module/blank/w4d/Readme.md | 34 + module/blank/w4d/src/lib.rs | 6 + module/blank/w4d/tests/smoke_test.rs | 14 + module/blank/willbe_old/Cargo.toml | 80 + module/blank/willbe_old/License | 22 + module/blank/willbe_old/Readme.md | 35 + .../src/willbe_old/commands/each.rs | 119 ++ .../willbe_old/src/willbe_old/commands/end.rs | 61 + .../src/willbe_old/commands/init.rs | 43 + .../willbe_old/src/willbe_old/commands/mod.rs | 66 + .../src/willbe_old/commands/package/info.rs | 80 + .../src/willbe_old/commands/package/mod.rs | 8 + .../willbe_old/commands/package/publish.rs | 66 + .../src/willbe_old/core/entities/mod.rs | 10 + .../core/entities/package/metadata.rs | 119 ++ .../willbe_old/core/entities/package/mod.rs | 10 + .../core/entities/package/package.rs | 53 + .../core/entities/package/verification.rs | 65 + .../src/willbe_old/core/entities/utility.rs | 124 ++ .../src/willbe_old/core/entities/workspace.rs | 95 + .../src/willbe_old/core/iterators.rs | 36 + .../willbe_old/src/willbe_old/core/mod.rs | 9 + .../blank/willbe_old/src/willbe_old/files.rs | 34 + .../willbe_old/src/willbe_old/willbe_entry.rs | 34 + .../willbe_old/src/willbe_old/willbe_lib.rs | 36 + module/blank/willbe_old/tests/smoke_test.rs | 15 + .../tests/willbe_old/_asset/empty/.gitignore | 4 + .../willbe_old/_asset/package/Cargo.toml | 9 + .../tests/willbe_old/_asset/package/License | 0 .../tests/willbe_old/_asset/package/Readme.md | 0 .../willbe_old/_asset/package/src/lib.rs | 15 + .../willbe_old/_asset/package/src/main.rs | 3 + .../_asset/package_no_verified/Cargo.toml | 8 + .../_asset/package_no_verified/src/lib.rs | 8 + .../_asset/package_no_verified/src/main.rs | 3 + .../_asset/workspace_with_deps/Cargo.toml | 8 + .../module/module1/Cargo.toml | 8 + .../module/module1/src/lib.rs | 14 + .../module/module2/Cargo.toml | 9 + .../module/module2/src/lib.rs | 14 + .../module/module3/Cargo.toml | 9 + .../module/module3/src/lib.rs | 14 + .../willbe_old/_asset/workspaces/Cargo.toml | 9 + .../_asset/workspaces/workspace1/Cargo.toml | 8 + .../workspace1/module/module1/Cargo.toml | 8 + .../workspace1/module/module1/src/lib.rs | 14 + .../workspace1/module/module2/Cargo.toml | 8 + .../workspace1/module/module2/src/lib.rs | 14 + .../_asset/workspaces/workspace2/Cargo.toml | 8 + .../workspace2/module/module3/Cargo.toml | 8 + .../workspace2/module/module3/src/lib.rs | 14 + .../workspace2/module/module4/Cargo.toml | 8 + .../workspace2/module/module4/src/lib.rs | 14 + .../workspace2/module/module5/Cargo.toml | 8 + .../workspace2/module/module5/src/lib.rs | 14 + .../willbe_old/tests/willbe_old/tests/from.rs | 38 + .../willbe_old/tests/integration/each.rs | 130 ++ .../willbe_old/tests/integration/info.rs | 78 + .../tests/willbe_old/tests/integration/mod.rs | 8 + .../tests/willbe_old/tests/iterator.rs | 149 ++ .../tests/willbe_old/tests/metadata.rs | 24 + .../willbe_old/tests/willbe_old/tests/mod.rs | 11 + .../tests/willbe_old/tests/ordering/mod.rs | 6 + .../tests/ordering/through_workspaces.rs | 74 + .../willbe_old/tests/ordering/workspace.rs | 103 + .../tests/willbe_old/tests/verification.rs | 26 + .../willbe_old/tests/willbe_old/utility.rs | 71 + .../tests/willbe_old/willbe_test.rs | 7 + module/blank/wlang/Cargo.toml | 43 + module/blank/wlang/License | 22 + module/blank/wlang/Readme.md | 30 + module/blank/wlang/src/empty_lib.rs | 0 module/blank/wlang/src/standard_lib.rs | 46 + module/blank/wlang/tests/smoke_test.rs | 15 + module/blank/wlang/tests/tests.rs | 0 module/core/clone_dyn/Cargo.toml | 40 + module/core/clone_dyn/License | 22 + module/core/clone_dyn/Readme.md | 49 + .../clone_dyn/examples/clone_dyn_trivial.rs | 24 + module/core/clone_dyn/src/lib.rs | 105 + module/core/clone_dyn/tests/inc/mod.rs | 160 ++ module/core/clone_dyn/tests/smoke_test.rs | 14 + module/core/clone_dyn/tests/tests.rs | 8 + module/core/clone_dyn_meta/Cargo.toml | 40 + module/core/clone_dyn_meta/License | 22 + module/core/clone_dyn_meta/Readme.md | 9 + module/core/clone_dyn_meta/src/derive.rs | 69 + module/core/clone_dyn_meta/src/lib.rs | 24 + .../core/clone_dyn_meta/tests/smoke_test.rs | 14 + module/core/collection_tools/Cargo.toml | 70 + module/core/collection_tools/License | 22 + module/core/collection_tools/Readme.md | 157 ++ .../examples/collection_tools_trivial.rs | 41 + .../core/collection_tools/src/collections.rs | 32 + .../collection_tools/src/collections/bmap.rs | 172 ++ .../collection_tools/src/collections/bset.rs | 158 ++ .../collection_tools/src/collections/heap.rs | 155 ++ .../collection_tools/src/collections/hmap.rs | 181 ++ .../collection_tools/src/collections/hset.rs | 182 ++ .../collection_tools/src/collections/list.rs | 173 ++ .../collection_tools/src/collections/vec.rs | 176 ++ .../collection_tools/src/collections/vecd.rs | 177 ++ module/core/collection_tools/src/lib.rs | 98 + .../core/collection_tools/tests/inc/bmap.rs | 94 + .../core/collection_tools/tests/inc/bset.rs | 93 + .../collection_tools/tests/inc/components.rs | 4 + .../core/collection_tools/tests/inc/heap.rs | 94 + .../core/collection_tools/tests/inc/hmap.rs | 120 ++ .../core/collection_tools/tests/inc/hset.rs | 100 + .../core/collection_tools/tests/inc/list.rs | 109 + module/core/collection_tools/tests/inc/mod.rs | 15 + module/core/collection_tools/tests/inc/vec.rs | 124 ++ .../core/collection_tools/tests/inc/vecd.rs | 108 + .../core/collection_tools/tests/smoke_test.rs | 14 + module/core/collection_tools/tests/tests.rs | 14 + module/core/data_type/Cargo.toml | 98 + module/core/data_type/License | 22 + module/core/data_type/Readme.md | 120 ++ .../data_type/examples/data_type_trivial.rs | 32 + module/core/data_type/src/dt.rs | 77 + module/core/data_type/src/lib.rs | 133 ++ .../core/data_type/tests/inc/either_test.rs | 21 + module/core/data_type/tests/inc/mod.rs | 14 + module/core/data_type/tests/smoke_test.rs | 14 + module/core/data_type/tests/tests.rs | 13 + module/core/derive_tools/Cargo.toml | 197 ++ module/core/derive_tools/License | 22 + module/core/derive_tools/Readme.md | 66 + module/core/derive_tools/build.rs | 44 + .../examples/derive_tools_trivial.rs | 43 + module/core/derive_tools/src/lib.rs | 313 +++ .../derive_tools/tests/inc/all_manual_test.rs | 68 + .../core/derive_tools/tests/inc/all_test.rs | 18 + .../tests/inc/as_mut_manual_test.rs | 17 + .../derive_tools/tests/inc/as_mut_test.rs | 9 + .../tests/inc/as_ref_manual_test.rs | 17 + .../derive_tools/tests/inc/as_ref_test.rs | 9 + .../core/derive_tools/tests/inc/basic_test.rs | 108 + .../tests/inc/deref/bounds_inlined.rs | 10 + .../tests/inc/deref/bounds_inlined_manual.rs | 17 + .../tests/inc/deref/bounds_mixed.rs | 12 + .../tests/inc/deref/bounds_mixed_manual.rs | 21 + .../tests/inc/deref/bounds_where.rs | 14 + .../tests/inc/deref/bounds_where_manual.rs | 24 + .../tests/inc/deref/enum_named.rs | 12 + .../tests/inc/deref/enum_named_empty.rs | 12 + .../inc/deref/enum_named_empty_manual.rs | 19 + .../tests/inc/deref/enum_named_manual.rs | 22 + .../tests/inc/deref/enum_tuple.rs | 12 + .../tests/inc/deref/enum_tuple_empty.rs | 12 + .../inc/deref/enum_tuple_empty_manual.rs | 19 + .../tests/inc/deref/enum_tuple_manual.rs | 22 + .../derive_tools/tests/inc/deref/enum_unit.rs | 12 + .../tests/inc/deref/enum_unit_manual.rs | 19 + .../tests/inc/deref/generics_constants.rs | 8 + .../inc/deref/generics_constants_default.rs | 8 + .../generics_constants_default_manual.rs | 15 + .../inc/deref/generics_constants_manual.rs | 15 + .../tests/inc/deref/generics_lifetimes.rs | 8 + .../inc/deref/generics_lifetimes_manual.rs | 15 + .../tests/inc/deref/generics_types.rs | 8 + .../tests/inc/deref/generics_types_default.rs | 8 + .../deref/generics_types_default_manual.rs | 15 + .../tests/inc/deref/generics_types_manual.rs | 15 + .../tests/inc/deref/name_collisions.rs | 23 + .../inc/deref/only_tests/bounds_inlined.rs | 8 + .../inc/deref/only_tests/bounds_mixed.rs | 8 + .../inc/deref/only_tests/bounds_where.rs | 8 + .../tests/inc/deref/only_tests/enum_named.rs | 8 + .../inc/deref/only_tests/enum_named_empty.rs | 8 + .../tests/inc/deref/only_tests/enum_tuple.rs | 8 + .../inc/deref/only_tests/enum_tuple_empty.rs | 8 + .../tests/inc/deref/only_tests/enum_unit.rs | 8 + .../deref/only_tests/generics_constants.rs | 8 + .../only_tests/generics_constants_default.rs | 8 + .../deref/only_tests/generics_lifetimes.rs | 8 + .../inc/deref/only_tests/generics_types.rs | 8 + .../only_tests/generics_types_default.rs | 8 + .../inc/deref/only_tests/name_collisions.rs | 8 + .../inc/deref/only_tests/struct_named.rs | 8 + .../deref/only_tests/struct_named_empty.rs | 8 + .../inc/deref/only_tests/struct_tuple.rs | 8 + .../deref/only_tests/struct_tuple_empty.rs | 8 + .../tests/inc/deref/only_tests/struct_unit.rs | 8 + .../tests/inc/deref/struct_named.rs | 12 + .../tests/inc/deref/struct_named_empty.rs | 8 + .../inc/deref/struct_named_empty_manual.rs | 15 + .../tests/inc/deref/struct_named_manual.rs | 19 + .../tests/inc/deref/struct_tuple.rs | 8 + .../tests/inc/deref/struct_tuple_empty.rs | 8 + .../inc/deref/struct_tuple_empty_manual.rs | 15 + .../tests/inc/deref/struct_tuple_manual.rs | 15 + .../tests/inc/deref/struct_unit.rs | 8 + .../tests/inc/deref/struct_unit_manual.rs | 15 + .../tests/inc/deref_manual_test.rs | 34 + .../tests/inc/deref_mut/bounds_inlined.rs | 10 + .../inc/deref_mut/bounds_inlined_manual.rs | 24 + .../tests/inc/deref_mut/bounds_mixed.rs | 12 + .../inc/deref_mut/bounds_mixed_manual.rs | 31 + .../tests/inc/deref_mut/bounds_where.rs | 14 + .../inc/deref_mut/bounds_where_manual.rs | 34 + .../tests/inc/deref_mut/enum_named.rs | 12 + .../tests/inc/deref_mut/enum_named_manual.rs | 32 + .../tests/inc/deref_mut/enum_tuple.rs | 12 + .../tests/inc/deref_mut/enum_tuple_manual.rs | 32 + .../tests/inc/deref_mut/generics_constants.rs | 8 + .../deref_mut/generics_constants_default.rs | 8 + .../generics_constants_default_manual.rs | 22 + .../deref_mut/generics_constants_manual.rs | 22 + .../tests/inc/deref_mut/generics_lifetimes.rs | 8 + .../deref_mut/generics_lifetimes_manual.rs | 22 + .../tests/inc/deref_mut/generics_types.rs | 8 + .../inc/deref_mut/generics_types_default.rs | 8 + .../generics_types_default_manual.rs | 22 + .../inc/deref_mut/generics_types_manual.rs | 22 + .../tests/inc/deref_mut/name_collisions.rs | 23 + .../deref_mut/only_tests/bounds_inlined.rs | 9 + .../inc/deref_mut/only_tests/bounds_mixed.rs | 9 + .../inc/deref_mut/only_tests/bounds_where.rs | 9 + .../inc/deref_mut/only_tests/enum_named.rs | 9 + .../inc/deref_mut/only_tests/enum_tuple.rs | 9 + .../only_tests/generics_constants.rs | 9 + .../only_tests/generics_constants_default.rs | 9 + .../only_tests/generics_lifetimes.rs | 9 + .../deref_mut/only_tests/generics_types.rs | 9 + .../only_tests/generics_types_default.rs | 9 + .../deref_mut/only_tests/name_collisions.rs | 9 + .../inc/deref_mut/only_tests/struct_named.rs | 9 + .../inc/deref_mut/only_tests/struct_tuple.rs | 9 + .../tests/inc/deref_mut/struct_named.rs | 12 + .../inc/deref_mut/struct_named_manual.rs | 26 + .../tests/inc/deref_mut/struct_tuple.rs | 8 + .../inc/deref_mut/struct_tuple_manual.rs | 22 + .../tests/inc/deref_mut_manual_test.rs | 53 + .../derive_tools/tests/inc/deref_mut_test.rs | 15 + .../core/derive_tools/tests/inc/deref_test.rs | 15 + .../tests/inc/from/manual_test.rs | 18 + .../tests/inc/from/multiple_manual_test.rs | 15 + .../inc/from/multiple_named_manual_test.rs | 19 + .../tests/inc/from/multiple_named_test.rs | 10 + .../tests/inc/from/multiple_test.rs | 6 + .../tests/inc/from/named_manual_test.rs | 18 + .../derive_tools/tests/inc/from/named_test.rs | 9 + .../tests/inc/from/only_test/basic.rs | 33 + .../tests/inc/from/only_test/multiple.rs | 7 + .../inc/from/only_test/multiple_named.rs | 7 + .../tests/inc/from/only_test/named.rs | 7 + .../tests/inc/from/only_test/unit.rs | 7 + .../tests/inc/from/only_test/variants.rs | 20 + .../inc/from/only_test/variants_duplicates.rs | 20 + .../inc/from/only_test/variants_generics.rs | 12 + .../core/derive_tools/tests/inc/from/test.rs | 10 + .../tests/inc/from/unit_manual_test.rs | 15 + .../derive_tools/tests/inc/from/unit_test.rs | 6 + .../tests/inc/from/variants_collisions.rs | 27 + .../tests/inc/from/variants_derive.rs | 18 + .../inc/from/variants_duplicates_all_off.rs | 45 + .../inc/from/variants_duplicates_some_off.rs | 25 + ...ariants_duplicates_some_off_default_off.rs | 27 + .../tests/inc/from/variants_generics.rs | 17 + .../tests/inc/from/variants_generics_where.rs | 19 + .../tests/inc/from/variants_manual.rs | 41 + .../tests/inc/inner_from/manual_test.rs | 18 + .../inc/inner_from/multiple_manual_test.rs | 15 + .../inner_from/multiple_named_manual_test.rs | 19 + .../inc/inner_from/multiple_named_test.rs | 10 + .../tests/inc/inner_from/multiple_test.rs | 6 + .../tests/inc/inner_from/named_manual_test.rs | 18 + .../tests/inc/inner_from/named_test.rs | 9 + .../tests/inc/inner_from/only_test/basic.rs | 12 + .../inc/inner_from/only_test/multiple.rs | 7 + .../inner_from/only_test/multiple_named.rs | 7 + .../tests/inc/inner_from/only_test/named.rs | 7 + .../tests/inc/inner_from/only_test/unit.rs | 8 + .../derive_tools/tests/inc/inner_from/test.rs | 9 + .../tests/inc/inner_from/unit_manual_test.rs | 16 + .../tests/inc/inner_from/unit_test.rs | 7 + module/core/derive_tools/tests/inc/mod.rs | 199 ++ .../derive_tools/tests/inc/only_test/all.rs | 54 + .../tests/inc/only_test/as_mut.rs | 13 + .../tests/inc/only_test/as_ref.rs | 12 + .../derive_tools/tests/inc/only_test/deref.rs | 26 + .../tests/inc/only_test/deref_mut.rs | 43 + module/core/derive_tools/tests/smoke_test.rs | 14 + module/core/derive_tools/tests/tests.rs | 9 + module/core/derive_tools_meta/Cargo.toml | 74 + module/core/derive_tools_meta/License | 22 + module/core/derive_tools_meta/Readme.md | 9 + module/core/derive_tools_meta/src/derive.rs | 28 + .../derive_tools_meta/src/derive/as_mut.rs | 31 + .../derive_tools_meta/src/derive/as_ref.rs | 33 + .../derive_tools_meta/src/derive/deref.rs | 546 ++++++ .../derive_tools_meta/src/derive/deref_mut.rs | 458 +++++ .../core/derive_tools_meta/src/derive/from.rs | 544 +++++ .../src/derive/from/field_attributes.rs | 252 +++ .../src/derive/from/item_attributes.rs | 201 ++ .../src/derive/inner_from.rs | 262 +++ .../core/derive_tools_meta/src/derive/new.rs | 403 ++++ .../src/derive/variadic_from.rs | 160 ++ module/core/derive_tools_meta/src/lib.rs | 509 +++++ .../derive_tools_meta/tests/smoke_test.rs | 12 + module/core/diagnostics_tools/Cargo.toml | 54 + module/core/diagnostics_tools/License | 22 + module/core/diagnostics_tools/Readme.md | 48 + .../examples/diagnostics_tools_trivial.rs | 20 + module/core/diagnostics_tools/src/diag/cta.rs | 84 + .../core/diagnostics_tools/src/diag/layout.rs | 128 ++ module/core/diagnostics_tools/src/diag/mod.rs | 83 + module/core/diagnostics_tools/src/diag/rta.rs | 289 +++ module/core/diagnostics_tools/src/lib.rs | 65 + .../tests/diagnostics_tests.rs | 15 + .../diagnostics_tools/tests/inc/cta_test.rs | 40 + .../tests/inc/layout_test.rs | 110 ++ .../core/diagnostics_tools/tests/inc/mod.rs | 7 + .../diagnostics_tools/tests/inc/rta_test.rs | 555 ++++++ .../inc/snipet/cta_mem_same_size_fail.rs | 9 + .../inc/snipet/cta_mem_same_size_fail.stderr | 9 + .../inc/snipet/cta_ptr_same_size_fail.rs | 9 + .../inc/snipet/cta_ptr_same_size_fail.stderr | 9 + .../tests/inc/snipet/cta_true_fail.rs | 6 + .../tests/inc/snipet/cta_true_fail.stderr | 8 + .../inc/snipet/cta_type_same_align_fail.rs | 8 + .../snipet/cta_type_same_align_fail.stderr | 10 + .../inc/snipet/cta_type_same_size_fail.rs | 7 + .../inc/snipet/cta_type_same_size_fail.stderr | 10 + .../tests/inc/snipet/rta_id.rs | 8 + .../tests/inc/snipet/rta_id_fail.rs | 8 + .../tests/inc/snipet/rta_id_fail.stderr | 11 + .../tests/inc/snipet/rta_not_id.rs | 8 + .../tests/inc/snipet/rta_not_id_fail.rs | 8 + .../tests/inc/snipet/rta_not_id_fail.stderr | 13 + .../diagnostics_tools/tests/smoke_test.rs | 14 + module/core/error_tools/Cargo.toml | 57 + module/core/error_tools/License | 22 + module/core/error_tools/Readme.md | 50 + .../examples/error_tools_trivial.rs | 21 + module/core/error_tools/src/assert.rs | 152 ++ module/core/error_tools/src/error.rs | 152 ++ module/core/error_tools/src/lib.rs | 105 + module/core/error_tools/src/result.rs | 43 + .../error_tools/tests/error_tools_tests.rs | 7 + .../core/error_tools/tests/inc/assert_test.rs | 92 + .../core/error_tools/tests/inc/basic_test.rs | 135 ++ .../error_tools/tests/inc/for_app_test.rs | 26 + module/core/error_tools/tests/inc/mod.rs | 6 + module/core/error_tools/tests/smoke_test.rs | 14 + module/core/for_each/Cargo.toml | 65 + module/core/for_each/License | 22 + module/core/for_each/Readme.md | 126 ++ .../examples/for_each_map_style_sample.rs | 20 + .../for_each/examples/for_each_trivial.rs | 14 + module/core/for_each/src/lib.rs | 517 +++++ module/core/for_each/tests/for_each_tests.rs | 6 + .../core/for_each/tests/inc/for_each_test.rs | 930 +++++++++ module/core/for_each/tests/inc/mod.rs | 4 + module/core/for_each/tests/smoke_test.rs | 14 + module/core/former/Cargo.toml | 72 + module/core/former/License | 23 + module/core/former/Readme.md | 1367 +++++++++++++ .../examples/former_collection_hashmap.rs | 29 + .../examples/former_collection_hashset.rs | 29 + .../examples/former_collection_vector.rs | 28 + .../former/examples/former_component_from.rs | 40 + .../examples/former_custom_collection.rs | 280 +++ .../former/examples/former_custom_defaults.rs | 56 + .../examples/former_custom_definition.rs | 72 + .../former/examples/former_custom_mutator.rs | 76 + .../examples/former_custom_scalar_setter.rs | 92 + .../former/examples/former_custom_setter.rs | 45 + .../former_custom_setter_overriden.rs | 51 + .../former_custom_subform_collection.rs | 95 + .../examples/former_custom_subform_entry.rs | 106 + .../examples/former_custom_subform_entry2.rs | 162 ++ .../examples/former_custom_subform_scalar.rs | 88 + module/core/former/examples/former_debug.rs | 39 + .../former/examples/former_many_fields.rs | 70 + module/core/former/examples/former_trivial.rs | 52 + .../former/examples/former_trivial_expaned.rs | 408 ++++ module/core/former/src/lib.rs | 119 ++ module/core/former/tests/experimental.rs | 10 + .../components_component_from_debug.rs | 18 + .../inc/components_tests/component_assign.rs | 17 + .../component_assign_manual.rs | 36 + .../inc/components_tests/component_from.rs | 20 + .../components_tests/component_from_manual.rs | 45 + .../inc/components_tests/components_assign.rs | 76 + .../components_assign_manual.rs | 195 ++ .../tests/inc/components_tests/composite.rs | 75 + .../inc/components_tests/composite_manual.rs | 212 ++ .../inc/components_tests/from_components.rs | 75 + .../from_components_manual.rs | 75 + .../only_test/component_assign.rs | 12 + .../only_test/component_from.rs | 18 + .../only_test/components_assign.rs | 64 + .../components_tests/only_test/composite.rs | 115 ++ .../only_test/from_components.rs | 15 + .../former/tests/inc/former_tests/a_basic.rs | 18 + .../tests/inc/former_tests/a_basic_manual.rs | 325 +++ .../tests/inc/former_tests/a_primitives.rs | 21 + .../inc/former_tests/a_primitives_manual.rs | 321 +++ .../tests/inc/former_tests/attribute_alias.rs | 51 + .../attribute_default_collection.rs | 52 + .../attribute_default_conflict.rs | 32 + .../attribute_default_primitive.rs | 51 + .../inc/former_tests/attribute_feature.rs | 43 + .../inc/former_tests/attribute_multiple.rs | 34 + .../inc/former_tests/attribute_perform.rs | 70 + .../inc/former_tests/attribute_setter.rs | 68 + .../attribute_storage_with_end.rs | 96 + .../attribute_storage_with_mutator.rs | 51 + .../collection_former_binary_heap.rs | 207 ++ .../collection_former_btree_map.rs | 221 +++ .../collection_former_btree_set.rs | 199 ++ .../former_tests/collection_former_common.rs | 301 +++ .../former_tests/collection_former_hashmap.rs | 221 +++ .../former_tests/collection_former_hashset.rs | 201 ++ .../collection_former_linked_list.rs | 203 ++ .../inc/former_tests/collection_former_vec.rs | 205 ++ .../collection_former_vec_deque.rs | 205 ++ .../compiletime/field_attr_bad.rs | 11 + .../compiletime/field_attr_bad.stderr | 11 + .../compiletime/hashmap_without_parameter.rs | 16 + .../compiletime/struct_attr_bad.rs | 11 + .../compiletime/struct_attr_bad.stderr | 12 + .../compiletime/vector_without_parameter.rs | 16 + .../inc/former_tests/default_user_type.rs | 40 + .../former_tests/name_collision_context.rs | 19 + .../inc/former_tests/name_collision_core.rs | 19 + .../inc/former_tests/name_collision_end.rs | 24 + ...lision_former_hashmap_without_parameter.rs | 44 + ...llision_former_vector_without_parameter.rs | 44 + .../inc/former_tests/name_collision_on_end.rs | 18 + .../tests/inc/former_tests/name_collisions.rs | 44 + .../tests/inc/former_tests/only_test/basic.rs | 562 ++++++ .../only_test/collections_with_subformer.rs | 365 ++++ .../collections_without_subformer.rs | 161 ++ .../only_test/parametrized_field.rs | 8 + .../only_test/parametrized_struct.rs | 69 + .../inc/former_tests/only_test/primitives.rs | 241 +++ .../former_tests/only_test/scalar_children.rs | 23 + .../only_test/scalar_children3.rs | 23 + .../former_tests/only_test/string_slice.rs | 101 + .../former_tests/only_test/subform_basic.rs | 169 ++ .../only_test/subform_collection.rs | 21 + .../only_test/subform_collection_children2.rs | 21 + .../only_test/subform_entry_child.rs | 38 + .../only_test/subform_entry_children2.rs | 19 + .../former_tests/only_test/subform_scalar.rs | 13 + .../inc/former_tests/parametrized_field.rs | 20 + .../former_tests/parametrized_field_where.rs | 22 + .../inc/former_tests/parametrized_slice.rs | 15 + .../former_tests/parametrized_slice_manual.rs | 268 +++ .../former_tests/parametrized_struct_imm.rs | 39 + .../parametrized_struct_manual.rs | 371 ++++ .../former_tests/parametrized_struct_where.rs | 41 + .../tests/inc/former_tests/subform_all.rs | 56 + .../former_tests/subform_all_parametrized.rs | 134 ++ .../inc/former_tests/subform_all_private.rs | 56 + .../inc/former_tests/subform_collection.rs | 27 + .../former_tests/subform_collection_basic.rs | 26 + .../subform_collection_basic_manual.rs | 670 +++++++ .../subform_collection_basic_scalar.rs | 23 + .../former_tests/subform_collection_custom.rs | 264 +++ .../subform_collection_implicit.rs | 29 + .../former_tests/subform_collection_manual.rs | 109 + .../former_tests/subform_collection_named.rs | 43 + .../subform_collection_playground.rs | 112 ++ .../subform_collection_setter_off.rs | 51 + .../subform_collection_setter_on.rs | 45 + .../tests/inc/former_tests/subform_entry.rs | 49 + .../inc/former_tests/subform_entry_hashmap.rs | 57 + .../subform_entry_hashmap_custom.rs | 178 ++ .../inc/former_tests/subform_entry_manual.rs | 202 ++ .../inc/former_tests/subform_entry_named.rs | 62 + .../subform_entry_named_manual.rs | 72 + .../former_tests/subform_entry_setter_off.rs | 49 + .../former_tests/subform_entry_setter_on.rs | 44 + .../tests/inc/former_tests/subform_scalar.rs | 28 + .../inc/former_tests/subform_scalar_manual.rs | 140 ++ .../inc/former_tests/subform_scalar_name.rs | 73 + .../tests/inc/former_tests/tuple_struct.rs | 37 + .../former_tests/unsigned_primitive_types.rs | 146 ++ .../inc/former_tests/user_type_no_debug.rs | 60 + .../inc/former_tests/user_type_no_default.rs | 84 + .../tests/inc/former_tests/visibility.rs | 25 + module/core/former/tests/inc/mod.rs | 224 +++ module/core/former/tests/smoke_test.rs | 14 + module/core/former/tests/tests.rs | 10 + module/core/former_meta/Cargo.toml | 69 + module/core/former_meta/License | 23 + module/core/former_meta/Readme.md | 16 + .../src/component/component_assign.rs | 80 + .../src/component/component_from.rs | 78 + .../src/component/components_assign.rs | 151 ++ .../src/component/from_components.rs | 140 ++ module/core/former_meta/src/derive_former.rs | 781 ++++++++ .../former_meta/src/derive_former/field.rs | 1585 +++++++++++++++ .../src/derive_former/field_attrs.rs | 1033 ++++++++++ .../src/derive_former/struct_attrs.rs | 483 +++++ module/core/former_meta/src/lib.rs | 616 ++++++ module/core/former_meta/tests/smoke_test.rs | 14 + module/core/former_types/Cargo.toml | 56 + module/core/former_types/License | 23 + module/core/former_types/Readme.md | 70 + .../examples/former_types_trivial.rs | 68 + module/core/former_types/src/axiomatic.rs | 0 module/core/former_types/src/collection.rs | 579 ++++++ .../src/collection/binary_heap.rs | 255 +++ .../former_types/src/collection/btree_map.rs | 252 +++ .../former_types/src/collection/btree_set.rs | 243 +++ .../former_types/src/collection/hash_map.rs | 252 +++ .../former_types/src/collection/hash_set.rs | 278 +++ .../src/collection/linked_list.rs | 234 +++ .../former_types/src/collection/vector.rs | 234 +++ .../src/collection/vector_deque.rs | 234 +++ module/core/former_types/src/component.rs | 198 ++ module/core/former_types/src/definition.rs | 100 + module/core/former_types/src/forming.rs | 286 +++ module/core/former_types/src/lib.rs | 101 + module/core/former_types/src/storage.rs | 49 + module/core/former_types/tests/inc/mod.rs | 51 + module/core/former_types/tests/smoke_test.rs | 14 + module/core/former_types/tests/tests.rs | 12 + module/core/fs_tools/Cargo.toml | 40 + module/core/fs_tools/License | 23 + module/core/fs_tools/Readme.md | 33 + module/core/fs_tools/src/fs/fs.rs | 87 + module/core/fs_tools/src/fs/lib.rs | 57 + module/core/fs_tools/tests/inc/basic_test.rs | 7 + module/core/fs_tools/tests/inc/mod.rs | 4 + module/core/fs_tools/tests/smoke_test.rs | 14 + module/core/fs_tools/tests/tests.rs | 10 + module/core/implements/Cargo.toml | 39 + module/core/implements/License | 23 + module/core/implements/Readme.md | 39 + .../implements/examples/implements_trivial.rs | 10 + module/core/implements/src/implements_impl.rs | 36 + module/core/implements/src/lib.rs | 115 ++ .../core/implements/tests/implements_tests.rs | 10 + .../implements/tests/inc/implements_test.rs | 223 +++ module/core/implements/tests/inc/mod.rs | 4 + module/core/implements/tests/smoke_test.rs | 14 + module/core/impls_index/Cargo.toml | 39 + module/core/impls_index/License | 22 + module/core/impls_index/Readme.md | 50 + .../examples/impls_index_trivial.rs | 22 + .../core/impls_index/src/impls_index/func.rs | 259 +++ .../core/impls_index/src/impls_index/impls.rs | 409 ++++ .../core/impls_index/src/impls_index/mod.rs | 71 + module/core/impls_index/src/lib.rs | 64 + module/core/impls_index/tests/experiment.rs | 10 + .../core/impls_index/tests/inc/func_test.rs | 362 ++++ .../core/impls_index/tests/inc/impls1_test.rs | 120 ++ .../core/impls_index/tests/inc/impls2_test.rs | 121 ++ .../core/impls_index/tests/inc/impls3_test.rs | 119 ++ .../impls_index/tests/inc/impls_basic_test.rs | 51 + .../core/impls_index/tests/inc/index_test.rs | 155 ++ module/core/impls_index/tests/inc/mod.rs | 36 + .../impls_index/tests/inc/tests_index_test.rs | 155 ++ module/core/impls_index/tests/smoke_test.rs | 14 + module/core/impls_index/tests/tests.rs | 9 + module/core/impls_index_meta/Cargo.toml | 39 + module/core/impls_index_meta/License | 23 + module/core/impls_index_meta/Readme.md | 18 + module/core/impls_index_meta/src/impls.rs | 130 ++ module/core/impls_index_meta/src/lib.rs | 25 + module/core/include_md/Cargo.toml | 61 + module/core/include_md/License | 22 + module/core/include_md/Readme.md | 32 + .../core/include_md/src/_blank/empty_lib.rs | 0 .../include_md/src/_blank/standard_lib.rs | 53 + module/core/include_md/tests/smoke_test.rs | 14 + module/core/inspect_type/Cargo.toml | 43 + module/core/inspect_type/License | 22 + module/core/inspect_type/Readme.md | 40 + module/core/inspect_type/build.rs | 31 + .../examples/inspect_type_trivial.rs | 42 + module/core/inspect_type/src/lib.rs | 118 ++ .../tests/inc/inspect_type_test.rs | 51 + module/core/inspect_type/tests/inc/mod.rs | 4 + module/core/inspect_type/tests/smoke_test.rs | 14 + module/core/inspect_type/tests/tests.rs | 18 + module/core/interval_adapter/Cargo.toml | 39 + module/core/interval_adapter/License | 22 + module/core/interval_adapter/Readme.md | 101 + .../examples/interval_adapter_more.rs | 29 + .../examples/interval_adapter_non_iterable.rs | 20 + .../examples/interval_adapter_trivial.rs | 25 + module/core/interval_adapter/src/lib.rs | 651 ++++++ module/core/interval_adapter/tests/inc/mod.rs | 248 +++ .../interval_adapter/tests/interval_tests.rs | 6 + .../core/interval_adapter/tests/smoke_test.rs | 12 + module/core/is_slice/Cargo.toml | 39 + module/core/is_slice/License | 23 + module/core/is_slice/Readme.md | 38 + .../is_slice/examples/is_slice_trivial.rs | 15 + module/core/is_slice/src/lib.rs | 127 ++ .../core/is_slice/tests/inc/is_slice_test.rs | 34 + module/core/is_slice/tests/inc/mod.rs | 4 + module/core/is_slice/tests/is_slice_tests.rs | 11 + module/core/is_slice/tests/smoke_test.rs | 14 + module/core/iter_tools/Cargo.toml | 41 + module/core/iter_tools/License | 22 + module/core/iter_tools/Readme.md | 62 + .../iter_tools/examples/iter_tools_trivial.rs | 35 + module/core/iter_tools/src/iter.rs | 168 ++ module/core/iter_tools/src/lib.rs | 71 + .../core/iter_tools/tests/inc/basic_test.rs | 21 + module/core/iter_tools/tests/inc/mod.rs | 4 + module/core/iter_tools/tests/smoke_test.rs | 14 + module/core/iter_tools/tests/tests.rs | 6 + module/core/macro_tools/Cargo.toml | 50 + module/core/macro_tools/License | 22 + module/core/macro_tools/Readme.md | 360 ++++ .../examples/macro_tools_attr_prop.rs | 290 +++ .../examples/macro_tools_trivial.rs | 39 + module/core/macro_tools/src/attr.rs | 477 +++++ module/core/macro_tools/src/attr_prop.rs | 168 ++ .../core/macro_tools/src/attr_prop/boolean.rs | 196 ++ .../src/attr_prop/boolean_optional.rs | 117 ++ .../macro_tools/src/attr_prop/singletone.rs | 108 + .../src/attr_prop/singletone_optional.rs | 139 ++ module/core/macro_tools/src/attr_prop/syn.rs | 115 ++ .../macro_tools/src/attr_prop/syn_optional.rs | 160 ++ module/core/macro_tools/src/container_kind.rs | 142 ++ module/core/macro_tools/src/derive.rs | 104 + module/core/macro_tools/src/diag.rs | 445 +++++ module/core/macro_tools/src/drop.rs | 96 + module/core/macro_tools/src/equation.rs | 160 ++ module/core/macro_tools/src/generic_args.rs | 195 ++ module/core/macro_tools/src/generic_params.rs | 553 ++++++ module/core/macro_tools/src/item.rs | 136 ++ module/core/macro_tools/src/item_struct.rs | 117 ++ module/core/macro_tools/src/iter.rs | 126 ++ module/core/macro_tools/src/lib.rs | 239 +++ module/core/macro_tools/src/name.rs | 262 +++ module/core/macro_tools/src/phantom.rs | 233 +++ module/core/macro_tools/src/punctuated.rs | 69 + module/core/macro_tools/src/quantifier.rs | 348 ++++ module/core/macro_tools/src/struct_like.rs | 467 +++++ module/core/macro_tools/src/tokens.rs | 115 ++ module/core/macro_tools/src/typ.rs | 200 ++ .../macro_tools/tests/inc/attr_prop_test.rs | 113 ++ .../core/macro_tools/tests/inc/attr_test.rs | 76 + .../core/macro_tools/tests/inc/basic_test.rs | 14 + .../tests/inc/container_kind_test.rs | 160 ++ .../core/macro_tools/tests/inc/derive_test.rs | 72 + .../core/macro_tools/tests/inc/diag_test.rs | 133 ++ .../core/macro_tools/tests/inc/drop_test.rs | 23 + .../macro_tools/tests/inc/equation_test.rs | 108 + .../tests/inc/generic_args_test.rs | 356 ++++ .../tests/inc/generic_params_test.rs | 353 ++++ .../macro_tools/tests/inc/item_struct_test.rs | 202 ++ .../core/macro_tools/tests/inc/item_test.rs | 118 ++ module/core/macro_tools/tests/inc/mod.rs | 36 + .../macro_tools/tests/inc/phantom_test.rs | 298 +++ .../macro_tools/tests/inc/quantifier_test.rs | 158 ++ .../macro_tools/tests/inc/struct_like_test.rs | 432 ++++ .../core/macro_tools/tests/inc/syntax_test.rs | 83 + .../core/macro_tools/tests/inc/tokens_test.rs | 18 + module/core/macro_tools/tests/inc/typ_Test.rs | 195 ++ module/core/macro_tools/tests/smoke_test.rs | 14 + module/core/macro_tools/tests/tests.rs | 6 + module/core/mem_tools/Cargo.toml | 50 + module/core/mem_tools/License | 22 + module/core/mem_tools/Readme.md | 59 + .../mem_tools/examples/mem_tools_trivial.rs | 24 + module/core/mem_tools/src/lib.rs | 71 + module/core/mem_tools/src/mem.rs | 108 + module/core/mem_tools/tests/inc/mem_test.rs | 120 ++ module/core/mem_tools/tests/inc/mod.rs | 4 + .../core/mem_tools/tests/mem_tools_tests.rs | 12 + module/core/mem_tools/tests/smoke_test.rs | 14 + module/core/meta_tools/Cargo.toml | 70 + module/core/meta_tools/License | 22 + module/core/meta_tools/Readme.md | 58 + .../meta_tools/examples/meta_tools_trivial.rs | 10 + module/core/meta_tools/src/lib.rs | 41 + module/core/meta_tools/src/meta.rs | 40 + .../tests/inc/indents_concat_test.rs | 42 + .../tests/inc/meta_constructor_test.rs | 50 + module/core/meta_tools/tests/inc/mod.rs | 20 + .../core/meta_tools/tests/meta_tools_tests.rs | 19 + module/core/meta_tools/tests/smoke_test.rs | 14 + module/core/mod_interface/Cargo.toml | 49 + module/core/mod_interface/License | 23 + module/core/mod_interface/Readme.md | 166 ++ .../examples/mod_interface_debug/Cargo.toml | 8 + .../examples/mod_interface_debug/Readme.md | 13 + .../examples/mod_interface_debug/src/inner.rs | 15 + .../examples/mod_interface_debug/src/main.rs | 18 + .../examples/mod_interface_trivial/Cargo.toml | 8 + .../examples/mod_interface_trivial/Readme.md | 11 + .../mod_interface_trivial/src/inner.rs | 15 + .../mod_interface_trivial/src/main.rs | 21 + module/core/mod_interface/src/lib.rs | 60 + .../tests/inc/derive/attr_debug/layer_a.rs | 58 + .../tests/inc/derive/attr_debug/mod.rs | 15 + .../tests/inc/derive/attr_debug/trybuild.rs | 18 + .../inc/derive/attr_debug/trybuild.stderr | 7 + .../tests/inc/derive/layer/layer_a.rs | 58 + .../tests/inc/derive/layer/layer_b.rs | 58 + .../tests/inc/derive/layer/mod.rs | 21 + .../tests/inc/derive/layer/trybuild.rs | 18 + .../tests/inc/derive/layer_bad_vis/layer_a.rs | 58 + .../tests/inc/derive/layer_bad_vis/mod.rs | 10 + .../inc/derive/layer_bad_vis/trybuild.rs | 18 + .../inc/derive/layer_bad_vis/trybuild.stderr | 7 + .../inc/derive/layer_have_layer/layer_a.rs | 52 + .../inc/derive/layer_have_layer/layer_b.rs | 50 + .../tests/inc/derive/layer_have_layer/mod.rs | 26 + .../inc/derive/layer_have_layer/trybuild.rs | 18 + .../derive/layer_have_layer_cfg/layer_a.rs | 52 + .../derive/layer_have_layer_cfg/layer_b.rs | 50 + .../inc/derive/layer_have_layer_cfg/mod.rs | 32 + .../derive/layer_have_layer_cfg/trybuild.rs | 18 + .../layer_have_layer_separate_use/layer_a.rs | 44 + .../layer_have_layer_separate_use/layer_b.rs | 50 + .../layer_have_layer_separate_use/mod.rs | 31 + .../layer_have_layer_separate_use/trybuild.rs | 18 + .../layer_a.rs | 44 + .../layer_b.rs | 50 + .../layer_have_layer_separate_use_two/mod.rs | 47 + .../trybuild.rs | 18 + .../inc/derive/layer_have_mod_cfg/mod.rs | 30 + .../inc/derive/layer_have_mod_cfg/mod_a.rs | 5 + .../inc/derive/layer_have_mod_cfg/mod_b.rs | 5 + .../inc/derive/layer_have_mod_cfg/trybuild.rs | 18 + .../inc/derive/layer_unknown_vis/layer_a.rs | 58 + .../tests/inc/derive/layer_unknown_vis/mod.rs | 10 + .../inc/derive/layer_unknown_vis/trybuild.rs | 18 + .../derive/layer_unknown_vis/trybuild.stderr | 5 + .../tests/inc/derive/layer_use_cfg/layer_a.rs | 52 + .../tests/inc/derive/layer_use_cfg/layer_b.rs | 50 + .../tests/inc/derive/layer_use_cfg/mod.rs | 36 + .../inc/derive/layer_use_cfg/trybuild.rs | 18 + .../inc/derive/layer_use_macro/layer_a.rs | 45 + .../tests/inc/derive/layer_use_macro/mod.rs | 25 + .../inc/derive/layer_use_macro/trybuild.rs | 18 + .../tests/inc/derive/micro_modules/mod.rs | 25 + .../inc/derive/micro_modules/mod_exposed.rs | 5 + .../inc/derive/micro_modules/mod_orphan.rs | 5 + .../inc/derive/micro_modules/mod_prelude.rs | 5 + .../inc/derive/micro_modules/mod_protected.rs | 5 + .../inc/derive/micro_modules/trybuild.rs | 18 + .../inc/derive/micro_modules_bad_vis/mod.rs | 10 + .../micro_modules_bad_vis/mod_exposed.rs | 5 + .../derive/micro_modules_bad_vis/trybuild.rs | 18 + .../micro_modules_bad_vis/trybuild.stderr | 7 + .../tests/inc/derive/micro_modules_two/mod.rs | 33 + .../derive/micro_modules_two/mod_exposed1.rs | 5 + .../derive/micro_modules_two/mod_exposed2.rs | 5 + .../derive/micro_modules_two/mod_orphan1.rs | 5 + .../derive/micro_modules_two/mod_orphan2.rs | 5 + .../derive/micro_modules_two/mod_prelude1.rs | 5 + .../derive/micro_modules_two/mod_prelude2.rs | 5 + .../micro_modules_two/mod_protected1.rs | 5 + .../micro_modules_two/mod_protected2.rs | 5 + .../inc/derive/micro_modules_two/trybuild.rs | 18 + .../derive/micro_modules_two_joined/mod.rs | 44 + .../micro_modules_two_joined/mod_exposed1.rs | 5 + .../micro_modules_two_joined/mod_exposed2.rs | 5 + .../micro_modules_two_joined/mod_orphan1.rs | 5 + .../micro_modules_two_joined/mod_orphan2.rs | 5 + .../micro_modules_two_joined/mod_prelude1.rs | 5 + .../micro_modules_two_joined/mod_prelude2.rs | 5 + .../mod_protected1.rs | 5 + .../mod_protected2.rs | 5 + .../micro_modules_two_joined/trybuild.rs | 18 + .../derive/micro_modules_unknown_vis/mod.rs | 10 + .../micro_modules_unknown_vis/mod_exposed.rs | 5 + .../micro_modules_unknown_vis/trybuild.rs | 18 + .../micro_modules_unknown_vis/trybuild.stderr | 5 + .../tests/inc/derive/use_as/derive.rs | 24 + .../tests/inc/derive/use_as/layer_x.rs | 58 + .../tests/inc/derive/use_as/layer_y.rs | 58 + .../tests/inc/derive/use_as/manual.rs | 19 + .../tests/inc/derive/use_as/manual_only.rs | 53 + .../tests/inc/derive/use_as/trybuild.rs | 18 + .../tests/inc/derive/use_bad_vis/mod.rs | 18 + .../tests/inc/derive/use_bad_vis/trybuild.rs | 18 + .../inc/derive/use_bad_vis/trybuild.stderr | 7 + .../tests/inc/derive/use_basic/layer_a.rs | 58 + .../tests/inc/derive/use_basic/layer_b.rs | 58 + .../tests/inc/derive/use_basic/mod.rs | 20 + .../tests/inc/derive/use_basic/trybuild.rs | 18 + .../tests/inc/derive/use_layer/layer_a.rs | 47 + .../tests/inc/derive/use_layer/mod.rs | 32 + .../tests/inc/derive/use_layer/trybuild.rs | 24 + .../tests/inc/derive/use_unknown_vis/mod.rs | 18 + .../inc/derive/use_unknown_vis/trybuild.rs | 18 + .../derive/use_unknown_vis/trybuild.stderr | 5 + .../tests/inc/manual/layer/layer_a.rs | 58 + .../tests/inc/manual/layer/layer_b.rs | 58 + .../tests/inc/manual/layer/mod.rs | 67 + .../tests/inc/manual/layer_use/layer_a.rs | 75 + .../tests/inc/manual/layer_use/layer_b.rs | 75 + .../tests/inc/manual/layer_use/mod.rs | 67 + .../tests/inc/manual/micro_modules/mod.rs | 53 + .../inc/manual/micro_modules/mod_exposed.rs | 5 + .../inc/manual/micro_modules/mod_orphan.rs | 5 + .../inc/manual/micro_modules/mod_prelude.rs | 5 + .../inc/manual/micro_modules/mod_protected.rs | 5 + .../tests/inc/manual/micro_modules_two/mod.rs | 62 + .../manual/micro_modules_two/mod_exposed1.rs | 5 + .../manual/micro_modules_two/mod_exposed2.rs | 5 + .../manual/micro_modules_two/mod_orphan1.rs | 5 + .../manual/micro_modules_two/mod_orphan2.rs | 5 + .../manual/micro_modules_two/mod_prelude1.rs | 5 + .../manual/micro_modules_two/mod_prelude2.rs | 5 + .../micro_modules_two/mod_protected1.rs | 5 + .../micro_modules_two/mod_protected2.rs | 5 + module/core/mod_interface/tests/inc/mod.rs | 48 + .../only_test/layer_have_mod_cfg_test_only.rs | 18 + .../inc/only_test/layer_simple_only_test.rs | 90 + .../inc/only_test/layer_single_only_test.rs | 66 + .../inc/only_test/micro_modules_only_test.rs | 58 + .../only_test/micro_modules_two_only_test.rs | 83 + .../inc/only_test/use_non_layer_only_test.rs | 85 + .../mod_interface/tests/inc/trybuild_test.rs | 97 + module/core/mod_interface/tests/smoke_test.rs | 14 + module/core/mod_interface/tests/tests.rs | 15 + module/core/mod_interface_meta/Cargo.toml | 49 + module/core/mod_interface_meta/License | 23 + module/core/mod_interface_meta/Readme.md | 11 + module/core/mod_interface_meta/src/impls.rs | 513 +++++ module/core/mod_interface_meta/src/lib.rs | 92 + module/core/mod_interface_meta/src/record.rs | 297 +++ .../core/mod_interface_meta/src/use_tree.rs | 243 +++ .../core/mod_interface_meta/src/visibility.rs | 561 ++++++ .../mod_interface_meta/tests/smoke_test.rs | 14 + module/core/process_tools/Cargo.toml | 55 + module/core/process_tools/License | 22 + module/core/process_tools/Readme.md | 33 + module/core/process_tools/src/environment.rs | 54 + module/core/process_tools/src/lib.rs | 22 + module/core/process_tools/src/process.rs | 331 ++++ .../tests/asset/err_out_test/err_out_err.rs | 8 + .../tests/asset/err_out_test/out_err_out.rs | 9 + module/core/process_tools/tests/inc/basic.rs | 7 + .../tests/inc/environment_is_cicd.rs | 86 + module/core/process_tools/tests/inc/mod.rs | 8 + .../process_tools/tests/inc/process_run.rs | 69 + module/core/process_tools/tests/smoke_test.rs | 14 + module/core/process_tools/tests/tests.rs | 10 + module/core/process_tools/tests/tool/asset.rs | 140 ++ module/core/program_tools/Cargo.toml | 57 + module/core/program_tools/License | 22 + module/core/program_tools/Readme.md | 33 + module/core/program_tools/src/lib.rs | 24 + module/core/program_tools/src/program.rs | 158 ++ .../tests/asset/err_out_test/err_out_err.rs | 8 + .../tests/asset/err_out_test/out_err_out.rs | 9 + module/core/program_tools/tests/inc/basic.rs | 16 + module/core/program_tools/tests/inc/mod.rs | 4 + module/core/program_tools/tests/smoke_test.rs | 14 + module/core/program_tools/tests/tests.rs | 11 + module/core/program_tools/tests/tool/asset.rs | 140 ++ module/core/proper_path_tools/Cargo.toml | 42 + module/core/proper_path_tools/License | 22 + module/core/proper_path_tools/Readme.md | 35 + module/core/proper_path_tools/src/lib.rs | 21 + module/core/proper_path_tools/src/path.rs | 1061 ++++++++++ .../src/path/absolute_path.rs | 128 ++ .../proper_path_tools/tests/experiment.rs | 20 + .../tests/inc/absolute_path.rs | 106 + .../core/proper_path_tools/tests/inc/mod.rs | 18 + .../tests/inc/path_change_ext.rs | 107 + .../tests/inc/path_common.rs | 506 +++++ .../proper_path_tools/tests/inc/path_ext.rs | 44 + .../proper_path_tools/tests/inc/path_exts.rs | 50 + .../tests/inc/path_is_glob.rs | 93 + .../proper_path_tools/tests/inc/path_join.rs | 252 +++ .../tests/inc/path_normalize.rs | 188 ++ .../tests/inc/path_relative.rs | 403 ++++ .../tests/inc/path_unique_folder_name.rs | 99 + .../tests/inc/rebase_path.rs | 57 + .../tests/inc/without_ext.rs | 114 ++ .../proper_path_tools/tests/smoke_test.rs | 14 + module/core/proper_path_tools/tests/tests.rs | 10 + module/core/reflect_tools/Cargo.toml | 52 + module/core/reflect_tools/License | 22 + module/core/reflect_tools/Readme.md | 28 + module/core/reflect_tools/build.rs | 25 + .../examples/reflect_tools_trivial.rs | 6 + module/core/reflect_tools/src/lib.rs | 77 + module/core/reflect_tools/src/reflect.rs | 165 ++ .../reflect_tools/src/reflect/axiomatic.rs | 550 ++++++ .../reflect_tools/src/reflect/entity_array.rs | 114 ++ .../src/reflect/entity_hashmap.rs | 121 ++ .../src/reflect/entity_hashset.rs | 110 ++ .../reflect_tools/src/reflect/entity_slice.rs | 110 ++ .../reflect_tools/src/reflect/entity_vec.rs | 109 + .../reflect_tools/src/reflect/primitive.rs | 264 +++ module/core/reflect_tools/tests/inc/mod.rs | 26 + .../tests/inc/newtype_experiment.rs | 39 + .../reflect_tools/tests/inc/only_test/all.rs | 54 + .../tests/inc/only_test/reflect_struct.rs | 28 + .../inc/only_test/reflect_struct_in_struct.rs | 31 + .../only_test/reflect_struct_with_lifetime.rs | 49 + .../tests/inc/reflect_array_test.rs | 28 + .../tests/inc/reflect_common_test.rs | 155 ++ .../tests/inc/reflect_hashmap_test.rs | 41 + .../tests/inc/reflect_hashset_test.rs | 39 + .../tests/inc/reflect_primitive_test.rs | 12 + .../tests/inc/reflect_slice_test.rs | 30 + .../reflect_struct_in_struct_manual_test.rs | 132 ++ .../tests/inc/reflect_struct_manual_test.rs | 107 + ...eflect_struct_with_lifetime_manual_test.rs | 85 + .../tests/inc/reflect_vec_test.rs | 38 + module/core/reflect_tools/tests/smoke_test.rs | 14 + module/core/reflect_tools/tests/tests.rs | 9 + module/core/reflect_tools_meta/Cargo.toml | 49 + module/core/reflect_tools_meta/License | 22 + module/core/reflect_tools_meta/Readme.md | 9 + .../src/implementation/reflect.rs | 26 + module/core/reflect_tools_meta/src/lib.rs | 46 + .../reflect_tools_meta/tests/smoke_test.rs | 12 + module/core/strs_tools/Cargo.toml | 63 + module/core/strs_tools/License | 22 + module/core/strs_tools/Readme.md | 57 + .../strs_tools/examples/strs_tools_trivial.rs | 28 + module/core/strs_tools/src/lib.rs | 45 + .../core/strs_tools/src/string/indentation.rs | 120 ++ module/core/strs_tools/src/string/isolate.rs | 216 ++ module/core/strs_tools/src/string/mod.rs | 88 + module/core/strs_tools/src/string/number.rs | 50 + .../strs_tools/src/string/parse_request.rs | 524 +++++ module/core/strs_tools/src/string/split.rs | 688 +++++++ .../strs_tools/tests/inc/indentation_test.rs | 63 + .../core/strs_tools/tests/inc/isolate_test.rs | 186 ++ module/core/strs_tools/tests/inc/mod.rs | 22 + .../core/strs_tools/tests/inc/number_test.rs | 60 + .../core/strs_tools/tests/inc/parse_test.rs | 355 ++++ .../core/strs_tools/tests/inc/split_test.rs | 395 ++++ module/core/strs_tools/tests/smoke_test.rs | 14 + .../core/strs_tools/tests/strs_tools_tests.rs | 5 + module/core/test_tools/Cargo.toml | 89 + module/core/test_tools/License | 22 + module/core/test_tools/Readme.md | 63 + module/core/test_tools/build.rs | 31 + .../test_tools/examples/test_tools_trivial.rs | 4 + module/core/test_tools/src/lib.rs | 99 + module/core/test_tools/src/test/asset.rs | 47 + .../core/test_tools/src/test/compiletime.rs | 24 + module/core/test_tools/src/test/helper.rs | 90 + module/core/test_tools/src/test/mod.rs | 14 + module/core/test_tools/src/test/smoke_test.rs | 332 ++++ module/core/test_tools/src/test/version.rs | 23 + .../core/test_tools/tests/inc/basic_test.rs | 66 + .../test_tools/tests/inc/dynamic/basic.rs | 47 + .../inc/dynamic/namespace_does_not_exists.rs | 23 + .../dynamic/namespace_does_not_exists.stderr | 31 + .../test_tools/tests/inc/dynamic/trybuild.rs | 23 + module/core/test_tools/tests/inc/mod.rs | 8 + .../test_tools/tests/inc/try_build_test.rs | 14 + module/core/test_tools/tests/smoke_test.rs | 18 + module/core/test_tools/tests/tests.rs | 12 + module/core/time_tools/Cargo.toml | 71 + module/core/time_tools/License | 22 + module/core/time_tools/Readme.md | 50 + .../time_tools/examples/time_tools_trivial.rs | 22 + module/core/time_tools/src/lib.rs | 68 + module/core/time_tools/src/now.rs | 70 + module/core/time_tools/tests/inc/basic.rs | 38 + module/core/time_tools/tests/inc/mod.rs | 15 + module/core/time_tools/tests/inc/now_test.rs | 42 + module/core/time_tools/tests/smoke_test.rs | 14 + module/core/time_tools/tests/time_tests.rs | 6 + module/core/typing_tools/Cargo.toml | 64 + module/core/typing_tools/License | 22 + module/core/typing_tools/Readme.md | 37 + .../examples/typing_tools_trivial.rs | 9 + module/core/typing_tools/src/lib.rs | 77 + module/core/typing_tools/src/typing.rs | 69 + module/core/typing_tools/tests/inc/mod.rs | 14 + module/core/typing_tools/tests/smoke_test.rs | 14 + module/core/typing_tools/tests/tests.rs | 10 + module/core/variadic_from/Cargo.toml | 55 + module/core/variadic_from/License | 22 + module/core/variadic_from/Readme.md | 155 ++ .../examples/variadic_from_trivial.rs | 52 + .../variadic_from_trivial_expanded.rs | 66 + module/core/variadic_from/src/lib.rs | 74 + module/core/variadic_from/src/variadic.rs | 431 ++++ .../tests/inc/auto_std_named_derive.rs | 17 + .../tests/inc/auto_std_named_manual.rs | 37 + .../core/variadic_from/tests/inc/exports.rs | 22 + .../tests/inc/from0_named_derive.rs | 13 + .../tests/inc/from0_named_manual.rs | 14 + .../tests/inc/from0_unnamed_derive.rs | 13 + .../tests/inc/from2_named_derive.rs | 14 + .../tests/inc/from2_named_manual.rs | 27 + .../tests/inc/from2_unnamed_derive.rs | 10 + .../tests/inc/from2_unnamed_manual.rs | 23 + .../tests/inc/from4_beyond_named.rs | 115 ++ .../tests/inc/from4_beyond_unnamed.rs | 115 ++ .../tests/inc/from4_named_manual.rs | 43 + .../tests/inc/from4_unnamed_manual.rs | 37 + module/core/variadic_from/tests/inc/mod.rs | 35 + .../tests/inc/only_test/from0.rs | 50 + .../tests/inc/only_test/from2_named.rs | 53 + .../tests/inc/only_test/from2_unnamed.rs | 53 + .../tests/inc/only_test/from4_named.rs | 47 + .../tests/inc/only_test/from4_unnamed.rs | 50 + module/core/variadic_from/tests/inc/sample.rs | 49 + module/core/variadic_from/tests/smoke_test.rs | 14 + .../tests/variadic_from_tests.rs | 10 + module/core/wtools/Cargo.toml | 450 +++++ module/core/wtools/License | 23 + module/core/wtools/Readme.md | 23 + module/core/wtools/examples/wtools_trivial.rs | 14 + module/core/wtools/src/lib.rs | 215 ++ module/core/wtools/tests/smoke_test.rs | 14 + module/core/wtools/tests/wtools_tests.rs | 58 + module/move/crates_tools/Cargo.toml | 39 + module/move/crates_tools/License | 22 + module/move/crates_tools/Readme.md | 59 + .../examples/crates_tools_trivial.rs | 20 + module/move/crates_tools/src/lib.rs | 166 ++ .../crates_tools/tests/crates_tools_tests.rs | 24 + module/move/crates_tools/tests/smoke_test.rs | 15 + module/move/deterministic_rand/Cargo.toml | 50 + module/move/deterministic_rand/License | 22 + module/move/deterministic_rand/Readme.md | 182 ++ .../examples/deterministic_rand_trivial.rs | 24 + .../sample_deterministic_rand_rayon.rs | 71 + .../examples/sample_deterministic_rand_std.rs | 28 + .../src/hrng_deterministic.rs | 204 ++ .../src/hrng_non_deterministic.rs | 180 ++ module/move/deterministic_rand/src/iter.rs | 83 + module/move/deterministic_rand/src/lib.rs | 43 + module/move/deterministic_rand/src/seed.rs | 79 + .../tests/assumption_test.rs | 246 +++ .../deterministic_rand/tests/basic_test.rs | 147 ++ .../deterministic_rand/tests/smoke_test.rs | 12 + module/move/graphs_tools/Cargo.toml | 49 + module/move/graphs_tools/License | 22 + module/move/graphs_tools/Readme.md | 39 + .../examples/graphs_tools_trivial.rs | 11 + module/move/graphs_tools/src/abs/edge.rs | 65 + module/move/graphs_tools/src/abs/factory.rs | 444 +++++ .../move/graphs_tools/src/abs/id_generator.rs | 52 + module/move/graphs_tools/src/abs/identity.rs | 104 + module/move/graphs_tools/src/abs/mod.rs | 17 + module/move/graphs_tools/src/abs/node.rs | 72 + module/move/graphs_tools/src/algo/dfs.rs | 29 + module/move/graphs_tools/src/algo/mod.rs | 5 + .../move/graphs_tools/src/canonical/edge.rs | 84 + .../src/canonical/factory_generative.rs | 202 ++ .../src/canonical/factory_impl.rs | 267 +++ .../src/canonical/factory_readable.rs | 185 ++ .../graphs_tools/src/canonical/identity.rs | 202 ++ module/move/graphs_tools/src/canonical/mod.rs | 20 + .../move/graphs_tools/src/canonical/node.rs | 187 ++ module/move/graphs_tools/src/lib.rs | 56 + .../graphs_tools/tests/graphs_tools_tests.rs | 10 + .../tests/inc/canonical_node_test.rs | 37 + .../tests/inc/cell_factory_test.rs | 39 + .../graphs_tools/tests/inc/factory_impls.rs | 189 ++ .../graphs_tools/tests/inc/factory_test.rs | 17 + .../graphs_tools/tests/inc/identity_test.rs | 132 ++ module/move/graphs_tools/tests/inc/mod.rs | 15 + module/move/graphs_tools/tests/smoke_test.rs | 14 + .../optimization_tools/.cargo/config.toml | 3 + module/move/optimization_tools/Cargo.toml | 70 + module/move/optimization_tools/License | 22 + module/move/optimization_tools/Readme.md | 268 +++ module/move/optimization_tools/diagram.md | 55 + .../evolve_method_diagram.md | 37 + .../examples/optimization_tools_trivial.rs | 186 ++ .../examples/traveling_salesman.rs | 45 + .../img/Genetic_algorithm.png | Bin 0 -> 36439 bytes .../img/Nelder-Mead_Himmelblau.gif | Bin 0 -> 931058 bytes ...roblem_solved_with_simulated_annealing.gif | Bin 0 -> 2373151 bytes module/move/optimization_tools/plot/2d.png | Bin 0 -> 156130 bytes .../optimization_tools/plot/ac_prob_plot.png | Bin 0 -> 203949 bytes .../optimization_tools/plot/cost_plot.png | Bin 0 -> 344091 bytes .../optimization_tools/plot/temp_plot.png | Bin 0 -> 204405 bytes .../src/hybrid_optimizer/gen_alg.rs | 306 +++ .../src/hybrid_optimizer/mod.rs | 541 +++++ .../src/hybrid_optimizer/sim_anneal.rs | 95 + module/move/optimization_tools/src/lib.rs | 14 + module/move/optimization_tools/src/main.rs | 56 + .../src/optimal_params_search/mod.rs | 309 +++ .../src/optimal_params_search/nelder_mead.rs | 861 ++++++++ .../results_serialize.rs | 69 + .../optimal_params_search/sim_annealing.rs | 209 ++ .../move/optimization_tools/src/plot/mod.rs | 250 +++ .../src/plot_dynamic/mod.rs | 134 ++ .../src/plot_dynamic/plotters_backend.rs | 283 +++ .../optimization_tools/src/problems/mod.rs | 6 + .../src/problems/sudoku/block_index.rs | 86 + .../src/problems/sudoku/board.rs | 437 +++++ .../src/problems/sudoku/cell_index.rs | 133 ++ .../src/problems/sudoku/cell_val.rs | 72 + .../src/problems/sudoku/mod.rs | 17 + .../src/problems/sudoku/sudoku.rs | 416 ++++ .../src/problems/sudoku/sudoku_sets.rs | 695 +++++++ .../src/problems/traveling_salesman.rs | 375 ++++ .../optimization_tools/src/simplex/drawing.rs | 113 ++ .../src/simplex/linear_problem.rs | 207 ++ .../optimization_tools/src/simplex/mod.rs | 13 + .../optimization_tools/src/simplex/parser.rs | 105 + .../optimization_tools/src/simplex/solver.rs | 376 ++++ .../move/optimization_tools/sudoku_results.md | 264 +++ .../optimization_tools/sudoku_results_old.md | 47 + module/move/optimization_tools/tests/board.rs | 309 +++ .../tests/ga_optimization.rs | 96 + .../optimization_tools/tests/nelder_mead.rs | 76 + .../optimization_tools/tests/opt_params.rs | 561 ++++++ .../optimization_tools/tests/optimization.rs | 211 ++ .../move/optimization_tools/tests/simplex.rs | 147 ++ .../optimization_tools/tests/tools/mod.rs | 27 + .../tests/traveling_salesman.rs | 111 ++ module/move/optimization_tools/tsp_results.md | 252 +++ module/move/plot_interface/Cargo.toml | 69 + module/move/plot_interface/License | 22 + module/move/plot_interface/Readme.md | 30 + .../plot_interface/src/plot/abs/change.rs | 34 + .../plot_interface/src/plot/abs/changer.rs | 58 + .../plot_interface/src/plot/abs/context.rs | 33 + .../plot_interface/src/plot/abs/identity.rs | 86 + .../move/plot_interface/src/plot/abs/mod.rs | 18 + .../plot_interface/src/plot/abs/registry.rs | 78 + module/move/plot_interface/src/plot/color.rs | 103 + .../src/plot/plot_interface_lib.rs | 19 + .../plot_interface/src/plot/sys/context.rs | 90 + .../src/plot/sys/context_changer.rs | 104 + .../plot_interface/src/plot/sys/drawing.rs | 57 + .../src/plot/sys/drawing/change_new.rs | 32 + .../src/plot/sys/drawing/changer.rs | 81 + .../src/plot/sys/drawing/command.rs | 18 + .../src/plot/sys/drawing/queue.rs | 30 + .../src/plot/sys/drawing/rect_change_new.rs | 35 + .../plot/sys/drawing/rect_change_region.rs | 49 + .../src/plot/sys/drawing/rect_changer.rs | 93 + .../move/plot_interface/src/plot/sys/mod.rs | 18 + .../src/plot/sys/stroke_brush.rs | 79 + .../src/plot/sys/stroke_brush/change_color.rs | 35 + .../src/plot/sys/stroke_brush/change_new.rs | 32 + .../src/plot/sys/stroke_brush/change_width.rs | 33 + .../src/plot/sys/stroke_brush/changer.rs | 104 + .../plot_interface/src/plot/sys/target.rs | 13 + .../move/plot_interface/src/plot/wplot_lib.rs | 48 + module/move/plot_interface/tests/plot/inc.rs | 5 + .../tests/plot/inc/basic_test.rs | 91 + .../tests/plot/plot_interface_tests.rs | 7 + .../plot_interface/tests/plot/wplot_tests.rs | 7 + .../move/plot_interface/tests/smoke_test.rs | 14 + module/move/refiner/Cargo.toml | 38 + module/move/refiner/License | 22 + module/move/refiner/Readme.md | 20 + module/move/refiner/src/instruction.rs | 226 +++ module/move/refiner/src/lib.rs | 15 + module/move/refiner/src/main.rs | 26 + module/move/refiner/src/props.rs | 73 + .../move/refiner/tests/censor/censor_tests.rs | 4 + module/move/refiner/tests/censor/inc.rs | 7 + .../refiner/tests/censor/inc/censor_test.rs | 57 + module/move/refiner/tests/smoke_test.rs | 15 + module/move/sqlx_query/Cargo.toml | 36 + module/move/sqlx_query/License | 22 + module/move/sqlx_query/Readme.md | 63 + module/move/sqlx_query/src/lib.rs | 134 ++ module/move/sqlx_query/tests/smoke_test.rs | 14 + module/move/unitore/Cargo.toml | 55 + module/move/unitore/Readme.md | 74 + module/move/unitore/config/feeds.toml | 7 + module/move/unitore/src/Readme.md | 6 + module/move/unitore/src/action/config.rs | 150 ++ module/move/unitore/src/action/feed.rs | 62 + module/move/unitore/src/action/frame.rs | 271 +++ module/move/unitore/src/action/mod.rs | 29 + module/move/unitore/src/action/query.rs | 87 + module/move/unitore/src/action/table.rs | 418 ++++ module/move/unitore/src/command/config.rs | 165 ++ module/move/unitore/src/command/feed.rs | 55 + module/move/unitore/src/command/frame.rs | 93 + module/move/unitore/src/command/mod.rs | 7 + module/move/unitore/src/command/query.rs | 71 + module/move/unitore/src/command/table.rs | 105 + module/move/unitore/src/entity/config.rs | 56 + module/move/unitore/src/entity/feed.rs | 106 + module/move/unitore/src/entity/frame.rs | 280 +++ module/move/unitore/src/entity/mod.rs | 7 + module/move/unitore/src/entity/table.rs | 18 + module/move/unitore/src/executor.rs | 64 + module/move/unitore/src/feed_config.rs | 52 + module/move/unitore/src/lib.rs | 12 + module/move/unitore/src/main.rs | 9 + module/move/unitore/src/retriever.rs | 57 + .../move/unitore/src/sled_adapter/config.rs | 56 + module/move/unitore/src/sled_adapter/feed.rs | 197 ++ module/move/unitore/src/sled_adapter/frame.rs | 124 ++ module/move/unitore/src/sled_adapter/mod.rs | 117 ++ module/move/unitore/src/sled_adapter/table.rs | 35 + module/move/unitore/src/tool/mod.rs | 3 + module/move/unitore/src/tool/table_display.rs | 88 + module/move/unitore/tests/basic.rs | 13 + module/move/unitore/tests/config_add.rs | 37 + module/move/unitore/tests/config_delete.rs | 43 + .../unitore/tests/fixtures/plain_feed.xml | 1747 +++++++++++++++++ .../unitore/tests/fixtures/test_config.toml | 3 + .../tests/fixtures/updated_one_frame.xml | 1747 +++++++++++++++++ module/move/unitore/tests/frames_download.rs | 121 ++ module/move/unitore/tests/query_execute.rs | 187 ++ module/move/unitore/tests/table_list.rs | 47 + module/move/unitore/tests/tables_list.rs | 34 + module/move/wca/Cargo.toml | 58 + module/move/wca/License | 22 + module/move/wca/Readme.md | 60 + module/move/wca/benches/bench.rs | 116 ++ module/move/wca/doc/WCA.png | Bin 0 -> 206374 bytes module/move/wca/doc/WCA_sequence.png | Bin 0 -> 33369 bytes module/move/wca/doc/wca.md | 30 + module/move/wca/examples/wca_fluent.rs | 48 + module/move/wca/examples/wca_shortcut.rs | 31 + module/move/wca/examples/wca_suggest.rs | 47 + module/move/wca/examples/wca_trivial.rs | 55 + module/move/wca/src/ca/aggregator.rs | 296 +++ module/move/wca/src/ca/executor/context.rs | 95 + module/move/wca/src/ca/executor/executor.rs | 161 ++ module/move/wca/src/ca/executor/mod.rs | 11 + module/move/wca/src/ca/executor/routine.rs | 339 ++++ module/move/wca/src/ca/facade.rs | 345 ++++ module/move/wca/src/ca/formatter.rs | 95 + module/move/wca/src/ca/grammar/command.rs | 256 +++ module/move/wca/src/ca/grammar/dictionary.rs | 113 ++ module/move/wca/src/ca/grammar/mod.rs | 10 + module/move/wca/src/ca/grammar/types.rs | 211 ++ module/move/wca/src/ca/help.rs | 420 ++++ module/move/wca/src/ca/input.rs | 83 + module/move/wca/src/ca/mod.rs | 31 + module/move/wca/src/ca/parser/command.rs | 62 + module/move/wca/src/ca/parser/mod.rs | 13 + module/move/wca/src/ca/parser/parser.rs | 166 ++ module/move/wca/src/ca/tool/mod.rs | 7 + module/move/wca/src/ca/tool/table.rs | 126 ++ module/move/wca/src/ca/verifier/command.rs | 49 + module/move/wca/src/ca/verifier/mod.rs | 7 + module/move/wca/src/ca/verifier/verifier.rs | 443 +++++ module/move/wca/src/lib.rs | 25 + module/move/wca/src/wtools.rs | 17 + module/move/wca/tests/inc/adapter.rs | 44 + .../tests/inc/commands_aggregator/basic.rs | 250 +++ .../tests/inc/commands_aggregator/callback.rs | 49 + .../wca/tests/inc/commands_aggregator/help.rs | 196 ++ .../wca/tests/inc/commands_aggregator/mod.rs | 16 + module/move/wca/tests/inc/executor/command.rs | 191 ++ module/move/wca/tests/inc/executor/mod.rs | 15 + module/move/wca/tests/inc/executor/program.rs | 120 ++ .../wca/tests/inc/grammar/from_command.rs | 405 ++++ .../wca/tests/inc/grammar/from_program.rs | 58 + module/move/wca/tests/inc/grammar/mod.rs | 13 + module/move/wca/tests/inc/grammar/types.rs | 155 ++ module/move/wca/tests/inc/mod.rs | 16 + module/move/wca/tests/inc/parser/command.rs | 394 ++++ module/move/wca/tests/inc/parser/mod.rs | 10 + module/move/wca/tests/inc/parser/program.rs | 59 + module/move/wca/tests/smoke_test.rs | 14 + module/move/wca/tests/wca_tests.rs | 12 + module/move/willbe/Cargo.toml | 77 + module/move/willbe/License | 22 + module/move/willbe/Readme.md | 38 + module/move/willbe/src/action/cicd_renew.rs | 277 +++ module/move/willbe/src/action/deploy_renew.rs | 187 ++ module/move/willbe/src/action/features.rs | 97 + module/move/willbe/src/action/list.rs | 693 +++++++ module/move/willbe/src/action/main_header.rs | 248 +++ module/move/willbe/src/action/mod.rs | 27 + module/move/willbe/src/action/publish.rs | 240 +++ module/move/willbe/src/action/publish_diff.rs | 149 ++ .../src/action/readme_health_table_renew.rs | 606 ++++++ .../action/readme_modules_headers_renew.rs | 244 +++ module/move/willbe/src/action/test.rs | 209 ++ .../move/willbe/src/action/workspace_renew.rs | 143 ++ module/move/willbe/src/bin/cargo-will.rs | 13 + module/move/willbe/src/bin/will.rs | 15 + module/move/willbe/src/bin/willbe.rs | 12 + module/move/willbe/src/command/cicd_renew.rs | 21 + .../move/willbe/src/command/deploy_renew.rs | 36 + module/move/willbe/src/command/features.rs | 40 + module/move/willbe/src/command/list.rs | 125 ++ module/move/willbe/src/command/main_header.rs | 32 + module/move/willbe/src/command/mod.rs | 314 +++ module/move/willbe/src/command/publish.rs | 92 + .../move/willbe/src/command/publish_diff.rs | 70 + .../src/command/readme_headers_renew.rs | 118 ++ .../src/command/readme_health_table_renew.rs | 20 + .../command/readme_modules_headers_renew.rs | 31 + module/move/willbe/src/command/test.rs | 162 ++ .../willbe/src/command/workspace_renew.rs | 49 + module/move/willbe/src/description.md | 25 + module/move/willbe/src/entity/channel.rs | 74 + module/move/willbe/src/entity/diff.rs | 226 +++ module/move/willbe/src/entity/features.rs | 153 ++ module/move/willbe/src/entity/manifest.rs | 295 +++ module/move/willbe/src/entity/mod.rs | 51 + module/move/willbe/src/entity/optimization.rs | 34 + module/move/willbe/src/entity/package.rs | 975 +++++++++ module/move/willbe/src/entity/packages.rs | 109 + module/move/willbe/src/entity/packed_crate.rs | 73 + module/move/willbe/src/entity/table.rs | 109 + module/move/willbe/src/entity/test.rs | 839 ++++++++ module/move/willbe/src/entity/version.rs | 387 ++++ module/move/willbe/src/entity/workspace.rs | 367 ++++ module/move/willbe/src/lib.rs | 66 + module/move/willbe/src/tool/_path.rs | 170 ++ module/move/willbe/src/tool/cargo.rs | 183 ++ module/move/willbe/src/tool/files.rs | 40 + module/move/willbe/src/tool/git.rs | 226 +++ module/move/willbe/src/tool/graph.rs | 312 +++ module/move/willbe/src/tool/http.rs | 48 + module/move/willbe/src/tool/mod.rs | 39 + module/move/willbe/src/tool/query.rs | 259 +++ module/move/willbe/src/tool/sha.rs | 26 + module/move/willbe/src/tool/template.rs | 386 ++++ module/move/willbe/src/tool/url.rs | 46 + module/move/willbe/src/wtools.rs | 28 + .../template/deploy/.deploy_template.toml.hbs | 5 + .../move/willbe/template/deploy/Makefile.hbs | 209 ++ .../willbe/template/deploy/deploy/.gitignore | 2 + .../willbe/template/deploy/deploy/Dockerfile | 23 + .../willbe/template/deploy/deploy/Readme.md | 20 + .../willbe/template/deploy/deploy/aws/main.tf | 80 + .../template/deploy/deploy/aws/outputs.tf | 16 + .../deploy/aws/templates/cloud-init.tpl | 46 + .../template/deploy/deploy/aws/variables.tf | 24 + .../template/deploy/deploy/gar/Readme.md | 24 + .../willbe/template/deploy/deploy/gar/main.tf | 15 + .../template/deploy/deploy/gar/outputs.tf | 6 + .../template/deploy/deploy/gar/variables.tf | 14 + .../template/deploy/deploy/gce/Readme.md | 26 + .../willbe/template/deploy/deploy/gce/main.tf | 88 + .../template/deploy/deploy/gce/outputs.tf | 16 + .../deploy/gce/templates/cloud-init.tpl | 24 + .../template/deploy/deploy/gce/variables.tf | 48 + .../willbe/template/deploy/deploy/gcs/main.tf | 31 + .../template/deploy/deploy/hetzner/main.tf | 49 + .../template/deploy/deploy/hetzner/outputs.tf | 16 + .../deploy/hetzner/templates/cloud-init.tpl | 46 + .../deploy/deploy/hetzner/variables.tf | 29 + .../willbe/template/deploy/key/.gitignore | 4 + .../move/willbe/template/deploy/key/Readme.md | 92 + .../move/willbe/template/deploy/key/pack.sh | 22 + .../willbe/template/workflow/Description.md | 19 + .../move/willbe/template/workflow/Readme.md | 133 ++ .../workflow/appropraite_branch_for.hbs | 17 + .../template/workflow/appropriate_branch.yml | 58 + .../template/workflow/auto_merge_to.hbs | 95 + .../move/willbe/template/workflow/auto_pr.yml | 36 + .../willbe/template/workflow/auto_pr_to.hbs | 17 + .../template/workflow/for_pr_rust_push.yml | 72 + .../willbe/template/workflow/module_push.hbs | 23 + .../willbe/template/workflow/rust_clean.yml | 38 + .../workflow/standard_rust_pull_request.hbs | 51 + .../template/workflow/standard_rust_push.yml | 157 ++ .../workflow/standard_rust_scheduled.yml | 20 + .../workflow/standard_rust_status.yml | 39 + .../workflow/status_checks_rules_update.yml | 77 + .../template/workspace/.cargo/config.toml | 7 + .../willbe/template/workspace/.gitattributes | 4 + .../willbe/template/workspace/.gitignore1 | 29 + .../willbe/template/workspace/.gitpod.yml | 26 + .../move/willbe/template/workspace/Cargo.hbs | 26 + .../move/willbe/template/workspace/Makefile | 151 ++ .../move/willbe/template/workspace/Readme.md | 5 + .../workspace/module/module1/Cargo.toml.x | 16 + .../workspace/module/module1/Readme.md | 2 + .../module1/examples/module1_example.rs | 12 + .../workspace/module/module1/src/lib.rs | 7 + .../module/module1/tests/hello_test.rs | 9 + .../tests/asset/chain_of_packages/Cargo.toml | 5 + .../asset/chain_of_packages/a/Cargo.toml | 9 + .../asset/chain_of_packages/a/src/lib.rs | 17 + .../asset/chain_of_packages/b/Cargo.toml | 9 + .../asset/chain_of_packages/b/src/lib.rs | 17 + .../asset/chain_of_packages/c/Cargo.toml | 8 + .../asset/chain_of_packages/c/src/lib.rs | 17 + .../tests/asset/err_out_test/err_out_err.rs | 8 + .../tests/asset/err_out_test/out_err_out.rs | 9 + .../willbe/tests/asset/full_config/Cargo.toml | 9 + .../Cargo.toml | 11 + ...e_variadic_tag_configurations_c_trivial.rs | 4 + .../src/lib.rs | 17 + .../willbe/tests/asset/full_config/readme.md | 2 + .../package_with_remote_dependency/Cargo.toml | 5 + .../a/Cargo.toml | 10 + .../a/src/lib.rs | 17 + .../b/Cargo.toml | 8 + .../b/src/lib.rs | 17 + .../tests/asset/single_module/Cargo.toml | 11 + .../tests/asset/single_module/Readme.md | 2 + .../single_module/test_module/Cargo.toml | 7 + .../asset/single_module/test_module/Readme.md | 2 + .../single_module/test_module/src/lib.rs | 17 + .../single_module_with_example/Cargo.toml | 11 + .../single_module_with_example/Readme.md | 2 + .../module/test_module/Cargo.toml | 7 + .../module/test_module/Readme.md | 2 + .../examples/test_module_trivial.rs | 4 + .../module/test_module/src/lib.rs | 17 + .../Cargo.toml | 9 + .../Readme.md | 2 + .../test_module/Cargo.toml | 6 + .../test_module/src/lib.rs | 17 + .../tests/asset/three_packages/Cargo.toml | 8 + .../tests/asset/three_packages/b/Cargo.toml | 12 + .../tests/asset/three_packages/b/Readme.md | 2 + .../tests/asset/three_packages/b/src/lib.rs | 17 + .../tests/asset/three_packages/c/Cargo.toml | 12 + .../tests/asset/three_packages/c/Readme.md | 2 + .../tests/asset/three_packages/c/src/lib.rs | 17 + .../tests/asset/three_packages/d/Cargo.toml | 11 + .../tests/asset/three_packages/d/Readme.md | 2 + .../tests/asset/three_packages/d/src/lib.rs | 17 + .../three_packages_with_features/Cargo.toml | 8 + .../three_packages_with_features/b/Cargo.toml | 17 + .../three_packages_with_features/b/Readme.md | 2 + .../three_packages_with_features/b/src/lib.rs | 17 + .../three_packages_with_features/c/Cargo.toml | 17 + .../three_packages_with_features/c/Readme.md | 2 + .../three_packages_with_features/c/src/lib.rs | 17 + .../three_packages_with_features/d/Cargo.toml | 14 + .../three_packages_with_features/d/Readme.md | 2 + .../three_packages_with_features/d/src/lib.rs | 17 + .../variadic_tag_configurations/Cargo.toml | 9 + .../Cargo.toml | 11 + .../src/lib.rs | 17 + .../variadic_tag_configurations/readme.md | 18 + .../Cargo.toml | 5 + .../c/Cargo.toml | 8 + .../c/src/lib.rs | 17 + .../without_any_toml_configurations/readme.md | 3 + .../Cargo.toml | 9 + .../Cargo.toml | 8 + .../src/lib.rs | 17 + .../readme.md | 3 + .../Cargo.toml | 5 + .../Cargo.toml | 12 + .../src/lib.rs | 17 + .../readme.md | 3 + .../Cargo.toml | 5 + .../a/Cargo.toml | 9 + .../a/src/lib.rs | 17 + .../b/Cargo.toml | 9 + .../b/src/lib.rs | 17 + .../willbe/tests/inc/action/cicd_renew.rs | 120 ++ .../move/willbe/tests/inc/action/features.rs | 183 ++ module/move/willbe/tests/inc/action/list.rs | 4 + .../move/willbe/tests/inc/action/list/data.rs | 314 +++ .../willbe/tests/inc/action/list/format.rs | 448 +++++ .../willbe/tests/inc/action/main_header.rs | 168 ++ module/move/willbe/tests/inc/action/mod.rs | 12 + .../inc/action/readme_health_table_renew.rs | 201 ++ .../action/readme_modules_headers_renew.rs | 207 ++ module/move/willbe/tests/inc/action/test.rs | 326 +++ .../tests/inc/action/workspace_renew.rs | 64 + module/move/willbe/tests/inc/command/mod.rs | 3 + .../willbe/tests/inc/command/tests_run.rs | 84 + .../willbe/tests/inc/entity/dependencies.rs | 128 ++ module/move/willbe/tests/inc/entity/diff.rs | 98 + .../move/willbe/tests/inc/entity/features.rs | 268 +++ module/move/willbe/tests/inc/entity/mod.rs | 6 + .../move/willbe/tests/inc/entity/version.rs | 227 +++ module/move/willbe/tests/inc/helpers.rs | 1 + module/move/willbe/tests/inc/mod.rs | 10 + module/move/willbe/tests/inc/package.rs | 172 ++ module/move/willbe/tests/inc/tool/graph.rs | 217 ++ module/move/willbe/tests/inc/tool/mod.rs | 7 + module/move/willbe/tests/inc/tool/process.rs | 65 + module/move/willbe/tests/inc/tool/query.rs | 139 ++ module/move/willbe/tests/smoke_test.rs | 14 + module/move/willbe/tests/tests.rs | 11 + module/move/wplot/Cargo.toml | 69 + module/move/wplot/License | 22 + module/move/wplot/Readme.md | 31 + module/move/wplot/src/plot/abs/change.rs | 37 + module/move/wplot/src/plot/abs/changer.rs | 61 + module/move/wplot/src/plot/abs/context.rs | 40 + module/move/wplot/src/plot/abs/identity.rs | 88 + module/move/wplot/src/plot/abs/mod.rs | 21 + module/move/wplot/src/plot/abs/registry.rs | 86 + module/move/wplot/src/plot/color.rs | 104 + .../move/wplot/src/plot/plot_interface_lib.rs | 19 + module/move/wplot/src/plot/sys/context.rs | 95 + .../wplot/src/plot/sys/context_changer.rs | 107 + module/move/wplot/src/plot/sys/drawing.rs | 61 + .../wplot/src/plot/sys/drawing/change_new.rs | 33 + .../wplot/src/plot/sys/drawing/changer.rs | 84 + .../wplot/src/plot/sys/drawing/command.rs | 18 + .../move/wplot/src/plot/sys/drawing/queue.rs | 30 + .../src/plot/sys/drawing/rect_change_new.rs | 36 + .../plot/sys/drawing/rect_change_region.rs | 51 + .../src/plot/sys/drawing/rect_changer.rs | 100 + module/move/wplot/src/plot/sys/mod.rs | 18 + .../move/wplot/src/plot/sys/stroke_brush.rs | 84 + .../src/plot/sys/stroke_brush/change_color.rs | 35 + .../src/plot/sys/stroke_brush/change_new.rs | 34 + .../src/plot/sys/stroke_brush/change_width.rs | 35 + .../src/plot/sys/stroke_brush/changer.rs | 104 + module/move/wplot/src/plot/sys/target.rs | 13 + module/move/wplot/src/plot/wplot_lib.rs | 52 + module/move/wplot/test.png | Bin 0 -> 327 bytes module/move/wplot/tests/plot/inc.rs | 5 + .../move/wplot/tests/plot/inc/basic_test.rs | 91 + .../wplot/tests/plot/plot_interface_tests.rs | 7 + module/move/wplot/tests/plot/wplot_tests.rs | 7 + module/move/wplot/tests/smoke_test.rs | 14 + module/postponed/_video_experiment/Cargo.toml | 69 + module/postponed/_video_experiment/License | 22 + module/postponed/_video_experiment/Readme.md | 28 + .../_video_experiment/src/video/common.rs | 73 + .../src/video/encoder_strategy.rs | 160 ++ .../src/video/encoders/gif.rs | 151 ++ .../src/video/encoders/mod.rs | 10 + .../src/video/encoders/mp4.rs | 291 +++ .../src/video/encoders/png.rs | 231 +++ .../src/video/video_experiment_lib.rs | 49 + .../_video_experiment/src/video/yuv.rs | 118 ++ .../_video_experiment/tests/smoke_test.rs | 14 + .../tests/video/_asset/img/rust_logo1.png | Bin 0 -> 23420 bytes .../tests/video/_asset/img/rust_logo2.png | Bin 0 -> 22413 bytes .../tests/video/_asset/img/rust_logo3.png | Bin 0 -> 22454 bytes .../_video_experiment/tests/video/inc.rs | 7 + .../tests/video/inc/apng_test.rs | 153 ++ .../tests/video/inc/encoder_strategy_test.rs | 114 ++ .../tests/video/inc/gif_test.rs | 165 ++ .../tests/video/inc/mp4_test.rs | 194 ++ .../_video_experiment/tests/video/inc/yuv.rs | 165 ++ .../tests/video/video_experiment_tests.rs | 8 + module/postponed/automata_tools/Cargo.toml | 37 + module/postponed/automata_tools/License | 22 + module/postponed/automata_tools/Readme.md | 36 + module/postponed/automata_tools/src/lib.rs | 10 + .../tests/graph/automata_tools_tests.rs | 7 + .../tests/graph/graphs_tools_tests.rs | 10 + .../automata_tools/tests/graph/inc.rs | 15 + .../tests/graph/inc/canonical_node_test.rs | 37 + .../tests/graph/inc/cell_factory_test.rs | 39 + .../tests/graph/inc/factory_impls.rs | 184 ++ .../tests/graph/inc/factory_test.rs | 17 + .../tests/graph/inc/identity_test.rs | 131 ++ .../tests/graph/wautomata_tests.rs | 12 + .../automata_tools/tests/smoke_test.rs | 14 + module/postponed/non_std/Cargo.toml | 396 ++++ module/postponed/non_std/License | 22 + module/postponed/non_std/Readme.md | 123 ++ module/postponed/non_std/src/non_std_lib.rs | 17 + .../postponed/non_std/tests/non_std_tests.rs | 19 + module/postponed/non_std/tests/smoke_test.rs | 14 + module/postponed/std_tools/Cargo.toml | 397 ++++ module/postponed/std_tools/License | 22 + module/postponed/std_tools/Readme.md | 119 ++ .../postponed/std_tools/src/std_tools_lib.rs | 17 + .../postponed/std_tools/tests/smoke_test.rs | 14 + .../std_tools/tests/std_tools_tests.rs | 23 + module/postponed/std_x/Cargo.toml | 399 ++++ module/postponed/std_x/License | 22 + module/postponed/std_x/Readme.md | 121 ++ module/postponed/std_x/src/std_x_lib.rs | 17 + module/postponed/std_x/tests/smoke_test.rs | 14 + module/postponed/std_x/tests/std_x_tests.rs | 23 + module/postponed/type_constructor/Cargo.toml | 118 ++ module/postponed/type_constructor/License | 22 + module/postponed/type_constructor/Readme.md | 842 ++++++++ .../Cargo.toml | 8 + .../src/main.rs | 15 + .../Cargo.toml | 8 + .../src/main.rs | 20 + .../type_constructor_many_sample/Cargo.toml | 8 + .../type_constructor_many_sample/src/main.rs | 12 + .../Cargo.toml | 8 + .../src/main.rs | 46 + .../type_constructor_pair_sample/Cargo.toml | 8 + .../type_constructor_pair_sample/src/main.rs | 16 + .../Cargo.toml | 8 + .../src/main.rs | 14 + .../Cargo.toml | 8 + .../src/main.rs | 15 + .../type_constructor_struct_sample/Cargo.toml | 8 + .../src/main.rs | 9 + .../Cargo.toml | 8 + .../type_constructor_trivial_sample/Readme.md | 5 + .../src/main.rs | 47 + .../Cargo.toml | 8 + .../src/main.rs | 21 + module/postponed/type_constructor/src/lib.rs | 96 + .../src/type_constuctor/enumerable.rs | 281 +++ .../src/type_constuctor/helper.rs | 78 + .../src/type_constuctor/make.rs | 290 +++ .../src/type_constuctor/many.rs | 591 ++++++ .../src/type_constuctor/mod.rs | 168 ++ .../src/type_constuctor/no_many.rs | 71 + .../src/type_constuctor/pair.rs | 244 +++ .../src/type_constuctor/single.rs | 577 ++++++ .../src/type_constuctor/traits.rs | 99 + .../src/type_constuctor/types.rs | 851 ++++++++ .../src/type_constuctor/vectorized_from.rs | 180 ++ .../type_constructor/tests/data_type_tests.rs | 12 + .../tests/inc/dynamic/make/make_too_many.rs | 7 + .../inc/dynamic/make/make_too_many.stderr | 10 + .../dynamic/types/single_too_many_params.rs | 11 + .../types/single_too_many_params.stderr | 11 + .../tests/inc/dynamic/types/wrong_kind.rs | 11 + .../tests/inc/dynamic/types/wrong_kind.stderr | 14 + .../types_many_no/many_too_many_params.rs | 11 + .../types_many_no/many_too_many_params.stderr | 10 + .../types_many_yes/many_too_many_params.rs | 11 + .../many_too_many_params.stderr | 11 + .../tests/inc/enumerable_test.rs | 264 +++ .../tests/inc/fundamental_data_type_tests.rs | 12 + .../tests/inc/make_interface_test.rs | 108 + .../tests/inc/many/many_from_tuple_test.rs | 7 + .../inc/many/many_from_tuple_test.stderr | 15 + .../inc/many/many_parameter_main_gen_test.rs | 15 + .../many/many_parameter_main_manual_test.rs | 144 ++ .../inc/many/many_parameter_main_test_only.rs | 156 ++ .../tests/inc/many/many_parameter_test.rs | 168 ++ .../many/many_parametrized_main_gen_test.rs | 55 + .../many_parametrized_main_manual_test.rs | 243 +++ .../many/many_parametrized_main_test_only.rs | 151 ++ .../tests/inc/many/many_parametrized_test.rs | 318 +++ .../tests/inc/many/many_with_two_args_test.rs | 6 + .../inc/many/many_with_two_args_test.stderr | 8 + .../tests/inc/many/many_without_args_test.rs | 6 + .../inc/many/many_without_args_test.stderr | 11 + .../type_constructor/tests/inc/mod.rs | 88 + .../pair/homo_pair_double_difinition_test.rs | 12 + .../homo_pair_double_difinition_test.stderr | 289 +++ .../pair/homo_pair_mismatched_types_test.rs | 7 + .../homo_pair_mismatched_types_test.stderr | 13 + .../pair/homo_pair_parameter_main_gen_test.rs | 21 + .../homo_pair_parameter_main_manual_test.rs | 129 ++ .../homo_pair_parameter_main_test_only.rs | 177 ++ .../inc/pair/homo_pair_parameter_test.rs | 399 ++++ .../homo_pair_parametrized_main_gen_test.rs | 46 + ...homo_pair_parametrized_main_manual_test.rs | 142 ++ .../homo_pair_parametrized_main_test_only.rs | 149 ++ .../inc/pair/homo_pair_parametrized_test.rs | 335 ++++ .../inc/pair/pair_parameter_main_gen_test.rs | 18 + .../pair/pair_parameter_main_manual_test.rs | 39 + .../inc/pair/pair_parameter_main_test_only.rs | 71 + .../tests/inc/pair/pair_parameter_test.rs | 424 ++++ .../pair/pair_parametrized_main_gen_test.rs | 47 + .../pair_parametrized_main_manual_test.rs | 56 + .../pair/pair_parametrized_main_test_only.rs | 84 + .../tests/inc/pair/pair_parametrized_test.rs | 449 +++++ .../inc/pair/pair_three_elements_test.rs | 6 + .../inc/pair/pair_three_elements_test.stderr | 11 + .../tests/inc/pair/pair_without_args_test.rs | 6 + .../inc/pair/pair_without_args_test.stderr | 11 + .../tests/inc/prelude_test.rs | 68 + .../inc/single/single_missing_generic.rs | 12 + .../inc/single/single_nested_type_test.rs | 12 + .../inc/single/single_nested_type_test.stderr | 11 + .../single/single_not_completed_type_test.rs | 11 + .../single_not_completed_type_test.stderr | 11 + .../single/single_parameter_main_gen_test.rs | 11 + .../single_parameter_main_manual_test.rs | 217 ++ .../single/single_parameter_main_test_only.rs | 133 ++ .../tests/inc/single/single_parameter_test.rs | 204 ++ .../single_parametrized_main_gen_test.rs | 55 + .../single_parametrized_main_manual_test.rs | 236 +++ .../single_parametrized_main_test_only.rs | 136 ++ .../inc/single/single_parametrized_test.rs | 603 ++++++ .../inc/single/single_redefinition_test.rs | 12 + .../single/single_redefinition_test.stderr | 68 + .../inc/single/single_self_containing_test.rs | 13 + .../inc/single/single_with_two_args_test.rs | 6 + .../single/single_with_two_args_test.stderr | 8 + .../tests/inc/type_constructor_tests.rs | 50 + .../tests/inc/vectorized_from_test.rs | 237 +++ .../type_constructor/tests/smoke_test.rs | 14 + module/postponed/wautomata/Cargo.toml | 62 + module/postponed/wautomata/License | 22 + module/postponed/wautomata/Readme.md | 35 + .../automata_tools_trivial_sample/Cargo.toml | 9 + .../automata_tools_trivial_sample/Readme.md | 5 + .../automata_tools_trivial_sample/src/main.rs | 13 + .../postponed/wautomata/src/graph/abs/edge.rs | 65 + .../wautomata/src/graph/abs/factory.rs | 443 +++++ .../wautomata/src/graph/abs/id_generator.rs | 52 + .../wautomata/src/graph/abs/identity.rs | 104 + .../postponed/wautomata/src/graph/abs/mod.rs | 17 + .../postponed/wautomata/src/graph/abs/node.rs | 72 + .../postponed/wautomata/src/graph/algo/dfs.rs | 29 + .../postponed/wautomata/src/graph/algo/mod.rs | 5 + .../wautomata/src/graph/automata_tools_lib.rs | 20 + .../wautomata/src/graph/canonical/edge.rs | 84 + .../src/graph/canonical/factory_generative.rs | 200 ++ .../src/graph/canonical/factory_impl.rs | 266 +++ .../src/graph/canonical/factory_readable.rs | 162 ++ .../wautomata/src/graph/canonical/identity.rs | 196 ++ .../wautomata/src/graph/canonical/mod.rs | 20 + .../wautomata/src/graph/canonical/node.rs | 187 ++ .../wautomata/src/graph/graphs_tools_lib.rs | 49 + .../wautomata/src/graph/wautomata_lib.rs | 20 + .../postponed/wautomata/tests/smoke_test.rs | 14 + .../wautomata/tests/wautomata_tests.rs | 3 + module/postponed/wpublisher/Cargo.toml | 55 + module/postponed/wpublisher/License | 22 + module/postponed/wpublisher/Readme.md | 22 + module/postponed/wpublisher/src/lib.rs | 5 + .../postponed/wpublisher/tests/smoke_test.rs | 14 + module/step/meta/Cargo.toml | 10 + .../_template_procedural_macro/front/lib.rs | 46 + .../_template_procedural_macro/meta/impls.rs | 26 + .../_template_procedural_macro/meta/lib.rs | 33 + .../_template_procedural_macro/runtime/lib.rs | 38 + module/step/meta/src/module/aggregating.rs | 21 + module/step/meta/src/module/terminal.rs | 17 + module/step/meta/tests/_blank/tests.rs | 0 .../meta/tests/_conditional/local_module.rs | 17 + module/step/meta/tests/_conditional/wtools.rs | 17 + .../meta/tests/_template_alias/lib_test.rs | 2 + module/step/meta/tests/_template_alias/mod.rs | 2 + .../meta/tests/_template_blank/basic_test.rs | 19 + .../meta/tests/_template_blank/lib_test.rs | 2 + module/step/meta/tests/_template_blank/mod.rs | 2 + module/step/meta/tests/smoke_test.rs | 14 + module/template/layer/layer.rs | 57 + .../template_alias/Cargo.toml.template | 36 + module/template/template_alias/License | 22 + module/template/template_alias/Readme.md | 17 + module/template/template_alias/src/lib.rs | 8 + module/template/template_alias/src/main.rs | 12 + .../template_alias/tests/smoke_test.rs | 14 + .../template_blank/Cargo.toml.template | 36 + module/template/template_blank/License | 22 + module/template/template_blank/Readme.md | 33 + module/template/template_blank/src/lib.rs | 11 + .../template_blank/tests/inc/basic_test.rs | 7 + .../template/template_blank/tests/inc/mod.rs | 4 + .../template_blank/tests/smoke_test.rs | 14 + module/template/template_blank/tests/tests.rs | 10 + .../template_procedural_macro/Cargo.toml | 64 + .../template_procedural_macro/License | 23 + .../template_procedural_macro/Readme.md | 30 + .../tests/smoke_test.rs | 14 + .../template_procedural_macro_meta/Cargo.toml | 45 + .../template_procedural_macro_meta/License | 23 + .../template_procedural_macro_meta/Readme.md | 8 + .../tests/smoke_test.rs | 14 + .../Cargo.toml | 57 + .../template_procedural_macro_runtime/License | 23 + .../Readme.md | 6 + .../tests/smoke_test.rs | 14 + module/test/a/Cargo.toml | 12 + module/test/a/Readme.md | 3 + module/test/a/src/lib.rs | 18 + module/test/b/Cargo.toml | 12 + module/test/b/Readme.md | 3 + module/test/b/src/lib.rs | 17 + module/test/c/Cargo.toml | 9 + module/test/c/Readme.md | 3 + module/test/c/src/lib.rs | 22 + rustfmt.toml | 30 + step/eol.sh | 31 + step/pivot.sh | 28 + step/replace.censor | 14 + 2040 files changed, 149773 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/workflows/Readme.md create mode 100644 .github/workflows/appropriate_branch.yml create mode 100644 .github/workflows/appropriate_branch_beta.yml create mode 100644 .github/workflows/appropriate_branch_master.yml create mode 100644 .github/workflows/auto_merge_to_beta.yml create mode 100644 .github/workflows/auto_pr.yml create mode 100644 .github/workflows/auto_pr_to_alpha.yml create mode 100644 .github/workflows/auto_pr_to_beta.yml create mode 100644 .github/workflows/auto_pr_to_master.yml create mode 100644 .github/workflows/for_pr_rust_push.yml create mode 100644 .github/workflows/module_cargo_will_push.yml create mode 100644 .github/workflows/module_clone_dyn_meta_push.yml create mode 100644 .github/workflows/module_clone_dyn_push.yml create mode 100644 .github/workflows/module_collection_tools_push.yml create mode 100644 .github/workflows/module_crates_tools_push.yml create mode 100644 .github/workflows/module_data_type_push.yml create mode 100644 .github/workflows/module_derive_tools_meta_push.yml create mode 100644 .github/workflows/module_derive_tools_push.yml create mode 100644 .github/workflows/module_deterministic_rand_push.yml create mode 100644 .github/workflows/module_diagnostics_tools_push.yml create mode 100644 .github/workflows/module_error_tools_push.yml create mode 100644 .github/workflows/module_exe_tools_push.yml create mode 100644 .github/workflows/module_file_tools_push.yml create mode 100644 .github/workflows/module_for_each_push.yml create mode 100644 .github/workflows/module_former_meta_push.yml create mode 100644 .github/workflows/module_former_push.yml create mode 100644 .github/workflows/module_former_types_push.yml create mode 100644 .github/workflows/module_fs_tools_push.yml create mode 100644 .github/workflows/module_fundamental_data_type_push.yml create mode 100644 .github/workflows/module_graphs_tools_push.yml create mode 100644 .github/workflows/module_image_tools_push.yml create mode 100644 .github/workflows/module_implements_push.yml create mode 100644 .github/workflows/module_impls_index_meta_push.yml create mode 100644 .github/workflows/module_impls_index_push.yml create mode 100644 .github/workflows/module_include_md_push.yml create mode 100644 .github/workflows/module_inspect_type_push.yml create mode 100644 .github/workflows/module_instance_of_push.yml create mode 100644 .github/workflows/module_interval_adapter_push.yml create mode 100644 .github/workflows/module_is_slice_push.yml create mode 100644 .github/workflows/module_iter_tools_push.yml create mode 100644 .github/workflows/module_macro_tools_push.yml create mode 100644 .github/workflows/module_math_tools_push.yml create mode 100644 .github/workflows/module_mem_tools_push.yml create mode 100644 .github/workflows/module_meta_tools_push.yml create mode 100644 .github/workflows/module_mod_interface_meta_push.yml create mode 100644 .github/workflows/module_mod_interface_push.yml create mode 100644 .github/workflows/module_multilayer_push.yml create mode 100644 .github/workflows/module_optimization_tools_push.yml create mode 100644 .github/workflows/module_plot_interface_push.yml create mode 100644 .github/workflows/module_proc_macro_tools_push.yml create mode 100644 .github/workflows/module_process_tools_push.yml create mode 100644 .github/workflows/module_program_tools_push.yml create mode 100644 .github/workflows/module_proper_path_tools_push.yml create mode 100644 .github/workflows/module_proper_tools_push.yml create mode 100644 .github/workflows/module_refiner_push.yml create mode 100644 .github/workflows/module_reflect_tools_meta_push.yml create mode 100644 .github/workflows/module_reflect_tools_push.yml create mode 100644 .github/workflows/module_rustql_push.yml create mode 100644 .github/workflows/module_sqlx_query_push.yml create mode 100644 .github/workflows/module_strs_tools_push.yml create mode 100644 .github/workflows/module_test_experimental_a_push.yml create mode 100644 .github/workflows/module_test_experimental_b_push.yml create mode 100644 .github/workflows/module_test_experimental_c_push.yml create mode 100644 .github/workflows/module_test_tools_push.yml create mode 100644 .github/workflows/module_time_tools_push.yml create mode 100644 .github/workflows/module_typing_tools_push.yml create mode 100644 .github/workflows/module_unitore_push.yml create mode 100644 .github/workflows/module_variadic_from_push.yml create mode 100644 .github/workflows/module_w_4_d_push.yml create mode 100644 .github/workflows/module_wca_push.yml create mode 100644 .github/workflows/module_werror_push.yml create mode 100644 .github/workflows/module_willbe_2_push.yml create mode 100644 .github/workflows/module_willbe_old_push.yml create mode 100644 .github/workflows/module_willbe_push.yml create mode 100644 .github/workflows/module_winterval_push.yml create mode 100644 .github/workflows/module_wlang_push.yml create mode 100644 .github/workflows/module_wplot_push.yml create mode 100644 .github/workflows/module_wproc_macro_push.yml create mode 100644 .github/workflows/module_wstring_tools_push.yml create mode 100644 .github/workflows/module_wtest_basic_push.yml create mode 100644 .github/workflows/module_wtest_push.yml create mode 100644 .github/workflows/module_wtools_push.yml create mode 100644 .github/workflows/runs_clean.yml create mode 100644 .github/workflows/standard_rust_pull_request.yml create mode 100644 .github/workflows/standard_rust_push.yml create mode 100644 .github/workflows/standard_rust_scheduled.yml create mode 100644 .github/workflows/standard_rust_status.yml create mode 100644 .github/workflows/status_checks_rules_update.yml create mode 100755 .gitignore create mode 100644 .gitpod.yml create mode 100644 Cargo.toml create mode 100644 License create mode 100644 Makefile create mode 100644 Readme.md create mode 100644 asset/img/docsrs.svg create mode 100644 asset/img/graph_logo_v1_trans.ico create mode 100644 asset/img/graph_logo_v1_trans.png create mode 100644 asset/img/logo_edge_trans.png create mode 100644 asset/img/logo_trans.png create mode 100644 asset/img/logo_v2_light.png create mode 100644 asset/img/logo_v2_trans.png create mode 100644 asset/img/logo_v2_trans_rect.png create mode 100644 asset/img/logo_v2_trans_rect_small.png create mode 100644 asset/img/logo_v2_wide_trans.png create mode 100644 asset/img/logo_v3_light.png create mode 100644 asset/img/logo_v3_trans.png create mode 100644 asset/img/logo_v3_trans_square.png create mode 100644 asset/img/logo_v3_trans_square_icon_small.ico create mode 100644 asset/img/logo_v3_trans_square_icon_small.png create mode 100644 asset/img/logo_v3_trans_square_icon_small_v2.ico create mode 100644 asset/img/logo_v3_trans_square_icon_small_v2.png create mode 100644 asset/img/logo_v3_trans_wide.png create mode 100644 asset/img/logo_white.png create mode 100644 asset/test/file1 create mode 100644 asset/test/file2 create mode 100644 asset/test/file3 create mode 100644 asset/test/file4.pdf create mode 100644 asset/test/small create mode 100644 asset/test/small2 create mode 100644 asset/test/small3 create mode 100644 asset/test/small4 create mode 100644 asset/test/small5 create mode 100644 asset/test/small6 create mode 100644 asset/test/small7 create mode 100644 asset/test/test.exe create mode 100644 bash.exe.stackdump create mode 100644 debug create mode 100644 doc/DevEnvForWindows.md create mode 100644 doc/Readme.md create mode 120000 doc/modules/wca create mode 100644 doc/rust/Cd.md create mode 100644 doc/rust/LibConventions.md create mode 100644 doc/rust/Readme.md create mode 100644 doc/rust/WhatStdIsMissing.md create mode 100644 module/alias/cargo_will/Cargo.toml create mode 100644 module/alias/cargo_will/License create mode 100644 module/alias/cargo_will/Readme.md create mode 100644 module/alias/cargo_will/src/bin/cargo-will.rs create mode 100644 module/alias/cargo_will/src/bin/will.rs create mode 100644 module/alias/cargo_will/src/bin/willbe.rs create mode 100644 module/alias/cargo_will/src/lib.rs create mode 100644 module/alias/cargo_will/tests/smoke_test.rs create mode 100644 module/alias/cargo_will/tests/willbe_tests.rs create mode 100644 module/alias/file_tools/Cargo.toml create mode 100644 module/alias/file_tools/License create mode 100644 module/alias/file_tools/Readme.md create mode 100644 module/alias/file_tools/src/lib.rs create mode 100644 module/alias/file_tools/tests/smoke_test.rs create mode 100644 module/alias/fundamental_data_type/Cargo.toml create mode 100644 module/alias/fundamental_data_type/License create mode 100644 module/alias/fundamental_data_type/Readme.md create mode 100644 module/alias/fundamental_data_type/src/lib.rs create mode 100644 module/alias/fundamental_data_type/tests/smoke_test.rs create mode 100644 module/alias/fundamental_data_type/tests/tests.rs create mode 100644 module/alias/instance_of/Cargo.toml create mode 100644 module/alias/instance_of/License create mode 100644 module/alias/instance_of/Readme.md create mode 100644 module/alias/instance_of/examples/instance_of_trivial_sample/Cargo.toml create mode 100644 module/alias/instance_of/examples/instance_of_trivial_sample/src/main.rs create mode 100644 module/alias/instance_of/src/typing/implements_impl.rs create mode 100644 module/alias/instance_of/src/typing/implements_lib.rs create mode 100644 module/alias/instance_of/src/typing/inspect_type_lib.rs create mode 100644 module/alias/instance_of/src/typing/instance_of_lib.rs create mode 100644 module/alias/instance_of/src/typing/is_slice_lib.rs create mode 100644 module/alias/instance_of/src/typing/mod.rs create mode 100644 module/alias/instance_of/src/typing/typing.rs create mode 100644 module/alias/instance_of/src/typing/typing_tools_lib.rs create mode 100644 module/alias/instance_of/tests/instance_of_tests.rs create mode 100644 module/alias/instance_of/tests/smoke_test.rs create mode 100644 module/alias/multilayer/Cargo.toml create mode 100644 module/alias/multilayer/License create mode 100644 module/alias/multilayer/Readme.md create mode 100644 module/alias/multilayer/src/meta/mod_interface/front/multilayer_lib.rs create mode 100644 module/alias/multilayer/tests/multilayer_tests.rs create mode 100644 module/alias/multilayer/tests/smoke_test.rs create mode 100644 module/alias/proc_macro_tools/Cargo.toml create mode 100644 module/alias/proc_macro_tools/License create mode 100644 module/alias/proc_macro_tools/Readme.md create mode 100644 module/alias/proc_macro_tools/examples/proc_macro_tools_trivial.rs create mode 100644 module/alias/proc_macro_tools/src/lib.rs create mode 100644 module/alias/proc_macro_tools/tests/proc_macro_tool_tests.rs create mode 100644 module/alias/proc_macro_tools/tests/smoke_test.rs create mode 100644 module/alias/proper_tools/Cargo.toml create mode 100644 module/alias/proper_tools/License create mode 100644 module/alias/proper_tools/Readme.md create mode 100644 module/alias/proper_tools/src/lib.rs create mode 100644 module/alias/proper_tools/tests/smoke_test.rs create mode 100644 module/alias/werror/Cargo.toml create mode 100644 module/alias/werror/License create mode 100644 module/alias/werror/Readme.md create mode 100644 module/alias/werror/examples/werror_tools_trivial.rs create mode 100644 module/alias/werror/src/lib.rs create mode 100644 module/alias/werror/tests/smoke_test.rs create mode 100644 module/alias/werror/tests/werror_tests.rs create mode 100644 module/alias/willbe2/Cargo.toml create mode 100644 module/alias/willbe2/License create mode 100644 module/alias/willbe2/Readme.md create mode 100644 module/alias/willbe2/src/lib.rs create mode 100644 module/alias/willbe2/src/main.rs create mode 100644 module/alias/willbe2/tests/smoke_test.rs create mode 100644 module/alias/winterval/Cargo.toml create mode 100644 module/alias/winterval/License create mode 100644 module/alias/winterval/Readme.md create mode 100644 module/alias/winterval/examples/winterval_more.rs create mode 100644 module/alias/winterval/examples/winterval_non_iterable.rs create mode 100644 module/alias/winterval/examples/winterval_trivial.rs create mode 100644 module/alias/winterval/src/lib.rs create mode 100644 module/alias/winterval/tests/interval_tests.rs create mode 100644 module/alias/winterval/tests/smoke_test.rs create mode 100644 module/alias/wproc_macro/Cargo.toml create mode 100644 module/alias/wproc_macro/License create mode 100644 module/alias/wproc_macro/Readme.md create mode 100644 module/alias/wproc_macro/src/lib.rs create mode 100644 module/alias/wproc_macro/tests/smoke_test.rs create mode 100644 module/alias/wproc_macro/tests/wproc_macro_tests.rs create mode 100644 module/alias/wstring_tools/Cargo.toml create mode 100644 module/alias/wstring_tools/License create mode 100644 module/alias/wstring_tools/Readme.md create mode 100644 module/alias/wstring_tools/examples/wstring_toolst_trivial_sample.rs create mode 100644 module/alias/wstring_tools/src/lib.rs create mode 100644 module/alias/wstring_tools/tests/smoke_test.rs create mode 100644 module/alias/wstring_tools/tests/wstring_tools_tests.rs create mode 100644 module/alias/wtest/Cargo.toml create mode 100644 module/alias/wtest/License create mode 100644 module/alias/wtest/Readme.md create mode 100644 module/alias/wtest/examples/wtest_trivial_sample.rs create mode 100644 module/alias/wtest/src/test/commands/init.rs create mode 100644 module/alias/wtest/src/test/commands/mod.rs create mode 100644 module/alias/wtest/src/test/commands/smoke.rs create mode 100644 module/alias/wtest/src/test/lib.rs create mode 100644 module/alias/wtest/src/test/main.rs create mode 100644 module/alias/wtest/tests/smoke_test.rs create mode 100644 module/alias/wtest/tests/wtest_basic_tests.rs create mode 100644 module/alias/wtest_basic/Cargo.toml create mode 100644 module/alias/wtest_basic/License create mode 100644 module/alias/wtest_basic/Readme.md create mode 100644 module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Cargo.toml create mode 100644 module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Readme.md create mode 100644 module/alias/wtest_basic/examples/wtest_basic_trivial_sample/src/main.rs create mode 100644 module/alias/wtest_basic/examples/wtest_basic_trivial_sample/test/trivial_test.rs create mode 100644 module/alias/wtest_basic/src/_blank/empty_lib.rs create mode 100644 module/alias/wtest_basic/src/_blank/standard_lib.rs create mode 100644 module/alias/wtest_basic/src/test/basic/helper.rs create mode 100644 module/alias/wtest_basic/src/test/basic/mod.rs create mode 100644 module/alias/wtest_basic/src/test/wtest_basic_lib.rs create mode 100644 module/alias/wtest_basic/tests/smoke_test.rs create mode 100644 module/alias/wtest_basic/tests/wtest_basic_tests.rs create mode 100644 module/blank/exe_tools/Cargo.toml create mode 100644 module/blank/exe_tools/License create mode 100644 module/blank/exe_tools/Readme.md create mode 100644 module/blank/exe_tools/src/lib.rs create mode 100644 module/blank/exe_tools/tests/inc/basic_test.rs create mode 100644 module/blank/exe_tools/tests/inc/mod.rs create mode 100644 module/blank/exe_tools/tests/smoke_test.rs create mode 100644 module/blank/exe_tools/tests/tests.rs create mode 100644 module/blank/image_tools/Cargo.toml create mode 100644 module/blank/image_tools/License create mode 100644 module/blank/image_tools/Readme.md create mode 100644 module/blank/image_tools/src/lib.rs create mode 100644 module/blank/image_tools/tests/smoke_test.rs create mode 100644 module/blank/math_tools/Cargo.toml create mode 100644 module/blank/math_tools/License create mode 100644 module/blank/math_tools/Readme.md create mode 100644 module/blank/math_tools/src/lib.rs create mode 100644 module/blank/math_tools/tests/smoke_test.rs create mode 100644 module/blank/rustql/Cargo.toml create mode 100644 module/blank/rustql/License create mode 100644 module/blank/rustql/Readme.md create mode 100644 module/blank/rustql/src/lib.rs create mode 100644 module/blank/rustql/tests/inc/basic_test.rs create mode 100644 module/blank/rustql/tests/inc/mod.rs create mode 100644 module/blank/rustql/tests/smoke_test.rs create mode 100644 module/blank/rustql/tests/tests.rs create mode 100644 module/blank/w4d/Cargo.toml create mode 100644 module/blank/w4d/License create mode 100644 module/blank/w4d/Readme.md create mode 100644 module/blank/w4d/src/lib.rs create mode 100644 module/blank/w4d/tests/smoke_test.rs create mode 100644 module/blank/willbe_old/Cargo.toml create mode 100644 module/blank/willbe_old/License create mode 100644 module/blank/willbe_old/Readme.md create mode 100644 module/blank/willbe_old/src/willbe_old/commands/each.rs create mode 100644 module/blank/willbe_old/src/willbe_old/commands/end.rs create mode 100644 module/blank/willbe_old/src/willbe_old/commands/init.rs create mode 100644 module/blank/willbe_old/src/willbe_old/commands/mod.rs create mode 100644 module/blank/willbe_old/src/willbe_old/commands/package/info.rs create mode 100644 module/blank/willbe_old/src/willbe_old/commands/package/mod.rs create mode 100644 module/blank/willbe_old/src/willbe_old/commands/package/publish.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/entities/mod.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/entities/package/metadata.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/entities/package/mod.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/entities/package/package.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/entities/package/verification.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/entities/utility.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/entities/workspace.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/iterators.rs create mode 100644 module/blank/willbe_old/src/willbe_old/core/mod.rs create mode 100644 module/blank/willbe_old/src/willbe_old/files.rs create mode 100644 module/blank/willbe_old/src/willbe_old/willbe_entry.rs create mode 100644 module/blank/willbe_old/src/willbe_old/willbe_lib.rs create mode 100644 module/blank/willbe_old/tests/smoke_test.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/empty/.gitignore create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package/License create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package/Readme.md create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package/src/main.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/main.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/Cargo.toml create mode 100644 module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/src/lib.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/from.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/integration/each.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/integration/info.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/integration/mod.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/iterator.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/metadata.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/mod.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/ordering/mod.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/ordering/through_workspaces.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/ordering/workspace.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/tests/verification.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/utility.rs create mode 100644 module/blank/willbe_old/tests/willbe_old/willbe_test.rs create mode 100644 module/blank/wlang/Cargo.toml create mode 100644 module/blank/wlang/License create mode 100644 module/blank/wlang/Readme.md create mode 100644 module/blank/wlang/src/empty_lib.rs create mode 100644 module/blank/wlang/src/standard_lib.rs create mode 100644 module/blank/wlang/tests/smoke_test.rs create mode 100644 module/blank/wlang/tests/tests.rs create mode 100644 module/core/clone_dyn/Cargo.toml create mode 100644 module/core/clone_dyn/License create mode 100644 module/core/clone_dyn/Readme.md create mode 100644 module/core/clone_dyn/examples/clone_dyn_trivial.rs create mode 100644 module/core/clone_dyn/src/lib.rs create mode 100644 module/core/clone_dyn/tests/inc/mod.rs create mode 100644 module/core/clone_dyn/tests/smoke_test.rs create mode 100644 module/core/clone_dyn/tests/tests.rs create mode 100644 module/core/clone_dyn_meta/Cargo.toml create mode 100644 module/core/clone_dyn_meta/License create mode 100644 module/core/clone_dyn_meta/Readme.md create mode 100644 module/core/clone_dyn_meta/src/derive.rs create mode 100644 module/core/clone_dyn_meta/src/lib.rs create mode 100644 module/core/clone_dyn_meta/tests/smoke_test.rs create mode 100644 module/core/collection_tools/Cargo.toml create mode 100644 module/core/collection_tools/License create mode 100644 module/core/collection_tools/Readme.md create mode 100644 module/core/collection_tools/examples/collection_tools_trivial.rs create mode 100644 module/core/collection_tools/src/collections.rs create mode 100644 module/core/collection_tools/src/collections/bmap.rs create mode 100644 module/core/collection_tools/src/collections/bset.rs create mode 100644 module/core/collection_tools/src/collections/heap.rs create mode 100644 module/core/collection_tools/src/collections/hmap.rs create mode 100644 module/core/collection_tools/src/collections/hset.rs create mode 100644 module/core/collection_tools/src/collections/list.rs create mode 100644 module/core/collection_tools/src/collections/vec.rs create mode 100644 module/core/collection_tools/src/collections/vecd.rs create mode 100644 module/core/collection_tools/src/lib.rs create mode 100644 module/core/collection_tools/tests/inc/bmap.rs create mode 100644 module/core/collection_tools/tests/inc/bset.rs create mode 100644 module/core/collection_tools/tests/inc/components.rs create mode 100644 module/core/collection_tools/tests/inc/heap.rs create mode 100644 module/core/collection_tools/tests/inc/hmap.rs create mode 100644 module/core/collection_tools/tests/inc/hset.rs create mode 100644 module/core/collection_tools/tests/inc/list.rs create mode 100644 module/core/collection_tools/tests/inc/mod.rs create mode 100644 module/core/collection_tools/tests/inc/vec.rs create mode 100644 module/core/collection_tools/tests/inc/vecd.rs create mode 100644 module/core/collection_tools/tests/smoke_test.rs create mode 100644 module/core/collection_tools/tests/tests.rs create mode 100644 module/core/data_type/Cargo.toml create mode 100644 module/core/data_type/License create mode 100644 module/core/data_type/Readme.md create mode 100644 module/core/data_type/examples/data_type_trivial.rs create mode 100644 module/core/data_type/src/dt.rs create mode 100644 module/core/data_type/src/lib.rs create mode 100644 module/core/data_type/tests/inc/either_test.rs create mode 100644 module/core/data_type/tests/inc/mod.rs create mode 100644 module/core/data_type/tests/smoke_test.rs create mode 100644 module/core/data_type/tests/tests.rs create mode 100644 module/core/derive_tools/Cargo.toml create mode 100644 module/core/derive_tools/License create mode 100644 module/core/derive_tools/Readme.md create mode 100644 module/core/derive_tools/build.rs create mode 100644 module/core/derive_tools/examples/derive_tools_trivial.rs create mode 100644 module/core/derive_tools/src/lib.rs create mode 100644 module/core/derive_tools/tests/inc/all_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/all_test.rs create mode 100644 module/core/derive_tools/tests/inc/as_mut_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/as_mut_test.rs create mode 100644 module/core/derive_tools/tests/inc/as_ref_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/as_ref_test.rs create mode 100644 module/core/derive_tools/tests/inc/basic_test.rs create mode 100644 module/core/derive_tools/tests/inc/deref/bounds_inlined.rs create mode 100644 module/core/derive_tools/tests/inc/deref/bounds_inlined_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/bounds_mixed.rs create mode 100644 module/core/derive_tools/tests/inc/deref/bounds_mixed_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/bounds_where.rs create mode 100644 module/core/derive_tools/tests/inc/deref/bounds_where_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_named_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_named_empty_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_named_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_tuple_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_tuple_empty_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_tuple_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_unit.rs create mode 100644 module/core/derive_tools/tests/inc/deref/enum_unit_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_constants.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_constants_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_constants_default_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_constants_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_lifetimes.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_lifetimes_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_types.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_types_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_types_default_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/generics_types_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/name_collisions.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/bounds_inlined.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/bounds_mixed.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/bounds_where.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/enum_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/enum_named_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/enum_unit.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/generics_constants.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/generics_constants_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/generics_lifetimes.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/generics_types.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/generics_types_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/name_collisions.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/struct_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/struct_named_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/only_tests/struct_unit.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_named_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_named_empty_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_named_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_tuple_empty.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_tuple_empty_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_tuple_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_unit.rs create mode 100644 module/core/derive_tools/tests/inc/deref/struct_unit_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/bounds_inlined.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/bounds_inlined_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/bounds_mixed.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/bounds_mixed_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/bounds_where.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/bounds_where_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/enum_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/enum_named_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/enum_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/enum_tuple_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_constants.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_constants_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_constants_default_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_constants_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_types.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_types_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_types_default_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/generics_types_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/name_collisions.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_inlined.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_mixed.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_where.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_lifetimes.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types_default.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/name_collisions.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/struct_named.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/struct_named_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/struct_tuple.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut/struct_tuple_manual.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/deref_mut_test.rs create mode 100644 module/core/derive_tools/tests/inc/deref_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/multiple_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/multiple_named_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/multiple_named_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/multiple_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/named_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/named_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/basic.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/multiple.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/multiple_named.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/named.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/unit.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/variants.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/variants_duplicates.rs create mode 100644 module/core/derive_tools/tests/inc/from/only_test/variants_generics.rs create mode 100644 module/core/derive_tools/tests/inc/from/test.rs create mode 100644 module/core/derive_tools/tests/inc/from/unit_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/unit_test.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_collisions.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_derive.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_duplicates_all_off.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_duplicates_some_off.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_duplicates_some_off_default_off.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_generics.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_generics_where.rs create mode 100644 module/core/derive_tools/tests/inc/from/variants_manual.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/multiple_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/multiple_named_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/multiple_named_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/multiple_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/named_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/named_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/only_test/basic.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/only_test/multiple.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/only_test/multiple_named.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/only_test/named.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/only_test/unit.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/unit_manual_test.rs create mode 100644 module/core/derive_tools/tests/inc/inner_from/unit_test.rs create mode 100644 module/core/derive_tools/tests/inc/mod.rs create mode 100644 module/core/derive_tools/tests/inc/only_test/all.rs create mode 100644 module/core/derive_tools/tests/inc/only_test/as_mut.rs create mode 100644 module/core/derive_tools/tests/inc/only_test/as_ref.rs create mode 100644 module/core/derive_tools/tests/inc/only_test/deref.rs create mode 100644 module/core/derive_tools/tests/inc/only_test/deref_mut.rs create mode 100644 module/core/derive_tools/tests/smoke_test.rs create mode 100644 module/core/derive_tools/tests/tests.rs create mode 100644 module/core/derive_tools_meta/Cargo.toml create mode 100644 module/core/derive_tools_meta/License create mode 100644 module/core/derive_tools_meta/Readme.md create mode 100644 module/core/derive_tools_meta/src/derive.rs create mode 100644 module/core/derive_tools_meta/src/derive/as_mut.rs create mode 100644 module/core/derive_tools_meta/src/derive/as_ref.rs create mode 100644 module/core/derive_tools_meta/src/derive/deref.rs create mode 100644 module/core/derive_tools_meta/src/derive/deref_mut.rs create mode 100644 module/core/derive_tools_meta/src/derive/from.rs create mode 100644 module/core/derive_tools_meta/src/derive/from/field_attributes.rs create mode 100644 module/core/derive_tools_meta/src/derive/from/item_attributes.rs create mode 100644 module/core/derive_tools_meta/src/derive/inner_from.rs create mode 100644 module/core/derive_tools_meta/src/derive/new.rs create mode 100644 module/core/derive_tools_meta/src/derive/variadic_from.rs create mode 100644 module/core/derive_tools_meta/src/lib.rs create mode 100644 module/core/derive_tools_meta/tests/smoke_test.rs create mode 100644 module/core/diagnostics_tools/Cargo.toml create mode 100644 module/core/diagnostics_tools/License create mode 100644 module/core/diagnostics_tools/Readme.md create mode 100644 module/core/diagnostics_tools/examples/diagnostics_tools_trivial.rs create mode 100644 module/core/diagnostics_tools/src/diag/cta.rs create mode 100644 module/core/diagnostics_tools/src/diag/layout.rs create mode 100644 module/core/diagnostics_tools/src/diag/mod.rs create mode 100644 module/core/diagnostics_tools/src/diag/rta.rs create mode 100644 module/core/diagnostics_tools/src/lib.rs create mode 100644 module/core/diagnostics_tools/tests/diagnostics_tests.rs create mode 100644 module/core/diagnostics_tools/tests/inc/cta_test.rs create mode 100644 module/core/diagnostics_tools/tests/inc/layout_test.rs create mode 100644 module/core/diagnostics_tools/tests/inc/mod.rs create mode 100644 module/core/diagnostics_tools/tests/inc/rta_test.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.stderr create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.stderr create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.stderr create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.stderr create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.stderr create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/rta_id.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.stderr create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/rta_not_id.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.rs create mode 100644 module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.stderr create mode 100644 module/core/diagnostics_tools/tests/smoke_test.rs create mode 100644 module/core/error_tools/Cargo.toml create mode 100644 module/core/error_tools/License create mode 100644 module/core/error_tools/Readme.md create mode 100644 module/core/error_tools/examples/error_tools_trivial.rs create mode 100644 module/core/error_tools/src/assert.rs create mode 100644 module/core/error_tools/src/error.rs create mode 100644 module/core/error_tools/src/lib.rs create mode 100644 module/core/error_tools/src/result.rs create mode 100644 module/core/error_tools/tests/error_tools_tests.rs create mode 100644 module/core/error_tools/tests/inc/assert_test.rs create mode 100644 module/core/error_tools/tests/inc/basic_test.rs create mode 100644 module/core/error_tools/tests/inc/for_app_test.rs create mode 100644 module/core/error_tools/tests/inc/mod.rs create mode 100644 module/core/error_tools/tests/smoke_test.rs create mode 100644 module/core/for_each/Cargo.toml create mode 100644 module/core/for_each/License create mode 100644 module/core/for_each/Readme.md create mode 100644 module/core/for_each/examples/for_each_map_style_sample.rs create mode 100644 module/core/for_each/examples/for_each_trivial.rs create mode 100644 module/core/for_each/src/lib.rs create mode 100644 module/core/for_each/tests/for_each_tests.rs create mode 100644 module/core/for_each/tests/inc/for_each_test.rs create mode 100644 module/core/for_each/tests/inc/mod.rs create mode 100644 module/core/for_each/tests/smoke_test.rs create mode 100644 module/core/former/Cargo.toml create mode 100644 module/core/former/License create mode 100644 module/core/former/Readme.md create mode 100644 module/core/former/examples/former_collection_hashmap.rs create mode 100644 module/core/former/examples/former_collection_hashset.rs create mode 100644 module/core/former/examples/former_collection_vector.rs create mode 100644 module/core/former/examples/former_component_from.rs create mode 100644 module/core/former/examples/former_custom_collection.rs create mode 100644 module/core/former/examples/former_custom_defaults.rs create mode 100644 module/core/former/examples/former_custom_definition.rs create mode 100644 module/core/former/examples/former_custom_mutator.rs create mode 100644 module/core/former/examples/former_custom_scalar_setter.rs create mode 100644 module/core/former/examples/former_custom_setter.rs create mode 100644 module/core/former/examples/former_custom_setter_overriden.rs create mode 100644 module/core/former/examples/former_custom_subform_collection.rs create mode 100644 module/core/former/examples/former_custom_subform_entry.rs create mode 100644 module/core/former/examples/former_custom_subform_entry2.rs create mode 100644 module/core/former/examples/former_custom_subform_scalar.rs create mode 100644 module/core/former/examples/former_debug.rs create mode 100644 module/core/former/examples/former_many_fields.rs create mode 100644 module/core/former/examples/former_trivial.rs create mode 100644 module/core/former/examples/former_trivial_expaned.rs create mode 100644 module/core/former/src/lib.rs create mode 100644 module/core/former/tests/experimental.rs create mode 100644 module/core/former/tests/inc/components_tests/compiletime/components_component_from_debug.rs create mode 100644 module/core/former/tests/inc/components_tests/component_assign.rs create mode 100644 module/core/former/tests/inc/components_tests/component_assign_manual.rs create mode 100644 module/core/former/tests/inc/components_tests/component_from.rs create mode 100644 module/core/former/tests/inc/components_tests/component_from_manual.rs create mode 100644 module/core/former/tests/inc/components_tests/components_assign.rs create mode 100644 module/core/former/tests/inc/components_tests/components_assign_manual.rs create mode 100644 module/core/former/tests/inc/components_tests/composite.rs create mode 100644 module/core/former/tests/inc/components_tests/composite_manual.rs create mode 100644 module/core/former/tests/inc/components_tests/from_components.rs create mode 100644 module/core/former/tests/inc/components_tests/from_components_manual.rs create mode 100644 module/core/former/tests/inc/components_tests/only_test/component_assign.rs create mode 100644 module/core/former/tests/inc/components_tests/only_test/component_from.rs create mode 100644 module/core/former/tests/inc/components_tests/only_test/components_assign.rs create mode 100644 module/core/former/tests/inc/components_tests/only_test/composite.rs create mode 100644 module/core/former/tests/inc/components_tests/only_test/from_components.rs create mode 100644 module/core/former/tests/inc/former_tests/a_basic.rs create mode 100644 module/core/former/tests/inc/former_tests/a_basic_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/a_primitives.rs create mode 100644 module/core/former/tests/inc/former_tests/a_primitives_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_alias.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_default_collection.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_default_conflict.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_default_primitive.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_feature.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_multiple.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_perform.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_setter.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_storage_with_end.rs create mode 100644 module/core/former/tests/inc/former_tests/attribute_storage_with_mutator.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_binary_heap.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_btree_map.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_btree_set.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_common.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_hashmap.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_hashset.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_linked_list.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_vec.rs create mode 100644 module/core/former/tests/inc/former_tests/collection_former_vec_deque.rs create mode 100644 module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.rs create mode 100644 module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.stderr create mode 100644 module/core/former/tests/inc/former_tests/compiletime/hashmap_without_parameter.rs create mode 100644 module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.rs create mode 100644 module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.stderr create mode 100644 module/core/former/tests/inc/former_tests/compiletime/vector_without_parameter.rs create mode 100644 module/core/former/tests/inc/former_tests/default_user_type.rs create mode 100644 module/core/former/tests/inc/former_tests/name_collision_context.rs create mode 100644 module/core/former/tests/inc/former_tests/name_collision_core.rs create mode 100644 module/core/former/tests/inc/former_tests/name_collision_end.rs create mode 100644 module/core/former/tests/inc/former_tests/name_collision_former_hashmap_without_parameter.rs create mode 100644 module/core/former/tests/inc/former_tests/name_collision_former_vector_without_parameter.rs create mode 100644 module/core/former/tests/inc/former_tests/name_collision_on_end.rs create mode 100644 module/core/former/tests/inc/former_tests/name_collisions.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/basic.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/collections_with_subformer.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/collections_without_subformer.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/parametrized_field.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/parametrized_struct.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/primitives.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/scalar_children.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/scalar_children3.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/string_slice.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/subform_basic.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/subform_collection.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/subform_collection_children2.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/subform_entry_child.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/subform_entry_children2.rs create mode 100644 module/core/former/tests/inc/former_tests/only_test/subform_scalar.rs create mode 100644 module/core/former/tests/inc/former_tests/parametrized_field.rs create mode 100644 module/core/former/tests/inc/former_tests/parametrized_field_where.rs create mode 100644 module/core/former/tests/inc/former_tests/parametrized_slice.rs create mode 100644 module/core/former/tests/inc/former_tests/parametrized_slice_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/parametrized_struct_imm.rs create mode 100644 module/core/former/tests/inc/former_tests/parametrized_struct_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/parametrized_struct_where.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_all.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_all_parametrized.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_all_private.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_basic.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_basic_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_basic_scalar.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_custom.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_implicit.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_named.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_playground.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_setter_off.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_collection_setter_on.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry_hashmap.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry_hashmap_custom.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry_named.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry_named_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry_setter_off.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_entry_setter_on.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_scalar.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_scalar_manual.rs create mode 100644 module/core/former/tests/inc/former_tests/subform_scalar_name.rs create mode 100644 module/core/former/tests/inc/former_tests/tuple_struct.rs create mode 100644 module/core/former/tests/inc/former_tests/unsigned_primitive_types.rs create mode 100644 module/core/former/tests/inc/former_tests/user_type_no_debug.rs create mode 100644 module/core/former/tests/inc/former_tests/user_type_no_default.rs create mode 100644 module/core/former/tests/inc/former_tests/visibility.rs create mode 100644 module/core/former/tests/inc/mod.rs create mode 100644 module/core/former/tests/smoke_test.rs create mode 100644 module/core/former/tests/tests.rs create mode 100644 module/core/former_meta/Cargo.toml create mode 100644 module/core/former_meta/License create mode 100644 module/core/former_meta/Readme.md create mode 100644 module/core/former_meta/src/component/component_assign.rs create mode 100644 module/core/former_meta/src/component/component_from.rs create mode 100644 module/core/former_meta/src/component/components_assign.rs create mode 100644 module/core/former_meta/src/component/from_components.rs create mode 100644 module/core/former_meta/src/derive_former.rs create mode 100644 module/core/former_meta/src/derive_former/field.rs create mode 100644 module/core/former_meta/src/derive_former/field_attrs.rs create mode 100644 module/core/former_meta/src/derive_former/struct_attrs.rs create mode 100644 module/core/former_meta/src/lib.rs create mode 100644 module/core/former_meta/tests/smoke_test.rs create mode 100644 module/core/former_types/Cargo.toml create mode 100644 module/core/former_types/License create mode 100644 module/core/former_types/Readme.md create mode 100644 module/core/former_types/examples/former_types_trivial.rs create mode 100644 module/core/former_types/src/axiomatic.rs create mode 100644 module/core/former_types/src/collection.rs create mode 100644 module/core/former_types/src/collection/binary_heap.rs create mode 100644 module/core/former_types/src/collection/btree_map.rs create mode 100644 module/core/former_types/src/collection/btree_set.rs create mode 100644 module/core/former_types/src/collection/hash_map.rs create mode 100644 module/core/former_types/src/collection/hash_set.rs create mode 100644 module/core/former_types/src/collection/linked_list.rs create mode 100644 module/core/former_types/src/collection/vector.rs create mode 100644 module/core/former_types/src/collection/vector_deque.rs create mode 100644 module/core/former_types/src/component.rs create mode 100644 module/core/former_types/src/definition.rs create mode 100644 module/core/former_types/src/forming.rs create mode 100644 module/core/former_types/src/lib.rs create mode 100644 module/core/former_types/src/storage.rs create mode 100644 module/core/former_types/tests/inc/mod.rs create mode 100644 module/core/former_types/tests/smoke_test.rs create mode 100644 module/core/former_types/tests/tests.rs create mode 100644 module/core/fs_tools/Cargo.toml create mode 100644 module/core/fs_tools/License create mode 100644 module/core/fs_tools/Readme.md create mode 100644 module/core/fs_tools/src/fs/fs.rs create mode 100644 module/core/fs_tools/src/fs/lib.rs create mode 100644 module/core/fs_tools/tests/inc/basic_test.rs create mode 100644 module/core/fs_tools/tests/inc/mod.rs create mode 100644 module/core/fs_tools/tests/smoke_test.rs create mode 100644 module/core/fs_tools/tests/tests.rs create mode 100644 module/core/implements/Cargo.toml create mode 100644 module/core/implements/License create mode 100644 module/core/implements/Readme.md create mode 100644 module/core/implements/examples/implements_trivial.rs create mode 100644 module/core/implements/src/implements_impl.rs create mode 100644 module/core/implements/src/lib.rs create mode 100644 module/core/implements/tests/implements_tests.rs create mode 100644 module/core/implements/tests/inc/implements_test.rs create mode 100644 module/core/implements/tests/inc/mod.rs create mode 100644 module/core/implements/tests/smoke_test.rs create mode 100644 module/core/impls_index/Cargo.toml create mode 100644 module/core/impls_index/License create mode 100644 module/core/impls_index/Readme.md create mode 100644 module/core/impls_index/examples/impls_index_trivial.rs create mode 100644 module/core/impls_index/src/impls_index/func.rs create mode 100644 module/core/impls_index/src/impls_index/impls.rs create mode 100644 module/core/impls_index/src/impls_index/mod.rs create mode 100644 module/core/impls_index/src/lib.rs create mode 100644 module/core/impls_index/tests/experiment.rs create mode 100644 module/core/impls_index/tests/inc/func_test.rs create mode 100644 module/core/impls_index/tests/inc/impls1_test.rs create mode 100644 module/core/impls_index/tests/inc/impls2_test.rs create mode 100644 module/core/impls_index/tests/inc/impls3_test.rs create mode 100644 module/core/impls_index/tests/inc/impls_basic_test.rs create mode 100644 module/core/impls_index/tests/inc/index_test.rs create mode 100644 module/core/impls_index/tests/inc/mod.rs create mode 100644 module/core/impls_index/tests/inc/tests_index_test.rs create mode 100644 module/core/impls_index/tests/smoke_test.rs create mode 100644 module/core/impls_index/tests/tests.rs create mode 100644 module/core/impls_index_meta/Cargo.toml create mode 100644 module/core/impls_index_meta/License create mode 100644 module/core/impls_index_meta/Readme.md create mode 100644 module/core/impls_index_meta/src/impls.rs create mode 100644 module/core/impls_index_meta/src/lib.rs create mode 100644 module/core/include_md/Cargo.toml create mode 100644 module/core/include_md/License create mode 100644 module/core/include_md/Readme.md create mode 100644 module/core/include_md/src/_blank/empty_lib.rs create mode 100644 module/core/include_md/src/_blank/standard_lib.rs create mode 100644 module/core/include_md/tests/smoke_test.rs create mode 100644 module/core/inspect_type/Cargo.toml create mode 100644 module/core/inspect_type/License create mode 100644 module/core/inspect_type/Readme.md create mode 100644 module/core/inspect_type/build.rs create mode 100644 module/core/inspect_type/examples/inspect_type_trivial.rs create mode 100644 module/core/inspect_type/src/lib.rs create mode 100644 module/core/inspect_type/tests/inc/inspect_type_test.rs create mode 100644 module/core/inspect_type/tests/inc/mod.rs create mode 100644 module/core/inspect_type/tests/smoke_test.rs create mode 100644 module/core/inspect_type/tests/tests.rs create mode 100644 module/core/interval_adapter/Cargo.toml create mode 100644 module/core/interval_adapter/License create mode 100644 module/core/interval_adapter/Readme.md create mode 100644 module/core/interval_adapter/examples/interval_adapter_more.rs create mode 100644 module/core/interval_adapter/examples/interval_adapter_non_iterable.rs create mode 100644 module/core/interval_adapter/examples/interval_adapter_trivial.rs create mode 100644 module/core/interval_adapter/src/lib.rs create mode 100644 module/core/interval_adapter/tests/inc/mod.rs create mode 100644 module/core/interval_adapter/tests/interval_tests.rs create mode 100644 module/core/interval_adapter/tests/smoke_test.rs create mode 100644 module/core/is_slice/Cargo.toml create mode 100644 module/core/is_slice/License create mode 100644 module/core/is_slice/Readme.md create mode 100644 module/core/is_slice/examples/is_slice_trivial.rs create mode 100644 module/core/is_slice/src/lib.rs create mode 100644 module/core/is_slice/tests/inc/is_slice_test.rs create mode 100644 module/core/is_slice/tests/inc/mod.rs create mode 100644 module/core/is_slice/tests/is_slice_tests.rs create mode 100644 module/core/is_slice/tests/smoke_test.rs create mode 100644 module/core/iter_tools/Cargo.toml create mode 100644 module/core/iter_tools/License create mode 100644 module/core/iter_tools/Readme.md create mode 100644 module/core/iter_tools/examples/iter_tools_trivial.rs create mode 100644 module/core/iter_tools/src/iter.rs create mode 100644 module/core/iter_tools/src/lib.rs create mode 100644 module/core/iter_tools/tests/inc/basic_test.rs create mode 100644 module/core/iter_tools/tests/inc/mod.rs create mode 100644 module/core/iter_tools/tests/smoke_test.rs create mode 100644 module/core/iter_tools/tests/tests.rs create mode 100644 module/core/macro_tools/Cargo.toml create mode 100644 module/core/macro_tools/License create mode 100644 module/core/macro_tools/Readme.md create mode 100644 module/core/macro_tools/examples/macro_tools_attr_prop.rs create mode 100644 module/core/macro_tools/examples/macro_tools_trivial.rs create mode 100644 module/core/macro_tools/src/attr.rs create mode 100644 module/core/macro_tools/src/attr_prop.rs create mode 100644 module/core/macro_tools/src/attr_prop/boolean.rs create mode 100644 module/core/macro_tools/src/attr_prop/boolean_optional.rs create mode 100644 module/core/macro_tools/src/attr_prop/singletone.rs create mode 100644 module/core/macro_tools/src/attr_prop/singletone_optional.rs create mode 100644 module/core/macro_tools/src/attr_prop/syn.rs create mode 100644 module/core/macro_tools/src/attr_prop/syn_optional.rs create mode 100644 module/core/macro_tools/src/container_kind.rs create mode 100644 module/core/macro_tools/src/derive.rs create mode 100644 module/core/macro_tools/src/diag.rs create mode 100644 module/core/macro_tools/src/drop.rs create mode 100644 module/core/macro_tools/src/equation.rs create mode 100644 module/core/macro_tools/src/generic_args.rs create mode 100644 module/core/macro_tools/src/generic_params.rs create mode 100644 module/core/macro_tools/src/item.rs create mode 100644 module/core/macro_tools/src/item_struct.rs create mode 100644 module/core/macro_tools/src/iter.rs create mode 100644 module/core/macro_tools/src/lib.rs create mode 100644 module/core/macro_tools/src/name.rs create mode 100644 module/core/macro_tools/src/phantom.rs create mode 100644 module/core/macro_tools/src/punctuated.rs create mode 100644 module/core/macro_tools/src/quantifier.rs create mode 100644 module/core/macro_tools/src/struct_like.rs create mode 100644 module/core/macro_tools/src/tokens.rs create mode 100644 module/core/macro_tools/src/typ.rs create mode 100644 module/core/macro_tools/tests/inc/attr_prop_test.rs create mode 100644 module/core/macro_tools/tests/inc/attr_test.rs create mode 100644 module/core/macro_tools/tests/inc/basic_test.rs create mode 100644 module/core/macro_tools/tests/inc/container_kind_test.rs create mode 100644 module/core/macro_tools/tests/inc/derive_test.rs create mode 100644 module/core/macro_tools/tests/inc/diag_test.rs create mode 100644 module/core/macro_tools/tests/inc/drop_test.rs create mode 100644 module/core/macro_tools/tests/inc/equation_test.rs create mode 100644 module/core/macro_tools/tests/inc/generic_args_test.rs create mode 100644 module/core/macro_tools/tests/inc/generic_params_test.rs create mode 100644 module/core/macro_tools/tests/inc/item_struct_test.rs create mode 100644 module/core/macro_tools/tests/inc/item_test.rs create mode 100644 module/core/macro_tools/tests/inc/mod.rs create mode 100644 module/core/macro_tools/tests/inc/phantom_test.rs create mode 100644 module/core/macro_tools/tests/inc/quantifier_test.rs create mode 100644 module/core/macro_tools/tests/inc/struct_like_test.rs create mode 100644 module/core/macro_tools/tests/inc/syntax_test.rs create mode 100644 module/core/macro_tools/tests/inc/tokens_test.rs create mode 100644 module/core/macro_tools/tests/inc/typ_Test.rs create mode 100644 module/core/macro_tools/tests/smoke_test.rs create mode 100644 module/core/macro_tools/tests/tests.rs create mode 100644 module/core/mem_tools/Cargo.toml create mode 100644 module/core/mem_tools/License create mode 100644 module/core/mem_tools/Readme.md create mode 100644 module/core/mem_tools/examples/mem_tools_trivial.rs create mode 100644 module/core/mem_tools/src/lib.rs create mode 100644 module/core/mem_tools/src/mem.rs create mode 100644 module/core/mem_tools/tests/inc/mem_test.rs create mode 100644 module/core/mem_tools/tests/inc/mod.rs create mode 100644 module/core/mem_tools/tests/mem_tools_tests.rs create mode 100644 module/core/mem_tools/tests/smoke_test.rs create mode 100644 module/core/meta_tools/Cargo.toml create mode 100644 module/core/meta_tools/License create mode 100644 module/core/meta_tools/Readme.md create mode 100644 module/core/meta_tools/examples/meta_tools_trivial.rs create mode 100644 module/core/meta_tools/src/lib.rs create mode 100644 module/core/meta_tools/src/meta.rs create mode 100644 module/core/meta_tools/tests/inc/indents_concat_test.rs create mode 100644 module/core/meta_tools/tests/inc/meta_constructor_test.rs create mode 100644 module/core/meta_tools/tests/inc/mod.rs create mode 100644 module/core/meta_tools/tests/meta_tools_tests.rs create mode 100644 module/core/meta_tools/tests/smoke_test.rs create mode 100644 module/core/mod_interface/Cargo.toml create mode 100644 module/core/mod_interface/License create mode 100644 module/core/mod_interface/Readme.md create mode 100644 module/core/mod_interface/examples/mod_interface_debug/Cargo.toml create mode 100644 module/core/mod_interface/examples/mod_interface_debug/Readme.md create mode 100644 module/core/mod_interface/examples/mod_interface_debug/src/inner.rs create mode 100644 module/core/mod_interface/examples/mod_interface_debug/src/main.rs create mode 100644 module/core/mod_interface/examples/mod_interface_trivial/Cargo.toml create mode 100644 module/core/mod_interface/examples/mod_interface_trivial/Readme.md create mode 100644 module/core/mod_interface/examples/mod_interface_trivial/src/inner.rs create mode 100644 module/core/mod_interface/examples/mod_interface_trivial/src/main.rs create mode 100644 module/core/mod_interface/src/lib.rs create mode 100644 module/core/mod_interface/tests/inc/derive/attr_debug/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/attr_debug/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.stderr create mode 100644 module/core/mod_interface/tests/inc/derive/layer/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_bad_vis/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_bad_vis/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.stderr create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_unknown_vis/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_unknown_vis/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.stderr create mode 100644 module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_use_cfg/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_use_cfg/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_use_macro/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_use_macro/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/layer_use_macro/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules/mod_exposed.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules/mod_orphan.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules/mod_prelude.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules/mod_protected.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod_exposed.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.stderr create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected1.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected2.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod_exposed.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.stderr create mode 100644 module/core/mod_interface/tests/inc/derive/use_as/derive.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_as/layer_x.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_as/layer_y.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_as/manual.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_as/manual_only.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_as/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_bad_vis/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.stderr create mode 100644 module/core/mod_interface/tests/inc/derive/use_basic/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_basic/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_basic/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_basic/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_layer/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_layer/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_layer/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_unknown_vis/mod.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.rs create mode 100644 module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.stderr create mode 100644 module/core/mod_interface/tests/inc/manual/layer/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/manual/layer/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/manual/layer/mod.rs create mode 100644 module/core/mod_interface/tests/inc/manual/layer_use/layer_a.rs create mode 100644 module/core/mod_interface/tests/inc/manual/layer_use/layer_b.rs create mode 100644 module/core/mod_interface/tests/inc/manual/layer_use/mod.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules/mod.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules/mod_exposed.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules/mod_orphan.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules/mod_prelude.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules/mod_protected.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed1.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed2.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan1.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan2.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude1.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude2.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected1.rs create mode 100644 module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected2.rs create mode 100644 module/core/mod_interface/tests/inc/mod.rs create mode 100644 module/core/mod_interface/tests/inc/only_test/layer_have_mod_cfg_test_only.rs create mode 100644 module/core/mod_interface/tests/inc/only_test/layer_simple_only_test.rs create mode 100644 module/core/mod_interface/tests/inc/only_test/layer_single_only_test.rs create mode 100644 module/core/mod_interface/tests/inc/only_test/micro_modules_only_test.rs create mode 100644 module/core/mod_interface/tests/inc/only_test/micro_modules_two_only_test.rs create mode 100644 module/core/mod_interface/tests/inc/only_test/use_non_layer_only_test.rs create mode 100644 module/core/mod_interface/tests/inc/trybuild_test.rs create mode 100644 module/core/mod_interface/tests/smoke_test.rs create mode 100644 module/core/mod_interface/tests/tests.rs create mode 100644 module/core/mod_interface_meta/Cargo.toml create mode 100644 module/core/mod_interface_meta/License create mode 100644 module/core/mod_interface_meta/Readme.md create mode 100644 module/core/mod_interface_meta/src/impls.rs create mode 100644 module/core/mod_interface_meta/src/lib.rs create mode 100644 module/core/mod_interface_meta/src/record.rs create mode 100644 module/core/mod_interface_meta/src/use_tree.rs create mode 100644 module/core/mod_interface_meta/src/visibility.rs create mode 100644 module/core/mod_interface_meta/tests/smoke_test.rs create mode 100644 module/core/process_tools/Cargo.toml create mode 100644 module/core/process_tools/License create mode 100644 module/core/process_tools/Readme.md create mode 100644 module/core/process_tools/src/environment.rs create mode 100644 module/core/process_tools/src/lib.rs create mode 100644 module/core/process_tools/src/process.rs create mode 100644 module/core/process_tools/tests/asset/err_out_test/err_out_err.rs create mode 100644 module/core/process_tools/tests/asset/err_out_test/out_err_out.rs create mode 100644 module/core/process_tools/tests/inc/basic.rs create mode 100644 module/core/process_tools/tests/inc/environment_is_cicd.rs create mode 100644 module/core/process_tools/tests/inc/mod.rs create mode 100644 module/core/process_tools/tests/inc/process_run.rs create mode 100644 module/core/process_tools/tests/smoke_test.rs create mode 100644 module/core/process_tools/tests/tests.rs create mode 100644 module/core/process_tools/tests/tool/asset.rs create mode 100644 module/core/program_tools/Cargo.toml create mode 100644 module/core/program_tools/License create mode 100644 module/core/program_tools/Readme.md create mode 100644 module/core/program_tools/src/lib.rs create mode 100644 module/core/program_tools/src/program.rs create mode 100644 module/core/program_tools/tests/asset/err_out_test/err_out_err.rs create mode 100644 module/core/program_tools/tests/asset/err_out_test/out_err_out.rs create mode 100644 module/core/program_tools/tests/inc/basic.rs create mode 100644 module/core/program_tools/tests/inc/mod.rs create mode 100644 module/core/program_tools/tests/smoke_test.rs create mode 100644 module/core/program_tools/tests/tests.rs create mode 100644 module/core/program_tools/tests/tool/asset.rs create mode 100644 module/core/proper_path_tools/Cargo.toml create mode 100644 module/core/proper_path_tools/License create mode 100644 module/core/proper_path_tools/Readme.md create mode 100644 module/core/proper_path_tools/src/lib.rs create mode 100644 module/core/proper_path_tools/src/path.rs create mode 100644 module/core/proper_path_tools/src/path/absolute_path.rs create mode 100644 module/core/proper_path_tools/tests/experiment.rs create mode 100644 module/core/proper_path_tools/tests/inc/absolute_path.rs create mode 100644 module/core/proper_path_tools/tests/inc/mod.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_change_ext.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_common.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_ext.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_exts.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_is_glob.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_join.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_normalize.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_relative.rs create mode 100644 module/core/proper_path_tools/tests/inc/path_unique_folder_name.rs create mode 100644 module/core/proper_path_tools/tests/inc/rebase_path.rs create mode 100644 module/core/proper_path_tools/tests/inc/without_ext.rs create mode 100644 module/core/proper_path_tools/tests/smoke_test.rs create mode 100644 module/core/proper_path_tools/tests/tests.rs create mode 100644 module/core/reflect_tools/Cargo.toml create mode 100644 module/core/reflect_tools/License create mode 100644 module/core/reflect_tools/Readme.md create mode 100644 module/core/reflect_tools/build.rs create mode 100644 module/core/reflect_tools/examples/reflect_tools_trivial.rs create mode 100644 module/core/reflect_tools/src/lib.rs create mode 100644 module/core/reflect_tools/src/reflect.rs create mode 100644 module/core/reflect_tools/src/reflect/axiomatic.rs create mode 100644 module/core/reflect_tools/src/reflect/entity_array.rs create mode 100644 module/core/reflect_tools/src/reflect/entity_hashmap.rs create mode 100644 module/core/reflect_tools/src/reflect/entity_hashset.rs create mode 100644 module/core/reflect_tools/src/reflect/entity_slice.rs create mode 100644 module/core/reflect_tools/src/reflect/entity_vec.rs create mode 100644 module/core/reflect_tools/src/reflect/primitive.rs create mode 100644 module/core/reflect_tools/tests/inc/mod.rs create mode 100644 module/core/reflect_tools/tests/inc/newtype_experiment.rs create mode 100644 module/core/reflect_tools/tests/inc/only_test/all.rs create mode 100644 module/core/reflect_tools/tests/inc/only_test/reflect_struct.rs create mode 100644 module/core/reflect_tools/tests/inc/only_test/reflect_struct_in_struct.rs create mode 100644 module/core/reflect_tools/tests/inc/only_test/reflect_struct_with_lifetime.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_array_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_common_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_hashmap_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_hashset_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_primitive_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_slice_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_struct_in_struct_manual_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_struct_manual_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_struct_with_lifetime_manual_test.rs create mode 100644 module/core/reflect_tools/tests/inc/reflect_vec_test.rs create mode 100644 module/core/reflect_tools/tests/smoke_test.rs create mode 100644 module/core/reflect_tools/tests/tests.rs create mode 100644 module/core/reflect_tools_meta/Cargo.toml create mode 100644 module/core/reflect_tools_meta/License create mode 100644 module/core/reflect_tools_meta/Readme.md create mode 100644 module/core/reflect_tools_meta/src/implementation/reflect.rs create mode 100644 module/core/reflect_tools_meta/src/lib.rs create mode 100644 module/core/reflect_tools_meta/tests/smoke_test.rs create mode 100644 module/core/strs_tools/Cargo.toml create mode 100644 module/core/strs_tools/License create mode 100644 module/core/strs_tools/Readme.md create mode 100644 module/core/strs_tools/examples/strs_tools_trivial.rs create mode 100644 module/core/strs_tools/src/lib.rs create mode 100644 module/core/strs_tools/src/string/indentation.rs create mode 100644 module/core/strs_tools/src/string/isolate.rs create mode 100644 module/core/strs_tools/src/string/mod.rs create mode 100644 module/core/strs_tools/src/string/number.rs create mode 100644 module/core/strs_tools/src/string/parse_request.rs create mode 100644 module/core/strs_tools/src/string/split.rs create mode 100644 module/core/strs_tools/tests/inc/indentation_test.rs create mode 100644 module/core/strs_tools/tests/inc/isolate_test.rs create mode 100644 module/core/strs_tools/tests/inc/mod.rs create mode 100644 module/core/strs_tools/tests/inc/number_test.rs create mode 100644 module/core/strs_tools/tests/inc/parse_test.rs create mode 100644 module/core/strs_tools/tests/inc/split_test.rs create mode 100644 module/core/strs_tools/tests/smoke_test.rs create mode 100644 module/core/strs_tools/tests/strs_tools_tests.rs create mode 100644 module/core/test_tools/Cargo.toml create mode 100644 module/core/test_tools/License create mode 100644 module/core/test_tools/Readme.md create mode 100644 module/core/test_tools/build.rs create mode 100644 module/core/test_tools/examples/test_tools_trivial.rs create mode 100644 module/core/test_tools/src/lib.rs create mode 100644 module/core/test_tools/src/test/asset.rs create mode 100644 module/core/test_tools/src/test/compiletime.rs create mode 100644 module/core/test_tools/src/test/helper.rs create mode 100644 module/core/test_tools/src/test/mod.rs create mode 100644 module/core/test_tools/src/test/smoke_test.rs create mode 100644 module/core/test_tools/src/test/version.rs create mode 100644 module/core/test_tools/tests/inc/basic_test.rs create mode 100644 module/core/test_tools/tests/inc/dynamic/basic.rs create mode 100644 module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.rs create mode 100644 module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.stderr create mode 100644 module/core/test_tools/tests/inc/dynamic/trybuild.rs create mode 100644 module/core/test_tools/tests/inc/mod.rs create mode 100644 module/core/test_tools/tests/inc/try_build_test.rs create mode 100644 module/core/test_tools/tests/smoke_test.rs create mode 100644 module/core/test_tools/tests/tests.rs create mode 100644 module/core/time_tools/Cargo.toml create mode 100644 module/core/time_tools/License create mode 100644 module/core/time_tools/Readme.md create mode 100644 module/core/time_tools/examples/time_tools_trivial.rs create mode 100644 module/core/time_tools/src/lib.rs create mode 100644 module/core/time_tools/src/now.rs create mode 100644 module/core/time_tools/tests/inc/basic.rs create mode 100644 module/core/time_tools/tests/inc/mod.rs create mode 100644 module/core/time_tools/tests/inc/now_test.rs create mode 100644 module/core/time_tools/tests/smoke_test.rs create mode 100644 module/core/time_tools/tests/time_tests.rs create mode 100644 module/core/typing_tools/Cargo.toml create mode 100644 module/core/typing_tools/License create mode 100644 module/core/typing_tools/Readme.md create mode 100644 module/core/typing_tools/examples/typing_tools_trivial.rs create mode 100644 module/core/typing_tools/src/lib.rs create mode 100644 module/core/typing_tools/src/typing.rs create mode 100644 module/core/typing_tools/tests/inc/mod.rs create mode 100644 module/core/typing_tools/tests/smoke_test.rs create mode 100644 module/core/typing_tools/tests/tests.rs create mode 100644 module/core/variadic_from/Cargo.toml create mode 100644 module/core/variadic_from/License create mode 100644 module/core/variadic_from/Readme.md create mode 100644 module/core/variadic_from/examples/variadic_from_trivial.rs create mode 100644 module/core/variadic_from/examples/variadic_from_trivial_expanded.rs create mode 100644 module/core/variadic_from/src/lib.rs create mode 100644 module/core/variadic_from/src/variadic.rs create mode 100644 module/core/variadic_from/tests/inc/auto_std_named_derive.rs create mode 100644 module/core/variadic_from/tests/inc/auto_std_named_manual.rs create mode 100644 module/core/variadic_from/tests/inc/exports.rs create mode 100644 module/core/variadic_from/tests/inc/from0_named_derive.rs create mode 100644 module/core/variadic_from/tests/inc/from0_named_manual.rs create mode 100644 module/core/variadic_from/tests/inc/from0_unnamed_derive.rs create mode 100644 module/core/variadic_from/tests/inc/from2_named_derive.rs create mode 100644 module/core/variadic_from/tests/inc/from2_named_manual.rs create mode 100644 module/core/variadic_from/tests/inc/from2_unnamed_derive.rs create mode 100644 module/core/variadic_from/tests/inc/from2_unnamed_manual.rs create mode 100644 module/core/variadic_from/tests/inc/from4_beyond_named.rs create mode 100644 module/core/variadic_from/tests/inc/from4_beyond_unnamed.rs create mode 100644 module/core/variadic_from/tests/inc/from4_named_manual.rs create mode 100644 module/core/variadic_from/tests/inc/from4_unnamed_manual.rs create mode 100644 module/core/variadic_from/tests/inc/mod.rs create mode 100644 module/core/variadic_from/tests/inc/only_test/from0.rs create mode 100644 module/core/variadic_from/tests/inc/only_test/from2_named.rs create mode 100644 module/core/variadic_from/tests/inc/only_test/from2_unnamed.rs create mode 100644 module/core/variadic_from/tests/inc/only_test/from4_named.rs create mode 100644 module/core/variadic_from/tests/inc/only_test/from4_unnamed.rs create mode 100644 module/core/variadic_from/tests/inc/sample.rs create mode 100644 module/core/variadic_from/tests/smoke_test.rs create mode 100644 module/core/variadic_from/tests/variadic_from_tests.rs create mode 100644 module/core/wtools/Cargo.toml create mode 100644 module/core/wtools/License create mode 100644 module/core/wtools/Readme.md create mode 100644 module/core/wtools/examples/wtools_trivial.rs create mode 100644 module/core/wtools/src/lib.rs create mode 100644 module/core/wtools/tests/smoke_test.rs create mode 100644 module/core/wtools/tests/wtools_tests.rs create mode 100644 module/move/crates_tools/Cargo.toml create mode 100644 module/move/crates_tools/License create mode 100644 module/move/crates_tools/Readme.md create mode 100644 module/move/crates_tools/examples/crates_tools_trivial.rs create mode 100644 module/move/crates_tools/src/lib.rs create mode 100644 module/move/crates_tools/tests/crates_tools_tests.rs create mode 100644 module/move/crates_tools/tests/smoke_test.rs create mode 100644 module/move/deterministic_rand/Cargo.toml create mode 100644 module/move/deterministic_rand/License create mode 100644 module/move/deterministic_rand/Readme.md create mode 100644 module/move/deterministic_rand/examples/deterministic_rand_trivial.rs create mode 100644 module/move/deterministic_rand/examples/sample_deterministic_rand_rayon.rs create mode 100644 module/move/deterministic_rand/examples/sample_deterministic_rand_std.rs create mode 100644 module/move/deterministic_rand/src/hrng_deterministic.rs create mode 100644 module/move/deterministic_rand/src/hrng_non_deterministic.rs create mode 100644 module/move/deterministic_rand/src/iter.rs create mode 100644 module/move/deterministic_rand/src/lib.rs create mode 100644 module/move/deterministic_rand/src/seed.rs create mode 100644 module/move/deterministic_rand/tests/assumption_test.rs create mode 100644 module/move/deterministic_rand/tests/basic_test.rs create mode 100644 module/move/deterministic_rand/tests/smoke_test.rs create mode 100644 module/move/graphs_tools/Cargo.toml create mode 100644 module/move/graphs_tools/License create mode 100644 module/move/graphs_tools/Readme.md create mode 100644 module/move/graphs_tools/examples/graphs_tools_trivial.rs create mode 100644 module/move/graphs_tools/src/abs/edge.rs create mode 100644 module/move/graphs_tools/src/abs/factory.rs create mode 100644 module/move/graphs_tools/src/abs/id_generator.rs create mode 100644 module/move/graphs_tools/src/abs/identity.rs create mode 100644 module/move/graphs_tools/src/abs/mod.rs create mode 100644 module/move/graphs_tools/src/abs/node.rs create mode 100644 module/move/graphs_tools/src/algo/dfs.rs create mode 100644 module/move/graphs_tools/src/algo/mod.rs create mode 100644 module/move/graphs_tools/src/canonical/edge.rs create mode 100644 module/move/graphs_tools/src/canonical/factory_generative.rs create mode 100644 module/move/graphs_tools/src/canonical/factory_impl.rs create mode 100644 module/move/graphs_tools/src/canonical/factory_readable.rs create mode 100644 module/move/graphs_tools/src/canonical/identity.rs create mode 100644 module/move/graphs_tools/src/canonical/mod.rs create mode 100644 module/move/graphs_tools/src/canonical/node.rs create mode 100644 module/move/graphs_tools/src/lib.rs create mode 100644 module/move/graphs_tools/tests/graphs_tools_tests.rs create mode 100644 module/move/graphs_tools/tests/inc/canonical_node_test.rs create mode 100644 module/move/graphs_tools/tests/inc/cell_factory_test.rs create mode 100644 module/move/graphs_tools/tests/inc/factory_impls.rs create mode 100644 module/move/graphs_tools/tests/inc/factory_test.rs create mode 100644 module/move/graphs_tools/tests/inc/identity_test.rs create mode 100644 module/move/graphs_tools/tests/inc/mod.rs create mode 100644 module/move/graphs_tools/tests/smoke_test.rs create mode 100644 module/move/optimization_tools/.cargo/config.toml create mode 100644 module/move/optimization_tools/Cargo.toml create mode 100644 module/move/optimization_tools/License create mode 100644 module/move/optimization_tools/Readme.md create mode 100644 module/move/optimization_tools/diagram.md create mode 100644 module/move/optimization_tools/evolve_method_diagram.md create mode 100644 module/move/optimization_tools/examples/optimization_tools_trivial.rs create mode 100644 module/move/optimization_tools/examples/traveling_salesman.rs create mode 100644 module/move/optimization_tools/img/Genetic_algorithm.png create mode 100644 module/move/optimization_tools/img/Nelder-Mead_Himmelblau.gif create mode 100644 module/move/optimization_tools/img/Travelling_salesman_problem_solved_with_simulated_annealing.gif create mode 100644 module/move/optimization_tools/plot/2d.png create mode 100644 module/move/optimization_tools/plot/ac_prob_plot.png create mode 100644 module/move/optimization_tools/plot/cost_plot.png create mode 100644 module/move/optimization_tools/plot/temp_plot.png create mode 100644 module/move/optimization_tools/src/hybrid_optimizer/gen_alg.rs create mode 100644 module/move/optimization_tools/src/hybrid_optimizer/mod.rs create mode 100644 module/move/optimization_tools/src/hybrid_optimizer/sim_anneal.rs create mode 100644 module/move/optimization_tools/src/lib.rs create mode 100644 module/move/optimization_tools/src/main.rs create mode 100644 module/move/optimization_tools/src/optimal_params_search/mod.rs create mode 100644 module/move/optimization_tools/src/optimal_params_search/nelder_mead.rs create mode 100644 module/move/optimization_tools/src/optimal_params_search/results_serialize.rs create mode 100644 module/move/optimization_tools/src/optimal_params_search/sim_annealing.rs create mode 100644 module/move/optimization_tools/src/plot/mod.rs create mode 100644 module/move/optimization_tools/src/plot_dynamic/mod.rs create mode 100644 module/move/optimization_tools/src/plot_dynamic/plotters_backend.rs create mode 100644 module/move/optimization_tools/src/problems/mod.rs create mode 100644 module/move/optimization_tools/src/problems/sudoku/block_index.rs create mode 100644 module/move/optimization_tools/src/problems/sudoku/board.rs create mode 100644 module/move/optimization_tools/src/problems/sudoku/cell_index.rs create mode 100644 module/move/optimization_tools/src/problems/sudoku/cell_val.rs create mode 100644 module/move/optimization_tools/src/problems/sudoku/mod.rs create mode 100644 module/move/optimization_tools/src/problems/sudoku/sudoku.rs create mode 100644 module/move/optimization_tools/src/problems/sudoku/sudoku_sets.rs create mode 100644 module/move/optimization_tools/src/problems/traveling_salesman.rs create mode 100644 module/move/optimization_tools/src/simplex/drawing.rs create mode 100644 module/move/optimization_tools/src/simplex/linear_problem.rs create mode 100644 module/move/optimization_tools/src/simplex/mod.rs create mode 100644 module/move/optimization_tools/src/simplex/parser.rs create mode 100644 module/move/optimization_tools/src/simplex/solver.rs create mode 100644 module/move/optimization_tools/sudoku_results.md create mode 100644 module/move/optimization_tools/sudoku_results_old.md create mode 100644 module/move/optimization_tools/tests/board.rs create mode 100644 module/move/optimization_tools/tests/ga_optimization.rs create mode 100644 module/move/optimization_tools/tests/nelder_mead.rs create mode 100644 module/move/optimization_tools/tests/opt_params.rs create mode 100644 module/move/optimization_tools/tests/optimization.rs create mode 100644 module/move/optimization_tools/tests/simplex.rs create mode 100644 module/move/optimization_tools/tests/tools/mod.rs create mode 100644 module/move/optimization_tools/tests/traveling_salesman.rs create mode 100644 module/move/optimization_tools/tsp_results.md create mode 100644 module/move/plot_interface/Cargo.toml create mode 100644 module/move/plot_interface/License create mode 100644 module/move/plot_interface/Readme.md create mode 100644 module/move/plot_interface/src/plot/abs/change.rs create mode 100644 module/move/plot_interface/src/plot/abs/changer.rs create mode 100644 module/move/plot_interface/src/plot/abs/context.rs create mode 100644 module/move/plot_interface/src/plot/abs/identity.rs create mode 100644 module/move/plot_interface/src/plot/abs/mod.rs create mode 100644 module/move/plot_interface/src/plot/abs/registry.rs create mode 100644 module/move/plot_interface/src/plot/color.rs create mode 100644 module/move/plot_interface/src/plot/plot_interface_lib.rs create mode 100644 module/move/plot_interface/src/plot/sys/context.rs create mode 100644 module/move/plot_interface/src/plot/sys/context_changer.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing/change_new.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing/changer.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing/command.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing/queue.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing/rect_change_new.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing/rect_change_region.rs create mode 100644 module/move/plot_interface/src/plot/sys/drawing/rect_changer.rs create mode 100644 module/move/plot_interface/src/plot/sys/mod.rs create mode 100644 module/move/plot_interface/src/plot/sys/stroke_brush.rs create mode 100644 module/move/plot_interface/src/plot/sys/stroke_brush/change_color.rs create mode 100644 module/move/plot_interface/src/plot/sys/stroke_brush/change_new.rs create mode 100644 module/move/plot_interface/src/plot/sys/stroke_brush/change_width.rs create mode 100644 module/move/plot_interface/src/plot/sys/stroke_brush/changer.rs create mode 100644 module/move/plot_interface/src/plot/sys/target.rs create mode 100644 module/move/plot_interface/src/plot/wplot_lib.rs create mode 100644 module/move/plot_interface/tests/plot/inc.rs create mode 100644 module/move/plot_interface/tests/plot/inc/basic_test.rs create mode 100644 module/move/plot_interface/tests/plot/plot_interface_tests.rs create mode 100644 module/move/plot_interface/tests/plot/wplot_tests.rs create mode 100644 module/move/plot_interface/tests/smoke_test.rs create mode 100644 module/move/refiner/Cargo.toml create mode 100644 module/move/refiner/License create mode 100644 module/move/refiner/Readme.md create mode 100644 module/move/refiner/src/instruction.rs create mode 100644 module/move/refiner/src/lib.rs create mode 100644 module/move/refiner/src/main.rs create mode 100644 module/move/refiner/src/props.rs create mode 100644 module/move/refiner/tests/censor/censor_tests.rs create mode 100644 module/move/refiner/tests/censor/inc.rs create mode 100644 module/move/refiner/tests/censor/inc/censor_test.rs create mode 100644 module/move/refiner/tests/smoke_test.rs create mode 100644 module/move/sqlx_query/Cargo.toml create mode 100644 module/move/sqlx_query/License create mode 100644 module/move/sqlx_query/Readme.md create mode 100644 module/move/sqlx_query/src/lib.rs create mode 100644 module/move/sqlx_query/tests/smoke_test.rs create mode 100644 module/move/unitore/Cargo.toml create mode 100644 module/move/unitore/Readme.md create mode 100644 module/move/unitore/config/feeds.toml create mode 100644 module/move/unitore/src/Readme.md create mode 100644 module/move/unitore/src/action/config.rs create mode 100644 module/move/unitore/src/action/feed.rs create mode 100644 module/move/unitore/src/action/frame.rs create mode 100644 module/move/unitore/src/action/mod.rs create mode 100644 module/move/unitore/src/action/query.rs create mode 100644 module/move/unitore/src/action/table.rs create mode 100644 module/move/unitore/src/command/config.rs create mode 100644 module/move/unitore/src/command/feed.rs create mode 100644 module/move/unitore/src/command/frame.rs create mode 100644 module/move/unitore/src/command/mod.rs create mode 100644 module/move/unitore/src/command/query.rs create mode 100644 module/move/unitore/src/command/table.rs create mode 100644 module/move/unitore/src/entity/config.rs create mode 100644 module/move/unitore/src/entity/feed.rs create mode 100644 module/move/unitore/src/entity/frame.rs create mode 100644 module/move/unitore/src/entity/mod.rs create mode 100644 module/move/unitore/src/entity/table.rs create mode 100644 module/move/unitore/src/executor.rs create mode 100644 module/move/unitore/src/feed_config.rs create mode 100644 module/move/unitore/src/lib.rs create mode 100644 module/move/unitore/src/main.rs create mode 100644 module/move/unitore/src/retriever.rs create mode 100644 module/move/unitore/src/sled_adapter/config.rs create mode 100644 module/move/unitore/src/sled_adapter/feed.rs create mode 100644 module/move/unitore/src/sled_adapter/frame.rs create mode 100644 module/move/unitore/src/sled_adapter/mod.rs create mode 100644 module/move/unitore/src/sled_adapter/table.rs create mode 100644 module/move/unitore/src/tool/mod.rs create mode 100644 module/move/unitore/src/tool/table_display.rs create mode 100644 module/move/unitore/tests/basic.rs create mode 100644 module/move/unitore/tests/config_add.rs create mode 100644 module/move/unitore/tests/config_delete.rs create mode 100644 module/move/unitore/tests/fixtures/plain_feed.xml create mode 100644 module/move/unitore/tests/fixtures/test_config.toml create mode 100644 module/move/unitore/tests/fixtures/updated_one_frame.xml create mode 100644 module/move/unitore/tests/frames_download.rs create mode 100644 module/move/unitore/tests/query_execute.rs create mode 100644 module/move/unitore/tests/table_list.rs create mode 100644 module/move/unitore/tests/tables_list.rs create mode 100644 module/move/wca/Cargo.toml create mode 100644 module/move/wca/License create mode 100644 module/move/wca/Readme.md create mode 100644 module/move/wca/benches/bench.rs create mode 100644 module/move/wca/doc/WCA.png create mode 100644 module/move/wca/doc/WCA_sequence.png create mode 100644 module/move/wca/doc/wca.md create mode 100644 module/move/wca/examples/wca_fluent.rs create mode 100644 module/move/wca/examples/wca_shortcut.rs create mode 100644 module/move/wca/examples/wca_suggest.rs create mode 100644 module/move/wca/examples/wca_trivial.rs create mode 100644 module/move/wca/src/ca/aggregator.rs create mode 100644 module/move/wca/src/ca/executor/context.rs create mode 100644 module/move/wca/src/ca/executor/executor.rs create mode 100644 module/move/wca/src/ca/executor/mod.rs create mode 100644 module/move/wca/src/ca/executor/routine.rs create mode 100644 module/move/wca/src/ca/facade.rs create mode 100644 module/move/wca/src/ca/formatter.rs create mode 100644 module/move/wca/src/ca/grammar/command.rs create mode 100644 module/move/wca/src/ca/grammar/dictionary.rs create mode 100644 module/move/wca/src/ca/grammar/mod.rs create mode 100644 module/move/wca/src/ca/grammar/types.rs create mode 100644 module/move/wca/src/ca/help.rs create mode 100644 module/move/wca/src/ca/input.rs create mode 100644 module/move/wca/src/ca/mod.rs create mode 100644 module/move/wca/src/ca/parser/command.rs create mode 100644 module/move/wca/src/ca/parser/mod.rs create mode 100644 module/move/wca/src/ca/parser/parser.rs create mode 100644 module/move/wca/src/ca/tool/mod.rs create mode 100644 module/move/wca/src/ca/tool/table.rs create mode 100644 module/move/wca/src/ca/verifier/command.rs create mode 100644 module/move/wca/src/ca/verifier/mod.rs create mode 100644 module/move/wca/src/ca/verifier/verifier.rs create mode 100644 module/move/wca/src/lib.rs create mode 100644 module/move/wca/src/wtools.rs create mode 100644 module/move/wca/tests/inc/adapter.rs create mode 100644 module/move/wca/tests/inc/commands_aggregator/basic.rs create mode 100644 module/move/wca/tests/inc/commands_aggregator/callback.rs create mode 100644 module/move/wca/tests/inc/commands_aggregator/help.rs create mode 100644 module/move/wca/tests/inc/commands_aggregator/mod.rs create mode 100644 module/move/wca/tests/inc/executor/command.rs create mode 100644 module/move/wca/tests/inc/executor/mod.rs create mode 100644 module/move/wca/tests/inc/executor/program.rs create mode 100644 module/move/wca/tests/inc/grammar/from_command.rs create mode 100644 module/move/wca/tests/inc/grammar/from_program.rs create mode 100644 module/move/wca/tests/inc/grammar/mod.rs create mode 100644 module/move/wca/tests/inc/grammar/types.rs create mode 100644 module/move/wca/tests/inc/mod.rs create mode 100644 module/move/wca/tests/inc/parser/command.rs create mode 100644 module/move/wca/tests/inc/parser/mod.rs create mode 100644 module/move/wca/tests/inc/parser/program.rs create mode 100644 module/move/wca/tests/smoke_test.rs create mode 100644 module/move/wca/tests/wca_tests.rs create mode 100644 module/move/willbe/Cargo.toml create mode 100644 module/move/willbe/License create mode 100644 module/move/willbe/Readme.md create mode 100644 module/move/willbe/src/action/cicd_renew.rs create mode 100644 module/move/willbe/src/action/deploy_renew.rs create mode 100644 module/move/willbe/src/action/features.rs create mode 100644 module/move/willbe/src/action/list.rs create mode 100644 module/move/willbe/src/action/main_header.rs create mode 100644 module/move/willbe/src/action/mod.rs create mode 100644 module/move/willbe/src/action/publish.rs create mode 100644 module/move/willbe/src/action/publish_diff.rs create mode 100644 module/move/willbe/src/action/readme_health_table_renew.rs create mode 100644 module/move/willbe/src/action/readme_modules_headers_renew.rs create mode 100644 module/move/willbe/src/action/test.rs create mode 100644 module/move/willbe/src/action/workspace_renew.rs create mode 100644 module/move/willbe/src/bin/cargo-will.rs create mode 100644 module/move/willbe/src/bin/will.rs create mode 100644 module/move/willbe/src/bin/willbe.rs create mode 100644 module/move/willbe/src/command/cicd_renew.rs create mode 100644 module/move/willbe/src/command/deploy_renew.rs create mode 100644 module/move/willbe/src/command/features.rs create mode 100644 module/move/willbe/src/command/list.rs create mode 100644 module/move/willbe/src/command/main_header.rs create mode 100644 module/move/willbe/src/command/mod.rs create mode 100644 module/move/willbe/src/command/publish.rs create mode 100644 module/move/willbe/src/command/publish_diff.rs create mode 100644 module/move/willbe/src/command/readme_headers_renew.rs create mode 100644 module/move/willbe/src/command/readme_health_table_renew.rs create mode 100644 module/move/willbe/src/command/readme_modules_headers_renew.rs create mode 100644 module/move/willbe/src/command/test.rs create mode 100644 module/move/willbe/src/command/workspace_renew.rs create mode 100644 module/move/willbe/src/description.md create mode 100644 module/move/willbe/src/entity/channel.rs create mode 100644 module/move/willbe/src/entity/diff.rs create mode 100644 module/move/willbe/src/entity/features.rs create mode 100644 module/move/willbe/src/entity/manifest.rs create mode 100644 module/move/willbe/src/entity/mod.rs create mode 100644 module/move/willbe/src/entity/optimization.rs create mode 100644 module/move/willbe/src/entity/package.rs create mode 100644 module/move/willbe/src/entity/packages.rs create mode 100644 module/move/willbe/src/entity/packed_crate.rs create mode 100644 module/move/willbe/src/entity/table.rs create mode 100644 module/move/willbe/src/entity/test.rs create mode 100644 module/move/willbe/src/entity/version.rs create mode 100644 module/move/willbe/src/entity/workspace.rs create mode 100644 module/move/willbe/src/lib.rs create mode 100644 module/move/willbe/src/tool/_path.rs create mode 100644 module/move/willbe/src/tool/cargo.rs create mode 100644 module/move/willbe/src/tool/files.rs create mode 100644 module/move/willbe/src/tool/git.rs create mode 100644 module/move/willbe/src/tool/graph.rs create mode 100644 module/move/willbe/src/tool/http.rs create mode 100644 module/move/willbe/src/tool/mod.rs create mode 100644 module/move/willbe/src/tool/query.rs create mode 100644 module/move/willbe/src/tool/sha.rs create mode 100644 module/move/willbe/src/tool/template.rs create mode 100644 module/move/willbe/src/tool/url.rs create mode 100644 module/move/willbe/src/wtools.rs create mode 100644 module/move/willbe/template/deploy/.deploy_template.toml.hbs create mode 100644 module/move/willbe/template/deploy/Makefile.hbs create mode 100644 module/move/willbe/template/deploy/deploy/.gitignore create mode 100644 module/move/willbe/template/deploy/deploy/Dockerfile create mode 100644 module/move/willbe/template/deploy/deploy/Readme.md create mode 100644 module/move/willbe/template/deploy/deploy/aws/main.tf create mode 100644 module/move/willbe/template/deploy/deploy/aws/outputs.tf create mode 100644 module/move/willbe/template/deploy/deploy/aws/templates/cloud-init.tpl create mode 100644 module/move/willbe/template/deploy/deploy/aws/variables.tf create mode 100644 module/move/willbe/template/deploy/deploy/gar/Readme.md create mode 100644 module/move/willbe/template/deploy/deploy/gar/main.tf create mode 100644 module/move/willbe/template/deploy/deploy/gar/outputs.tf create mode 100644 module/move/willbe/template/deploy/deploy/gar/variables.tf create mode 100644 module/move/willbe/template/deploy/deploy/gce/Readme.md create mode 100644 module/move/willbe/template/deploy/deploy/gce/main.tf create mode 100644 module/move/willbe/template/deploy/deploy/gce/outputs.tf create mode 100644 module/move/willbe/template/deploy/deploy/gce/templates/cloud-init.tpl create mode 100644 module/move/willbe/template/deploy/deploy/gce/variables.tf create mode 100644 module/move/willbe/template/deploy/deploy/gcs/main.tf create mode 100644 module/move/willbe/template/deploy/deploy/hetzner/main.tf create mode 100644 module/move/willbe/template/deploy/deploy/hetzner/outputs.tf create mode 100644 module/move/willbe/template/deploy/deploy/hetzner/templates/cloud-init.tpl create mode 100644 module/move/willbe/template/deploy/deploy/hetzner/variables.tf create mode 100644 module/move/willbe/template/deploy/key/.gitignore create mode 100644 module/move/willbe/template/deploy/key/Readme.md create mode 100755 module/move/willbe/template/deploy/key/pack.sh create mode 100644 module/move/willbe/template/workflow/Description.md create mode 100644 module/move/willbe/template/workflow/Readme.md create mode 100644 module/move/willbe/template/workflow/appropraite_branch_for.hbs create mode 100644 module/move/willbe/template/workflow/appropriate_branch.yml create mode 100644 module/move/willbe/template/workflow/auto_merge_to.hbs create mode 100644 module/move/willbe/template/workflow/auto_pr.yml create mode 100644 module/move/willbe/template/workflow/auto_pr_to.hbs create mode 100644 module/move/willbe/template/workflow/for_pr_rust_push.yml create mode 100644 module/move/willbe/template/workflow/module_push.hbs create mode 100644 module/move/willbe/template/workflow/rust_clean.yml create mode 100644 module/move/willbe/template/workflow/standard_rust_pull_request.hbs create mode 100644 module/move/willbe/template/workflow/standard_rust_push.yml create mode 100644 module/move/willbe/template/workflow/standard_rust_scheduled.yml create mode 100644 module/move/willbe/template/workflow/standard_rust_status.yml create mode 100644 module/move/willbe/template/workflow/status_checks_rules_update.yml create mode 100644 module/move/willbe/template/workspace/.cargo/config.toml create mode 100644 module/move/willbe/template/workspace/.gitattributes create mode 100644 module/move/willbe/template/workspace/.gitignore1 create mode 100644 module/move/willbe/template/workspace/.gitpod.yml create mode 100644 module/move/willbe/template/workspace/Cargo.hbs create mode 100644 module/move/willbe/template/workspace/Makefile create mode 100644 module/move/willbe/template/workspace/Readme.md create mode 100644 module/move/willbe/template/workspace/module/module1/Cargo.toml.x create mode 100644 module/move/willbe/template/workspace/module/module1/Readme.md create mode 100644 module/move/willbe/template/workspace/module/module1/examples/module1_example.rs create mode 100644 module/move/willbe/template/workspace/module/module1/src/lib.rs create mode 100644 module/move/willbe/template/workspace/module/module1/tests/hello_test.rs create mode 100644 module/move/willbe/tests/asset/chain_of_packages/Cargo.toml create mode 100644 module/move/willbe/tests/asset/chain_of_packages/a/Cargo.toml create mode 100644 module/move/willbe/tests/asset/chain_of_packages/a/src/lib.rs create mode 100644 module/move/willbe/tests/asset/chain_of_packages/b/Cargo.toml create mode 100644 module/move/willbe/tests/asset/chain_of_packages/b/src/lib.rs create mode 100644 module/move/willbe/tests/asset/chain_of_packages/c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/chain_of_packages/c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/err_out_test/err_out_err.rs create mode 100644 module/move/willbe/tests/asset/err_out_test/out_err_out.rs create mode 100644 module/move/willbe/tests/asset/full_config/Cargo.toml create mode 100644 module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/examples/_willbe_variadic_tag_configurations_c_trivial.rs create mode 100644 module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/full_config/readme.md create mode 100644 module/move/willbe/tests/asset/package_with_remote_dependency/Cargo.toml create mode 100644 module/move/willbe/tests/asset/package_with_remote_dependency/a/Cargo.toml create mode 100644 module/move/willbe/tests/asset/package_with_remote_dependency/a/src/lib.rs create mode 100644 module/move/willbe/tests/asset/package_with_remote_dependency/b/Cargo.toml create mode 100644 module/move/willbe/tests/asset/package_with_remote_dependency/b/src/lib.rs create mode 100644 module/move/willbe/tests/asset/single_module/Cargo.toml create mode 100644 module/move/willbe/tests/asset/single_module/Readme.md create mode 100644 module/move/willbe/tests/asset/single_module/test_module/Cargo.toml create mode 100644 module/move/willbe/tests/asset/single_module/test_module/Readme.md create mode 100644 module/move/willbe/tests/asset/single_module/test_module/src/lib.rs create mode 100644 module/move/willbe/tests/asset/single_module_with_example/Cargo.toml create mode 100644 module/move/willbe/tests/asset/single_module_with_example/Readme.md create mode 100644 module/move/willbe/tests/asset/single_module_with_example/module/test_module/Cargo.toml create mode 100644 module/move/willbe/tests/asset/single_module_with_example/module/test_module/Readme.md create mode 100644 module/move/willbe/tests/asset/single_module_with_example/module/test_module/examples/test_module_trivial.rs create mode 100644 module/move/willbe/tests/asset/single_module_with_example/module/test_module/src/lib.rs create mode 100644 module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Cargo.toml create mode 100644 module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Readme.md create mode 100644 module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/Cargo.toml create mode 100644 module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/src/lib.rs create mode 100644 module/move/willbe/tests/asset/three_packages/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages/b/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages/b/Readme.md create mode 100644 module/move/willbe/tests/asset/three_packages/b/src/lib.rs create mode 100644 module/move/willbe/tests/asset/three_packages/c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages/c/Readme.md create mode 100644 module/move/willbe/tests/asset/three_packages/c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/three_packages/d/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages/d/Readme.md create mode 100644 module/move/willbe/tests/asset/three_packages/d/src/lib.rs create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/b/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/b/Readme.md create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/b/src/lib.rs create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/c/Readme.md create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/d/Cargo.toml create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/d/Readme.md create mode 100644 module/move/willbe/tests/asset/three_packages_with_features/d/src/lib.rs create mode 100644 module/move/willbe/tests/asset/variadic_tag_configurations/Cargo.toml create mode 100644 module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/variadic_tag_configurations/readme.md create mode 100644 module/move/willbe/tests/asset/without_any_toml_configurations/Cargo.toml create mode 100644 module/move/willbe/tests/asset/without_any_toml_configurations/c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/without_any_toml_configurations/c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/without_any_toml_configurations/readme.md create mode 100644 module/move/willbe/tests/asset/without_module_toml_configurations/Cargo.toml create mode 100644 module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/without_module_toml_configurations/readme.md create mode 100644 module/move/willbe/tests/asset/without_workspace_toml_configurations/Cargo.toml create mode 100644 module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/Cargo.toml create mode 100644 module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/src/lib.rs create mode 100644 module/move/willbe/tests/asset/without_workspace_toml_configurations/readme.md create mode 100644 module/move/willbe/tests/asset/workspace_with_cyclic_dependency/Cargo.toml create mode 100644 module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/Cargo.toml create mode 100644 module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/src/lib.rs create mode 100644 module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/Cargo.toml create mode 100644 module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/src/lib.rs create mode 100644 module/move/willbe/tests/inc/action/cicd_renew.rs create mode 100644 module/move/willbe/tests/inc/action/features.rs create mode 100644 module/move/willbe/tests/inc/action/list.rs create mode 100644 module/move/willbe/tests/inc/action/list/data.rs create mode 100644 module/move/willbe/tests/inc/action/list/format.rs create mode 100644 module/move/willbe/tests/inc/action/main_header.rs create mode 100644 module/move/willbe/tests/inc/action/mod.rs create mode 100644 module/move/willbe/tests/inc/action/readme_health_table_renew.rs create mode 100644 module/move/willbe/tests/inc/action/readme_modules_headers_renew.rs create mode 100644 module/move/willbe/tests/inc/action/test.rs create mode 100644 module/move/willbe/tests/inc/action/workspace_renew.rs create mode 100644 module/move/willbe/tests/inc/command/mod.rs create mode 100644 module/move/willbe/tests/inc/command/tests_run.rs create mode 100644 module/move/willbe/tests/inc/entity/dependencies.rs create mode 100644 module/move/willbe/tests/inc/entity/diff.rs create mode 100644 module/move/willbe/tests/inc/entity/features.rs create mode 100644 module/move/willbe/tests/inc/entity/mod.rs create mode 100644 module/move/willbe/tests/inc/entity/version.rs create mode 100644 module/move/willbe/tests/inc/helpers.rs create mode 100644 module/move/willbe/tests/inc/mod.rs create mode 100644 module/move/willbe/tests/inc/package.rs create mode 100644 module/move/willbe/tests/inc/tool/graph.rs create mode 100644 module/move/willbe/tests/inc/tool/mod.rs create mode 100644 module/move/willbe/tests/inc/tool/process.rs create mode 100644 module/move/willbe/tests/inc/tool/query.rs create mode 100644 module/move/willbe/tests/smoke_test.rs create mode 100644 module/move/willbe/tests/tests.rs create mode 100644 module/move/wplot/Cargo.toml create mode 100644 module/move/wplot/License create mode 100644 module/move/wplot/Readme.md create mode 100644 module/move/wplot/src/plot/abs/change.rs create mode 100644 module/move/wplot/src/plot/abs/changer.rs create mode 100644 module/move/wplot/src/plot/abs/context.rs create mode 100644 module/move/wplot/src/plot/abs/identity.rs create mode 100644 module/move/wplot/src/plot/abs/mod.rs create mode 100644 module/move/wplot/src/plot/abs/registry.rs create mode 100644 module/move/wplot/src/plot/color.rs create mode 100644 module/move/wplot/src/plot/plot_interface_lib.rs create mode 100644 module/move/wplot/src/plot/sys/context.rs create mode 100644 module/move/wplot/src/plot/sys/context_changer.rs create mode 100644 module/move/wplot/src/plot/sys/drawing.rs create mode 100644 module/move/wplot/src/plot/sys/drawing/change_new.rs create mode 100644 module/move/wplot/src/plot/sys/drawing/changer.rs create mode 100644 module/move/wplot/src/plot/sys/drawing/command.rs create mode 100644 module/move/wplot/src/plot/sys/drawing/queue.rs create mode 100644 module/move/wplot/src/plot/sys/drawing/rect_change_new.rs create mode 100644 module/move/wplot/src/plot/sys/drawing/rect_change_region.rs create mode 100644 module/move/wplot/src/plot/sys/drawing/rect_changer.rs create mode 100644 module/move/wplot/src/plot/sys/mod.rs create mode 100644 module/move/wplot/src/plot/sys/stroke_brush.rs create mode 100644 module/move/wplot/src/plot/sys/stroke_brush/change_color.rs create mode 100644 module/move/wplot/src/plot/sys/stroke_brush/change_new.rs create mode 100644 module/move/wplot/src/plot/sys/stroke_brush/change_width.rs create mode 100644 module/move/wplot/src/plot/sys/stroke_brush/changer.rs create mode 100644 module/move/wplot/src/plot/sys/target.rs create mode 100644 module/move/wplot/src/plot/wplot_lib.rs create mode 100644 module/move/wplot/test.png create mode 100644 module/move/wplot/tests/plot/inc.rs create mode 100644 module/move/wplot/tests/plot/inc/basic_test.rs create mode 100644 module/move/wplot/tests/plot/plot_interface_tests.rs create mode 100644 module/move/wplot/tests/plot/wplot_tests.rs create mode 100644 module/move/wplot/tests/smoke_test.rs create mode 100644 module/postponed/_video_experiment/Cargo.toml create mode 100644 module/postponed/_video_experiment/License create mode 100644 module/postponed/_video_experiment/Readme.md create mode 100644 module/postponed/_video_experiment/src/video/common.rs create mode 100644 module/postponed/_video_experiment/src/video/encoder_strategy.rs create mode 100644 module/postponed/_video_experiment/src/video/encoders/gif.rs create mode 100644 module/postponed/_video_experiment/src/video/encoders/mod.rs create mode 100644 module/postponed/_video_experiment/src/video/encoders/mp4.rs create mode 100644 module/postponed/_video_experiment/src/video/encoders/png.rs create mode 100644 module/postponed/_video_experiment/src/video/video_experiment_lib.rs create mode 100644 module/postponed/_video_experiment/src/video/yuv.rs create mode 100644 module/postponed/_video_experiment/tests/smoke_test.rs create mode 100644 module/postponed/_video_experiment/tests/video/_asset/img/rust_logo1.png create mode 100644 module/postponed/_video_experiment/tests/video/_asset/img/rust_logo2.png create mode 100644 module/postponed/_video_experiment/tests/video/_asset/img/rust_logo3.png create mode 100644 module/postponed/_video_experiment/tests/video/inc.rs create mode 100644 module/postponed/_video_experiment/tests/video/inc/apng_test.rs create mode 100644 module/postponed/_video_experiment/tests/video/inc/encoder_strategy_test.rs create mode 100644 module/postponed/_video_experiment/tests/video/inc/gif_test.rs create mode 100644 module/postponed/_video_experiment/tests/video/inc/mp4_test.rs create mode 100644 module/postponed/_video_experiment/tests/video/inc/yuv.rs create mode 100644 module/postponed/_video_experiment/tests/video/video_experiment_tests.rs create mode 100644 module/postponed/automata_tools/Cargo.toml create mode 100644 module/postponed/automata_tools/License create mode 100644 module/postponed/automata_tools/Readme.md create mode 100644 module/postponed/automata_tools/src/lib.rs create mode 100644 module/postponed/automata_tools/tests/graph/automata_tools_tests.rs create mode 100644 module/postponed/automata_tools/tests/graph/graphs_tools_tests.rs create mode 100644 module/postponed/automata_tools/tests/graph/inc.rs create mode 100644 module/postponed/automata_tools/tests/graph/inc/canonical_node_test.rs create mode 100644 module/postponed/automata_tools/tests/graph/inc/cell_factory_test.rs create mode 100644 module/postponed/automata_tools/tests/graph/inc/factory_impls.rs create mode 100644 module/postponed/automata_tools/tests/graph/inc/factory_test.rs create mode 100644 module/postponed/automata_tools/tests/graph/inc/identity_test.rs create mode 100644 module/postponed/automata_tools/tests/graph/wautomata_tests.rs create mode 100644 module/postponed/automata_tools/tests/smoke_test.rs create mode 100644 module/postponed/non_std/Cargo.toml create mode 100644 module/postponed/non_std/License create mode 100644 module/postponed/non_std/Readme.md create mode 100644 module/postponed/non_std/src/non_std_lib.rs create mode 100644 module/postponed/non_std/tests/non_std_tests.rs create mode 100644 module/postponed/non_std/tests/smoke_test.rs create mode 100644 module/postponed/std_tools/Cargo.toml create mode 100644 module/postponed/std_tools/License create mode 100644 module/postponed/std_tools/Readme.md create mode 100644 module/postponed/std_tools/src/std_tools_lib.rs create mode 100644 module/postponed/std_tools/tests/smoke_test.rs create mode 100644 module/postponed/std_tools/tests/std_tools_tests.rs create mode 100644 module/postponed/std_x/Cargo.toml create mode 100644 module/postponed/std_x/License create mode 100644 module/postponed/std_x/Readme.md create mode 100644 module/postponed/std_x/src/std_x_lib.rs create mode 100644 module/postponed/std_x/tests/smoke_test.rs create mode 100644 module/postponed/std_x/tests/std_x_tests.rs create mode 100644 module/postponed/type_constructor/Cargo.toml create mode 100644 module/postponed/type_constructor/License create mode 100644 module/postponed/type_constructor/Readme.md create mode 100644 module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_homopair_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_homopair_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_many_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_many_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_multiple_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_multiple_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_pair_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_pair_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_struct_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_struct_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_trivial_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_trivial_sample/Readme.md create mode 100644 module/postponed/type_constructor/examples/type_constructor_trivial_sample/src/main.rs create mode 100644 module/postponed/type_constructor/examples/type_constructor_without_macro_sample/Cargo.toml create mode 100644 module/postponed/type_constructor/examples/type_constructor_without_macro_sample/src/main.rs create mode 100644 module/postponed/type_constructor/src/lib.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/enumerable.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/helper.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/make.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/many.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/mod.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/no_many.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/pair.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/single.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/traits.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/types.rs create mode 100644 module/postponed/type_constructor/src/type_constuctor/vectorized_from.rs create mode 100644 module/postponed/type_constructor/tests/data_type_tests.rs create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.rs create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.stderr create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.rs create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.stderr create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.rs create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.stderr create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.rs create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.stderr create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.rs create mode 100644 module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.stderr create mode 100644 module/postponed/type_constructor/tests/inc/enumerable_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/fundamental_data_type_tests.rs create mode 100644 module/postponed/type_constructor/tests/inc/make_interface_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parameter_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parameter_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parameter_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parameter_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parametrized_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parametrized_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parametrized_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_parametrized_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/many/many_without_args_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/many/many_without_args_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/mod.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parameter_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_parametrized_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/prelude_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_missing_generic.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_nested_type_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_nested_type_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parameter_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parameter_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parameter_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parameter_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parametrized_main_gen_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parametrized_main_manual_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parametrized_main_test_only.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_parametrized_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_redefinition_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_redefinition_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/single/single_self_containing_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.rs create mode 100644 module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.stderr create mode 100644 module/postponed/type_constructor/tests/inc/type_constructor_tests.rs create mode 100644 module/postponed/type_constructor/tests/inc/vectorized_from_test.rs create mode 100644 module/postponed/type_constructor/tests/smoke_test.rs create mode 100644 module/postponed/wautomata/Cargo.toml create mode 100644 module/postponed/wautomata/License create mode 100644 module/postponed/wautomata/Readme.md create mode 100644 module/postponed/wautomata/examples/automata_tools_trivial_sample/Cargo.toml create mode 100644 module/postponed/wautomata/examples/automata_tools_trivial_sample/Readme.md create mode 100644 module/postponed/wautomata/examples/automata_tools_trivial_sample/src/main.rs create mode 100644 module/postponed/wautomata/src/graph/abs/edge.rs create mode 100644 module/postponed/wautomata/src/graph/abs/factory.rs create mode 100644 module/postponed/wautomata/src/graph/abs/id_generator.rs create mode 100644 module/postponed/wautomata/src/graph/abs/identity.rs create mode 100644 module/postponed/wautomata/src/graph/abs/mod.rs create mode 100644 module/postponed/wautomata/src/graph/abs/node.rs create mode 100644 module/postponed/wautomata/src/graph/algo/dfs.rs create mode 100644 module/postponed/wautomata/src/graph/algo/mod.rs create mode 100644 module/postponed/wautomata/src/graph/automata_tools_lib.rs create mode 100644 module/postponed/wautomata/src/graph/canonical/edge.rs create mode 100644 module/postponed/wautomata/src/graph/canonical/factory_generative.rs create mode 100644 module/postponed/wautomata/src/graph/canonical/factory_impl.rs create mode 100644 module/postponed/wautomata/src/graph/canonical/factory_readable.rs create mode 100644 module/postponed/wautomata/src/graph/canonical/identity.rs create mode 100644 module/postponed/wautomata/src/graph/canonical/mod.rs create mode 100644 module/postponed/wautomata/src/graph/canonical/node.rs create mode 100644 module/postponed/wautomata/src/graph/graphs_tools_lib.rs create mode 100644 module/postponed/wautomata/src/graph/wautomata_lib.rs create mode 100644 module/postponed/wautomata/tests/smoke_test.rs create mode 100644 module/postponed/wautomata/tests/wautomata_tests.rs create mode 100644 module/postponed/wpublisher/Cargo.toml create mode 100644 module/postponed/wpublisher/License create mode 100644 module/postponed/wpublisher/Readme.md create mode 100644 module/postponed/wpublisher/src/lib.rs create mode 100644 module/postponed/wpublisher/tests/smoke_test.rs create mode 100644 module/step/meta/Cargo.toml create mode 100644 module/step/meta/src/meta/_template_procedural_macro/front/lib.rs create mode 100644 module/step/meta/src/meta/_template_procedural_macro/meta/impls.rs create mode 100644 module/step/meta/src/meta/_template_procedural_macro/meta/lib.rs create mode 100644 module/step/meta/src/meta/_template_procedural_macro/runtime/lib.rs create mode 100644 module/step/meta/src/module/aggregating.rs create mode 100644 module/step/meta/src/module/terminal.rs create mode 100644 module/step/meta/tests/_blank/tests.rs create mode 100644 module/step/meta/tests/_conditional/local_module.rs create mode 100644 module/step/meta/tests/_conditional/wtools.rs create mode 100644 module/step/meta/tests/_template_alias/lib_test.rs create mode 100644 module/step/meta/tests/_template_alias/mod.rs create mode 100644 module/step/meta/tests/_template_blank/basic_test.rs create mode 100644 module/step/meta/tests/_template_blank/lib_test.rs create mode 100644 module/step/meta/tests/_template_blank/mod.rs create mode 100644 module/step/meta/tests/smoke_test.rs create mode 100644 module/template/layer/layer.rs create mode 100644 module/template/template_alias/Cargo.toml.template create mode 100644 module/template/template_alias/License create mode 100644 module/template/template_alias/Readme.md create mode 100644 module/template/template_alias/src/lib.rs create mode 100644 module/template/template_alias/src/main.rs create mode 100644 module/template/template_alias/tests/smoke_test.rs create mode 100644 module/template/template_blank/Cargo.toml.template create mode 100644 module/template/template_blank/License create mode 100644 module/template/template_blank/Readme.md create mode 100644 module/template/template_blank/src/lib.rs create mode 100644 module/template/template_blank/tests/inc/basic_test.rs create mode 100644 module/template/template_blank/tests/inc/mod.rs create mode 100644 module/template/template_blank/tests/smoke_test.rs create mode 100644 module/template/template_blank/tests/tests.rs create mode 100644 module/template/template_procedural_macro/Cargo.toml create mode 100644 module/template/template_procedural_macro/License create mode 100644 module/template/template_procedural_macro/Readme.md create mode 100644 module/template/template_procedural_macro/tests/smoke_test.rs create mode 100644 module/template/template_procedural_macro_meta/Cargo.toml create mode 100644 module/template/template_procedural_macro_meta/License create mode 100644 module/template/template_procedural_macro_meta/Readme.md create mode 100644 module/template/template_procedural_macro_meta/tests/smoke_test.rs create mode 100644 module/template/template_procedural_macro_runtime/Cargo.toml create mode 100644 module/template/template_procedural_macro_runtime/License create mode 100644 module/template/template_procedural_macro_runtime/Readme.md create mode 100644 module/template/template_procedural_macro_runtime/tests/smoke_test.rs create mode 100644 module/test/a/Cargo.toml create mode 100644 module/test/a/Readme.md create mode 100644 module/test/a/src/lib.rs create mode 100644 module/test/b/Cargo.toml create mode 100644 module/test/b/Readme.md create mode 100644 module/test/b/src/lib.rs create mode 100644 module/test/c/Cargo.toml create mode 100644 module/test/c/Readme.md create mode 100644 module/test/c/src/lib.rs create mode 100644 rustfmt.toml create mode 100644 step/eol.sh create mode 100644 step/pivot.sh create mode 100644 step/replace.censor diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000000..38ed1d83cd --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,7 @@ + +[env] +MODULES_PATH = { value = "module", relative = true } +WORKSPACE_PATH = { value = ".", relative = true } + +[net] +# offline = true diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..53b061a851 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..3591e3428d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.s linguist-language=JavaScript +*.ss linguist-language=JavaScript +*.js linguist-language=JavaScript +* -text \ No newline at end of file diff --git a/.github/workflows/Readme.md b/.github/workflows/Readme.md new file mode 100644 index 0000000000..52ce58143f --- /dev/null +++ b/.github/workflows/Readme.md @@ -0,0 +1,133 @@ +# healthtable + +[healthtable](../../Readme.md) - in addition to information about modules, their stability contains the results of CI/CD of the master and alpha branches. + +# for_pr_rust_push.yml + +actions: +- install stable rust +- install nightly rust +- install willbe +- run tests with all features, but only on stable toolchain and in debug optimization mode + +Groups creates by strategy: +```yml +for_pr_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} +``` + +inputs.module_name - name of module +github.ref - name of branch +{{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} - returns true if commit message contains directive `+test` or starts with `merge` word. + +runs if commit message contains directive `+test` or starts with `merge` word. + +# standard_rust_push.yml + +actions: +- install stable rust +- install nightly rust +- install cargo-udeps +- install cargo-audit +- checks crate with cargo-udeps +- checks crete with cargo-audit +- install willbe +- run tests with all features, with stable and nightly toolchain, with release and debug optimization mode + +Groups creates by strategy: +```yml +standard_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} +``` + +inputs.module_name - name of module +github.ref - name of branch +{{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} - returns true if commit message contains directive `+test` or starts with `merge` word. + +runs if commit message contains directive `+test` or starts with `merge` word. + +# standard_rust_pool_request.yml + +actions: +- call [for_pr_rust_push.yml](#for_pr_rust_pushyml) for all project. + +# standard_rust_schedule.yml + +actions: +- call [standard_rust_push.yml](#standard_rust_pushyml) for `{module_name}` every day at 1:00 a.m. + +Affects badges in the header of the workspace readme.md file, looks like this [![wTools](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/standard_rust_scheduled.yml?label=master&logo=github&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/standard_rust_scheduled.yml). + +# module_{module_name}_push.yml + +actions: +- call [standard_rust_push.yml](#standard_rust_pushyml) for `{module_name}`. + +Affects badges that are opposite to modules in the **[healthtable](#healthtable)**, as well as badges in the header of the crate readme.md files. + + +# appropriate_branch.yml + +This workflow ensures that pull requests are opened against the correct target branches based on a predefined branching strategy (alpha -> beta -> master). It checks whether the destination branch specified in the pull request matches the expected branch according to the branching strategy. If it doesn't match, the pull request is converted to draft mode, and if it still doesn't match, the workflow fails. + +# appropriate_branch_beta.yml + +This workflow delegates the actual validation and actions to another workflow file (appropriate_branch.yml) located in the Wandalen/wTools repository under .github/workflows directory on the "alpha" branch. It ensures that pull requests targeting the "beta" branch are appropriately validated and processed according to the rules defined in the external workflow file. + +# appropriate_branch_master.yml + +Similar to the previous workflow, this one also delegates the validation and processing of pull requests to an external workflow file (appropriate_branch.yml) located in the Wandalen/wTools repository under the .github/workflows directory on the "alpha" branch. +By specifying the "beta" branch as the source branch and dynamically referencing the base branch of the pull request as the destination branch, this workflow ensures that pull requests targeting the "main" or "master" branches are appropriately validated and processed according to the rules defined in the external workflow file. +This setup promotes consistency and reusability of workflow logic across different branches within the repository, helping to maintain a standardized process for handling pull requests. + +# auto_merge_to_beta.yml + +This workflow automates the process of merging changes from the "alpha" branch into the "beta" branch after ensuring that related workflow runs for modules have completed successfully. +It waits for the completion of workflow runs related to modules and checks their statuses before proceeding with the merge process. +If all checks pass, it merges the changes into the "beta" branch using the provided GitHub token. + +# auto_pr.yml + +This workflow automates the process of opening pull requests between specified source and destination branches. +Upon triggering, it checks out the repository and opens a pull request from the source branch (src_branch) to the destination branch (dst_branch). +The pull request title is automatically generated to indicate that it's an automated pull request forwarding from one branch to another. +If a pull request already exists between the specified branches and PASS_IF_EXISTS is set to true, the action will pass without creating a new pull request. + +# auto_pr_to_alpha.yml + +This workflow automates the process of opening pull requests from any branch except for those explicitly excluded to the "alpha" branch. +It leverages branch filtering to include all branches and exclude specific ones such as master, main, alpha, beta, and any branches containing test or experiment in their names. +When triggered by a push event on a qualifying branch, it calls the external workflow (auto_pr.yml) to handle the process of opening a pull request to the "alpha" branch, passing the source and destination branch information along with the GitHub bot token for authentication. + +# auto_pr_to_beta.yml + +This workflow automates the process of opening pull requests from the "alpha" branch to the "beta" branch. +When triggered by a push event on the "alpha" branch, it calls the external workflow (auto_pr.yml) to handle the process of opening a pull request to the "beta" branch, passing the source and destination branch information along with the GitHub bot token for authentication. + +# auto_pr_to_master.yml + +This workflow automates the process of opening pull requests from the "beta" branch to the "master" branch. +When triggered by a push event on the "beta" branch, it calls the external workflow (auto_pr.yml) to handle the process of opening a pull request to the "master" branch, passing the source and destination branch information along with the GitHub bot token for authentication. + +# runs_clean.yml + +This workflow allows manual triggering to clean up workflow runs in the repository. +It first deletes any runs that have been cancelled or skipped, ensuring that they do not clutter the workflow history. +Then, it deletes runs older than a specified number of days, while ensuring that at least 20 runs are preserved regardless of their age. +By regularly cleaning up older workflow runs, this workflow helps maintain a clean and organized workflow history in the repository. + +# standard_rust_status.yml + +This workflow serves as a status monitor for the completion of specific workflows: "auto_merge_to_beta" and "rust_scheduled." +Upon completion of any of these workflows, it checks the status of their runs. +It employs a matrix strategy to iterate over different workflow files to check their statuses. +If the conclusion of any checked workflow run is "failure," "cancelled," or "skipped," the workflow exits with an error, indicating a problem. + +# status_checks_rules_update.yml + +When a pull request is opened targeting branches "alpha" or "beta": +- If the base branch is "beta": + - It compares the contents of the workflow directories between branches "alpha" and "beta". + - If they are not equal, it triggers an update of branch protection rules for the "beta" branch. +- If the base branch is "alpha": + - It directly triggers an update of branch protection rules for the "alpha" branch with specific required status checks for different contexts. \ No newline at end of file diff --git a/.github/workflows/appropriate_branch.yml b/.github/workflows/appropriate_branch.yml new file mode 100644 index 0000000000..a966ab13cf --- /dev/null +++ b/.github/workflows/appropriate_branch.yml @@ -0,0 +1,58 @@ + +name : appropriate_branch + +on : + + workflow_call : + inputs : + src_branch : + required : true + type : string + dst_branch : + required : true + type : string + secrets : + PRIVATE_GITHUB_BOT_TOKEN : + description : 'Github bot token' + required : true + +env : + + CARGO_TERM_COLOR : always + +concurrency : + + group : appropraite_branch_${{ inputs.src_branch }}_${{ inputs.dst_branch }} + cancel-in-progress : true + +jobs : + + check : + runs-on : ubuntu-latest + outputs : + shouldSkip : ${{ steps.validation.outputs.wrong-target }} + steps : + - name : Check branch + id : validation + uses : Vankka/pr-target-branch-action@v2.1 + env : + GITHUB_TOKEN : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + with : + target : ${{ inputs.dst_branch }} + exclude : ${{ inputs.src_branch }} + comment : | + To maintain stability of the module the repository uses 3-stages system to forward changes from an unstable branch to a stable. + The unstable branch is `alpha`. All user pull requests should be opened to this branch. + The staging branch is `beta`. Changes to this branch are forwarded by a pull request from branch `alpha` automatically. + The stable branch is `master`. Changes to this branch are forwarded by a pull request from branch `beta` automatically. + + The pull request was automatically converted to draft. + Please, change base branch taking into account the described system `alpha -> beta -> master`. + - name : Convert to draft + if : ${{ steps.validation.outputs.wrong-target == 'true' }} + uses: voiceflow/draft-pr@latest + with: + token: ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + - name : Failure + if : ${{ steps.validation.outputs.wrong-target == 'true' }} + run : exit 1 diff --git a/.github/workflows/appropriate_branch_beta.yml b/.github/workflows/appropriate_branch_beta.yml new file mode 100644 index 0000000000..b1fbccec56 --- /dev/null +++ b/.github/workflows/appropriate_branch_beta.yml @@ -0,0 +1,17 @@ + +name : appropriate_branch_beta + +on : + pull_request_target : + branches : + - beta + +jobs : + + appropriate_branch : + uses : Wandalen/wTools/.github/workflows/appropriate_branch.yml@alpha + with : + src_branch : 'alpha' + dst_branch : '${{ github.base_ref }}' + secrets : + PRIVATE_GITHUB_BOT_TOKEN : '${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}' diff --git a/.github/workflows/appropriate_branch_master.yml b/.github/workflows/appropriate_branch_master.yml new file mode 100644 index 0000000000..ea4f0dac66 --- /dev/null +++ b/.github/workflows/appropriate_branch_master.yml @@ -0,0 +1,18 @@ + +name : appropriate_branch_master + +on : + pull_request_target : + branches : + - main + - master + +jobs : + + appropriate_branch : + uses : Wandalen/wTools/.github/workflows/appropriate_branch.yml@alpha + with : + src_branch : 'beta' + dst_branch : '${{ github.base_ref }}' + secrets : + PRIVATE_GITHUB_BOT_TOKEN : '${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}' diff --git a/.github/workflows/auto_merge_to_beta.yml b/.github/workflows/auto_merge_to_beta.yml new file mode 100644 index 0000000000..8fe280914a --- /dev/null +++ b/.github/workflows/auto_merge_to_beta.yml @@ -0,0 +1,95 @@ + +name : auto_merge_to_beta + +on : + push : + branches : [ alpha ] + +concurrency : + + group : auto_merge_to_beta + cancel-in-progress : true + +jobs : + + get_modules: + outputs : + workflow_files: ${{ steps.workflow_files.outputs.files }} + workflow_names: ${{ steps.workflow_names.outputs.names }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - id: workflow_files + run: | + WORKFLOWS=$(ls .github/workflows | grep module) + for WORKFLOW in $WORKFLOWS ; do + NAME=$(echo $WORKFLOW | sed 's/\(\S\+\).yml/\1/') + NAMES="$NAMES $NAME" + done; + NAMES=$(sed 's/\s\+/\n/g' <<< $NAMES) + OUTPUT=$(echo "$NAMES" | jq -R -s -c 'split("\n")[1:-1]') + echo "files={\"modules\":$OUTPUT}" >> $GITHUB_OUTPUT + - id: workflow_names + run: | + WORKFLOWS=$(ls .github/workflows | grep module) + for WORKFLOW in $WORKFLOWS ; do + NAME=$(cat .github/workflows/$WORKFLOW | grep -G '^name :' | sed 's/name\s*:\s\+\(\S*\)/\1/') + NAMES="$NAMES%0A$NAME" + done; + echo "names=$NAMES" >> $GITHUB_OUTPUT + + wait_for_modules : + needs : get_modules + runs-on : ubuntu-latest + steps : + - name : Waiting ... + uses : willgarcia/workflow-wait-action@main + with : + timeout : 21600 + interval : 60 + initial_delay : 60 + workflows : ${{ needs.get_modules.outputs.workflow_names }} + + runs_check : + needs : + - get_modules + - wait_for_modules + strategy : + matrix : ${{ fromJSON( needs.get_modules.outputs.workflow_files ) }} + runs-on : ubuntu-latest + steps : + - name : Check workflow run status + id : check_ci + uses : ronymeyer/workflow-status@v0.3.7 + with : + token : ${{ secrets.GITHUB_TOKEN }} + workflow : ${{ matrix.modules }}.yml + event : push + branch : alpha + - name : Check failure conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'failure' }} + run : exit 1 + - name : Check cancelled conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'cancelled' }} + run : exit 1 + - name : Check skipped conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'skipped' }} + run : exit 1 + + merge : + needs : runs_check + runs-on : ubuntu-latest + steps : + - name : Find PR number for current commit + uses : jwalton/gh-find-current-pr@v1 + id : find + with : + state: open + - name: Automerge passed pull request + if : ${{ success() }} + uses: juliangruber/merge-pull-request-action@v1 + with: + github-token: ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + repo: ${{ github.repository }} + number: ${{ steps.find.outputs.number }} + method: merge diff --git a/.github/workflows/auto_pr.yml b/.github/workflows/auto_pr.yml new file mode 100644 index 0000000000..bd87d03d26 --- /dev/null +++ b/.github/workflows/auto_pr.yml @@ -0,0 +1,36 @@ + +name : auto_pr + +on : + + workflow_call : + inputs : + src_branch : + required : true + type : string + dst_branch : + required : true + type : string + secrets : + PRIVATE_GITHUB_BOT_TOKEN : + description : 'Github bot token' + required : true + +concurrency : + + group : auto_pr_${{ inputs.src_branch }}_${{ inputs.dst_branch }} + cancel-in-progress : true + +jobs : + + build : + runs-on : ubuntu-latest + steps : + - uses : actions/checkout@v3 + - name : Open PR + uses : vsoch/pull-request-action@1.1.0 + env : + GITHUB_TOKEN : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + PULL_REQUEST_BRANCH : ${{ inputs.dst_branch }} + PULL_REQUEST_TITLE : 'AUTO : Forward from ${{ inputs.src_branch }} to ${{ inputs.dst_branch }}' + PASS_IF_EXISTS : true diff --git a/.github/workflows/auto_pr_to_alpha.yml b/.github/workflows/auto_pr_to_alpha.yml new file mode 100644 index 0000000000..e65855bb51 --- /dev/null +++ b/.github/workflows/auto_pr_to_alpha.yml @@ -0,0 +1,29 @@ + +name : auto_pr_to_alpha + +on : + push : + branches : + - '*' + - '*/*' + - '**' + - '!master' + - '!main' + - '!alpha' + - '!beta' + - '!*test*' + - '!*test*/*' + - '!*/*test*' + - '!*experiment*' + - '!*experiment*/*' + - '!*/*experiment*' + +jobs : + + forward : + uses : Wandalen/wTools/.github/workflows/auto_pr.yml@alpha + with : + src_branch : '${{ github.ref_name }}' + dst_branch : 'alpha' + secrets : + PRIVATE_GITHUB_BOT_TOKEN : '${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}' diff --git a/.github/workflows/auto_pr_to_beta.yml b/.github/workflows/auto_pr_to_beta.yml new file mode 100644 index 0000000000..54a6d7d9e5 --- /dev/null +++ b/.github/workflows/auto_pr_to_beta.yml @@ -0,0 +1,17 @@ + +name : auto_pr_to_beta + +on : + push : + branches : + - alpha + +jobs : + + forward : + uses : Wandalen/wTools/.github/workflows/auto_pr.yml@alpha + with : + src_branch : 'alpha' + dst_branch : 'beta' + secrets : + PRIVATE_GITHUB_BOT_TOKEN : '${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}' diff --git a/.github/workflows/auto_pr_to_master.yml b/.github/workflows/auto_pr_to_master.yml new file mode 100644 index 0000000000..e652301038 --- /dev/null +++ b/.github/workflows/auto_pr_to_master.yml @@ -0,0 +1,17 @@ + +name : auto_pr_to_master + +on : + push : + branches : + - beta + +jobs : + + forward : + uses : Wandalen/wTools/.github/workflows/auto_pr.yml@alpha + with : + src_branch : 'beta' + dst_branch : 'master' + secrets : + PRIVATE_GITHUB_BOT_TOKEN : '${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}' diff --git a/.github/workflows/for_pr_rust_push.yml b/.github/workflows/for_pr_rust_push.yml new file mode 100644 index 0000000000..edbc5aa907 --- /dev/null +++ b/.github/workflows/for_pr_rust_push.yml @@ -0,0 +1,72 @@ + +name : for_pr_push + +on : + + workflow_call : + inputs : + manifest_path : + required : true + type : string + module_name : + required : true + type : string + commit_message : + required : true + type : string + with_smoke : + required : false + type : string + default : true + +concurrency : + + group : for_pr_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} + cancel-in-progress : true + +env : + + RUST_BACKTRACE : 1 + CARGO_TERM_COLOR : always + WITH_SMOKE : ${{ inputs.with_smoke }} + +jobs : + + will_test : + if : contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + concurrency : + group : for_pr_rust_push_${{ inputs.module_name }}_${{ github.ref }}_${{ matrix.os }} + cancel-in-progress : true + strategy : + fail-fast : false + matrix : + os : [ ubuntu-latest, windows-latest, macos-latest ] + runs-on : ${{ matrix.os }} + steps : + - name : Install latest stable toolchain + uses : Wandalen/wretry.action/main@master + with : + action : actions-rs/toolchain@v1 + with : | + toolchain : stable + override : true + attempt_limit : 3 + attempt_delay: 10000 + - name: Install latest nightly toolchain + uses: Wandalen/wretry.action/main@master + with: + action: actions-rs/toolchain@v1 + with: | + toolchain : nightly + override : true + attempt_limit: 3 + attempt_delay: 10000 + - uses: actions/checkout@v3 + - name: Install will + run: cargo install --git https://github.com/Wandalen/wTools --branch alpha willbe + - name: Set MANIFEST_ROOT_PATH + id: rootpath + run: echo "::set-output name=path::$(dirname ${{ inputs.manifest_path }})" + - name: Run tests with each feature + run: will .test ${{ steps.rootpath.outputs.path }}/ dry:0 exclude:'' with_all_features:1 with_debug:1 with_nightly:0 with_none_features:1 with_release:0 with_stable:1 \ No newline at end of file diff --git a/.github/workflows/module_cargo_will_push.yml b/.github/workflows/module_cargo_will_push.yml new file mode 100644 index 0000000000..302282174f --- /dev/null +++ b/.github/workflows/module_cargo_will_push.yml @@ -0,0 +1,23 @@ +name : cargo_will + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # cargo_will + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/cargo_will/Cargo.toml' + module_name : 'cargo_will' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_clone_dyn_meta_push.yml b/.github/workflows/module_clone_dyn_meta_push.yml new file mode 100644 index 0000000000..d9d94012f5 --- /dev/null +++ b/.github/workflows/module_clone_dyn_meta_push.yml @@ -0,0 +1,23 @@ +name : clone_dyn_meta + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # clone_dyn_meta + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/clone_dyn_meta/Cargo.toml' + module_name : 'clone_dyn_meta' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_clone_dyn_push.yml b/.github/workflows/module_clone_dyn_push.yml new file mode 100644 index 0000000000..d7b480578b --- /dev/null +++ b/.github/workflows/module_clone_dyn_push.yml @@ -0,0 +1,23 @@ +name : clone_dyn + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # clone_dyn + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/clone_dyn/Cargo.toml' + module_name : 'clone_dyn' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_collection_tools_push.yml b/.github/workflows/module_collection_tools_push.yml new file mode 100644 index 0000000000..d1325627e2 --- /dev/null +++ b/.github/workflows/module_collection_tools_push.yml @@ -0,0 +1,23 @@ +name : collection_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # collection_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/collection_tools/Cargo.toml' + module_name : 'collection_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_crates_tools_push.yml b/.github/workflows/module_crates_tools_push.yml new file mode 100644 index 0000000000..1b06311c6c --- /dev/null +++ b/.github/workflows/module_crates_tools_push.yml @@ -0,0 +1,23 @@ +name : crates_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # crates_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/crates_tools/Cargo.toml' + module_name : 'crates_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_data_type_push.yml b/.github/workflows/module_data_type_push.yml new file mode 100644 index 0000000000..64fa876fc6 --- /dev/null +++ b/.github/workflows/module_data_type_push.yml @@ -0,0 +1,23 @@ +name : data_type + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # data_type + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/data_type/Cargo.toml' + module_name : 'data_type' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_derive_tools_meta_push.yml b/.github/workflows/module_derive_tools_meta_push.yml new file mode 100644 index 0000000000..4bbc62af5a --- /dev/null +++ b/.github/workflows/module_derive_tools_meta_push.yml @@ -0,0 +1,23 @@ +name : derive_tools_meta + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # derive_tools_meta + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/derive_tools_meta/Cargo.toml' + module_name : 'derive_tools_meta' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_derive_tools_push.yml b/.github/workflows/module_derive_tools_push.yml new file mode 100644 index 0000000000..723b900d2d --- /dev/null +++ b/.github/workflows/module_derive_tools_push.yml @@ -0,0 +1,23 @@ +name : derive_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # derive_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/derive_tools/Cargo.toml' + module_name : 'derive_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_deterministic_rand_push.yml b/.github/workflows/module_deterministic_rand_push.yml new file mode 100644 index 0000000000..a761d7cb83 --- /dev/null +++ b/.github/workflows/module_deterministic_rand_push.yml @@ -0,0 +1,23 @@ +name : deterministic_rand + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # deterministic_rand + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/deterministic_rand/Cargo.toml' + module_name : 'deterministic_rand' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_diagnostics_tools_push.yml b/.github/workflows/module_diagnostics_tools_push.yml new file mode 100644 index 0000000000..cdb337ebd1 --- /dev/null +++ b/.github/workflows/module_diagnostics_tools_push.yml @@ -0,0 +1,23 @@ +name : diagnostics_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # diagnostics_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/diagnostics_tools/Cargo.toml' + module_name : 'diagnostics_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_error_tools_push.yml b/.github/workflows/module_error_tools_push.yml new file mode 100644 index 0000000000..39c342f339 --- /dev/null +++ b/.github/workflows/module_error_tools_push.yml @@ -0,0 +1,23 @@ +name : error_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # error_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/error_tools/Cargo.toml' + module_name : 'error_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_exe_tools_push.yml b/.github/workflows/module_exe_tools_push.yml new file mode 100644 index 0000000000..f340a4bbd6 --- /dev/null +++ b/.github/workflows/module_exe_tools_push.yml @@ -0,0 +1,23 @@ +name : exe_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # exe_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/blank/exe_tools/Cargo.toml' + module_name : 'exe_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_file_tools_push.yml b/.github/workflows/module_file_tools_push.yml new file mode 100644 index 0000000000..f6bc6e7ae6 --- /dev/null +++ b/.github/workflows/module_file_tools_push.yml @@ -0,0 +1,23 @@ +name : file_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # file_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/file_tools/Cargo.toml' + module_name : 'file_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_for_each_push.yml b/.github/workflows/module_for_each_push.yml new file mode 100644 index 0000000000..6b8fb841df --- /dev/null +++ b/.github/workflows/module_for_each_push.yml @@ -0,0 +1,23 @@ +name : for_each + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # for_each + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/for_each/Cargo.toml' + module_name : 'for_each' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_former_meta_push.yml b/.github/workflows/module_former_meta_push.yml new file mode 100644 index 0000000000..48d9ab029c --- /dev/null +++ b/.github/workflows/module_former_meta_push.yml @@ -0,0 +1,23 @@ +name : former_meta + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # former_meta + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/former_meta/Cargo.toml' + module_name : 'former_meta' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_former_push.yml b/.github/workflows/module_former_push.yml new file mode 100644 index 0000000000..f5757ce568 --- /dev/null +++ b/.github/workflows/module_former_push.yml @@ -0,0 +1,23 @@ +name : former + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # former + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/former/Cargo.toml' + module_name : 'former' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_former_types_push.yml b/.github/workflows/module_former_types_push.yml new file mode 100644 index 0000000000..4bff75e540 --- /dev/null +++ b/.github/workflows/module_former_types_push.yml @@ -0,0 +1,23 @@ +name : former_types + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # former_types + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/former_types/Cargo.toml' + module_name : 'former_types' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_fs_tools_push.yml b/.github/workflows/module_fs_tools_push.yml new file mode 100644 index 0000000000..a0a5933d00 --- /dev/null +++ b/.github/workflows/module_fs_tools_push.yml @@ -0,0 +1,23 @@ +name : fs_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # fs_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/fs_tools/Cargo.toml' + module_name : 'fs_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_fundamental_data_type_push.yml b/.github/workflows/module_fundamental_data_type_push.yml new file mode 100644 index 0000000000..e1b249f10a --- /dev/null +++ b/.github/workflows/module_fundamental_data_type_push.yml @@ -0,0 +1,23 @@ +name : fundamental_data_type + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # fundamental_data_type + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/fundamental_data_type/Cargo.toml' + module_name : 'fundamental_data_type' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_graphs_tools_push.yml b/.github/workflows/module_graphs_tools_push.yml new file mode 100644 index 0000000000..171b256c36 --- /dev/null +++ b/.github/workflows/module_graphs_tools_push.yml @@ -0,0 +1,23 @@ +name : graphs_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # graphs_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/graphs_tools/Cargo.toml' + module_name : 'graphs_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_image_tools_push.yml b/.github/workflows/module_image_tools_push.yml new file mode 100644 index 0000000000..ca8bc1059c --- /dev/null +++ b/.github/workflows/module_image_tools_push.yml @@ -0,0 +1,23 @@ +name : image_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # image_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/blank/image_tools/Cargo.toml' + module_name : 'image_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_implements_push.yml b/.github/workflows/module_implements_push.yml new file mode 100644 index 0000000000..76efd0b848 --- /dev/null +++ b/.github/workflows/module_implements_push.yml @@ -0,0 +1,23 @@ +name : implements + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # implements + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/implements/Cargo.toml' + module_name : 'implements' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_impls_index_meta_push.yml b/.github/workflows/module_impls_index_meta_push.yml new file mode 100644 index 0000000000..da1fc0c8bd --- /dev/null +++ b/.github/workflows/module_impls_index_meta_push.yml @@ -0,0 +1,23 @@ +name : impls_index_meta + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # impls_index_meta + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/impls_index_meta/Cargo.toml' + module_name : 'impls_index_meta' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_impls_index_push.yml b/.github/workflows/module_impls_index_push.yml new file mode 100644 index 0000000000..bffccc6c8e --- /dev/null +++ b/.github/workflows/module_impls_index_push.yml @@ -0,0 +1,23 @@ +name : impls_index + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # impls_index + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/impls_index/Cargo.toml' + module_name : 'impls_index' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_include_md_push.yml b/.github/workflows/module_include_md_push.yml new file mode 100644 index 0000000000..d48608d38e --- /dev/null +++ b/.github/workflows/module_include_md_push.yml @@ -0,0 +1,23 @@ +name : include_md + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # include_md + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/include_md/Cargo.toml' + module_name : 'include_md' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_inspect_type_push.yml b/.github/workflows/module_inspect_type_push.yml new file mode 100644 index 0000000000..79f7219395 --- /dev/null +++ b/.github/workflows/module_inspect_type_push.yml @@ -0,0 +1,23 @@ +name : inspect_type + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # inspect_type + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/inspect_type/Cargo.toml' + module_name : 'inspect_type' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_instance_of_push.yml b/.github/workflows/module_instance_of_push.yml new file mode 100644 index 0000000000..52403c3004 --- /dev/null +++ b/.github/workflows/module_instance_of_push.yml @@ -0,0 +1,23 @@ +name : instance_of + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # instance_of + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/instance_of/Cargo.toml' + module_name : 'instance_of' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_interval_adapter_push.yml b/.github/workflows/module_interval_adapter_push.yml new file mode 100644 index 0000000000..f720644edc --- /dev/null +++ b/.github/workflows/module_interval_adapter_push.yml @@ -0,0 +1,23 @@ +name : interval_adapter + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # interval_adapter + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/interval_adapter/Cargo.toml' + module_name : 'interval_adapter' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_is_slice_push.yml b/.github/workflows/module_is_slice_push.yml new file mode 100644 index 0000000000..469ad60f45 --- /dev/null +++ b/.github/workflows/module_is_slice_push.yml @@ -0,0 +1,23 @@ +name : is_slice + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # is_slice + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/is_slice/Cargo.toml' + module_name : 'is_slice' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_iter_tools_push.yml b/.github/workflows/module_iter_tools_push.yml new file mode 100644 index 0000000000..e309b039bb --- /dev/null +++ b/.github/workflows/module_iter_tools_push.yml @@ -0,0 +1,23 @@ +name : iter_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # iter_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/iter_tools/Cargo.toml' + module_name : 'iter_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_macro_tools_push.yml b/.github/workflows/module_macro_tools_push.yml new file mode 100644 index 0000000000..b6bfa53f2c --- /dev/null +++ b/.github/workflows/module_macro_tools_push.yml @@ -0,0 +1,23 @@ +name : macro_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # macro_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/macro_tools/Cargo.toml' + module_name : 'macro_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_math_tools_push.yml b/.github/workflows/module_math_tools_push.yml new file mode 100644 index 0000000000..07e965fbf1 --- /dev/null +++ b/.github/workflows/module_math_tools_push.yml @@ -0,0 +1,23 @@ +name : math_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # math_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/blank/math_tools/Cargo.toml' + module_name : 'math_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_mem_tools_push.yml b/.github/workflows/module_mem_tools_push.yml new file mode 100644 index 0000000000..acca4cac93 --- /dev/null +++ b/.github/workflows/module_mem_tools_push.yml @@ -0,0 +1,23 @@ +name : mem_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # mem_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/mem_tools/Cargo.toml' + module_name : 'mem_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_meta_tools_push.yml b/.github/workflows/module_meta_tools_push.yml new file mode 100644 index 0000000000..8aacc2691f --- /dev/null +++ b/.github/workflows/module_meta_tools_push.yml @@ -0,0 +1,23 @@ +name : meta_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # meta_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/meta_tools/Cargo.toml' + module_name : 'meta_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_mod_interface_meta_push.yml b/.github/workflows/module_mod_interface_meta_push.yml new file mode 100644 index 0000000000..c7a1ed7477 --- /dev/null +++ b/.github/workflows/module_mod_interface_meta_push.yml @@ -0,0 +1,23 @@ +name : mod_interface_meta + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # mod_interface_meta + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/mod_interface_meta/Cargo.toml' + module_name : 'mod_interface_meta' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_mod_interface_push.yml b/.github/workflows/module_mod_interface_push.yml new file mode 100644 index 0000000000..2f0bd2f75a --- /dev/null +++ b/.github/workflows/module_mod_interface_push.yml @@ -0,0 +1,23 @@ +name : mod_interface + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # mod_interface + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/mod_interface/Cargo.toml' + module_name : 'mod_interface' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_multilayer_push.yml b/.github/workflows/module_multilayer_push.yml new file mode 100644 index 0000000000..a2929d01d9 --- /dev/null +++ b/.github/workflows/module_multilayer_push.yml @@ -0,0 +1,23 @@ +name : multilayer + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # multilayer + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/multilayer/Cargo.toml' + module_name : 'multilayer' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_optimization_tools_push.yml b/.github/workflows/module_optimization_tools_push.yml new file mode 100644 index 0000000000..8a1c8cf89d --- /dev/null +++ b/.github/workflows/module_optimization_tools_push.yml @@ -0,0 +1,23 @@ +name : optimization_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # optimization_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/optimization_tools/Cargo.toml' + module_name : 'optimization_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_plot_interface_push.yml b/.github/workflows/module_plot_interface_push.yml new file mode 100644 index 0000000000..22ed8a9c72 --- /dev/null +++ b/.github/workflows/module_plot_interface_push.yml @@ -0,0 +1,23 @@ +name : plot_interface + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # plot_interface + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/plot_interface/Cargo.toml' + module_name : 'plot_interface' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_proc_macro_tools_push.yml b/.github/workflows/module_proc_macro_tools_push.yml new file mode 100644 index 0000000000..d9aafa1cbb --- /dev/null +++ b/.github/workflows/module_proc_macro_tools_push.yml @@ -0,0 +1,23 @@ +name : proc_macro_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # proc_macro_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/proc_macro_tools/Cargo.toml' + module_name : 'proc_macro_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_process_tools_push.yml b/.github/workflows/module_process_tools_push.yml new file mode 100644 index 0000000000..217cc648de --- /dev/null +++ b/.github/workflows/module_process_tools_push.yml @@ -0,0 +1,23 @@ +name : process_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # process_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/process_tools/Cargo.toml' + module_name : 'process_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_program_tools_push.yml b/.github/workflows/module_program_tools_push.yml new file mode 100644 index 0000000000..5b3e79ed27 --- /dev/null +++ b/.github/workflows/module_program_tools_push.yml @@ -0,0 +1,23 @@ +name : program_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # program_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/program_tools/Cargo.toml' + module_name : 'program_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_proper_path_tools_push.yml b/.github/workflows/module_proper_path_tools_push.yml new file mode 100644 index 0000000000..e7adc2bbb2 --- /dev/null +++ b/.github/workflows/module_proper_path_tools_push.yml @@ -0,0 +1,23 @@ +name : proper_path_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # proper_path_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/proper_path_tools/Cargo.toml' + module_name : 'proper_path_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_proper_tools_push.yml b/.github/workflows/module_proper_tools_push.yml new file mode 100644 index 0000000000..798d19b582 --- /dev/null +++ b/.github/workflows/module_proper_tools_push.yml @@ -0,0 +1,23 @@ +name : proper_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # proper_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/proper_tools/Cargo.toml' + module_name : 'proper_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_refiner_push.yml b/.github/workflows/module_refiner_push.yml new file mode 100644 index 0000000000..e48de2c4ec --- /dev/null +++ b/.github/workflows/module_refiner_push.yml @@ -0,0 +1,23 @@ +name : refiner + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # refiner + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/refiner/Cargo.toml' + module_name : 'refiner' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_reflect_tools_meta_push.yml b/.github/workflows/module_reflect_tools_meta_push.yml new file mode 100644 index 0000000000..d8319d1eaa --- /dev/null +++ b/.github/workflows/module_reflect_tools_meta_push.yml @@ -0,0 +1,23 @@ +name : reflect_tools_meta + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # reflect_tools_meta + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/reflect_tools_meta/Cargo.toml' + module_name : 'reflect_tools_meta' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_reflect_tools_push.yml b/.github/workflows/module_reflect_tools_push.yml new file mode 100644 index 0000000000..7384babc65 --- /dev/null +++ b/.github/workflows/module_reflect_tools_push.yml @@ -0,0 +1,23 @@ +name : reflect_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # reflect_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/reflect_tools/Cargo.toml' + module_name : 'reflect_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_rustql_push.yml b/.github/workflows/module_rustql_push.yml new file mode 100644 index 0000000000..16ca176024 --- /dev/null +++ b/.github/workflows/module_rustql_push.yml @@ -0,0 +1,23 @@ +name : rustql + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # rustql + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/blank/rustql/Cargo.toml' + module_name : 'rustql' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_sqlx_query_push.yml b/.github/workflows/module_sqlx_query_push.yml new file mode 100644 index 0000000000..896a0ebcbd --- /dev/null +++ b/.github/workflows/module_sqlx_query_push.yml @@ -0,0 +1,23 @@ +name : sqlx_query + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # sqlx_query + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/sqlx_query/Cargo.toml' + module_name : 'sqlx_query' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_strs_tools_push.yml b/.github/workflows/module_strs_tools_push.yml new file mode 100644 index 0000000000..b62f5d0ff6 --- /dev/null +++ b/.github/workflows/module_strs_tools_push.yml @@ -0,0 +1,23 @@ +name : strs_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # strs_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/strs_tools/Cargo.toml' + module_name : 'strs_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_test_experimental_a_push.yml b/.github/workflows/module_test_experimental_a_push.yml new file mode 100644 index 0000000000..3b8f21e98a --- /dev/null +++ b/.github/workflows/module_test_experimental_a_push.yml @@ -0,0 +1,23 @@ +name : test_experimental_a + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # test_experimental_a + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/test/a/Cargo.toml' + module_name : 'test_experimental_a' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_test_experimental_b_push.yml b/.github/workflows/module_test_experimental_b_push.yml new file mode 100644 index 0000000000..7eb23049bc --- /dev/null +++ b/.github/workflows/module_test_experimental_b_push.yml @@ -0,0 +1,23 @@ +name : test_experimental_b + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # test_experimental_b + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/test/b/Cargo.toml' + module_name : 'test_experimental_b' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_test_experimental_c_push.yml b/.github/workflows/module_test_experimental_c_push.yml new file mode 100644 index 0000000000..8d44763090 --- /dev/null +++ b/.github/workflows/module_test_experimental_c_push.yml @@ -0,0 +1,23 @@ +name : test_experimental_c + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # test_experimental_c + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/test/c/Cargo.toml' + module_name : 'test_experimental_c' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_test_tools_push.yml b/.github/workflows/module_test_tools_push.yml new file mode 100644 index 0000000000..d75629dc41 --- /dev/null +++ b/.github/workflows/module_test_tools_push.yml @@ -0,0 +1,23 @@ +name : test_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # test_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/test_tools/Cargo.toml' + module_name : 'test_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_time_tools_push.yml b/.github/workflows/module_time_tools_push.yml new file mode 100644 index 0000000000..49d89bb2e9 --- /dev/null +++ b/.github/workflows/module_time_tools_push.yml @@ -0,0 +1,23 @@ +name : time_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # time_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/time_tools/Cargo.toml' + module_name : 'time_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_typing_tools_push.yml b/.github/workflows/module_typing_tools_push.yml new file mode 100644 index 0000000000..c3e0040579 --- /dev/null +++ b/.github/workflows/module_typing_tools_push.yml @@ -0,0 +1,23 @@ +name : typing_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # typing_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/typing_tools/Cargo.toml' + module_name : 'typing_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_unitore_push.yml b/.github/workflows/module_unitore_push.yml new file mode 100644 index 0000000000..1dca0c370d --- /dev/null +++ b/.github/workflows/module_unitore_push.yml @@ -0,0 +1,23 @@ +name : unitore + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # unitore + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/unitore/Cargo.toml' + module_name : 'unitore' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_variadic_from_push.yml b/.github/workflows/module_variadic_from_push.yml new file mode 100644 index 0000000000..c147ba0aa5 --- /dev/null +++ b/.github/workflows/module_variadic_from_push.yml @@ -0,0 +1,23 @@ +name : variadic_from + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # variadic_from + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/variadic_from/Cargo.toml' + module_name : 'variadic_from' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_w_4_d_push.yml b/.github/workflows/module_w_4_d_push.yml new file mode 100644 index 0000000000..3f8ff05a50 --- /dev/null +++ b/.github/workflows/module_w_4_d_push.yml @@ -0,0 +1,23 @@ +name : w4d + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # w4d + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/blank/w4d/Cargo.toml' + module_name : 'w4d' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wca_push.yml b/.github/workflows/module_wca_push.yml new file mode 100644 index 0000000000..e4a77a1e67 --- /dev/null +++ b/.github/workflows/module_wca_push.yml @@ -0,0 +1,23 @@ +name : wca + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wca + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/wca/Cargo.toml' + module_name : 'wca' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_werror_push.yml b/.github/workflows/module_werror_push.yml new file mode 100644 index 0000000000..563ab2e63f --- /dev/null +++ b/.github/workflows/module_werror_push.yml @@ -0,0 +1,23 @@ +name : werror + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # werror + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/werror/Cargo.toml' + module_name : 'werror' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_willbe_2_push.yml b/.github/workflows/module_willbe_2_push.yml new file mode 100644 index 0000000000..65631a35b5 --- /dev/null +++ b/.github/workflows/module_willbe_2_push.yml @@ -0,0 +1,23 @@ +name : willbe2 + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # willbe2 + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/willbe2/Cargo.toml' + module_name : 'willbe2' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_willbe_old_push.yml b/.github/workflows/module_willbe_old_push.yml new file mode 100644 index 0000000000..231a5784dd --- /dev/null +++ b/.github/workflows/module_willbe_old_push.yml @@ -0,0 +1,23 @@ +name : willbe_old + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # willbe_old + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/blank/willbe_old/Cargo.toml' + module_name : 'willbe_old' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_willbe_push.yml b/.github/workflows/module_willbe_push.yml new file mode 100644 index 0000000000..701f8cdc2f --- /dev/null +++ b/.github/workflows/module_willbe_push.yml @@ -0,0 +1,23 @@ +name : willbe + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # willbe + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/willbe/Cargo.toml' + module_name : 'willbe' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_winterval_push.yml b/.github/workflows/module_winterval_push.yml new file mode 100644 index 0000000000..39c87febbf --- /dev/null +++ b/.github/workflows/module_winterval_push.yml @@ -0,0 +1,23 @@ +name : winterval + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # winterval + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/winterval/Cargo.toml' + module_name : 'winterval' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wlang_push.yml b/.github/workflows/module_wlang_push.yml new file mode 100644 index 0000000000..ab1bbd2c96 --- /dev/null +++ b/.github/workflows/module_wlang_push.yml @@ -0,0 +1,23 @@ +name : wlang + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wlang + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/blank/wlang/Cargo.toml' + module_name : 'wlang' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wplot_push.yml b/.github/workflows/module_wplot_push.yml new file mode 100644 index 0000000000..833466e0d0 --- /dev/null +++ b/.github/workflows/module_wplot_push.yml @@ -0,0 +1,23 @@ +name : wplot + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wplot + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/wplot/Cargo.toml' + module_name : 'wplot' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wproc_macro_push.yml b/.github/workflows/module_wproc_macro_push.yml new file mode 100644 index 0000000000..c56d38c188 --- /dev/null +++ b/.github/workflows/module_wproc_macro_push.yml @@ -0,0 +1,23 @@ +name : wproc_macro + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wproc_macro + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/wproc_macro/Cargo.toml' + module_name : 'wproc_macro' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wstring_tools_push.yml b/.github/workflows/module_wstring_tools_push.yml new file mode 100644 index 0000000000..fdc4364c33 --- /dev/null +++ b/.github/workflows/module_wstring_tools_push.yml @@ -0,0 +1,23 @@ +name : wstring_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wstring_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/wstring_tools/Cargo.toml' + module_name : 'wstring_tools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wtest_basic_push.yml b/.github/workflows/module_wtest_basic_push.yml new file mode 100644 index 0000000000..420736676c --- /dev/null +++ b/.github/workflows/module_wtest_basic_push.yml @@ -0,0 +1,23 @@ +name : wtest_basic + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wtest_basic + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/wtest_basic/Cargo.toml' + module_name : 'wtest_basic' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wtest_push.yml b/.github/workflows/module_wtest_push.yml new file mode 100644 index 0000000000..7cc9b8979f --- /dev/null +++ b/.github/workflows/module_wtest_push.yml @@ -0,0 +1,23 @@ +name : wtest + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wtest + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/alias/wtest/Cargo.toml' + module_name : 'wtest' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/module_wtools_push.yml b/.github/workflows/module_wtools_push.yml new file mode 100644 index 0000000000..fbbf8c7a3f --- /dev/null +++ b/.github/workflows/module_wtools_push.yml @@ -0,0 +1,23 @@ +name : wtools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # wtools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/wtools/Cargo.toml' + module_name : 'wtools' + commit_message : ${{ github.event.head_commit.message }} diff --git a/.github/workflows/runs_clean.yml b/.github/workflows/runs_clean.yml new file mode 100644 index 0000000000..e05465ed0d --- /dev/null +++ b/.github/workflows/runs_clean.yml @@ -0,0 +1,38 @@ + +name : runs_clean + +on : + + workflow_dispatch : + inputs : + days : + description : 'Older than number of days.' + required : true + type : number + default : 0 + +concurrency : + + group : runs_clean + cancel-in-progress : true + +jobs : + + del_runs : + runs-on : ubuntu-latest + steps : + - name : Delete skipped and cancelled runs + uses : dmvict/clean-workflow-runs@v1 + with : + token : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + run_conclusions : | + cancelled + skipped + save_period : 0 + save_min_runs_number : 0 + - name : Delete older workflow runs + uses : dmvict/clean-workflow-runs@v1 + with : + token : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + save_period : ${{ github.event.inputs.days }} + save_min_runs_number : 20 diff --git a/.github/workflows/standard_rust_pull_request.yml b/.github/workflows/standard_rust_pull_request.yml new file mode 100644 index 0000000000..f71b959fae --- /dev/null +++ b/.github/workflows/standard_rust_pull_request.yml @@ -0,0 +1,51 @@ + +name : rust_pull_request + +on : [ pull_request ] + +env : + CARGO_TERM_COLOR : always + +concurrency : + group : standard_rust_pull_request_${{ github.event.base.ref }}_${{ github.event.number }} + cancel-in-progress : true + +jobs : + + check : + if : ${{ github.event.pull_request.head.repo.fork }} + runs-on : ubuntu-latest + outputs : + commit_message : ${{ steps.message.outputs.message }} + should_run : ${{ steps.run.outputs.should_run }} + steps : + - name : List commits on the pull request + run : | + response=$(curl --request GET \ + --url 'https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/commits' \ + --header 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' \ + --header 'Accept: application/vnd.github.v3+json' \ + --header 'Content-Type: application/json') + echo $response > response.json + - name : Get latest commit + id : message + run : | + length=$(jq 'length' response.json) + index=$(($length - 1)) + latest_commit=$(jq --argjson index $index '.[$index]' response.json) + latest_commit_message=$(echo "$latest_commit" | jq -r '.commit.message' | tr -d '\n') + echo "message=$latest_commit_message" >> $GITHUB_OUTPUT + - name : Set output + id: run + if : "!startsWith( steps.message.outputs.message, 'Merge ' )" + run : echo "should_run=true" >> $GITHUB_OUTPUT + + tested : + needs: check + if : ${{ needs.check.outputs.should_run == 'true' }} + uses : Wandalen/wTools/.github/workflows/for_pr_rust_push.yml@alpha + with : + manifest_path : './Cargo.toml' + module_name : ${{ github.event.base.ref }}_${{ github.event.number }} + commit_message : "+test_${{ github.event.base.ref }}_${{ github.event.number }}" + with_smoke : false diff --git a/.github/workflows/standard_rust_push.yml b/.github/workflows/standard_rust_push.yml new file mode 100644 index 0000000000..1812c69512 --- /dev/null +++ b/.github/workflows/standard_rust_push.yml @@ -0,0 +1,157 @@ + +name : rust_push + +on : + + workflow_call : + inputs : + manifest_path : + required : true + type : string + module_name : + required : true + type : string + commit_message : + required : true + type : string + with_smoke : + required : false + type : string + default : true + +concurrency : + + group : standard_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} + cancel-in-progress : true + +env : + + RUST_BACKTRACE : 1 + CARGO_TERM_COLOR : always + WITH_SMOKE : ${{ inputs.with_smoke }} + +jobs : + + checkmate: + if : contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + runs-on: ubuntu-latest + steps: + - name: Install latest nightly toolchain + uses: Wandalen/wretry.action/main@master + with: + action: actions-rs/toolchain@v1 + with: | + toolchain : nightly + override : true + components : clippy + attempt_limit: 3 + attempt_delay: 10000 + - uses: actions/checkout@v3 + + - name: Install cargo-audit + run: cargo install cargo-audit + - name: Install cargo-udeps + run: cargo install cargo-udeps --locked + + - name: Set MANIFEST_ROOT_PATH + id: rootpath + run: echo "::set-output name=path::$(dirname ${{ inputs.manifest_path }})" + - name: Audit the modules + run: cd ${{ steps.rootpath.outputs.path }} && make audit + continue-on-error: true + - name: Generate documentation for the modules + run: make doc open=no manifest_path=${{ inputs.manifest_path }} + continue-on-error: true + - name: Lint the modules + run: make lint manifest_path=${{ inputs.manifest_path }} warnings=no + continue-on-error: true + - name: Check the modules + run: make check manifest_path=${{ inputs.manifest_path }} + continue-on-error: true + - name: Check the modules dependencies + run: cargo +nightly udeps --all-targets --manifest-path ${{ inputs.manifest_path }} + continue-on-error: true + +# release: +# if: contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) +# strategy: +# fail-fast: false +# matrix: +# os: [ ubuntu-latest, windows-latest, macos-latest ] +# runs-on: ${{ matrix.os }} +# steps: +# - name: Install latest stable toolchain +# uses: Wandalen/wretry.action@master +# with: +# action: actions-rs/toolchain@v1 +# with: | +# toolchain : stable +# override : true +# attempt_limit: 3 +# attempt_delay: 10000 +# - uses: actions/checkout@v3 +# with: +# ref: alpha +# +# - name: Make release build +# run: cargo build --manifest-path ${{ inputs.manifest_path }} --release + + # miri: + # if: contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + # runs-on: ubuntu-latest + # steps: + # - name: Install latest nightly toolchain + # uses: Wandalen/wretry.action@master + # with: + # action: actions-rs/toolchain@v1 + # with: | + # toolchain : nightly + # override : true + # components : miri + # attempt_limit: 3 + # attempt_delay: 10000 + # - uses: actions/checkout@v3 + # with: + # ref: alpha + + # - name: Test with miri + # run: cargo miri test --manifest-path ${{ inputs.manifest_path }} + + will_test : + if : contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + concurrency : + group : standard_rust_push_${{ inputs.module_name }}_${{ github.ref }}_${{ matrix.os }} + cancel-in-progress : true + strategy : + fail-fast : false + matrix : + os : [ ubuntu-latest, windows-latest, macos-latest ] + runs-on : ${{ matrix.os }} + steps : + - name : Install latest stable toolchain + uses : Wandalen/wretry.action/main@master + with : + action : actions-rs/toolchain@v1 + with : | + toolchain : stable + override : true + attempt_limit : 3 + attempt_delay: 10000 + - name: Install latest nightly toolchain + uses: Wandalen/wretry.action/main@master + with: + action: actions-rs/toolchain@v1 + with: | + toolchain : nightly + override : true + attempt_limit: 3 + attempt_delay: 10000 + - uses: actions/checkout@v3 + - name: Install will + run: cargo install --git https://github.com/Wandalen/wTools --branch alpha willbe + - name: Set MANIFEST_ROOT_PATH + id: rootpath + run: echo "::set-output name=path::$(dirname ${{ inputs.manifest_path }})" + - name: Run tests with each feature + run: will .test ${{ steps.rootpath.outputs.path }}/ dry:0 exclude:'' with_all_features:1 with_debug:1 with_nightly:1 with_none_features:1 with_release:1 with_stable:1 \ No newline at end of file diff --git a/.github/workflows/standard_rust_scheduled.yml b/.github/workflows/standard_rust_scheduled.yml new file mode 100644 index 0000000000..ac680e60bd --- /dev/null +++ b/.github/workflows/standard_rust_scheduled.yml @@ -0,0 +1,20 @@ +name : rust_scheduled + +on : + schedule : + - cron : '0 1 * * *' + +env : + + RUST_BACKTRACE : 1 + CARGO_TERM_COLOR : always + WITH_SMOKE : ${{ inputs.with_smoke }} + +jobs : + + tested : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : './Cargo.toml' + module_name : $\{{ github.event.base.ref }}_$\{{ github.event.number }} + commit_message : '+test_$\{{ github.event.base.ref }}_$\{{ github.event.number }}' \ No newline at end of file diff --git a/.github/workflows/standard_rust_status.yml b/.github/workflows/standard_rust_status.yml new file mode 100644 index 0000000000..36f5261f97 --- /dev/null +++ b/.github/workflows/standard_rust_status.yml @@ -0,0 +1,39 @@ + +name : rust_status + +on: + workflow_run: + workflows: [ auto_merge_to_beta, rust_scheduled ] + types: + - completed + +concurrency : + + group : standard_rust_status + cancel-in-progress : true + +jobs : + + runs_check : + strategy : + matrix : + modules : [ 'auto_pr_to_beta', 'standard_rust_scheduled' ] + runs-on : ubuntu-latest + steps : + - name : Check workflow run status + id : check_ci + uses : ronymeyer/workflow-status@v0.3.7 + with : + token : ${{ secrets.GITHUB_TOKEN }} + workflow : ${{ matrix.modules }}.yml + branch : alpha + - name : Check failure conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'failure' }} + run : exit 1 + - name : Check cancelled conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'cancelled' }} + run : exit 1 + - name : Check skipped conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'skipped' }} + run : exit 1 + diff --git a/.github/workflows/status_checks_rules_update.yml b/.github/workflows/status_checks_rules_update.yml new file mode 100644 index 0000000000..7d82451595 --- /dev/null +++ b/.github/workflows/status_checks_rules_update.yml @@ -0,0 +1,77 @@ + +name : status_checks_rules_update + +on : + pull_request : + types : [ opened ] + branches : [ alpha, beta ] + +concurrency : + + group : projected_rules_update + cancel-in-progress : true + +jobs : + + check_workflows : + if : ${{ github.event.pull_request.base.ref == 'beta' }} + outputs : + should_update : ${{ steps.compare.outputs.not_equal }} + runs-on : ubuntu-latest + steps : + - name : Compare workflow directories content + id : compare + run : | + files_beta=$(curl -X GET -G \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/contents/.github/workflows \ + -d 'ref=beta') + files_alpha=$(curl -X GET -G \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/contents/.github/workflows \ + -d 'ref=alpha') + + if [[ "$files_beta" == "$files_alpha" ]] ; then + echo "not_equal=false" >> $GITHUB_OUTPUT + else + echo "not_equal=true" >> $GITHUB_OUTPUT + fi + + update_beta : + needs : check_workflows + if : ${{ needs.check_workflows.outputs.should_update == 'true' }} + runs-on : ubuntu-latest + steps : + - uses: actions/checkout@v3 + - name : Get options + id : options_get + run : | + WORKFLOWS=$(ls .github/workflows | grep module) + for WORKFLOW in $WORKFLOWS ; do + CONTEXT=$(echo $WORKFLOW | sed 's/\(\S\+\).yml/{"context":"check (\1)","app_id":null}/') + CONTEXTS="$CONTEXTS,$CONTEXT" + done; + CHECKS="[$(sed 's/^,//g' <<< $CONTEXTS),{\"context\":\"runs_check\",\"app_id\":null}]" + echo "options={\"required_status_checks\":{\"strict\":false,\"checks\":$CHECKS},\"enforce_admins\":false,\"required_pull_request_reviews\":null,\"restrictions\":null}" >> $GITHUB_OUTPUT + - name : Setup rules for beta + run : | + curl -X PUT \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/branches/beta/protection \ + -d '${{ steps.options_get.outputs.options }}' + + update_alpha : + if : ${{ github.event.pull_request.base.ref == 'alpha' }} + runs-on : ubuntu-latest + steps : + - name : Setup rules for alpha + run : | + CHECKS='[{"context":"tested / fast (ubuntu-latest)","app_id":null},{"context":"tested / fast (windows-latest)","app_id":null},{"context":"tested / fast (macos-latest)","app_id":null}]' + curl -X PUT \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/branches/alpha/protection \ + -d "{\"required_status_checks\":{\"strict\":false,\"checks\":$CHECKS},\"enforce_admins\":false,\"required_pull_request_reviews\":null,\"restrictions\":null}" diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000000..8cba9a9a97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ + +!/.github +!/.circleci +!/.* + +/build +/builder +/binding +/target +/node_modules +/.module +/package-lock.json +/Cargo.lock +/.vscode +/_* + +_key +_data +target +dist +.module +Cargo.lock +.DS_Store +.idea +*.log +*.db +*.tmp +*.build +*.code-workspace +.warchive* +-* +rustc-ice-*.txt diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000000..9e8ad03681 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,27 @@ + +checkoutLocation : "." +workspaceLocation : "." + +tasks : + - init : | + rustup default nightly + cd $RUN_PATH + command : | + code $SAMPLE_FILE + cargo run $RUN_POSTFIX + echo 'To get list of samples in the repository try running from the root:' + echo 'cargo run --example' + +vscode : + extensions : + - rust-lang.rust-analyzer + +github : + prebuilds : + addBadge : true + pullRequests : true + +# +# # to list examples +# if [[ "${HAS_SAMPLES}" == "true" ]] || [[ "${HAS_SAMPLES}" == "1" ]]; then cargo run --example; fi +# diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000000..4e75221932 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,490 @@ +[workspace] +resolver = "2" +members = [ + "module/alias/*", + "module/blank/*", + "module/core/*", + "module/move/*", + "module/test/*", +] +exclude = [ + "-*", + "module/move/_video_experiment", +] +# default-members = [ "module/core/wtools" ] + +[workspace.metadata] +branches = [ "master", "alpha" ] +master_branch = "master" +workspace_name = "wTools" +repo_url = "https://github.com/Wandalen/wTools" +discord_url = "https://discord.gg/m3YfbXpUUY" + +# [metadata.cargo-suppress-warnings] +# unused-manifest-key = true + + +[workspace.lints.rust] +# Source :: https://github.com/obox-systems/conventions/blob/master/code_style.md#lints-and-warnings + +# Denies non-idiomatic code for Rust 2018 edition. +rust_2018_idioms = "deny" +# Denies using features that may break in future Rust versions. +future_incompatible = "deny" +# Warns if public items lack documentation. +missing_docs = "warn" +# Warns for public types not implementing Debug. +missing_debug_implementations = "warn" +# Denies all unsafe code usage. +unsafe-code = "warn" + +[workspace.lints.clippy] +# Denies restrictive lints, limiting certain language features/patterns. +restriction = "warn" +# Denies pedantic lints, enforcing strict coding styles and conventions. +pedantic = "warn" +# Denies undocumented unsafe blocks. +undocumented_unsafe_blocks = "deny" +# xxx : document +single_call_fn = "allow" +inline_always = "allow" +module_name_repetitions = "allow" +absolute_paths = "allow" + +## top level + +[workspace.dependencies.wtools] +version = "~0.2.0" +path = "module/core/wtools" +default-features = false + +[workspace.dependencies.non_std] +version = "~0.1.4" +path = "module/alias/non_std" + +[workspace.dependencies.std_tools] +version = "~0.1.4" +path = "module/alias/std_tools" + +[workspace.dependencies.std_x] +version = "~0.1.4" +path = "module/alias/std_x" + + +## data_type + +[workspace.dependencies.data_type] +version = "~0.7.0" +path = "module/core/data_type" +default-features = false + +# [workspace.dependencies.type_constructor_meta] +# version = "~0.2.0" +# path = "module/core/type_constructor_meta" +# default-features = false + +# [workspace.dependencies.type_constructor_make_meta] +# version = "~0.2.0" +# path = "module/core/type_constructor_make_meta" +# +# [workspace.dependencies.type_constructor_derive_pair_meta] +# version = "~0.1.0" +# path = "module/core/type_constructor_derive_pair_meta" + +[workspace.dependencies.interval_adapter] +version = "~0.21.0" +path = "module/core/interval_adapter" +default-features = false +features = [ "enabled" ] + +[workspace.dependencies.winterval] +version = "~0.3.0" +path = "module/alias/winterval" +default-features = false +features = [ "enabled" ] + +[workspace.dependencies.collection_tools] +version = "~0.8.0" +path = "module/core/collection_tools" +default-features = false + + +## derive + +[workspace.dependencies.derive_tools] +version = "~0.24.0" +path = "module/core/derive_tools" +default-features = false +features = [ "enabled" ] + +[workspace.dependencies.derive_tools_meta] +version = "~0.23.0" +path = "module/core/derive_tools_meta" +default-features = false +features = [ "enabled" ] + +[workspace.dependencies.reflect_tools] +version = "~0.2.0" +path = "module/core/reflect_tools" +default-features = false +features = [ "enabled" ] + +[workspace.dependencies.reflect_tools_meta] +version = "~0.2.0" +path = "module/core/reflect_tools_meta" +default-features = false +features = [ "enabled" ] + +# [workspace.dependencies.type_constructor] +# version = "~0.3.0" +# path = "module/core/type_constructor" +# default-features = false + +[workspace.dependencies.fundamental_data_type] +version = "~0.2.0" +path = "module/alias/fundamental_data_type" +default-features = false + +[workspace.dependencies.variadic_from] +version = "~0.19.0" +path = "module/core/variadic_from" +default-features = false +features = [ "enabled" ] + +[workspace.dependencies.clone_dyn] +version = "~0.18.0" +path = "module/core/clone_dyn" +default-features = false +features = [ "enabled" ] + +[workspace.dependencies.clone_dyn_meta] +version = "~0.18.0" +path = "module/core/clone_dyn_meta" +features = [ "enabled" ] + + +## mem + +[workspace.dependencies.mem_tools] +version = "~0.6.0" +path = "module/core/mem_tools" +default-features = false + + +## diagnostics + +[workspace.dependencies.diagnostics_tools] +version = "~0.8.0" +path = "module/core/diagnostics_tools" +default-features = false + + +## iter + +[workspace.dependencies.iter_tools] +version = "~0.17.0" +path = "module/core/iter_tools" +default-features = false + + +## meta + +[workspace.dependencies.meta_tools] +version = "~0.10.0" +path = "module/core/meta_tools" +default-features = false + +[workspace.dependencies.for_each] +version = "~0.8.0" +path = "module/core/for_each" +default-features = false + +[workspace.dependencies.former] +version = "~2.2.0" +path = "module/core/former" +default-features = false + +[workspace.dependencies.former_stable] +package = "former" +version = "=2.0.0" +default-features = false + +[workspace.dependencies.former_meta] +version = "~2.2.0" +path = "module/core/former_meta" +default-features = false + +[workspace.dependencies.former_types] +version = "~2.2.0" +path = "module/core/former_types" +default-features = false + +[workspace.dependencies.impls_index] +version = "~0.7.0" +path = "module/core/impls_index" +default-features = false + +[workspace.dependencies.impls_index_meta] +version = "~0.7.0" +path = "module/core/impls_index_meta" + +[workspace.dependencies.mod_interface] +version = "~0.21.0" +path = "module/core/mod_interface" +default-features = false + +[workspace.dependencies.mod_interface_meta] +version = "~0.21.0" +path = "module/core/mod_interface_meta" +default-features = false + +[workspace.dependencies.multilayer] +version = "~0.1.3" +path = "module/alias/multilayer" +default-features = false + +# [workspace.dependencies.woptions] +# version = "~0.1.4" +# path = "module/core/woptions" +# default-features = false +# +# [workspace.dependencies.woptions_meta] +# version = "~0.1.4" +# path = "module/core/woptions_meta" +# +# [workspace.dependencies.woptions_runtime] +# version = "~0.1.4" +# path = "module/core/woptions_runtime" + + +## macro tools + +[workspace.dependencies.macro_tools] +version = "~0.28.0" +path = "module/core/macro_tools" +default-features = false + +[workspace.dependencies.proc_macro_tools] +version = "~0.2.0" +path = "module/alias/proc_macro_tools" +default-features = false + +[workspace.dependencies.wproc_macro] +version = "~0.1.1" +path = "module/alias/wproc_macro" +default-features = false + + +## time + +[workspace.dependencies.time_tools] +version = "~0.2.0" +path = "module/core/time_tools" +default-features = false + + +## typing + +[workspace.dependencies.typing_tools] +version = "~0.8.0" +path = "module/core/typing_tools" +default-features = false + +[workspace.dependencies.implements] +version = "~0.8.0" +path = "module/core/implements" +default-features = false + +[workspace.dependencies.instance_of] +version = "~0.2.0" +path = "module/alias/instance_of" +default-features = false + +[workspace.dependencies.inspect_type] +version = "~0.10.0" +path = "module/core/inspect_type" +default-features = false + +[workspace.dependencies.is_slice] +version = "~0.9.0" +path = "module/core/is_slice" +default-features = false + + +## error + +[workspace.dependencies.error_tools] +version = "~0.14.0" +path = "module/core/error_tools" +default-features = false + +[workspace.dependencies.werror] +version = "~0.4.0" +path = "module/alias/werror" + + +## string tools + +[workspace.dependencies.strs_tools] +version = "~0.14.0" +path = "module/core/strs_tools" +default-features = false + +[workspace.dependencies.wstring_tools] +version = "~0.2.0" +path = "module/alias/wstring_tools" + + +## fs tools / path tools + +[workspace.dependencies.fs_tools] +version = "~0.1.0" +path = "module/core/fs_tools" +default-features = false + +[workspace.dependencies.file_tools] +version = "~0.1.0" +path = "module/alias/file_tools" +default-features = false + +[workspace.dependencies.proper_path_tools] +version = "~0.7.0" +path = "module/core/proper_path_tools" +default-features = false + + +## process tools + +[workspace.dependencies.process_tools] +version = "~0.6.0" +path = "module/core/process_tools" +default-features = false + +[workspace.dependencies.process_tools_published] +package = "process_tools" +version = "~0.2.0" +default-features = false + + +## test + +[workspace.dependencies.wtest] +version = "~0.4.0" +path = "module/alias/wtest" + +[workspace.dependencies.test_tools] +version = "~0.9.0" +path = "module/core/test_tools" + +[workspace.dependencies.wtest_basic] +version = "~0.4.0" +path = "module/alias/wtest_basic" + + + +## graphs tools + +[workspace.dependencies.graphs_tools] +version = "~0.2.0" +path = "module/move/graphs_tools" +default-features = false + +# [workspace.dependencies.automata_tools] +# version = "~0.2.0" +# path = "module/move/automata_tools" +# default-features = false +# +# [workspace.dependencies.wautomata] +# version = "~0.2.0" +# path = "module/alias/wautomata" +# default-features = false + + +## ca + +[workspace.dependencies.wca] +version = "~0.18.0" +path = "module/move/wca" + + +## censor + +[workspace.dependencies.wcensor] +version = "~0.1.1" +path = "module/move/wcensor" + + +## willbe + +[workspace.dependencies.willbe] +version = "~0.12.0" +path = "module/move/willbe" + + +## lang + +[workspace.dependencies.wlang] +version = "~0.1.0" +path = "module/move/wlang" + + +## publisher + +[workspace.dependencies.wpublisher] +version = "~0.2.0" +path = "module/move/wpublisher_xxx" + + +## plot + +[workspace.dependencies.wplot] +version = "~0.2.0" +path = "module/move/wplot" + +[workspace.dependencies.plot_interface] +version = "~0.1.3" +path = "module/move/plot_interface" + + +## etc + +[workspace.dependencies.sqlx_query] +version = "~0.2.0" +path = "module/move/sqlx_query" + +[workspace.dependencies.deterministic_rand] +version = "~0.5.0" +path = "module/move/deterministic_rand" + +[workspace.dependencies.crates_tools] +version = "~0.10.0" +path = "module/move/crates_tools" + + +## steps + +[workspace.dependencies.integration_test] +path = "module/step/integration_test" +default-features = true + +[workspace.dependencies.smoke_test] +path = "module/step/smoke_test" +default-features = true + + +## test experimental + +[workspace.dependencies.test_experimental_a] +version = "~0.5.0" +path = "module/test/a" +default-features = true + +[workspace.dependencies.test_experimental_b] +version = "~0.3.0" +path = "module/test/b" +default-features = true + +[workspace.dependencies.test_experimental_c] +version = "~0.3.0" +path = "module/test/c" +default-features = true diff --git a/License b/License new file mode 100644 index 0000000000..616fd389f2 --- /dev/null +++ b/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn (c) 2013-2023 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..45e341b29e --- /dev/null +++ b/Makefile @@ -0,0 +1,151 @@ +# abc def +# === common +# + +# Comma +comma := , + +# Checks two given strings for equality. +eq = $(if $(or $(1),$(2)),$(and $(findstring $(1),$(2)),\ + $(findstring $(2),$(1))),1) + +# +# === Parameters +# + +VERSION ?= $(strip $(shell grep -m1 'version = "' Cargo.toml | cut -d '"' -f2)) + +# +# === Git +# + +# Sync local repostiry. +# +# Usage : +# make git.sync [message='description of changes'] + +git.sync : + git add --all && git commit -am $(message) && git pull + +sync : git.sync + +# +# === External cargo crates commands +# + +# Check vulnerabilities with cargo-audit. +# +# Usage : +# make audit + +audit : + cargo audit + +# +# === General commands +# + +# Generate crates documentation from Rust sources. +# +# Usage : +# make doc [private=(yes|no)] [open=(yes|no)] [clean=(no|yes)] [manifest_path=(|[path])] + +doc : +ifeq ($(clean),yes) + @rm -rf target/doc/ +endif + cargo doc --all-features \ + $(if $(call eq,$(private),no),,--document-private-items) \ + $(if $(call eq,$(manifest_path),),--manifest-path ./Cargo.toml,--manifest-path $(manifest_path)) \ + $(if $(call eq,$(open),no),,--open) + +# Lint Rust sources with Clippy. +# +# Usage : +# make lint [warnings=(no|yes)] [manifest_path=(|[path])] + +lint : + cargo clippy --all-features \ + $(if $(call eq,$(manifest_path),),--manifest-path ./Cargo.toml,--manifest-path $(manifest_path)) \ + $(if $(call eq,$(warnings),no),-- -D warnings,) + +# Check Rust sources `check`. +# +# Usage : +# make check [manifest_path=(|[path])] + +check : + cargo check \ + $(if $(call eq,$(manifest_path),),--manifest-path ./Cargo.toml,--manifest-path $(manifest_path)) + +# Format and lint Rust sources. +# +# Usage : +# make normalize + +normalize : fmt lint + +# Perform common checks on the module. +# +# Usage : +# make checkmate + +checkmate : doc lint check + +# Format Rust sources with rustfmt. +# +# Usage : +# make fmt [check=(no|yes)] + +fmt : + { find -L module -name *.rs -print0 ; } | xargs -0 rustfmt +nightly $(if $(call eq,$(check),yes),-- --check,) + +# cargo +nightly fmt --all $(if $(call eq,$(check),yes),-- --check,) + +# Run project Rust sources with Cargo. +# +# Usage : +# make up + +up : + cargo up + +# Run project Rust sources with Cargo. +# +# Usage : +# make clean + +clean : + cargo clean && rm -rf Cargo.lock && cargo cache -a && cargo update + +# Run Rust tests of project. +# +# Usage : +# make test + +test : + cargo test --all-features + +# Run format link test and tests. +# +# Usage : +# make all + +all : fmt lint test + +# +# === .PHONY section +# + +.PHONY : \ + all \ + audit \ + docs \ + lint \ + check \ + fmt \ + normalize \ + checkmate \ + test \ + up \ + doc diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000000..966a6516c6 --- /dev/null +++ b/Readme.md @@ -0,0 +1,76 @@ +[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua) + +![wTools](./asset/img/logo_v3_trans_wide.png) + + +[![wTools](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/standard_rust_scheduled.yml?label=wTools&logo=github&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/standard_rust_scheduled.yml) +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2Fwtools_trivial_sample%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20wtools_trivial_sample/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/wTools) + + +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. + +### Rust tools + + +| Module | Stability | master | alpha | Docs | Sample | +|--------|-----------|--------|--------|:----:|:------:| +| [collection_tools](module/core/collection_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_collection_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_collection_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/collection_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fcollection_tools%2Fexamples%2Fcollection_tools_trivial.rs,RUN_POSTFIX=--example%20collection_tools_trivial/https://github.com/Wandalen/wTools) | +| [former_types](module/core/former_types) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_types_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_types_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/former_types) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer_types%2Fexamples%2Fformer_types_trivial.rs,RUN_POSTFIX=--example%20former_types_trivial/https://github.com/Wandalen/wTools) | +| [interval_adapter](module/core/interval_adapter) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_interval_adapter_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_interval_adapter_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/interval_adapter) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finterval_adapter%2Fexamples%2Finterval_adapter_trivial.rs,RUN_POSTFIX=--example%20interval_adapter_trivial/https://github.com/Wandalen/wTools) | +| [iter_tools](module/core/iter_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_iter_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_iter_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/iter_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fiter_tools%2Fexamples%2Fiter_tools_trivial.rs,RUN_POSTFIX=--example%20iter_tools_trivial/https://github.com/Wandalen/wTools) | +| [macro_tools](module/core/macro_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_macro_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_macro_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/macro_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmacro_tools%2Fexamples%2Fmacro_tools_trivial.rs,RUN_POSTFIX=--example%20macro_tools_trivial/https://github.com/Wandalen/wTools) | +| [clone_dyn_meta](module/core/clone_dyn_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_clone_dyn_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_clone_dyn_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/clone_dyn_meta) | | +| [derive_tools_meta](module/core/derive_tools_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_derive_tools_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_derive_tools_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/derive_tools_meta) | | +| [clone_dyn](module/core/clone_dyn) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_clone_dyn_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_clone_dyn_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/clone_dyn) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fclone_dyn%2Fexamples%2Fclone_dyn_trivial.rs,RUN_POSTFIX=--example%20clone_dyn_trivial/https://github.com/Wandalen/wTools) | +| [variadic_from](module/core/variadic_from) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_variadic_from_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_variadic_from_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/variadic_from) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fvariadic_from%2Fexamples%2Fvariadic_from_trivial.rs,RUN_POSTFIX=--example%20variadic_from_trivial/https://github.com/Wandalen/wTools) | +| [derive_tools](module/core/derive_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_derive_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_derive_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/derive_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fderive_tools%2Fexamples%2Fderive_tools_trivial.rs,RUN_POSTFIX=--example%20derive_tools_trivial/https://github.com/Wandalen/wTools) | +| [former_meta](module/core/former_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_former_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_former_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/former_meta) | | +| [impls_index_meta](module/core/impls_index_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/impls_index_meta) | | +| [mod_interface_meta](module/core/mod_interface_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mod_interface_meta) | | +| [for_each](module/core/for_each) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_for_each_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_for_each_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/for_each) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ffor_each%2Fexamples%2Ffor_each_trivial.rs,RUN_POSTFIX=--example%20for_each_trivial/https://github.com/Wandalen/wTools) | +| [former](module/core/former) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/former) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer%2Fexamples%2Fformer_trivial.rs,RUN_POSTFIX=--example%20former_trivial/https://github.com/Wandalen/wTools) | +| [implements](module/core/implements) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_implements_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_implements_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/implements) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimplements%2Fexamples%2Fimplements_trivial.rs,RUN_POSTFIX=--example%20implements_trivial/https://github.com/Wandalen/wTools) | +| [impls_index](module/core/impls_index) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/impls_index) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimpls_index%2Fexamples%2Fimpls_index_trivial.rs,RUN_POSTFIX=--example%20impls_index_trivial/https://github.com/Wandalen/wTools) | +| [inspect_type](module/core/inspect_type) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_inspect_type_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_inspect_type_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/inspect_type) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finspect_type%2Fexamples%2Finspect_type_trivial.rs,RUN_POSTFIX=--example%20inspect_type_trivial/https://github.com/Wandalen/wTools) | +| [is_slice](module/core/is_slice) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_is_slice_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_is_slice_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/is_slice) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fis_slice%2Fexamples%2Fis_slice_trivial.rs,RUN_POSTFIX=--example%20is_slice_trivial/https://github.com/Wandalen/wTools) | +| [mod_interface](module/core/mod_interface) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mod_interface) | | +| [data_type](module/core/data_type) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_data_type_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_data_type_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/data_type) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdata_type%2Fexamples%2Fdata_type_trivial.rs,RUN_POSTFIX=--example%20data_type_trivial/https://github.com/Wandalen/wTools) | +| [diagnostics_tools](module/core/diagnostics_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_diagnostics_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_diagnostics_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/diagnostics_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdiagnostics_tools%2Fexamples%2Fdiagnostics_tools_trivial.rs,RUN_POSTFIX=--example%20diagnostics_tools_trivial/https://github.com/Wandalen/wTools) | +| [error_tools](module/core/error_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_error_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_error_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/error_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ferror_tools%2Fexamples%2Ferror_tools_trivial.rs,RUN_POSTFIX=--example%20error_tools_trivial/https://github.com/Wandalen/wTools) | +| [mem_tools](module/core/mem_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mem_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mem_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mem_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmem_tools%2Fexamples%2Fmem_tools_trivial.rs,RUN_POSTFIX=--example%20mem_tools_trivial/https://github.com/Wandalen/wTools) | +| [meta_tools](module/core/meta_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_meta_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_meta_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/meta_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmeta_tools%2Fexamples%2Fmeta_tools_trivial.rs,RUN_POSTFIX=--example%20meta_tools_trivial/https://github.com/Wandalen/wTools) | +| [proper_path_tools](module/core/proper_path_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_proper_path_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_proper_path_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_proper_path_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_proper_path_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/proper_path_tools) | | +| [reflect_tools_meta](module/core/reflect_tools_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/reflect_tools_meta) | | +| [strs_tools](module/core/strs_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_strs_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_strs_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/strs_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fstrs_tools%2Fexamples%2Fstrs_tools_trivial.rs,RUN_POSTFIX=--example%20strs_tools_trivial/https://github.com/Wandalen/wTools) | +| [time_tools](module/core/time_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_time_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_time_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/time_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftime_tools%2Fexamples%2Ftime_tools_trivial.rs,RUN_POSTFIX=--example%20time_tools_trivial/https://github.com/Wandalen/wTools) | +| [typing_tools](module/core/typing_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_typing_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_typing_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/typing_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftyping_tools%2Fexamples%2Ftyping_tools_trivial.rs,RUN_POSTFIX=--example%20typing_tools_trivial/https://github.com/Wandalen/wTools) | +| [fs_tools](module/core/fs_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_fs_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_fs_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_fs_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_fs_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/fs_tools) | | +| [include_md](module/core/include_md) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_include_md_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_include_md_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_include_md_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_include_md_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/include_md) | | +| [process_tools](module/core/process_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_process_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_process_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/process_tools) | | +| [program_tools](module/core/program_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_program_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_program_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_program_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_program_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/program_tools) | | +| [reflect_tools](module/core/reflect_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/reflect_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Freflect_tools%2Fexamples%2Freflect_tools_trivial.rs,RUN_POSTFIX=--example%20reflect_tools_trivial/https://github.com/Wandalen/wTools) | +| [test_tools](module/core/test_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_test_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_test_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/test_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftest_tools%2Fexamples%2Ftest_tools_trivial.rs,RUN_POSTFIX=--example%20test_tools_trivial/https://github.com/Wandalen/wTools) | +| [wtools](module/core/wtools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wtools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wtools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/wtools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fwtools%2Fexamples%2Fwtools_trivial.rs,RUN_POSTFIX=--example%20wtools_trivial/https://github.com/Wandalen/wTools) | + + +### Rust modules to be moved out to other repositories + + +| Module | Stability | master | alpha | Docs | Sample | +|--------|-----------|--------|--------|:----:|:------:| +| [crates_tools](module/move/crates_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_crates_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_crates_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/crates_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fcrates_tools%2Fexamples%2Fcrates_tools_trivial.rs,RUN_POSTFIX=--example%20crates_tools_trivial/https://github.com/Wandalen/wTools) | +| [deterministic_rand](module/move/deterministic_rand) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_deterministic_rand_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_deterministic_rand_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/deterministic_rand) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fdeterministic_rand%2Fexamples%2Fdeterministic_rand_trivial.rs,RUN_POSTFIX=--example%20deterministic_rand_trivial/https://github.com/Wandalen/wTools) | +| [wca](module/move/wca) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wca_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wca_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/wca) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fwca%2Fexamples%2Fwca_trivial.rs,RUN_POSTFIX=--example%20wca_trivial/https://github.com/Wandalen/wTools) | +| [wplot](module/move/wplot) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wplot_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_wplot_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wplot_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_wplot_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/wplot) | | +| [graphs_tools](module/move/graphs_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_graphs_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_graphs_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/graphs_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20graphs_tools_trivial/https://github.com/Wandalen/wTools) | +| [optimization_tools](module/move/optimization_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_optimization_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_optimization_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_optimization_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_optimization_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/optimization_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Foptimization_tools%2Fexamples%2Foptimization_tools_trivial.rs,RUN_POSTFIX=--example%20optimization_tools_trivial/https://github.com/Wandalen/wTools) | +| [plot_interface](module/move/plot_interface) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_plot_interface_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_plot_interface_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_plot_interface_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_plot_interface_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/plot_interface) | | +| [refiner](module/move/refiner) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_refiner_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_refiner_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_refiner_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_refiner_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/refiner) | | +| [sqlx_query](module/move/sqlx_query) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_sqlx_query_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_sqlx_query_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_sqlx_query_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_sqlx_query_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/sqlx_query) | | +| [unitore](module/move/unitore) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_unitore_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_unitore_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_unitore_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_unitore_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/unitore) | | +| [willbe](module/move/willbe) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_willbe_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_willbe_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/willbe) | | + + +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. diff --git a/asset/img/docsrs.svg b/asset/img/docsrs.svg new file mode 100644 index 0000000000..1891683e13 --- /dev/null +++ b/asset/img/docsrs.svg @@ -0,0 +1 @@ +docs: passingdocspassing \ No newline at end of file diff --git a/asset/img/graph_logo_v1_trans.ico b/asset/img/graph_logo_v1_trans.ico new file mode 100644 index 0000000000000000000000000000000000000000..8c51d56e2167a7a8080032dded233f50d040a1ab GIT binary patch literal 179846 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 JyDrnX`hN+NdS?It literal 0 HcmV?d00001 diff --git a/asset/img/graph_logo_v1_trans.png b/asset/img/graph_logo_v1_trans.png new file mode 100644 index 0000000000000000000000000000000000000000..2408c59fe9d7635cb65e23b82937451ef5aa792d GIT binary patch literal 6625 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 LOhFA=PSO7ZxGG-5 literal 0 HcmV?d00001 diff --git a/asset/img/logo_edge_trans.png b/asset/img/logo_edge_trans.png new file mode 100644 index 0000000000000000000000000000000000000000..4767948e8954c1f394c888b6e5a70f1a9c65d89e GIT binary patch literal 163918 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�*g-*g~9cREIjZpZc2`QGnqEPQ|@>=&lSIk8@H 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 DYgEG@ literal 0 HcmV?d00001 diff --git a/asset/img/logo_trans.png b/asset/img/logo_trans.png new file mode 100644 index 0000000000000000000000000000000000000000..97125984711d7a95406fe927fa32018cdac6865a GIT binary patch literal 123626 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 )l&@ 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

W&bdbKBla1s)5ieh0t4G_ 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�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 z ze0uuuj~+fM`A&K&|hZ2@jF3DCFi^WUloOO}hL=EUWX zT+73upD2GBsbA+PpjHgrUFjGkOgdti81Z0lQDiQdurZ&rhTD?a|Spvx}a(ZBl`$Rjz;=y9z~f(eph$=##JIkrTse*WNMzf~G*$w1p{}N*m_j3n8}F*NX`^sR6wkyT^VXfnB(6z&xT!Hy-}) z*Tz5k|4yjd$kqmbX{3w=VKB>lRmt~Gol!v~M`ot9#V9U;OXSXBLa zVM7DSFB;YFe0_CoYeV|eE^VL-^3*8-63_L5;AcLTfg8=e1g=@?OdmOEsXiL@DT8|4 zHl1p|{?cqJ2)cT@KFMdvq!g!e}m)qEi# zA#wdI*8{27H$}G@?IqsYzwDCaEkRQcYyyo58Je7p=38w=O_=R|Il)gEnwXCr*062P z(Sm3%gQb-PzEsD7Em%3Fh_YB15xJTdFTPv94F^RVH+hg;F04v*eAMlG@B_Dtmbnd5 zRYJ6UJp9)Z&Pkf!rmLc&qI2`!z01w3v#XrFCCIP4#PI8ruk|@|A&fRjDRc}Bv#R%! z2J;*R>C0UeO;`CuF8NBr3`YAiQ&Py5rF8%P2Gf1GC($5om-wxdE6o_ko{wW}gPR9A zd3mF%Z!y@5lVABGgfcnYH?9Zv8aXAr0&j_w9%NN3sCqnB*Aki%SorDE=eWG*6PFer z@%ptNW}p~w+HZeS$q-CEb>!z~D<|{J@>B_!9(BP$;?26DAP!~i7TP~XVt(R3KE~X4 z57W(wWfMe|T^LH@mR^XE*3a&|7i@&y=cS1Jeu`!CJHgfodo(}Twx=d1r;=lQsC-H@ zil-teqcO7AEHDfb#gof0DTKO>?V4p6ySlh&NHjfU*W>&GD+l&fsib^b#nL~F7M-7v z_cm^#s)KzS-aTIIP1^i95i9w*H8|Y)ct;{chR&tHMw_2O{EL9oOqV#m<{9 zTW)-b-rT5kTJZY`5G0fgAnNiqw0l#)xlT+IxQ2P$w`BK!V9lGg@K66)s~>!L2iAHc zw15=+GT!GSMHA~7XPMKt+&e6m$<$X?=8!4jc|E!ivJYl|jFfl9s-qA!}`GH6G>0#INbx`bPdGXS@gB*E*W_-a3zGIi5$T{{zj+GDR{Iw{2WT+%Tf0j9vwqGwh4WHZ1YZhph5a}kpau+Be02?_OoqUQ5ym)@fyHvu zmYDggh1j2mk>%VJcNxUkUC(RY4eoaAe~8?x%5DvXp8`va&>$Z;oR$%y_?MY&3e?HO45fanpu7EuwmEv z*nyqjv5?tNxrF55iQn80SB*po2Wnh#i)$l(bd}-3v7-dCqM1+fX=)UXPyATeI67w< z#=bV2Q`b67{sjntPE2Ng|PI$X*qdz_~#o)J@<5lN{c9QCu zCYv44h8ZRf1hE1QGe?@RA@49T4)a(Qe+$@1t)_=bnMts7!w~?@o^WxI9Y9yUl?r)$ zuhFl|&{+KR={+9*#%^I-DCmtHZ1dBO#Ju_LWpI7K1=EyRBjC{PqRhq$w3u>@jEq#g z3LuyZIB>U{tfm3-(0-gYAKAQJUp!r^Yhlv&?6HC~BItU|<i0jbQG1VdU=ygj>9t z;4A|S9JM`{{^3-f^(JLhr7Q{xio;`L(H)8uKUUk$Nys=MdZ3N#u{FEux_xTAJT4Y3 z*rMz0ZSJKj-meEQpA)2Pw4w-Pp#-GS3TmaLSR+FS-o`{p`-Uz%ci@~cux)^jkHNB; zur9msx}L;mG{nHXy8}tFJ&kQz>9PN>2&Da41SD!7p{uW-6^$~$fc#{^kydnp}-))LgGU-s?$a!?|wq&3%j?Q z2rmEwS)*mlsT9;z(h6;-1H?7vqhUVH`}-;e&9>J8FL8W)d=PLU_zr}qO+=cXw4}c@ za$fju<=0}vMMxw1_VZ`D{6bt*ATeAOQC^w|c5y}WG`WzDV@kU=bo(^i;SD9x(#r{3B-thE8SS`3FmDNQHm%*l*G<|^reZU_W-m_7=K0=|IGHyu` zLPZ(b=eZ;ECm|Te!k7iBoIJPW;^K7?YD30iPJkoi@9|0L)3pqxF&Vm&qknKnM3~!F zPTS&t6PQh8MoXvbJ+^Vu9p<~>O{Mz*EpI{?$RlGvFCL{bf#41~<$%lCcKl-4i2_zQ zty4@;Au0`MjN1l($w;tFm(&eFSskS-$U8O4b`opKPB~*xA7xQGr(zv3sAx zv)|`cX=knavQ&JWRDo;cwyFF0i1xmStSoCKd@1NCx7|zuEbX9w_6=nVJo?df1~m^Q zt-^#gxrEIl6&}Xlm*B$=jH_u=0DkXjL`hxd)H4Zker8>fz=ek~g8aD)Kb12jT}fxP z^423Xs|81$Op(Nss?G`N>z!tvfj>J`J)VRC*KDWx*tes7Yy_b7&$Q9Rpu+4!rBOMGm(A z(dQ)a{~Q|%nQ|t_(@0HR33#If#@_C5>e==AjL7l8o8Vjmt8 zz0b?Te|Bs%JmNwGFi1mybmS<8@DNMzii0M6a5YphYtw~EZNqA!{~R_%YrC;jEe_Ex z<M+w|IFCW#o$#4vi|LRJuJzELkDVm+1^R$FhP z9z7|LVLHA$z3sxl$9_{j^fs{C@$*)%VXCeq{?n)OfR^pKgDD}h3aJK9N`zazE{?aw zU;_6kc)YiFmp_#EITqw}Te_S?m4FP)m4p=$Z9stx`L{4-x&JXN4{Ik{AoC|Ap&dnG zPhG7@KHYsWKB-8czS20m!)xD#^^pM9Y~2Z!SzF(h2e_oh#wGv?i}u~NXW~cHVX@fs z`^%rcy%#T=Z@yZyz2gu|X&O7Big23_QfBTH(q8D18+i2MKoL}>>}heZtICgI8`Xgo zyzSgte`2}PD1ffK1;E|b$Zh~b(dlRVMF;L59Q1=9zzG)*PEMDEggLm}<+F}kjX5I~ z@|d1@7oKo>_@59+o-grL*LXf*=j-5~D|mP}{6XTXH8?*H*n*4?UA5d!*EMK$&$~L*_>Vo$R&>v`~#+L8G zn`s<+3=>35eAm17&}W~vji{kPgeC5jLr93s8+jLhU(>+g)oof=q~?=}zP=YrJhznw z<4)0=Rc0z3ah44GlhezM8BIfkT|SvshJ45^DgXDyt)W8x!zAcWGt!2l zHmM@b1y%+UYh=d1dx@Kt)-@QHy+>_>JblHb3Dg>wq=pS1<>lqAZR|)ZDl+@{`VPaG zKpuH5r8i9^BmhR4KSjJYZcJdz zPmoVjUz%7ky|3TK6W9;nIiXHpg3$IX6D@mDA7^;crh?m7Onyx>xwsppJv&EJ*pxI< zR^J`7?f~CnW78+TCsY#a5#xILWpkepRW_B5SLT_b{-oxUdAOq^s#Osn!At`_wFhri zAs>N&MbQCgq;k@rRy59;*xPC5A|7lyVzNv1=kWGX>JNyK02BfrWE#5%!B~cd z;`QU3@vMci$ku;{uw2@ke>SQ#3tT4mT(E^@N!U}BS8DH!IbaZR8nYFbhL6iG8kCk2 z4t1b6hX#psvrO*`(S^am9rY9AVSswX7PiT)t==fwgud0=dU^dG0f9N#4WpWh>3Qcv zMG$QP20vP;I7*%)Qrn0$y3!iEy}1#r*1$KJpYip4ld3e52!{?^l*n@-NefI|{fAuu zDsU?pvXTlEm2{~43$T^E2moDlJCgzv0(w3#x`FBb*3qB=NnQoBP5{!@*BG0IJ9mw*+x6ruIPMwbg8@)u(Q3x|fFA`rqecZd5KB zW5U=HZ&s&$9DcZo+?y`JCz>l~j*34Xi$jDdkLF9N;NMb3livA>=9wmxSpi&GWf&=W z7FJdnh%#Pp-wQNG$-hO35gJIuV?&WI5)sv`qI4-Jk%PY7aM@zQ0Fm&-)gyQLeth+u zJOTUfYP$y#M1QtJ8$B7m^3moD7BW4)avB&|w~sAFmmQW?LggPP@L*40+kv4`X?rWR@_`4hLrruD*#?k>1CXjH;Be1-E_t=m8InuhqKw-5;rXgXP z{OWvYw|jf+;>7lqb3^H;Lcwb=+0p>(%{2jOB?8(F|3*M=(T(nrc6O%wXfvn)SjgD` zD+~~oT2i7)%#CRiB8^P%iJ8(V{`|rKT?r^;4aVhxsTNkj6dAG|yTm_yy1iQmbR_Ut zj}4K}@`Yjt-PWw{ovTBX)WR8lN`GQz*!ns@z1VfN)nnF#!HfNIw3qvtV1Jsn)s1Y? z$6p|#wQWLh>yxWbcb#j+vW2*~xOxL!eiyccFoqU@J1Eu~r$m}vm6pg4+^oJlxop3^ zbqXZ{Wr+qiJu6+?rLEXxaU3}YW_vbe?vVyb(?O9Sr6y9P$8Rx4Jt6qP5GIx)X1`(L zPiuG%r)Rj^J{-_z2xhl^KSrv`7|r6NVWR;=J(C{OXxZ=|{O^d9{lDvLe>!+1;>A5xCP57J4Hv#%m1CNJ ziLyZw#l|SEk+#B&b#8c{YNp#{ib+AG?oD6+i;K054e2_+ zqbp-Wwn`40@@?XCc&8%hS|;JgkR1)VkF7Fm2_O!SrRs=CEOc6#xecf^tuF)E zQ$-{|H!J$GDiXK?VF0k*jI?AY?a#KM$Q=!qR{fc&xKwpcCbAPcM%AzI>URwf-()Q} zVTWuVW^FZKLzsQE(%y$19OiQY8JVAf{0jh1%ir3j9P+FClKJi_cTd)(W}!TYB+6}r zj6i$?&jz}pW4;*XUSw8vw^*M8Rr1#5AT{Vxy4uqtS9c?Z2GIe`m_w7pq2os$Zrzpo z4wU3n3XBhH3soh_!>U0J#C-0FeT}13HIkT~BS3>J07fh*N$f>|+%S+>hm(QVL4P5} zfPI8DZ^vPP)>tcVIUN!A_^}?mfVnV2#a_@F+H&S@)b4U4j>5}sgaS<{Jy+>Cy6DtC zu@v$Ijk4VSPYA)q`)9#dgeCmQCte!0e!0Cw@HGX#dAmX;Q50_&Ph;cbUnG|Yu*8p} z;%7s{jTU9GS1Nj&3iZYVN%bUg?^Id(-!v195n5(L&!VBMM+-vReMCR%MCD zMd}&G$b>_MiY0bb;l5Lxb9AEw5tm|qo4yH5&`l9f(jKfWugYf+=tOkp>ke8rj;m$I z9l`bmhyv&d}XAb>!s!f0Ru=Yth#A8WIAU`4{Xw)@=fj`;$ zX&0h1LaO#cGe5x7H*I|*_y4H6@<1rtudP)jR6;3~>_mm^WX(=?#*ji7J7b?wNkaBi z_U!wNecvS{WF3Yf`!e>OF?_f8_x9HJ{5A6z&zbu^=Q`K9&N*uGaW=dwK+?l8x}Rhf zKIt|%-um@vs#fnDVeZf*lJZ1uySQ~JrWaILA|H~KrTNq>YGsHDg#5H1r zXGf&A6(&*KRVURlV=aVD^ z9KWZYW%J$c4kbjg!KnwiFtw;qu2<9)eZw`|w#|_>J`p67GU=BY79;!5=2#6FU}cA& znG7i2IaSX1(j^4@G&a|2FKM2s_uS)?JH8oek3fHrsKDy{ny2HW1ywDsijllUePX>I zZ)v}BkGxsLapnp0TgjzMse6LhAez337c14~F{xk_B_QSB3*Kc@X*p2gS&5hwCRCX! z{4?y{_$ys&^i_j9u$0B9u`op8S!UBDY6m_6CP2(2;S zr--MCex{k~X=ymMOJ8um%dD4a3(+{9A5BxYl-9B9Z*o9Sb2rz|#QHorFE*)(Z~dqG zv~bP3dxoyFb+J>`!&oP8qP75*f1${t>a6qY_iBiNv_#dAcvte-J}Wio%+2`r0_L$q ztwcwr|D?N@yRZHoB5CCV6(h4=M^f14smUKa|$OEcOW4AOkv`-8Aw6O z$|wojjE!ytiiv|XWuQN9Zf$)xq@_+1c#}6y)Bg@5k4l6}kV-0>$o1>j}#9Vl5{T~?RMv@DN_HTkRyo6PJ-7r7kf;(mP-4p;S*w*8o0+uQQ7ZR}(5 zqi!nHAZ^BJWxs2Ct^Bs|c}9Mo)Mq z5Axe9yCymh@%KqAIgGtoX^ECi=`|>A-}hq>IG!-*fFGa-?GSo{UcW9akJ>i>`gtk2 z`}4ymZ1If|gO=h33OyCME0Z5F9GvX+--5T?tv1f~4Rp#FSY<`CW>LMEf}fopS6xR2 zug5hxRXiD>CYZ<7&kOy}5zaj}?qVL`Q8s5hNLciB`#yb!A(X9UWhVvjF`rPz0&IN3 zF1yz{6GZK|7o2>)YfOD5?x&o+qvgj0H$iK03WP;RMg|{?rI(^Ufr$^IVCxFA*Z#YW zpO-xrNu3VV3wb7x?DusLGtu83Z-_}F9>%xa-~ChG-4y(ro$J1+cp0TV%8{_|`{qVs z=qtiich`4DUnUcH?ltL3*f(Nib1DaBTV0uzXl_v{kw!YviEAl7cXl zmEkcr9T;Ttc5Fq))bzwLU)T;QdpiDlkDcqT6c8vSY3ScTZNVW+VN=ExBP6hx)D2{l zVMV2twC2dS?L%nRzSUK0W8jp65%f`Wj$6+ID*F_r?r{lS9=Do-`pZ3TLq~CIRBodpo+o;b9B`yU79tz6%d^P&PwP?<(!bl(fz@&!TU|9Ef|I%>2$D}8>N$u%=ov76|29u2X$0^;q z`fU8&PpACzrNhS`XXP2!@BeQ`-|=6c^K1I6V?~z#u9k{%_cu%1RwNfg=ut}hG&UOu z&TW?G7QX^n|Jqi<3J~2P=9cFlCMmMrjJB3meMaTV{cuK6K&~e#Ntymi^hcUUNF>8d z|Br^4ey#%Vp)1^l8H(S&<=#v4mXBxlPz$M=%JMRY`uG3J0GB{AryLPB&0t__p^Alz$(u24Qc$5M!fT7>tT|9x&@&ti{ikPm$9`QcH zSfqi$u`=9nKwXSMJ^i6>xWYeuB12<*9fXpDN3iY)wE+ozsWw)FI|}C%oF0%L zlT*Zc0zN>HWw{J*ZW~#mv)v7^ob4ytAJvoCjoE!mSlKqk=y?Hn%wqbi3bKs}72|O7 z_6ok*(5juJP=Tv16YEsT&W(ly1KqGjndceZJpEVeg;$D9DE*pz*H_!u2Yt7TTfe>8 zQSm6evixUP?YqA;R-i%Svg^jS%!xKoNbj6>(%FM&Kj(f+1?pBCP?O2cA!ke53jf1b zQt=nhqcO3Y@RBEx(9jzZed&v!^Gy2l-X16s#smWp_pCjg984;BWFem}?x-mfvG&<} zlxMHnYiifa!_${LK7s1lhQL2>O}>rkWPqG{CuP88ZX3Q8@|Fo6D$43*LoQ!hS^`Q& zGJ_j9}&`7PgFLzIq?UD5zrIE$nJFBf;pFVy3;(91n zL^`&%u6*1ytRTcxBBgEOrEwT?YQ0+W`}C>&^ltpp{UIOcK+)qr|G!5y@Gr6r*nldg zOy^aup}|U8`#*m=Tmb?Hw2({9aY_S%6d0}SEC(Ejl zQc@B#U|fnSPN}-s!?z+X;p5rFF?+g7^WfHns4l0k6pA1nN~KrY+P|oN%yx8Z4Vs8H zDBvJ4_I00d@dXPUAB3O_*zr>topDW|(L~5&|0d`=;USFPdtF$kN*(C3J*f4D>DAR< zrX^wt+fc&r&@h200i53R7EmnT*wTBV13jO3-r94@In>X5*2gfR5ONse>m>G`kkop~ z2k~FV$`nKKSB~<|Ql9zE9eOndO*VzY2cT;GaZ;&nY^B>`J{?l#xVrk}roEV7(Jare zWgJcK$kK*^dhE4`xMUBnxQ8}uus*e`0kS2xhgG`UIy=8EL~*Sxi`qZyUr%fOp&&?Q zXLDzpxlLa9PztqDXz!D08v8#}$BYxm}R6#-0apSR0!+oEh z;--)_5A5j!aq-WaZ|?Mt=mF`f2*F02br^;x#H4V?V-pfT1>KDmd`c+&lyBMK4QABb zxpt9>F8JHj9>%sUR~#UN2L%KeooeO@j-T@Cx2 z^z?FWZj?X}>??^_O%nDrr_38~YEya6NG}5pcTw5E6bbnn3(7?it-#kA|z?rL>LMdQ}s%h~Q`YGh_F1_w&D@;5!T1K!?qp$AyXSAw_Vt<#OBcK5Q-ULTi_? zT!Jp{j$3;I0kl8v&Y=@yBi~!z>b4@fzm5zNb7JqgT^36flA4xwn^%%Hi1u#1mn4FW z*LH}ct_uitT8Dbw+V;WSRd?aFH3_|c?T<24R{izgS9V_tY{j!w=;6&V95`ad>lHpI zF~F|uj2lBpYe$IWwLo|c`f^js&|`0|2t3+L)ne}7l#XyL>N$C0YHH@`avW#%_JV75 zCDHsU%~bS^U5$xE(OD*RyY&aW*HpRk07>o_vz{#is zz(u?Mbw}49=Aj?E>avb7gcj8;N5a)4hEE7DBvf=G15B4g{{*Kw#s7C^CC_;knmv2u zBqPS)(>3i>lQjM~-jj-se7qB<>s^cI0?i3_#bxmN*$smfdMN5cBr`(7-d!ZIA=*17 zLcmiU2(Ovjk{hL|BD}5I<*O?ZH@+(?-=m{|kdLpqt4Q=xdwjoK;r%Ft?t@L4$?_`> zA)CYFeGi_ucj~f)2+welc9G)K4~6YMmZ)q;N#PhX&h*^7C-m|ZY3S3Pgc_jdzhJmh z0u~w%#)+8~YNR>~%L%O)$b@$yg}Di)xD;N4!gKburBpe3=;P*nAe|aSU+yLD(eK$* zsvr6q+2xP9eI`8r%UN;!RmB41JD*8AyNl#ntnTpN;%G4k3)LHeu;^yMm%U}EQMtnz zFUp&ZZeEnhHAPg>*XMOL9{4?uXPP%Ume|nM37nqa*n6UD_#V3_pkG!>!D~PKET%3c zoSmuL@|l7Y+DL-^F}afK5buk0#lpSVf574Bk;ut%NsdCb0h)Lkj;bzCS|cP?pbFWS zswz@a3WnyxrpFHRJ=7ysb`7ho_eOZ)Gf`~hQax1uDwp58pu9Af!a*t%FTTFI`p&qq z5xX~-e~gRto`U)Z(A+clystSDXa96Wl^f~*HO#D0WaqDuD4VH&<;_gVjIt3kt6w=H zR)F#@_d<<~OvIg(6iXq;D<(^aG%xBTLqTWzwVO9z>n-<2{YW{@+^>CGk>JW#{(yne zw`H<9cU_a)p!yO3Wlwtnmj=+neUF!FT?H}`9qYy7PJ8(`ZZdr-q$mE)tVWidD?$Pc5;J=QG17I%5nQ#ZQ zgEs7&_#eF&6hjO+6gO(8r_BMERdHSsl?4g#aGtGSTDx`iLUaq~-VN6_sZS3BOkVci zOyFm3n{oIj-*-B?k&j+blu|OY4I?f?3f23v!lPb20^Y?6NteKK3~U$yqj#9Nx6|A#6Jpe*vjxbq?< zuO8i++weG+5ve5#`#%SA)%u1z<;ava{=jykV(eG?P`U{1-srgJevHr=KA}nQ4k53$@@>&+GmOn3NH&lE=nTGcfsI&hR-=AyEl+evcPkc-L{yPmI`|VZJV@KjQEBok_-&z1w z7dTwzNXPBgFZJsHrC5ojWl2Z4&Ry=-|H1$Eg+*$L-Ih|XP_6fn=8r@{THzsscapoi z2&c6~bNX;NsV>;A^}m?y$+KP786f$!}~p*6CZO1ftBo=g8PUg|L5cX?O3pzt4dk@a{hMYSB-NSy+!N8tK1ZEH(w?q4t307Z>C_Y)T$MI!`0X|PlZdqq7KYm z_pG_r8)^Nf33R-D4S(KJ;C6J|sKym6^@zVl9^AOHqb|asc`RfzgXpO|;Lv0l#)uGx zK({EX9GHE1-0q=^HhzUM@wndpk>@^+B`K^;Yyk<$kV9IkKgP7pHEnxQveokZB>|M( zEdGBHuPZJgfx(s=^U@5JyK^k6`h<3=!Zl;{QMbPil)Cbn&JH6;9p--C?~Pk_s_NJf zxV6VG9pM?*$={|S#Jw`v7&xsAl0kGdhiK9F_OST)Gh9>iKO(;ZoL1NBNShm$YUTRk zA2xOFals2X&)LP4gr71yC{Y)s)J1tRm!641{gF2m!)8a7E59z^6mmJOhcXt#G>yND ze!X0}Q;?-{IWW$NQq++VzxWt#pUp-WP6kHmwYGJBtK1hkI9Ndj0y+d}svj|OhGJ@* zb8_V?yz58nMhi^rZVh?;f3NrV(0AF*AB8dz+42ME$+caAQ!W_Tc?gQ=K-=mF8p`6t z;52|e9`DQIn_FJ;JIfBHZ<^h1drYp7oyEGs&c>Y8>o#?T=C1xrw^8IN08_uDrk*p1 zj!r)@YNv#e-@!ZWQ92!*(~YdyGrFjFeDK73y>!^FX7%2Nqbub?rk%uFMz6+1y78A4 zKV7Mn5ppV)+D2iz2S!b|1L)+v4U-gJjKx^jWt*zLK<9e(0IX;;RL&sjHLJ>Ps2}w7 zp6clEi{;3c(sr4;PbGQ-{*`VeJK47n>;7wYe)sP16WqZ~`un|j`!^@LXDBcbIJZiW#Q|8 z(JhAq|L^S?{ob^RiO3xzyRmVn3fJ$`Cui?BH8lxgf4&QqIJ`L9X;T05=RKzIcUBsh zOB0||Cqg^&EDPIP=J*-s*~~;4Jr9HP$n|e9cVhq2XC2+ZM~3y@wffxYq5V77Q7ud1 z?Tqcy@&?dtW$Tv@tUxcsJh<^kl3s3yH!#s-dxu(FJMj~&nyIn@ST~5B$Gq!A>I;$2 zQYTMe`*o7`GucSp;>6*-dJ@o1GeT+Hnf4>rFI>a8wNUXcofgk1eCbm z)Gh)RaZteNHRR;{DCH_Qikv^6A4op>bU|>b_3YiIeJYawJ*&^9gs%Ml9I4^r=y@$d zEKT}M+YZ#{;gx{huvF;Jn)2e*8-goyJ_p-wm7Ys)KYsc|+?bJz@?3oFf;VAh-b+@B zXr}gTw3ZH6(1w=?c<#h+?Dz9Z{#<)5zF-N{@sRWDng2lF#kqB{3Nz|T7(6pi6LBEj z#iL@vaY%0zM?pfeip3;0leH*OONTS&TnZFh8nBEiMS+bPh7f2kW8Hz$(Q4>Xs@IN} zfB>-%Ewxnm-f}ZaCVW_zj}ntKtn+{}4QJ>MH`fU!C*N=OTA8a+riE{BD$9%t5CjEUJR~ z?%s-SyGn6c{VPIY{h*?Ee{NHC`(Yu;KP=o8}j%_)A8*afN?B*Q+;Dfc@Ysi91FF^q%)&rMiKf_pa{4`w6}{5s=AvH}C0nkVlYI6Aw@`k5-pW0Sj4rD$!_xtxQ`1`ka zmlEn3Y+iJIlWe%P3t@Q4vc+ zy3T&ZhpyS90Uqm6c{1AKVZQ}sW#vl5Y%Q2}k_}pf)2enn1wBXIniXAK3(j#A( zo=zrr1ziG}lp^p3e8x9w=UPnJdj>3~QBW6HJteO4yL9*`oF|(5N`R6bc|~dM3|F|% z)>c`iEAcImUgi}PILakIVZp_841}0Aw=NBYq6^=SK-nKmcCsad0Y(B#!?Rp+#>f>Y zy(CgQerYK?H`ih1IZisfRPCnA>_PPKO5GWJi%qw%O)mZU|IC0~{L3Utz$ChRE!hgj zVD|+h7(Ag4*0spra|Byl{h5ze_h`Y@_{bpPy~z6|^xJc#uVk3-D_0};y?Yq?}=7VLpGtJsPId;JKCzt1ERd8_7Fk3oR)vMGaL5lZU>~MjyRGOW2Jo zir440t2WDdzIZjTcq>`wRq;~`Ma6)a7&`djqE!u{^Gv+3hcwQ=Qd?Iy zJ*uBtbRgnFQfrs*_el&imcx+CLZ9*XVL)2{Wd&M*SkBnd#*4$`op834m_(D+BgW0$&|Az_w6nu?J z{NQt?2xVp|O1B_0{`uEBiBIhvRisCuu*7VKae{+`P|nq2^G6Z?nt)>D;DgTfG7YmL zSe@e%1{EJ9&y;t+Y?({@sS0dnKG$xnCL?Fe7!wR}>l+?MgL%v>c|Gon%~9W)1SWX0 zWvz4I$!D0FmX=9Cv|!XTb2%Z*B#Huq8or;k(a zEv)I@)#xjNUB9o$!JEq=r~my@y=C#@MbiZ-5X@915|0#IZ+r6_KBtYEbu!39r}gbT zeRLePawQR4!Qa@}iVF*~jU>?Si$m~v2=rWCP}o$6YxYI63$%^1QA!!y0$GzSAq$cR z(}{!&QuOq;hbOmtA|iezBghnI^l)A^blT_kYrNL29WqzmFjwr-laN&V!5-ml=&y~w zpD2dV65+=CgL!kFBd)%Au@9o(>+0zV2#BW~l2XF)o#KeCEx}6oMu;v3qx0m++K8tE z*SMzxZBnakjx0^yUMabp;Y+^ifX5K!BDHvtB(fJ>bL+gL{oM&orLvpUJvh8Bj&Q@J z$}dR)LfUy1ea7Gj_^f{(t=a@VB4>#KoVk$stbX znOk>+lbkQ=I?N2n;yChl+>+l&4x4H}%iLin9r2Cly@}hbHSKy?DL+1ik{912O6#)z z^*+6&y`F(bbh2yha!ExsrJ`D;b1i=JqsxSs==U@oUDk*73?~PVC=++&qo`N$ja-J5$40sDDxOJXFmBl_k=-x7!GhlZr z*d5G0`qvO7U_$Vn-&T<%lbXJzbu&V28SB$FyQQaD%LUMsQiQAH-oB^O9d-Gw(7K~O zzQsJ-)4d5J9Pe&)slfn(Z7_GJci@4)*IC5P_PnUCP zRNWzATXfdw1{vo$q8r98OGBLf!_b18!2q(#mZ?JMzuCs>93+Qi_Zp zf0#QPLLj|0qY{XHw9n5Hd>Q}Z0K$2L?2su?mZ@NJ#j{^2JPG*jk%hf`SLbP8*xh|G z+cz+fJlW#88Kk^2*M;0m!Vd2cZg{2kS`nZIJH`Z~Be_d~2i*EQLtVQ1z)St_8I}Lr z3UcGE9g9r+c9=s!%;7)@%3H$3;0h=D>vmo{hI$QMfzdA&NG8kOlU4z+D-BwlIQehX+BDS`b*!l1X(}1fF%ot9+rIrtf6^>gyh%b%5OzCOx~Q3$+_Tx&9j$qB%(*?GPp9Y&SR9<^hfk?hm)U7 z=2wt}ol37VJrK-+amEUycNqrYqHmepv^YivZ0B9%Sy&Vq1I2)UW<;)%5f@S@`-<%o zDdo<>9_5_2i(;yC36*rN$-{GBjCR78!4IW>p9Fip#{Yt9tBJnJawP@kFbE_;wOR(>C^uzY6#tzlW?8dr#)(aodM10U8_jG*KB5tH|)Of09?%DoCSgP%? zaMZ`B%p{Z=EpI}v&q2Go%YkJm@S{-*tlnWg^zF!56%DJoz~L1#jL$swnFD(cXY}o3 zM2md6H57!jftB66>d}1+DrS-)?fT}c56hrdu-jzU4dqq~)*Oi&89qNH570h6t&#WZ zC<-lL>6mMQ?`_MFWMys_{3af*|X z1yy zvfFwa3L<*EI6{-OsS<(h!`TK`R9Kii&X#hF^b%3tDKLz^^)sjMq?7>Gp$}_f zHByiKhDq9)U>XlzGmuLR z)E&(SqL5yy#|Y5HRjtBCt<9{_#N~(y&BbixdO>N%$)haZxsEUEd*FkTl9GkKfJqUz z?NpvP(VQlK%8HF(D-Vw$f0lTbvK8nKGA}0e409f5_tWmAr4d1%dbZ<3GWv5rH+3%S zEVZ4H>8sWtU5=iur9=5kEG$Zu5AWa4;uubBwo!LBs6(nU^LAM=@QqKJ)>yblkg^Ct6)ZQa~%oaRA}1JHV2%kdiWj zh_7W{WMEQozd92k>U!dkjHi~;*6Z@2UCx!EGrKh2#ny_hYGBBlwT;csS0S$S!cGd{ z1ou}IW$2hd@J*+-J-sMVj8AUg^bog1pvZGBg>9CzGlD?!ZR@j605_LmkbzFCmL0ik zXPz=o#bGf-a_@$&?48SLnpWcOyBd166+k_>0(<)OQA!Gxp`oEBCp7cQ_0Se$eVph; z*%)YU`)0DhkX^PHIxml)6b69S=5jNci1SQp2%~s1kua?NL^oZQX&m$1?r!On@gW2x zzk0s#&yDbFuzUYrpZc!r|0QK4n~e^s1!S8`Om1X~*yg>&sf|5#BOfuk0RE^CAJ`+? zt(~5I_h%;TGtP|?kz3nau&2MmX+C{4Ll*>%n3#d~`jzaMDLYPT^9Kedst@P_va6GS z_%nyni%)PVB}l-HmX-)QTF@n#FEp7h=&~_HR|($EhfI0Y$+o_vEqUX?ScO93_XrY_ zr~W1S)pJQ_?hM=Dr~_nqs^Bez(q*S%)i$#p-3Nxo#@&5=?>z|w_{IR#gk}8|#H~Xt zUgu%t`2pSg5Um>27KV&VZrQ~*@F^mFYYRT)CFD7kKU(45Ire#?uWi!W4x5n*;gWxT ze|jW>E4IC(9Ga^+^@3A7aB;Yp=0|?*Z&Z3P@&}7OrG33>rnvf(XK=-73F9%3{?G+s zNjY2fQ=BH)+RDQK?4tuoOTr;B2*mM1&?I_stuL zKT{sdEO=>@UvDOkBE{)$_N;#oq@*>3+dy6{S>%<-__fkw4Ch@~E2`kSodf3CncSF$ z&Qpi-S685wU)*@&^kkm<);TnF3T6%>Abyh{r0{I|Ac{mzSZ;C zWOHAC%bXWsRtC#3s`}hD%UgM9#KfSE_1jbC;);oj)3iT2g&=MT;A*{00K4WXB09_a zA+%-k2JN!F+leFmImLb2B_?*O#cIv04+C0OIy$;@k6Ms$Mv=@&wvc(tE>pOxOJd#Xwq~=` zsI>*WHO@1;9i72b<0X}$o}d9pu*RKhxoN0!402(gH)uffh7MENzIZPBw^bzF{y3dM zKh^P84aM$K9g#wZDf{)k0~Smom<|r|Qve;6GByEpL>_e=W%C}n$fZ1=G&C~YmXfWS zlgxD})>7zMy!2t@KC>0k?sbH24SReW`$A_HbF{Xza%5+scnaBU=We|j3|3?fgK6s; zTF=tzipJ`mJwFf>7(_K2LZ=4K*rJ0^5i5debY3*97NZxw#wvO|+ zbxI%q#|XZJ4mLF(s-nQ@kG#d~A$BEzzxmk{b7$eSfnK`A&wYA&wcUv*qyChJ+p4PS zFmvrya@fimaVT8%E`2>ArYe)tM-nBT4A@7a2h) zn5VHwJhEyy16$tOCgeTPM0@e-L61bKrAeF{D)zK)0rsjMQowKlBW=oFXymtmWvtqs zwY%%UWAte-rcp0jEdvmx+Inc*Pk?0d2s?z4%DDhtT|LCsg8rqzk$}8lSA*M{p3R)$ z;~lpat8*`yd3aP%FfQ~A@n!rIz~|%1tgUVO7WQKvMB5D1Je)QbU36V?9yX~wTrs+F zk>b-c`rm1A{pcSz{7YakT{EH}Xd#cYrv-(Wz*=Fj8++b)I*LlHRIczE1_{qxbY0C% z&K-pF)?4|OZwJlWKwfl*`#P5M=4xdl$)TLrIVHnu^>1be`-hSwk9I$SsCkBdVWF=U z5nTH{Qm3PMgF^Z=-*Q?c3bDX&q>dTuNe_%T4gQ&3#ay>QjCeE5|15^5Qus)+Vze>L zmQx!;!KGl0KtKV=q;u!bJlaw}O75!LjZBb;*WrmBK1W|Wb0HklXJZan+;arLm2)hB{VNrj3!^ z_f2m1WWVr1Y{f8$(-jK%Ppl2P4bY0}bRp^S@eUnDy}`Ew?a!H>=zLh#xwmC<5RKgH zCM<~kMD16K95FaIkl&8;z@VzOD~4zJFec|IN)}>FhRX#ge6)YRe)Y*e`HwecVB={P zPNP(N>L`itfH$i=#DpuPie99(aP|P1h2{2q-2Oi4ruxx7DPk{!3vfn*=gu#t$MjHM zzL{VD=$d8zhBEU+VDn@)IRCmf_aD8*ZZnZQm4)emHeCZE5Pby~((O%yD zTY^Sa5SQKHdkq$E$iS&E1{UFxHH0tj;BF$@wpwrph{lAXg+W~+c7ZE>#7I({F9$&V z1G;&{CS-Jf%{d}x%7;okIuR9*6-n~F~oNZ`*cctykaXx;`(aht5W)Y7H z(pu@&t8T)kS(DKisZL7iTDcLl_fq!SBL_loMOTu#UtmO;PG+^4 z6tgzM^S2hDtzUIkX_^IK{}IpTH~r|yhRKJR&I*tHxY(4g$|WkhDx7q1DJusrZ!dPC za-UJ`=N81xg}ASZt4646X=xck)c5uzKI4hOS6#I(i;f^0L|DC%EgDmHC&OLsO3$`W zuV-hY`VK$R!~;e&RH8gLefb8Z+PC?kmHn*2UH z?gD>&>@I^1)x&$HXIRN@>I<~>0-M=0g}3?usJVTTj86aEQ&Yz$lT?ulc&{%oLA&|R zc*4Sx&zC*FGf^KuW-~{R+<*Gi)d1dBUHV;_=79rRhbK{Mq$UxJiqXMn=VTQ~ky5zK zO%<1^gfOAl9Rl|6dH4I zcvk)>p`exy8z-mFl{Tw_qiP=~)k4 zuc!tWO@11`G{D_#+S({G=Lh=;)u~g<;A_KG`&23V;yyGI)#&F2(Ev;>EJpW=%o_T8 z89|^+n0v01{?Y=9X(Q>7lwFOfSrmC?>D8M&GP{@mwc1O;pg+z>@(N&RO*MM56-%qO z@!k?gWt?v=bLOolpSkey<3|BufxMPG>U~GQl9oqnGVD>KtJExap5*-eto@^g=OSZu z>kjnEgI$lLqjTju&M z>f;A?nouiGPx(`nr0_bliQCH7LPPx>lO-&&Yv1#G*N&-N8^-;VKlBV>WLO>;MVdV@ z$jcbeff{7>W~eVTR`edGllxbS^n*x_jiGC%a!l*B8h*inK6oS>-i52xW$CdSxtG$| zLHFZZ2i+eUV%6fWfb}??o!Lq!1ZyNZjU|8sR*2_qzTlnjU~3DVoTRGssk@|m zoyjC0pcl6@CJt`VLh(++0^`9K1_m&ovV~?#N%7otP@p`^kbN|Mhn$=o=3*nQ+^($j zb@EW2oaXI_?X4bO?ot!qtCDq-!E~-ghxzx+9>%T-Mga7@fe!%(tIAb{Erbyu>4g|h z7OL}gx^3kGQIHoGE1-1_OYL9ET7u+ecj8OV{z*GWx&Jux0|meUd^{cN8eVsXrV=We z&^0^eycB84kF}!RYPtI+Ou-UqD&@93x^tq9P(#VTx*9J3xP^biMR&-iRO875-Bz;2 ztGc_UuOs$?10!f^9SB(kNoxKSu33biQXoTb^`{oW?&N?JBAb)*g97UaenY}&ej5t+ zpLa%FGs;&|(|zK^Bc#_z20$TVX*HR#C1_?zzk5HqNucUPlNCn71@^|yl{tnC?-ZR_e}rLvs*5%sC%SU^mngbNAbB9w!`Ji2i$G(@3lFnF|+_t z+XX*CqdHGXT=W1{3gA}_Nk{0KMwK;g_iVSFjmnmEUaHLFGrG}V#2G%6H$a`s``dBt zBLDLBY_~F5trjPabg55Xq|J*lW4_|iWsA|*C`?Ws(UYNL@JJ@qAS&Smlzpgw;%?Z~ z_l4}mY@c>{d8Tf9E~U5qaR&-OA=lL*@u-g~;Rj$UP&)o3-@@n-Y$*;Qxyf#SA zTndAcT#+eZj9P`j8y$bKrF~tphgieLlWzbbme>^%5J+iAx{a%JR^M6PsoH9Om!6Th z|HahGDu7aEIbC{+CtGIOQ}r^6#nn*#jUY7NB8qXz2yYGRpBbRkjo#laU;vm&8yqk# z8AJ^@w8gav>w*x6l^6B&6J%wGG)wZe_(#lmkRJc=%~m zcQY3b`jd_s65k8JE5}49bjN$u?C(e-@w$MfQzQQg(tls`& zRvYHINqsLbJ5{F`RQOg;_y^5)EyR<}x_n820(OF-P9YbE_+GXpry#MOg+Gm)vT;1D$?9@otz`8e;ULsWm^Y{H8#+a?) zC^FB$=DRnb_s+=JpnGKGHMsvS8{71VW4Kwd)zF)Rf;ZGRpfXu_u z+3bfNbOd&*C-DdDqTDhVJW}XfvO^mn+YeGBN}jq5H{Q73tlkzxvjSx7O_IWnp{TzE z=IqGiSk>W9LmcD8%x{qc$${)&zUeNNcG!heXUI`Rkt+e-snX_cJk*U>+U_ZYslDJA z=S$(O+c!)k4l`~6{tzTd{R;~*l$Q;M^8|J7e_v!_x8f!-l~O139uIHNr0 z7ixRIWS`6U9!1w!L|zA%2~XY_k$AStK<5~0s=J>gS!JDd!B5CJTMXukm_@=EEA~b> zWn2O2YBMHAn+_<|>-4=#qHf2vN?bMkG2pu&HomqflWLvVJA{v38#lKLe7aGV_av7t zwPT*PGqIbE(I+)U{INC!k_RTY1YZbmI1ta4?w>m@L)f43SEBBkZ~pvWRchDqkIbVU z!hKGO)z{w^6%SuRzs}a&F8_hl$V|Pe!y4b?`$`I0v7c94;|d)!u1hOeQv|poiusC! zSOG>!bIi^CnX>@L^I4k{7YGJDHKCQ2bW3An>Bptp#tJ?W@7=JN9f9oRWTwpAC=Q9y zu;DRIB^-RX3~K+X?F2@5Gq-T6RELFp`~pcm!>rwz4L6}N13yc$N5(GB5xB)K!ySs- zgL-dyepFo+)MJb4v=9(^m`*@Yx=ha8g;u#LgTi4+adon`HBRrzh#hLg%Gig>d0%bA zb8W=Vc@vARR8o#ykQhwkJH|(Q&b9V-*4m97YX$n;-n>IkO=7Ej@K{D)VejXMt{cv8 z>xBOE!}3Jvw?EIBS0nZ8zG&CwP~^V>V4s-l`zca&7SKLf#4 zII9C{6>z@WqzbH&RVdEuXIVP%*_`txpF5geZ)CEMmhJ#foZ5LdQGvN%!zAYvDHgtH z8Ol@V_M|0*9%L|S$>Gvp9>lh>(=Or})GLX1jqcBtu2dYNU^LbGBby8ZO{B-pPxMDO zmR}uW-pYVcs}gS6XAqo?b47Sv+bz5Fla(bKzib-+B# z<>pk zH@d3#rSO8`ve5?>R=^gf7p`meWBRi;9#v5=E)Qf;wRl_hocutOSq#l9G`q&%203>p zvCjIH;?5wal3`K()Q|L?0$aFZ<8_kNqR&1-v*Uy56?syA-^0Z1B<7un1l{XBwq=Iq zt(lY?Y~JU7o(%2nRo}9-Q~+?zZDUOa+(7594ok3wxnn3t;*!D5x5vImy}GI@x&dWp zmj7vQC`QL$*eQqPuhR32iKm!Jn zyR7U&CHNK`JBH1bfyOT^OJo8bzptlf(f4{S*5V<4hm2DGd|EPc-Q=cDTw78LOTPX$1Gu@;ird>b}#5ip%Hv#${@AD<8 zC$ z6D31RnT_zt0dqBRg!guDxS@4Z6lHTE0+XXhUxsU`wTojkl9KyJ(s!gkpCUmTZp_YP zJnYH<+~iORD>bK#v6FK{z!zz=v{-^Qu9`Neh01PO0p@5Wr`4-PM@QHF>t|TP`;aOR zxDgdq>97u*Z%@TZ{H z?h2P#aIFz9^(aeCm9<+Nx0k*2Bgb{}6@FRB^p;c440d9}oafBHHvBdF>QACPcysw2 zm(lf{eQhJ$LX86RIu{0#nbN~4Ye?b*2t#M*4LXkp>4X}h=e<>p|Kaq(-BgQNi>NL| zAPpch-#xYRkh`MgOX}v?#)t-(U}FSuHhQf#HkmuGLWs6`3zlQ((o&j|lG5@P+gdaV zwV6cyoVw=qbCns86G%u-N%+3)*zq#!up1ADFQ?d|7<5297ns;Ww8rIkE@yNgG?j;X>e@b{(uehBZ zmMtgd`iNP*apDEe`#uX;Ta3-p%QxlIZ93$x*L1(J&;(MIvT9W zs50{AGc+>Nw_A!;SGKijh?A3>u`+~kV zRE%!$mj%~a$KXj4pi_@(ZGFhXrq=g7#K{!YPTvl1__dZ_dQL^t^a_cw6>?a~@lxUE zI>nb41TV}vJa>u2-MjUF&AsJARBQJ?i~({$#DGy6R2rlQBn6~Fa%Sj|8e&K(VL(N| zprk{(XXx%!8tELmh8nu_x4pm5Ir=9&`whH=y{~J4Qya+xNvI-*7H#8gp zu&#nT&jGZg=(ECao)wsGdLZ_w58$qRrdzLG@}{^0V=iTV$V}R~2`MIezQaxAJ-IGh zzP3S@mzz3KiUI=QmG*Da!Y=cb!H3i%O}+*I@av5JsPB;Wt``3>mXmN*ylXwbVd;*e zYVWPbvB2ij|9cvp|9+c@2ejkVltm~VP*`c<;&b$ObMn&WMpK}beO*-f|1~93Rh~vi zo@WB0=Pyf~odJsKx1O0-GW)Tvmbz0`XPAAl;z;Wqu6t3XMA{~5Kcte2-1QG!%B&Gq z8gg;~YC+TYZBttKP2nJ{hE0J9xs+?hTci%*6M8jLra;bSIpu@_g_g2~r{${jej(?q(L+%cg#~awd<}C2??DRJ^fS=5ht{F)S`X$1jp*wxcMP&yOq|(8v z$^a%NE#@VZF6S#vNkKEbxL68$_zrerly@QMA*Q>6oThd)=f!tn}+<&-HM2y;@Z^`)kKlJ*q$F zF@Z#e#^B-?WcDk zj|bOT>B1_C#3{?lE9lLHvJlD|p6ICBEDuE1b55_VpBRv9;F$+oikWB%pj`*_UR?lJ z`E_k=P0csHYvUrnpum1(;gsQMG8t1!^bKa<#^xuCGDzC5$m@A`q4 zkZHxWa6yWweUXin&Jl~bv!ZR~N(4jP+8SHg)=a^sbi)6x2d!A@$TAZI0z2yrBf6dz z&lap>JRtQAsx!c*JneAt&IX!ko1d+U*h@q{^4tFBU4@z51RJ3h2GT?gp(+hF_7={P zij+r#bSQ%Ry=}{<#SB$5e(O{LaAT^*tw9aH%D%DJfSui@X|c3otqs$o=XWxD5Wvvl zVN>A@6%r(Gpo=e=s>*5U(acg!=mVrRE<4RSG%IkJC@31KD`V0Qspx&dEjZ;22<0v! zjbA;kB>neQ8UC>w;B9x76Uu?u^I0gM%fbMiE$&q3r=DAEh5+_X5*wMl|Edqp+WD;T z+j#*<;8$iEDpTd8r9ms9OMK;o1e=}l`Hf3%?w<=6m$y6i+PY5htdPiriK7Ytkku5E zs~&bf4qYcb>(qx@@hup_sA)+;)`P9cnOZu-ZfsUz^0!&N$gN$+sBuBF>7N!q`cCtj|o;n~SvSFIYs>B6@6NWgajQZA}ao(G9iXkPgS{1%t2 z-{R-z&mFHiF{b^Dc)n>Tn0R$}Z=ee*`iw~Mlr8o!c4!2OPOFoq)AxoooUYt(d9wji zDE@J=F>Z2^cl&W1=`uO7^ku@jgd5^zFB@gnhm(&l{$mu~t^PnjjZ`qQ#L{g=NA5I9 zzrxNXpmO<4B-tTbVPGmzYW)TDN+F96kg5zGSNbt}x&U&Qsd^U}DIl3bxTy4N4+W^D z_GjCB?wA5QQdr;*oVU2<T4NOM{V+fA(TZ_jyL8?vC)@e=wuF!C#p{a1(znst}d#C&*Fy`aOua=({scLhkWB z^aeR`3lnHW+sJ5iZ6a=DWJG|E4-I&ZToy(UQ*{{h<@*4j(N$Ma$O-E>J|d6W&w}oY zyH>QYYei2^>Z$R@DpyBs*ZD!MQK&L|qq>QsEtuPpB;Y|>(#@h=TPF*8Y3`|O%u96> z*<2WMmit?b$GBBJf=#6QjT)`SL6W=4>ag=n2zB#;yWZEf!<^-6;kH2tN>juooMf2< zExX}+XxCkg3KcLhpMwwScK6~le*U;?CmfsTfof}c@^;ruD=lq-(n~b=mfhtesw6F@ zghPlsB3L0q!_UD({VwnKkVB2KW5(vt871>}2ihX4yJOVGlKlf=_i0u(`cC+={-?JF zSf26`3&Dbjv*)c+Ctz%)*p&E*Ew|v9{*Kzo_5l}N#BG$1K`9Q-A9wo(8%S422Y?07KVW=bg==cQJqFs(tpn@X|FIco zipE9S`izW>AmyEFv335shuTwJKq;d`ZOg+&6?0oU`0}BiG4D4uE1ev+&Mu^VN;E)8 za>uz5Ac0=ryVTszM$r3-mYJgHYWjgkg6M}SpdUbw<5_GBF!>$yP< zv0r}7O%{!wJkD+3I6SE9A*P`@a~Xosif4wmh2&&p=q!QVw4jys%Kr#PlliS+5ws2$ zmQBSNHegbFy9V^L@ zpFd@c$Zf6P$_{GsQBqJ1Ha1Gr#g)G6-rv`x+b#r(Z8*ovV}JH{Cz|XN)6Ommd%VMq z&E@x8-z2GuCaRg6``Ij^va{77<{8%O)xl|g6_p^n8ucC(6>B@YHwEbZ zGmB!1(KAyWIInq%g4?;v(Y0qXM8k|*AU`JDPN0o*ym-JyX75vJcLH~Go74Jyd}~9` zLaf*w=}?*`As;p_mm1039>l0P`X)tQX>yHU6=J2FEdMuW zMu6uH^e{@lA^T?rBVANQV>-?>&AXrHi26HMB58f^bCUv-_FTG}l1_6Xa&9yVJ>-!L z^bdDd)L>b6Dsh>}AZvKGW?K9W%1QlD`5%!Amd&AFojA8HnoWNqhITXn8p6JKL)fT$ z1(R+pi2R$R+{6D09CT&$Pbr96!a%7-Urd0)t}_e@DV{o*>W4oC`CB+u)kZ}{3y6!S zFsGU3Ck?F}SNaDet?X=nYMneB8q&Nm>CIRP6O+jEP^+y5G%xH2A*rQ zdMo|cL-&Y@<6=Efjz_ilPk=gW*G|8fN6f^Hd$Bo$L9Zm3ri zS9gD1tFPFpaK9al;CZDJIpZ{HdtL@C7}Kqoz8)HsU+^ZRE3IE%=jr{j`r(6K$d!R= zo{g2`_$}Hb0Fc)_I>Rn63y3t#`hFYn!gG49p*c8M&zp`viKs2YGZTeo6P~j%v^!AG zEIhg#SU6@6V3@*2DP~>Nnwu5|^?=@$a+_IN22@uIze%o}y7dH&Mok6m+DaVNz*`I^Pe2qCC`-yP*U7&sBZ>L2B-!TM8e`>S^ZwBkdveTAe-uX?-T-rkbV`2axBPQ)NrO?>6j7?zJt>VUh{WygNJeF=)m5;<4K`~ga-{@jCXyktPrgma^IJ)tmx2rRf$l`eHW$#!D+Pje_pk&gHji#q1@{})kxNB5W2WHygi zM1;zp@#_s{(8#J|p2+>rZvd0t(d3~{#nfGY*ZVt_q@&syE#oI1z}|}WUsGpmKHF+7 zEvf)PKLU#=#S6jr99Rv+Z0XEm&CyD6ux#!V4U-OsGl+C}6AzII&3ei6tCNgDR>lVk zW&F6o%L@b`Y*h#Jt%m~O)6Q_0`U$f#zzz)2)kq!S9aU6>%$J9Ed@ML$7FVW=>wf4B z>%0I)L`H_o%qb8bcjF_N;N^&GogU=PKzrw9H?ER2=L}(~kTU15#W$T_<}t0AP0Jx_ z?IsW-7M;)@U#WM4p7hh|_0_UH($q8fO77qAiF9XN$at7~6gpa3zI=KhkfCXnS5wq< z9jh5WSiiflG8V(6Z%^)-C$+dSSxcIRow^#2p=L*2KViGpKF@Q+C>a@^fub#;TFwv{_G9(ClNEzI^Q;AiY@(en`GiM4fnz6#x zE(SYyA-!P+Gg#UqlvwtJdH=|@;O|i-bs<7++^#1d; z)5PTJbjWut{`>0PFs84k?>YuLztDzwEArEjQOL^6uOzusN1RX%go;{%=<23UOjrX36@at^msM0) zU0q%Pzy;J4S!ZpHLdpZX>rRNmceM3Q%6heP`}DX4+DY-}6zBq}T`|xLTXjFYrP@S% z7T5T~0A3j9lPXjAAfc|NZoW8BK z4bUYm+*tN2;x)?tVKdi8e_T0=s^y}T6ZG_RJjiGrsv}@%!EF~IL5v;gid~8js7C7A z8l}sd(pC8*2Eb>oEf;c_?J*-B8S(VO1~>C#8J%jpBt|S<-SeLQu18l{eNUFM`M(Bt zylqX{|0o>1+Jkb!hlu=VR!zyTMmgv`bo~m`3wS9uXQf3Y9hj4Pfx-_8=pohsvj4YD ziGYCC%F0n^+-n3DSvngUl1+whB*mp^vU^6PY`0OX;;;+c7r&6FTM|)HMue}H&mZg# z_j7Cvj;R%lM1jiq1#+s)lj7oY1+0ureb01!Q7CruudQD$5s&R=;CG9Q8zDdJA0p2W zJ+xgq6v$B-evwSk&DIf33qOmVp8D>f zMaQ18zqL(iLnRLrq{w;xI+Y#exILXN<W<^e`xlm|;&lcN-b#T~WOm!hN#}Tf|GvY{W!ZKPWnP&T|pViyKj~rEgBu~`B3F6)*AJVS@W+(otn!X;6%XhJNd8ZG?w!AQ1 zc<@$8DEs#$inTH-N*b!s34oYZjN`sdMxbj5rq-e+I!%!dFL=VCV~gHaa}*F@@3JBn zV`u9`E_DE4{BI2#AfBP5T!X;$)|2dk$mIgb0AzV!I!AOba?ly{y_6^dlwR7n`0-$q zI(L5YOQIhK&hjuMexPKwzd8}0P4m>wVOQpgmNs&7`pXVueNUGum;1D?LceSAievE# zR(#`8pt{LQ5rbE*)ND~tSzJOrOb>YrXcNxI%q81CcPPw+s4By4Uk||Em7=PkDSc92 zbK>z0ngx_zUi~pgVGGkXRA+`3-5BfcioP8D>V?mhRA|(j<821OEnfSIdc7ZTGSOW> zB7ZYwQ+|9zrNOW`h4r=|XDFxvr&>lj2{z0i+Q|N@l(GW<#Ge=6RE9ClY8sB)E5LB? zs*ShADqz4v6oj%d`NWm`?728k-fygy;Zt< z7ohi2I*W^or5M3BelwNoF2&ix7$}yvK+4^TXRKTi5xyzV!giAb_F>R~$gqM;^w)|` zvXirnAm&xw?2LunO^&1egqgL~V!$_wYuH$v<|O{=sRm=G_iAmN-wN+(nLc=6mm4>*zaK~!pUaz$gNbG$ z?0(KPjpE2rOLhlHj~vC&lxUi^FA`~mooRlH;T=+tNx-W0X2m$`Hwjym*dpw;l8i#3 z&yO`l%keQ_kTyN0H3Gfq4%45>vK+R@fdR%z1O!k81+Y9!el`b8MyHCB(`@{II%=cm1$WaqKC&bchahfp93;HZ z+1{!`NfmZnj|ABkvqd~;+G9P^CDzt8ujJOYn#-OuPRc_ynHz0yMNa)}Sam($@mY&p z0^=vTor(nGwo4q8xjT$G2wMhCGUU)>W7Jx2N~cAI58e( z#(G*`E=n+rYOKGb*k+Q#r`<$bYm!E%vM5=Km?U{z#kAE+& z%0&taCbE}*WkVN;ieKC{+3aCx??ZoN$Q!Q=C9b~$FAt3lXV;lFkV+(qdUxM?d<6XC znJC@QX3emsGNSJ$$Cf^kHQrHBya3r$-D7RIiV`( z78ALx-dGMh92B+z_@>(oN^t(%YGed(=;%mkbu|i*c^(`@v@$dCZ^P9tE^e&hJd@`D zJ&(Jtk|ow3W;xehJ)sMM!E$PIm4PuMsGR&ma#l|L@u9KgfdLJl z?#?exbj78e5umtI}o?PH}rWZT5}AlNr(5+WwIXAYUKSb-78N9|_!Mg_4WW`G2?Z?KOS!a#ei&aMn{_ zWB=4_dm?yN`|aVWC4@4`kMe8c*N^YpW^1TKEqyExlWegMmj!rumTm;IgTcAE$2)+6 zP^ZM%Z+5|HTc3fjDp}yD+V+uMw^^j)f+7>)YoIcyNPq|@9CGHu(c9-lmU-K%*3L2` zume*%OGEQO59mL|+a8z&fV^(=^-V|+_TK*#Of8Km&mA3<)W2mjp6DM12i`0>e&lNN7iW`|?hi0f z>Y7u}2PgutD0Cc5-CKS0lrpdMu7)f#yf2)=jzTE?q zxa%F^JbAhK1d+=`XL{`UACGybjbjwv1~n<{RX2zK{DKy-yTbuW9F&dWp$uY;Rb~PB z4iMKz7KBKwGOD!n$F1aMAJ{ssjIrZBz=oW1o9pDPvv)!aAWPDbht9-iP#6TAlhc1I zhvS8fqzW3U1Jl%$pIO?I%;-EXapw4*gr8en<>jpj=?OwbjeFhgoaA_n&yY7M%U!}k zT`>#@mK2GB^ULQ$2(q@-WY~zAT%9?r`Vtu5{Bv#r{`5X^SWr`z#&IxtJ?yf|Y%Z&b zC)LkXTmDyl!{Jndk@mjHOHVtGjBT;icHpVGY{{`b-+Z+sgi1Eo`&nTLpQnTJ?cH=P$jC&g=L5j-c*u4{jZIo(NXm!wUql z@!B03iQ_DxMT5-&;-Qu0Yb}8wg0k&2h@FA9_WpYrV&>D{AIMD5my$0*K(vkMNWZ|E zooSc7K%ZAv7A}TFc7d+HaqSj365(isx5;N{ZpN&OcRzwUlt%3$GYb(C&TS>6gTFG= ztaydio2k4&t&{G#u*+9l%V+gFOJ00)ZLrJDhG6TG-ujy7SN0ZHu7~!fbWX@gL#N zU6e7CybA@Ach75LukQP&lq*AfSmJhC377_1F>2X!Io=IiJmrGN4Ew}!;Kw8tgB3o{;8tA=dtG47<&f#>W zaL)ZW7et^y;<#Futl}1L0T*(jC6%l0%{W^*vwEj_BZ0DW$kWk^X6ZrS8C1fuK`=DY zgO(qjeN855Ebxk4t3ZzoOxxkWU(O&)LMu1Q61oF_TxZy8H(K7>XYim744cX)dG#w( z^K9c7Zwf9NWmsX~yGq4Wkd(!ey*j~SdQDEJb~Bm|J-(BVJ$Rou&g|(=$98jd%k4^J z=!`KVWhs~7)2P8%5!(^R4GS0nc3|I#qt(ciK9TOK@0OPo7a$(ActU0^{wwQq5z z=e&aZ_R*UeEw+p_Yw2K0cV&Dq8JIdK-D(JP`{{&{}tFrxX9rQzxHbR|4L z&`|p(>jSwlkOCt0jVIIP3wN64zz?wof0duO#Y*o za>-Xy0{w?=GmJ!1mszo@ljYF)w4fYGh7-RA`sD_+?Jn9OPxp(;4p5L0cFgYhp+m}=6mrTu;7=_Id+lDAXks^ta3 z<)1Zt!xHR90~2otJc(6iE|=tT;0({vF5IYpUufpO`(DZb{cDHgeQTCork8C+JXg!Z zovKN(2JOplV(NW6_offep3g^+M+)F6(>TK`jbe%*|Pk5fI(pz9&Tbn6`DiiOc+dY?0F#ONsdt^k8 z!c02cg>d4MWpYHSD0g>OZyF<8_Z`ME=zP}^j?bU6Vd+v;{01q|?tMBFpnbRREE83tv~QU3 zRXjz5pNYHi2!cJsep)Hxx%w{g$Tl78*KJN!^h67I1ok1le zg!UBKUT7z}0dRPk`lfl_%rZ|HW8cW~jt4H5=&(jAg3pgn557@12uGyB3KkEFbi{=t zq>7B|TQU#N0AC3-xq>30(-eBvDMoqaOZx&PtML_fT3 zr@w;w@n=AjWbqokqn6~)uxB?N#v*hQZxc5(yJ*zH?PaqpRr}8XDG8gEgBAB9`7@NM zbXXQ}&=&$icClvPwLGXU)r0X;hnRyCWKEv-i-wh#Oxb$ZbV+|?9)5C*Wx+ye z#OISmC)cHM30*k%~?|; zQrytME*B8s5lgO)8aR(KD!sQ?=_eXRt9ymRGIjO11W5(oASFT_d=ds4f}R_ z6BCJmOSOT=5%zPfkI&Rr;7Wko-dlOP=VN-W~}?+Q?pEUlr~gJd)`w#jQ)R2-IiuE|--uA)O3vBN4_&HwJHkEl zL_g%rF#O>l-l+g*qAK~jzzY6}5n0EsWsgxyvG5Lgj}i_M5zOyI=6ex0)LjchkKbL4 z7i=qrJo_pp6gpPoJ@uGk5WFCj+S>LYp~o|!)8$5ba4?m@XQ|MgnTsG<`R0)S;;#hh zA8ZD%p^|Z~!yWFVGiKctgo;PH@6r=~ke;%zKqL(HnRRerH`GnwH^M0s<6iZ|sF*Kf z$Mu=QKkuI*t&Ch2Q~N_z4|<)vz3p24h9r`d>bx0xx}x?ykrb+}holA*9Bwq~UB*@;f&l}*$f>AEz6NeS|6)R2aBI;3ocBO7>s7N?-X~je#U!h zBKPlye`oZUF$r%{i9=MS?e#$mZaq~Uk{0s z8FIl4SSLnS=@@c>%q=bT$~(=+IS}o#IcC_fSS6}{>O6b-{*9XQsOVY}35%XuCciQP z%*`Cr9*!)5<42!7xz6hO_GZRKtvxql4(elT<|*lVs{LsNwpUt0gkLR0>)s~`jZ`%6 zr1{U0^seTwAl;az2n17uYn`bSx9b(P z>yXl_rMp}byMOBjl^1oezw4%}=K$`&Oq8<2T{tquj&EJ8qHcyR2H6HS9;e&Sz^p2) zuPN&0m6K>$6FQp(57RHd0Sjzl<5^`i!_~8SEAK#MFY%{ckj&y9yS^OvC;&+sEqsVUpKK;CIY3()7}h3i>t#H2K}oAS}c zI#T;jC{kF{^WdZ+R<-Ufe$Waf{h%crNd)#1NiUaL>zj=wVD>D+ODA9#;Lqs^2d<0( zT~JzUXVJJ^OBBuCi#Hmacz6W!3NIzK;>22Q<5z6T`<_`8?csYxN0o?vCzg4s$ch`0J0qRZ1BNH)PXUw{#SiVBZ~wSO*P_?9B0(~2!ArqP z25i+JV+`*ZJ5!6NEUPL4G6MZV9Px{_KCs+W=9$eb50RV&B3r#B1bR_WmYv}s(1m*Pp+6ZV3<3*E0KMU~Mr(VG(5`w2PQ=XG( zfGJg0-*}ey58Pr3SU%`5vu)+49Q=&H4ZcYCAFr;fzukTElqeUlRg}E%f-9$uG`)D8 z)OB&f6@~c<#xHX1g3L4YY!woEo(>0GXqt(J#@uG|KB@d6Q?&y$;J7Yet=A+Gt3ST$AM$hPxRe;>S8*@teb!}j zsUcuTn>+&TC$lKWhDF#r-TpA1N}^#jSl+4KlD3KVNf_))^Jgh@DITsbCJCQl8Q+pK z6;7B)o^i!Ofd$Z@i6e@@)`6{q42hK*q^0Yb=y!~>H9Esb!X6wS&r^10EuBfC zrAU^&&o3&-hsg@hLC(OFX4fxcR$K=f6T$Gcvr3ERco8pV%+Hkxu=98>LVtf0dB8KD zuhZ%OfNxo-E^}vnz88%h#7q5kDL{V(5pO&z^5$g9^9XvvOxVPdmSh%qH z3gU`_lzcB9H7?N#(?yIDP$JmVJwkAK#kuh=bxenpJuT~@ru$zX^%|6<*(dNnp=p&0 zezubBX%ng*PlLISPl>2W^Dt-$rV*TJSF{=5q1^qrWotzdR}X1+mc;g;#`=>F9^s`=1*lNmo}c) zHxelgC#Un({TmOelg0w53yy-s!zG>_*3iliExI$QC#!RP_owOYE&^|}s8{yiqD3C_Y(gs? zf9~crKI!>WIUTG28QOq{w>jG!8Oz9(v85ecfHlQR@;0CDg^6q)FI!=g3t304`X9 z>0uDIc3qSbOpR=L-mv@#DMnHL9obf&NM?~?!SnNhgW~&@BfOq?D3n}hbMV#fr?>|sM=GDu5DdP|S4;2Tvxc~qF literal 0 HcmV?d00001 diff --git a/asset/img/logo_v2_trans_rect.png b/asset/img/logo_v2_trans_rect.png new file mode 100644 index 0000000000000000000000000000000000000000..d56b6360c8839d2a50ee6d70345c5d787be9c5da GIT binary patch literal 464894 zcmV*?KrO$CP)(X0Qyo@1n>+6?dw5zjJ@f2~)&}*!H9&wY9YOX9( zjnbTejXW|)Qx*zp*n|!TNvbAg*4vkA`Ib;652L?@IygDXsE{{7YK^+8R5j97`gGJq z?*H?&wV7$JdngSAUtRYz4h-%C&4%m#p1N-H3<$gc*Jj6GrJUxzNpEzt*f9{<0WNPk znsNYK?E>S^mdxdr6rkzXG~nX`2p56Tdti9o%c{MO^CzINO;2 z3osSIssI2032;bRa{vGjVE_ORVF9Q=r)dBHAOJ~3K~#9!>|F(1R9P3l!@$sjy>_6O z2neEBpjg=L+PT)+y1KfyuCB4>r>?FYYj-!cAP9;bYj@E-%y<5m_r^B^2&^ce@A`Yr z@ZOsj_x|tcdk$lAlbhV+CO5gsErq6#yC8A<@Zp0YeW--3r$V8yq0d6JdD0dmIaNv9 zag9dfMW3f=yFr^8=VZ^GJx=aP8Ds#HF@0DPh$b5t7}Nupt_EIb0apXru08wNCEqK| z*w~0El}cu4XvjBdi;s`zTU=Zmi={1RjvTC-s|#z`pe`$0rW7kyvR`?F3xP;tlycL zndv?PVLJj`gbcFG3oLvzr-9ztv(G?wIUrCw==y`56rd{Dm1UF1k70!h7U004-#(&4 zhiTxi(Psc{?~=G}PTHL4+$Qu{8DUg} zC`o_b`xe-#;u`^%Ar0hMQ&ZCk)!ZAfcke&&flUrrpdLALWM@+*jAnIexq*G1r9oYm zUc$Kmb~CU`dX8~K;hIH8M%wJywV#cjG>utUS|m&9@QeUz$r3i~;GWGaBqX#co+~SZ zP4Nv-u7TkZ5eq6;uS=Ssv2@@#D-?kR4bZM!8MbrFIu;Qb8AAhEjCQ~Nn%W*%IH;bX zQhECI+jp#2-@)wP2akx&8b~Re&U53PE}lBX;x(Ed>Ceqs5p0Sq46w>XAud*MuEFIY zeX1Z1l8OfD%<+B9$k6aU0jmn_dYc&r>Z3wpa4S4KoH@DHW<-gTeGjFflKGuG&eZYo zKhU4AvJ%)7SrA;tG%!)U`VC>ee*THrA_fIi>z82zS&yzASWHYTfaRT;2Sor}4+7cJ zsnch%4V$(n`Cee7p7lJ~AHPok%QvBSik3l^{(~{@<;z!-8#HalSxi#knmuDOtLIS* zrULVWI9D#6X0BB#nOjr)7666@Dr{wCW!R=g(`?r+pJQ${t7+d^ zl-pn`v7>%@_~sxlu z2z}vTVr=4X=UkoJ;l#-%y0RSY?bym?3vo=5+4@3}i90pUv2raXjH3D-I%(`E)}(QR zo5UK+ehLZm-AA!o9KXr(inwVsoJ~GH;oo7kZ zDaygcEfK&9hT|OH|00TStZUH9BYt#=$*Zt4mY}vFClgMe2hK7df>a`lO+js9h zqg}0JN~SkEl?KXidzYF}+aZ6&5PQVTR4!jKpE)|%O{LSueb3-Zrr#Wbf`a^O)o;#? z($b09yjepwe)KQ@qlr5(Bl}H}Njl0pG&JmkTiqr)0E>%@Qyx9AgXPMZqa=0GJsDET zix}qS=1~Q0$}cIm5q(G}&$%!plIC~`lt>8X+$|40*i72s7({723Nk$KJ{Bcq~B zz7@-TM)j{kp$M#0txkD;*12r)T;}9x|5fd1iVW(2+m))1^AqTV_RmC z={J!hs@HC48Xg{@?PpBnTUWhVL`1|_16oF~OZQ`4>2o?H{Leq8!1-N3W|8UN zXyRHz1VN+cZ(M06Cjbp)k*_RWEeB>kv{&D(Kjw+Jx1@@1I2TeUv0;>(cuG8Bzi zq!C1sIAWEwONj}dEt>`FGhlcgn)toH37Jfg!;ZVvZBjclG>p4H2wvhy}|gL*T2nbz^@W z{vswOR#XHyMXOn-2@h@mQued2LCIP*Yu$-|7Y(kk=+}0yv7UB?%H#fZDH>_=g|GXc zBSj#diSk)+a4>uO_T6N#)GP-w%nWmLvuzI^KGL#D#5*Benp$U>O=bwt;%E#^2LIeg z$0JayL37B>;a`H9eNm9nL$4_7SXKKsUJ5cn!n?`<%fJ@htxE@=h=_=f>r;)4*e|0e zK>N&!W zl9X%%QU{2_KCJrdRxZZZTr$8i2iqi0<5UgzQ33&AQ3Cotva!-27W?zbujdrj5aWa64ojSG` zu8nds70Yzmrg@hR?R3&t)$nM}_* z9S{kvU(_^Tym*DLr_+m?eF;idwvJ~@9gT9ks~ZJbqoEmT`L}`AyP9KXjLlJgUm?DjGsJx&NI=7 zRLreLRXltyc^oshY!(+6XYS}&K}R;*wqp-pN%pzdPggq`{9hHEYfd&cR%sW7AnOe7 zBeTlP--vo?goV}It{D~Q&&3lSrN491~Npw9zJ$L{8J6H#lZeN9&Vsa#j;F0xMJx7CM|f;v{grZ z6wE9#nQPyHBSZ^7f5`4#I$b;kO`5mC(TSvnV3T? zGK$B+EtAJBYbgLk#fl-hji>;io>WXsj7_GXWN~q^+V6Nk_ZropRgRK}F3YvIe=VG? zvtz{Q@t>t-rWeSJ2M+yJXUF0Nv+xllk6G4hg$oyo6u*OIdYw84PPOpAdH~W3WS+j4 zujnMsB{CZ+4_DS?nQFDVv!PPS#J~pFJxR;#l%bT2P(A}$5XBY|5s3#~B5RddSIZnd zYKW+1av9sl_j1O{WCSQ%L&J|&erG3p$YT@bvC6V7qIHXA;&(o<%U5AZ2DAJx7fY9A z>PS;0;*AT6gMa3`vr?}LOZMaRsjpBE$&;wH6HOdMk{n?vbDvUS?`yoJ}k~Di-g$|L=nZqOX+SRIO$uiWf7{#A~7+ zJ$aJq_kdHsSkWSpcpuy!#$~#9)Qmspvz@#5(?m*GnwT$NUUv4x0US@VdYkafzVuv9 zKlK~J-oAU!_vg-)lWp6yh6M!$?Iy4`7w&;`Up;vED36x4(7O~aSRmEOP=t)wkF#aV zmM`E+V6x{~T9~ukxpM(LDJHZLo~@RFLUB>tXKrqeXI(}6SEp4BQhXW+3XQ3WDGQH? z_<=6`Dw*>Nm2<56*v!mK>#xLWq`0`aPx>pVvlrVr)#!(rf&s*5;lc&k-tGU?q2C=B zu3cjKta*30Zr_c#b9UYTJSe51&%avW6cwto+Oez=aHzaxv3kzre-nxuR!6`1N#$+2XbX2&vkDqp2Zy>E#WTYaQ zi52+#`OES&2@^g0rzn~6mhHRP^qKS7n&pdL(uF3`zKQxbpo{m0!A@Ezlw`CWDGsYf z)BmdP>3*n=cFyYnGgcY1>a`o zg-SJ8`Eq60+7*j~%U7&!)uds40PF|peQsX4u!ZimC8_sg2|<*`G`LG?qKHK(4T&0t zSF6>KVP(~X-+p;Y?^7@=Jc5O_6wC-g-us@549 zsR*zMF1FCHF#ZXUViMR_s>$Gl4)8e@LC<9-KFq(j{9_y|yQ$L1NJ`Xc*aG3wV)>gc z0&7kzd>a^SLq52D2M${_Y*5$mQ=CRcZ>2#7=o z&b<}6L25uYd)%Zykmy$3wb#$emdzVa82jsRGrGV?=>@2xssdzs06LS>OcAJ&W9d>Q z{Hxb$gok@!X>Ojctb;3~8MBM7;paw_2=yL`R4?1|&#K<-JNIJ0PacC3FXoRQKed7T zW8>Pt*_w45tw0I?_}7ibFTuj5t*&42WH>Vpn`lF^9_TY|q|$4BD}CFB>s*fJy{eLPBJ-s1jwJxn}^}#Kc%-8W|O> z14P45$V>x7HxafSyY{InlrQ^BlSU1uiAGkOM=;lMo}zji1l&}7Hv2`1_ z<~x02KXar3AlBQA*kiNzAA;EJtKQ7dKcIJM+mh>}qM|!hb@ycFy$*#pYtxC195#SD zTEk|~Tf{c6TMmGkh_a4}i7}G#>fEe%|DodGa8RM_^YSJ0q^E=tRdYgTZQZz<{W)(@ znI})5@${m^idNF^dca|vzgRgGt$0BlobM;P=7KrXp>;jkv~?#tvVR-WGO%CAPG&nc zuYsHifnP-w#HMYB9$@)w*7S*N(6BMAX%o)_p93;HzdByscKNDxtZS$CY{g&mQv6MU zf(252eHsHOZ>FMA_Qa{PDgqhGVMlNlXw`%+g35{yYyCJ_LeMZqg_KFJexvK z23$eE>7n-sKK1K*D5Nsg@>OeNL462NJ65gT*m65j9|AX*Gw68FU0c^__(U)@%{O#V zUjh@a1n5B&ms8Vxq@Z9~SrL*i31HRecjtv`51Bo8(Of743+Mj9`Th z#?;B^4=XDx)}Wq8vL}-42CACsDkV54I5;?z`pi_^_x?RsVv1ryQU6S5E>fF920&g zrRXd2=l_8PhlJ=)$dCMq0GAffLDO#7pw1xVf&GtNp3FH>To%5>yF(>dRHS2 zl=3*$za{=@1uZo}rxUt+Oi(;8Nh zC`s;IIS-a~sOkyR1`W)h^hyKTpl)q`PgpggV`A((_w2|1TKFe4$iwJddcJ<3LeSR! zUcQCQ#p^C$KJ z&@{L;Qt%VL6#xu&bB88&gPT__HX}-9EiR_kYc)u&EJE@n*y?F1CrSZi>tkbM+LN-K z00eqBdiHwswT!)sJIiiuCDu&;s9+?#TdK6nxMD?%=z~lPr0zfc%+{<}3^w`dLr{>u z^`GhAI2AK8nqK^8VnK__IacG>@T_0woqPReIWdU&^W{77*TUJg;e;PPq(8gt?e+BS zyZ4^Rg?jA34#*A*)5!)ISG`&lE>jU@Z3d04M(svy@Q5*o-o1OrAfG`db9ATxvqU7x zD5k#*9f04xre~fX9v(ip-{28!;hY)l(2?ViFLToGIDvCOIUgFNCXMPxR&{S+8bTBe z+8_BUqziJ69U$zYWRB^7HV|6D(Bju-!7~+SH75*ML+}GW}U5Hc+$60f8#I*=g#% zQu@ao?8~PaWCG9@Q^zlYitl^wI4DHUmoHzj8~#YS9_dldwX#=4M5LPssqDuO?95lk zvjywcxjg_@IK6zNf{a+Re7Vx6U8>hZ!7z6E*gob|wKhY}2&m{|#|&pbwr=4!XxOh# zV0U;10!uW)nvNdWF&JsGK;0qW<6Ru9)B;IhMT!(+`*v)E%wkG19!wax<#zn{*Z=-Z z^)o_w5h)>tNvTw@jcb;%u<&p_1L#MQ)P&eS{iZE!am5l0-l;M2@=x26Hl&fhQDNK- z5IU{m^hv2`-{tDwV2zlU5y^{{8nMyL9%LXhG-77(L@4=ZcOCT;1xkIWwmK zNbl%43}r#ohxVJc>}1nt&0`(fwT4-yCRjWvB(KYrDV^s(YL}B}G9K#Gy)QdLQ&J$xt)Jl}o2X+jQt|(V$5iZc7z}`u6B( zSn#i1M)A`4Ymlr42o#yT!Tp$R43Pvu?I`v(m?su<;s?3j~+kOp;{0dh+QTcd|=$P2p)_TYG9^JovBYk4<=A>o) z0G&VPs_&Vcq9#OxZb?+eFS+-Jah3X@GEJt70avcEYd3G%+bbdTMoVj{8;h&3h=!LVG3O9KEwqvY8GP+Dh5L=0SxQsj0ry;!NI}NV#Sk0 zbnoDizQc}mq^9QkHa{CsV@@n7> zre}LIbgx;BNdX20(1(;DI&YP)UqF(_5`q5c|uma(tG42=v| zL5r$gzZv@w6s*Dxp$ZeK2MLr64r#4XEk1#;!CM454s`FuL_znF{NW<_#*Bp- z7D)T-=yNrF_7n`7XX$%&mQXWbJbm52OW4uLzR7k#?Y z-$UrT7k#>m{y6#@M$;{{Zv%Y?dl)3x`g+s88u+d7cV+r}82vqzK1D~WCGIKQYnNcS z#50b7y^Z!Q6@nwD3Fr3|t~n4UFZ#ZXz9Xq~C|$#j{vHc0lm5Q(1wdv4EQk>{;9j%^ zj2u3&2wZ&#&qn;-!&{fx)xhhldD|{3u|zffP9^kzV%x~r2~#!2OFL>x*;R_5EgIj8 zm2%KLd-hy2VbU~yZ0Yh<8d$#tpWvTGZS8S>w0J&Z#nKU6xW~FyKX%m=DOo{t=k7ht z;Nib&aL<*i*J~F2wOq4d;}%VWCapCDa7`hb^8DECJ9jmOO4#vdpSxf&p4TiSB!nNQ z>z$#AqH(QR5Bm#A?q%GmTc3pA-@ePQSJkb)1{59FSpUyvI_98h+`Jur*Rybm3jF${ zvE%Q1#pvDfj2A9m!ryrZ4jsw=4i694Or1W9pWCDN0N!_auYCs&^ZvyB=$SNEu3qEk z+mv;}-|&^*!1Llh>;Kt;-;EK@4aEEWF>5YAANT(fWDNe+d_~G=$F?xti|##z`Y{gg zBJ`!kw!E{5nP_nnj_pm7T~?`FNyjFO5;dqS1~t27izY0<+l!&DH4~iCG>eYt``ZZ3 z9_g75l4eUM%&04uPEXC9D`$7?dvH5|37NFnxJlE6v>P3Oba3?7BA&Q zwNNZQC#?B212MxQlQ1aq?{}_UVznDIPq2HKnlgpN)qecYF6Qlf8C0kh63f7c`rCxx z*`2%hZ6^Nq3!d>>`z}A>`1L*e4l_9QNwna?oY&DkY{8sAc;7+3tLEx52s8h>|M_>c zZ)5W|o$&jxts7R70(IH+!NbR8h7In|uKJ!nGUC^9_}%ZqV}PQ%uUNf--Mn%UqD+A= z0Wx~FZjulvZR85E$6S9*9fx;|fk`OtW5qwdL0*I58rVn@WOZx1=?nS@^@+qqnz!l9 zJ+}x7ukJ$%x%~+>(}+TS*1oj6-*rZPI9nOLR?KySK9Z`SbDb&6_o3hYlat zQnI}}*27WDZD4I%wGg9I%OCeT&8AM9%?1n`CADIYr1x=n^yH~FiUM(Jv;UaPm*+tK z47_$jd+gwz&Ft-)cUo<0@6L_P+S;nls9}TH?!EhYeE*A=uMmG0N?^Woc;8mGa?J*Q z{))fmv)(oc(BJ51m(bAAM<);O zVIzN=C@y$O*Ji9z=|tG%%$b7|daNd=2~Y+EM;~CKa=0*oVuvM3$>;^DA=*@5n-l?r zj##+(Z_Fe!QMI?TE2l&KcJDpN#N+AFqN1Xw+uD}kk*E+p5f)Uels((Lbtfm)Fl7}k zln^@^L4dL;%<-RIdbG+Yc_1g`iDcvg-dNEUz4CvTsV5-G$VN` z=iz-sg1&Qh&s9&DwU^g?Ocjf_h`swPoMNf65G6b{YGc(TQqGX5}ObG2aQY$U@W0t zLo}ZMrs(xaGFTSLRSW(b70@XPvfL|$STg_-6UI^^bN5bas(6Iq@Y&U&+B5VcP z64;Dj?0rT1n+p_as^GT5fKS7k0Qx&XxNkf7iD{cj$3_d9tb?FoLW`a!SwU5lJ`e)+ zr_lMM>0D@zGwHjN_{^YIlGRExp%p_r6sXZ~mJskKMl$4whN*W=m9TEXgT7nS_dmsF zNJn;Q_`kna#I7PLEJnTFzv)L~9h`0E+=U^Vx9sF4CH4K6IPdtOoy^+GN?YDgk=zXo z43x2smEDpghq%yzU7J|mym?FnRehYDQ}xN_=4SjnVihWXZ!ho^xiCZ)Z8WC&+jZ*k z?9t<=+G-_O2}ac1uZ+E`lbM;RJ^|vmfJ6Pf*P*Ed{Bh#g8zg7lCiT5$+t$sKVw*9r zm9=W$jmtU0zKw`K6Rp5tH&#~Ja>_%MbsOx1f!A*_sqvivc87?L6M!ULodybxu?H)^ zc=|At0xVgO2|znDa@fEtD!xKT7ihRacz6UfIMI*zaQv7NIvM)rF8C`+W3Sw@1Qi3w zelayM(aKrSB58bU9Y1-R>6v~2Fj)PS_ip%#ktw>SkQC7DaN*RU7;sg6pdoaHG&nKV zI?lCE1M{I2Dj)ZJJ3Dk@(_7D$x~;;ffsCV-oA|$-HxBqE)O_XcK6ha!sK?MN=}Y!<+26b zYEH)+2=P#YUFEe#tZ$i6<66ml&K}j~wvb!akjD&_N{zjXo3>7ASa`VdX2698F#iw+ zVj-vBfAEmC`LP?)oJ-dn@P^8B#fufyCU!}VU5?0=Bc~`|g~1+z8&T8NMiO^r-n_K{XF|hR|L{W|UMgD9 z9@R;(M-H%|1N*YW`?sA!uDYar)v3yUO;pL`hW~k1x|A(TSU3=`Pt|zFpTQ%>aFR>k zyI|3&NX?8B(iZiQ$1zj4r45?4)mb#Mf7fPiR2Qh2){P{BD_rA)~Q2VXDcf! z_vC^hQUx+ZTF|E0u==lAm(KBgr%H+SpNHKfWJuMV!*e+n1uNF!JVv0s}9;oWMuaVj|gWg{#w91+-tDdxVYT3`)z8*^1p)24Z(dXm5~eb zav>QSvNp%Y#y+BHfPng`LS{msFAB+r(U31SPOX-!_+~OHMid|xiSk4XKPi05K;JWu z=fti-n@Co$CwDoYZ_++Y$CWaDBVFu5A-BFBC=qW8g-GGIyw1`_3GZ4_3zUI z0;4k~!KpLn{fCVl%SMeD#M-uMZZ6lr%v4k?u!3`q@-&`22oWOC;)SzWU(zTQLaHeJ z2CWkdZGN9L7JrsYY0al14FF?r-@en-Z_8*Dk|DjhON0 zg4rupt!Hm#DBw9pr-fLT8MTn)Ln+zx6bp zozo3u)Fw7;-fqIHS8qOLHxV@ut{i}}9X+sv<;t03U(ddS8n0iq6mdr~%glIyX&vDL z(TLO=zhpB60f>mifDJWAj_fI7DAfhL1W-&ouxoP+Vu+HlnK21<<9<#oE~(e36}xr& zZetP}ea>C&gYD zGS&&p{uJ2MSb^TLTOaoRLy(J$lcVYMS@RZoLP{QOhmNKDT*#?2Rp z_ijV3wPLAVA(iG*guG6*Mx(gkb!f@*zve^5Rq5Hx^a01^H;`l`ZGo(Y?9#tYn2H66 zXXGLO`fL&!Kk7dThSwNTywN*VrEeQUB0m_}bLGlmF64VlRa1QC!@`{5OAlf1UbiXo zyC$iPhz<3H{+uy|VG)X3-6mLh%}yNJh4j$!(z&mvP0p*~(P%KnKosnyp;?LLFEyJs zc`R$#pf3I_%@WcSr0JfDbetW?j&`v)?}LZDSOzj)S9G*z zdGq9kU2GB-Cx4FFN$~|=$WUOfaY@MpUZ>7R4gYmK{~N0C!`lHVmM@gsXO4$L5$jZ? zmJYzWcj>?e^y|e-O-dqV(lx83BBNgV{rmU#$~jiGF*i5oE+?2e!0&0+m}HgewpmFI zLtRaT%_H}(=sH4h;@J}iz+vpZu0nnGq7(@+jL<6)M9>7$pZerVj-} z#zw^DO92K$YM|da_>s-O#&ak#x)X?0KO}X!2udT16fJ>udLf!aRt7$gMLzUs(4q(e zNTqVvg;R&%d;V%ZWP^ zcRB#;-J>&W)2bPgS_FR0XUY^H153TEnjVeW<0sEhEx5DnhDs4& z#vEXX-_tN1fYqt(#`^r!9SLg}er+?6B9nEJp@D%xYz5~UOp@@HcT%$^o^1S>Uyw<$ zvTRFBvhU2yOijaW$~y5_KWX1J^sK|CPWWvZ$-jLvqVE)$aW;}n7KKH_V&MU?v*7pi z_x2LAZ_5h7NBOIMczDF2nspj$WBo)ea`@1nS;uy*M^JzLnNiQE$gCX)vR}GF6=wFa zkh-{1iYFH~Fi;=?$l>pusv%mrNAH0JuLNF~t}5cOe0z6nK-FXCloon?mmrgvH{N#c z(Ld+STer19!wiLopmC%6Z1T8Yze}nnP_O)!78cJ6+uAb|V`H6(2nFiG>BHDxfcoZn zMnA7XX6;B&D57S$)~{N!Y}%BuFmb5F)CcI$eftkH$Zm15aWHc<{Eh%-2>aLG{fC~} z+PNeG7(|Ld-!s^6loB`w7)vbmdevJG6HzqE%7pczb4(Qx#coHn$^yZ9;Jh1W4)&y8zqV znNyj&TXi*k&z4oeCcJA2+V1x3H;4rUT+;!UNWGB0>(tRbnL2t!kwpgpM#rdyie9S* zCl(SKDt#XvN{z`gYWUz7fl_DskfM4<4?A8_W|u1iKM_~Q@j}4ws93$WA@BAQNC%ANd~Sb z0cknPCBiMGPuWB{2H#P}rIK?+o~aqRJZRv4q}>N-3;j}qClu&%Cm`)dn#{Hxd$P;^ zSD9G2RBy$$c7X>nj{m)69{jo`>Cbyv%>eyPflNXn8d{i}@9#Ze7(0IA6fd7B(MCCS zkPafKL}+LjYuBbZuS#5{vNLKG+$2DPy{={nQ48Yw#AM^&g+NPO8~NLcq8>Wk*WFm9 zD(`>gD%-YeA6v0%9m{V0F{nfWEdE^LM8G8I(y1MnDPv<}OVT~>Wz{kH=0K(gwp_Hm z0f0O_Tkz#wXnMIk5>Yv^0etvP&RjWI>*h_EqoX}@akXzBWo9JxOj`?f5Bmn1bs8sHJ9~5LdcEU7v z;?x;tl)zFy1rm|fGM0F?we%du^j6VJ0R`&FtN6NA5Q0RU~OD^?j$Z+QFqvoYhRu=nq|gZ`5%;#1o!EG*c_;R9I{&w5DlfL(}Ag{&9( zJvjHjYmj|{(m`-oLY@_1}ru%mO0p$XLV}3vzpbbvQi~&7}8?J#>Q?T z5F!!V^Y68Of#N#@6>MOQ2~^u)WF7U}M0VtuSCZ!^-8476BtWgy)ZdkB<{9AK1DZU|Kadt@Hx)&1@ zTd+#adfH>j#cW9d1uzZl*Nb)U+L2Q^0Wc@%*k1a?3T(tf>jN|=ZH4H35Bl_=bBo|w zK|vvG;gV%+$F6<+I#T~tRx$_2!aouYm9zZG_>_(s5GMuYib#p?B{xeJ!? zwV9s^QbZ(d&u$%A*Us%(!2|v8kx_8@IBVe=d}+>d|3=pb{1q z=4|A!fvitOEeUI%Kwuv|ofML- z+jom>T1TrD-(~ZLmCUw8aUXi8YFSNY%ZiJ8dq+k_E_JD1S0@jbbU+}WpE$gmSzB2_ zrfQyrD`b#;0gVx?5%rl6 z+m#f!e#o1LgNs0zr3OJN%Mmr3Ozd>DlWQ$)X=eRZOO~`* zW^HZVM+VvF$zHK7+je0OA3sSXcZG(AGQW!_SvE_{Z?YP&@cv6*y?WiFxB+e;{)<_HIyl_UsRm#Cs-J_aT^lUbAM~1b75>)UGlJK`cjlahWj1c! zu0zem{y2O505dZ;EtZxNf!{62#LPW+?%mt;W2c{BN!MW$uyNhGdJ!FM{yjOIr4z55 zV^wZz6R8@qg+pxU+q)a<-J|P9qUs%FkbSx%7yoa`ihirsZb&41_3GA%_3zvB4$a(h z-)mxGfrYN!x_wXk>9gkQCMG6&UJGZWj6q2#T$skJ%u-p9ykF>=CT>T_(K4*`@ zWKokk?z^w{EA&;~Y}qVdmMH6-hWkq$+>cKIAuv1iy=8)RUo0ARO0o3={?u$t9f+4fDV zH_8A@Q`=RtWbtel&m56bv`A32@)fJ`!m1fnanB&507h*}@1KX+zIy#y2VlK=bYgR7 z{f-QX9c0|3iFINNRT&wXpEOlnklS?JK)+hp+hJm}La8 zr!v6Om7+xxuPi{ylaAJj%tTZF_|u+1SpS;?nGj9!3bH}M!V3dlbRDaA&U+nHQ>PS? zp^@%DdtRh)A?G9gmDzE(x#uSv<=XZ*P!k66$iLMZ`EdDWL2@J(b$ zd@-Q;x!0_|q;R2vTA+c8G-=rZHngu&3i+$ZWP<7(g|fv``C!N9wX8_tg0dz5D{&D= z7q>i$ghI8E)c>Y%M_s;n@-@k4d9ySn6JGFxeI;EvtfGS*D_W$`R2g7j$GoA@X!2eU zIM0{=i5e%quUWq-4~KKt>mJqJWKsf><^QC{;q%V-A4317alX8-E- zo2Z7(+Ual=sf_rzz-9^mX4hW*F?LQ_f|7xXz5fst zTeo3LeJb{Xs91h^s51veQyLg(>|NY+LW7_Ls8q)3iVK4;@$l64Ko*mlEcWl*2r5=g z9^TB;)ba7zJZja{Q37guG{zV5rUGc&l3u#$!+JSk8h|20|I&va}v zl$0}uVzfjMxDxRC&0Ep~RQuDD%cUzN6PL50T(d~Uu*&G4HGku4WqD{bUqcn((IW>l zX}&gBw+1Xd9q8%KE|p5pf`E z1DUw^boj`z5|$sY96Ycur_SLbUUoA@I)lvDv9i09 zv9U_4tzZ#@nVFev7t7=gYXBT1nr3u#j4HtA)N5;N>(6$crz^V*3k!D=lk@U?S`m>* zP1#5u!pz@@>o_8{sU#eT`Cqx3Cq32#q$kL7{nUSm&W;ObQ0kE#k%ur#v;eQ8dp-h# z6t_V`N8@X~%mgxD6n7VmuUPMAZIvzZd(Byq6+o?! z9=fd2MC0tweS3+!lwg_Tr~HBMoihU^>$-W{PMtii*|J$OnN?=J77-D#42yd>%7|sg z#Kgd6wkR`zY^jM*00I1*7lV(F?c3tuJwkmt zL`Fv9A=Cm-M-4}xtk$uRIrJ43K@LHQXq1J{M;qSjLP{Y^q92zw3``!{UO?f_Le$-_ zZR=)i#p(^PmvLq8)vGtE3BVl`xXp{G(gb8K zm7Ex&8|ZH&3=S3F@5$3=;Ua57D_*SVYoa81#rI6bcyB9SPmiTIyE_OSz=hZinX;H$2dG5E?i&>J71CMGCWRn^rFYh#NNlkr^2pg5;-4aj~|}#=MT~Q3}`AG-=g= zJ$v?oA=}X8@xSuVeFqM+-^Nd6qsLCMx_kW+a(!u6zYBfV^T45_%g0Tc&aXR)09m4V zF?J>J2Ae&1A*yt@f^bMjo-b0&yUgU)C61& z8uT3)eAEq2Mz-|dQz7pqvMHfGQanssxmtg`L* zyL^TDo<9zj{Aj|InMInn>5ShYua;M(svfLy!+M+&wxIojJH%XipW!3Nv3QMUoA`HV zNEmx~$A3v#$Ey9#9N)*QJ-gR$#tfB8ZahZ2fB(T?1x)tMLAVeqrlZE@5R#+cF0ix9VJcpyz{FU}kFC7#R>j zwLP1)WdS~?LckV3LsBs$P-B4(DDf!A%I-7b)atIu8^9P#i}*m?qd!gHX6EK*+>dE! z$je_ZphF8K6l~n2-)BzVv+odB{6>zMsH|6~R&Vi~WI-nUINyMwze=(bYyMYZe!c%*tTukw%uXJwr$(CZQDsF9ozovJ^1!MtD`ll zMpdnKV_x%7%RCyo90n0^`LO~@JgLOPqo&*m57FoL`*g(qpuP<2{)23V`wI2&BVlxufACTWAkL9(Q5Lb&DNk&GDjw$ zVnH!BhaC17DU$^5d-y6#y{XM%uLSIuEpSD*uj0}u{5oKC0x}NQ(yCYxSJ+67`ac$+ zChix{1n@HxkAFbotX4enc(A$i-+y+QI~YKkaMrlMmMJ#NLDS5-iS{agE{CmraAmaN z{Dk7?+%9*^e%)Po90O>MhX9IaWgc?!R6L&cAUr$;ZW2O+Udvrixg?c6$AZj`T{%1md@CGVX&c?)s zd_|*cE^A_t;jq)rEL~m{+&_j@2v!N8jPEbtvF~t65@%w6@fjgni`xeDg(npaeN|pR z*%8vJKwg*5%EYB8%BMFB8%Kl~m=8As?-G>Y8LSP(Ty4)38PL!FshyXWqEhVf1@z5C z@e!cF?4?TqObwgBkY0e+#>aRud7nkK)GcxG;i&W6iyQ+cq{-&$=#9DuRj+G$h6d9_ z>%6Gouk_C}G61iSGgn0lSP-LuJ7 zDqxZz)E)C|Va^$F41WOZ@dE;d^ zbH5?|wC3DzcAo^_Qh(^QW@8D~2R5$B`hfI1Lx8Zlk8V=bcf1e{tA6yGLuVc2r329$ z%~0p9OVYp-xyu!X-d#629Ja78Zwaq%MfF>j#-2w4jaLCNQ>x_{f7oe(ed-%U5G)WD zk(=GFxq4%Kcm(sKjC4*nQ>X@w=a))X+l_lR+ub~syR1M)j%eI3SPkuY`|a+bU({Vu zRY9A+=h#KWMTFdNC3QbK-L}UKW;Cm%ulj&cP9q=&zz9GI@|&BC-X-Pyj%Jc{BzAp) zy@*Ug6#Z0%JzOmOl{1*f!I-__aT0%01XEbOB}A_Pp(i0F6ljA?Ft@i)0UTF6nN-SH z?rmC$*L1e;_>E6nGf?{IaCQy4ROA=0?|XTXdHJtCOX8MBHe z4@YNBxj?V$5ldL=Lq!k5Lxbx(Hffr?4S*cRJLA!F{;1i2E|>E*k-7uy7J*eQzdSlk zyUY1%np`$FYDeFCz)lvSNDoO33q`pAa5N;+^s5iZ&|ZaAIBzbKSFhWzeAAJU(FQd? zhGmwhv)`gfaF11l3{)yx6ezePKk(!jPajWh!{;L-!ks5oEf;nwA`^va^qE5~G^zVO zm<-|bh-?kWWC64W#PMX71VTSf*`Tf8O_4S-37JBSH=N{~4hge_+n~N7a9nLQXAFEeg zfKcS`di5DxgZTEy$uF;u-_?2}=hG$PdYFCAV-cRZ+m!982#foy&gDm`sCq6JlVY;? z!Q5C|C|N6{7NRRQ#&W-v%yE|c0Dzzi8ON}?OZ^&n<}mEvtG{EO&v?TCQZnwN)M%lW zJo>u{DcpbaQu1!v}(l zDKchdyYlbGV5x78b~smBr2)xTPmgcFe%z!}?$ZUYTu}X-1#z=-eRr{B=W>ZMpsoL1 z+@N2lT7$6VeoOg2ppV7r^(gh>Mz>K%0)EFx>{Jp zE2*9Hi3Zse%iR-_Y&eh<%tt@2`9@&}OUC#h{(yqJOBVnF)b{y)iRYO`Uc;7|Y8Jga z+X}EU?m)|;0vqBC1My{?L2{3VAaSb;zyrl1z`$tl)w;skOtd`v3X69GZ>=3iQ6R<> z>VGu;sPUiO|C^bS-bxL2%*(kZNFKg9JavZwOzzA5iDoQ=rKx z!CCY|1C&NxN5@+#&(wL=#{}#g27OTW&Y>9GRh_g!hj@Zk7GT;Mgm=+~uX6A_wDH@$ zeqRA56_%#cX3lX3+r9S8Id8sH=ya!N2vDx_$o9?=LZMstw_hESw_cv4&TuRj0>_qw ziZ1ehn?z;uNLpr%4!9^_bRuIQcE4E6r2KoJKR{w2Rx~FOQl!C)Hd0Pm(_0yzl_shi z*yfv_dFDemptuI-r>9*|)`O5DtJscpG#&jPHZ*#@v2#rE0#To`Z1z4p!J`|T#k~Hh zE(nF0*`$Evsl0LmZQ(h^xHjVf0NUl!lsZkhGu@WwRzP(tbc_v4fZq&3lFZ%%xL_1Ee@Z3BnnO*fGC;nu*NG1-|hR+&TqNYaB?z-L?l?dKV7c;Yh`tN zIW#G&gPo~_cjjD6XaQGz1AFF7eAsvDjP2tVNGr5AHviJ_h%KsG9=FfVE$C+ugd()} zviOo=EayBxU?K5QW(2a(Aob|O;xk(`mr!4Dpg-Sz=EZPXbYphK7i5-Lk!mN zFJkcP8yUiaGM6AJxi_xp0aWof#DTOTPRLg|O~{MWV2>k#W!~UTF6>PcalnI48%iyr zmaLSYUqWNdoI&?8)3C)ijtC&E=0II!5x;r|1}*DF>t1K2|{1}5e`QZ1!@8o5w}jQ)14Yp z(r&$~2Gl`Gq349<@qI;d8Ihb6+!DQqnTDNi0mjG81)L+&6v03T4!j~YopO%$UlwzD z4_+JdT&H96@kqYi5_!O!Yq)D8dmicy`Ly4oY-0+Up$wmbD69yeIN z^#XBYgGOZ1Y(#n=H;yyQ;|8pm0_T{?iFpGDa1=IEJ%`Rq(uF#PlYXDfmN*BrTyQkG z$gk`a0n%ODt!Vqs=N#`m)62u01C%%f1YmjA#lya)78;>^evUy|Bt{z6%lY))dFe{I zI&C-q+{iR*l3YvTDFs>LPuf>1IiV2*IEywGL!8$O`(866)77RhM!|O5Bfd4y6(`{5 zFr8N~fZTmWU_b1Z8QB4ONiNZlL8SX2i_t`u0%1umEHC6cCKts%eLxgl?W^h8L3aqT zK+t6-2T&3p6G<%J*xom9L~Q%&@wA%oaMbA$Q;MGL=JNSfkoa+F9AT8q)8lR3CN8Oy zW|4eRFa|1fD<9Xl>d2*L%dYnMlQu;`vFn1FM^#?KCj;U=`cyI105WAC>x3ru0ONg` zu(Up_JxvA2{?q+t@={7`WU9cknsLvzc2y5l>)+ z5J1GHiW!{0Gdk20HJcDrc#75JwCL=8&IiZ&)tv@f`y4OcyBO0J&VaxY3ay0w-eti3 zj_OVXGgRuq1mT5_^BGR*;s0R`#R>Jsjs{nKJeguH@$9gsJuV_F;)GwP3;P0tpF%#Q zIY9?O82qvDH&|#obtdpb=I`P1Mh8U@D9G1rcTwLOl=^Mbjg>!A z82DRU?%#jmN`LQmh{@?wuXbB=RT_(To4nRy!C$K=4`f&H5qRwr68WPe%vbWx&-g3-rcvI}rY zk4kT(c1K_$r-___)>z~Tc~odZL%BsEH$&q@{3xKNR@FBK>)HKlja&gK&+F z$OBYg=e>SmXo_lCmVsq64eq4|nn#SsDIVx!8akFL1hX2cEf_cKotkjkd4WI3`*PQD zUr0N+n!4F@S@`E#b z|Eg8%)8dQoDfSn)l@!C=lw(-^1w;sgs?(z`LN`7d{cBLW#nPITLU$q)9*gi!Sf%%H zEK%$k{Zdut=f%P;afu%ehn-ss^zUpNzgiY#Y&uXc(K8}5Xi>p zTPXt!F^?^dB4C07AV_H$+U<1KpfLyLjp4i4@0uB=ViDy62(sS4m+^pTsugtM5+C}I z5!nSq1VQ7-@-w8(c$9V%puBiQH$c3(iLgp8^zQiaqP~08{*m zBciFs8o+dp;PfbqB;yhPx%_XKn-H|L@&U_ha6UYcm^R8{?Q5>NkkG)k z1C=tHfggTI5!g!6)zvMLzy;@IR|3Xk$vMU3Ra6^xp%heb&?vqMY+G6gX;%mM?R=At zggDFqEZPM4g4D{PzGc)2!)tIhw^!~~*sn{Pdg_$y^{*`7%h?>SYLz%&>2d3nUwG-N zJ~gL`z`Tp9`KC-K4DaP&u04Ic=33Ea5a1Ew256s(ayWA}$e5O}OT%M2qGBWEk?1tj z&o}Gi#Ka^G{XBbs$)4!IAN_JeBHBn_Ycn&oQK$V-A^S9Q94b55nOl<86u+f100{L9vwv@ z`@pk-tylavFeDLC7#)BL2zdqt2ZiPtr!B~%U%gEPDp14uQmIxFnhEL^xsj;PHc&%m z=9)YcR^Kj8PxQ^bs+ebJRSzJLgTVO>O*&XwdPsA!|CwywsHTk(Sj`#?C4Z*_-y=h9 z%ypMkA}8^G6rvJ}cnhqmc6pF&Fn8^UT+!@b=}(i?C(dNPoJ?DJXL8z&&G~SudAOf9 z%K<==5@N$Q`NkVHH9$DkHX%E*9VRdQba%+pScQ9uY1zDu4p~?=Q_77=bPxPqqQ%nh z+J%xk#-7jE)2;SKvABfuO*g5e$@_MTU)GtyLpp5Bl$>D)q?)N~`SR^Xo%mJBy;BmKaqydS3 z0cciDKR#Za-*dbiwPK>zf{&o~(P6?zU=7nqf1p@=ShkwYc#_CjZC9$9Y!+IZPzHT| zqrrVk4;I{K?rG7IGAXp=$bxCd{^I(DaJA!E{5OspO%Br5Sbia3$ae&Cc~u=#o?vlv zdN^h6Ovz5x-k_ceZ5NP!UW2~M5I8}^2YI5xkTQV{F2} z*6MLVG8*D8vCL9EaYv&sUT=2$W94tRosL`&M?`GV#ZSJWQ!=$rOAO`8crMn<1|Qwgr>-@_U$cDuOjin+y_gs2D@x?fGNa>Xzl%D z5jr8r;w`9i3$lBm6QbqycFQt}qj-^aGVc|hl5r}6q znbaCt_5>!~NW-+^<(-DsR{9isLa(3iFBlLRL{L!B(lmduqYVIo)O(6*$n(b(aVlZQ zllLk&n)qA-!PcTgIyKoRBSQiM*0uc7-l$x4aPJqDb#!2RQR;9E8Q16-!lmg*6sDXL zuL@n#0_YRmBM*%n1(}-7h@@1_#l-S5DZ~ZXe{o2eXrf4y)9?n~xeDH4Y(V_t4~N~3 zQGh6wGGm0VB(RHA3=@X}I<=<%kxNzV*(7~P7)zJ$Uv-bP+%GZfR7)vUxs2ed1E9HclV~}bCg{zVa>@Fl7`0>MEd`CTa{}mqwZB4#N-G`-- zdHgxU`J{y*JHF_`9mp;lE{uWsAj|!FSAyc@S1*Zxj&fDhVwV}3brHa)z$d^={F{-5 z<#?k7fMu6@K0JRN<>%+~l4?$>(tT+!0Q#wGUiSeBn$sXT1nhN4X`P85ViU7)*=GX_ ztUE9G`+Hn~7S}BJ-PNY)Ol8!LD8D5Mz#C*1n>hm7R=c@>+&~{h4)|_{FaOMz$9#H6 zn<$yvQKL-?O$v2)a8F%8&N;7lTk$vCsHYs?Zh%OD1;AWIz=Lc8$)ShZ+cZdlFRN;Z zS;os_kq(y&)kZ5Jf_$%w)JlL`%jR;Ma(y5=6fN-Li5~KRQfX*uqd{e5Rl~l;VknA* ze=>ol6yv2f4{CEZYoyB8?~pBlHR>7wNXVbWXbe&j3OS%Df?p{2qc!#_@&mzGOkg;T zkZlY@HN_9`nDr5$r4Na5cinP7(IpI~C8XP{cz+-Id<8aAc`z zp9STBQq?V<+h*xov?;<F%<~JIop(>s19>p0aG}2z)A#mF%xM->5T_Gjp$4y zz-HBOrsHoaDt0S!avb>cX<_1`EiN|lLLVr5dYli_tVCX-8 zyCRPAeJ2zM<}SlMiSA-p(eRBlh9F){a(J4z%khS!?QgOxNXz(Li&)}dimYbiXt>5^*Wd82 z-k)bM@@(;#G{|a0o3qaPVT$_Z^O#zQ=>gRV{LhfOJ?eGNFTKj=WSf1-VlbGdU2S&# zv9ebGCZq|6Ac-OPT`pJ09s%4icas*Fj;04#*MT3xSpB$>jJhhqu)CPmP=0*;^U4k% zS38Q5Q%q=qr&Mh=*FRKrf<&!72>?%?Pg`-kM)a7Ok$FB&R@edhl;%B$C-F|Q{A!<$ zZpzNYo7oRYB7OPMZMp)y7ChYhC=@DyoFeB_Ah^J!8Ao zjOtpx1vQE*9M*H+BDRA^0d85 z9SEy-tLR!|3XQ9J<2)Vtz2!h{<}X_M=hACKfa3RNBvt+N8xeEk zY^1wtL|Uq>Ho#VOzp=IP9(ZMDasYVGR3By`UdAxX-}uGH4}Y}VhruT90#rVa&c{^E zTK>uKvBsc|eJbq+^52mn(ZZsDYSIaE5LoQr znXK0RqcQjazgOeixRE+;_LPw|$Q@pKPBtV=gC_PN3qXph@$z?dX)r z0Yv%yMGzX>(!l?0wK5q3!aP(wG!-T!AS9uH z$m{bFo0tOozHPAP?(_~7pUQs_=!f6qaRO`*03vs5{^{19i64xpovK+E4;8N#{Pvc` zn}F`d<*Y?pIQ9i0on?oh1O3vn?(MB;2Ur^}S){Pw&MRjmQ*e=}Rg{6nbvcX6WtFrt(K`@xYAI0zsMT1%I(fCMP20HJ4?7WoR- zEbHhb?TRxLmgS&Olr~$bDBTfzJ-lJ7(eLv0s$%i{Rb20 z`2^@rKOM@$j{tm|xA>7fKvsErdB}}d(E_*_$%fJEoA|f07rGIUpLH@igq@)wQstA< z3{Fag+l+NGznyktn?iq9Pdg;sMYrAweCU%-H(x0u=DlK(+K9l??gnryMOldY^FV)rQ z49m~-f@Cfg2uYXRZSwICH>TQ>lSD!CGo1hohy0Fr z%@Jew?CHSXJIeR>Os7_pwq7cvYOz~^vzA3djC|{kdBrZNu3Pp?cZtt6##i7y2DV=^ zpDhE>WJzsp3Y@Nc%SR@(Od{O)%=HW{maAC*0wKHWNC|$YQI~@?w%b+(Ag;lhYkqC_ zVJsY)RZTPXPISB9Mvu|*JD+P(>o-H0I}@0DtB&y#lhrs>W)8+ev-xl?zRjjTVA5%K z2MTMwGm|uATpCmlwmK|jcQ&xv*_nZ(Hv`@H5|Xh&n>raoNKo^6@pO3?jmi}q)2w0f z9u$$d8a=^F@z|(WO;<+4_rsRZwMy?tE}>$)*HI}bNAdP_pZZ0q&j*f7iMj~6l(0!! zw^VAB{AnUjDl0p2&aI!kyB?Txzfs|g}}S4mqS0^E|>(d+FJ`R$(t)0B=|n8 zLAWA?9#^7S#G___H8MaLZe$oa0HvRE*b^mUNod%~CJ=Mk?X@eLUEfVtla$0_W(CGv#%Mw-!S@IgkBYNoEr9T)}paRpld#A4!clayOrD&~d*kL^dIhf-peEa3QaZ`y1+Kr5X^j!xP@-t85ZZRJP(9nh>UUABaGd-qf_AR->s?~NMbL@a52 zOX5PMlZY{$5j!4AGp#_6)=Eu>s{x`F4For_@?#EB$>RMey4kz5LJMj=0P9w3l{BhI zbyCO(fv9S(dZs}72A#hePSJ~QU$?8c70V||O==_d6+Qh6IO_rsIuM;CQRj1BQc!&o z0@*mJfQUQXSTA;|P|gA@x-m;~K!H}P&+1sq{TQZ;p)ROsSHz_ffU@`=)}eOa^*cOs z08RZbIxn2TN%9z6dA2GI;5oU!cKKke(5A?wjLYu`&86-hLt&DLtv^TQ1!{bf^sY`$3J zss&8&ERmv-bpVMvo7M8AaQ*fk^SgT!8hKI2B8 zbAtUF)uvsC?l}@=!JyXpCL4+KU}^dGx@- z!8OwzD9^;ltR-`i()P@Ib$-uL(IW7kI5#aJo<&*{q8**?zDsMbi>*Xd`q z1Qq;ESh_e3z^jB61FjI3jvPYSEK0MlOI)#8Ru%=t0?l+Yo{gucv)gD#0rh2mcp?zM zG0^$k&&i3jsKX2ox!m>2mts>!A6eMwYO5_trc&{^@0%zABR}Iga4r7vbvd4NeXjx7 zG`s7loCh^vz@K?IxsgjH#4skaeLr%IJ;quB*Hx0UC*S6&b%O5+illRpWY%d5Un@5p_>zey~jViRt0@o32BBC*F#dTIu}=LIEJfDYf*JtETz9ZT}Q5? zw*%si72_X4V?tCNH`d$D%IpE+d1C4QZPQrd|K@7Lwf5a~pZYmgbiV%bs4U3t+sXa? z{rV-7YmBN3tDDep{6@atE(g;_kq)>H1V1`D(ng8Cif3?lgGB;J@QxL#S=~K7Bq_74 z_L>pO?vmH(UtZI*#&4jHxT+Jd3VD1NDRq`w$U&o(#^swv+ghIJ!@85ng&%G7Aj8(T zeQKoPQt!yn)WjZHLTB#pw?rd%K|EHs{`$s3uqMDjp$~)wLdqfw$L}#Zi`5;lOMoEI z8#5C5TDo{p?j97d6v>>vb04qCI*ec? z_ScanNh*nZVPHom+ycEk5wnDvN=iBSE;!{o31CtX%b8L~hXp1dprw>7wyV=^$fl4n zx1x%D&+<{IO1%R%E*eu{hc%wRSt^y11EluB!p)8$(g?|=5|OE@GKqNgCvVfWea|kD zg%=JOHKG}f1oak%LA2|>{pJIPB=E3auT|31{FBG|l~7Qtk{&Q<7wB}mc>{~8V2ml- zLOrC&!MqGo0hd!wHi1jraD;>mBjUP8FEdQ-m*tv+00&=c6l1yzs7Y@7|m#9FH!H%1X?sMl5l8P1jrct492 z3%@a7$n*GG(>}jIC22^@t;sRK0jD}CIP3xreB1j`r>>SEjIs??G><4HA|k4p)Tps2 z|0+x5mU(@BU5urx0?_GxSV8OL6LE>8BhjqvO#+8wZFtTHj{}Z>Wx-j1u~NCIm0GET za{PQCng*0xqP3S@n;RS7>)eLSA5RxhliZj%yJ|Ig^X`vld|;)J%*GQ)rSkZmk%~IV z2np-8@0e3aib0i2nu8r3xSg>o{1yA23X{iWlVVCjMx01Ry+2*Oeg3~A_qf?vYC*Kd z+HSTVn(g;?_N&V-Ioh>u;e@WVIV7Nzx$M0iI)ni~q-rI?pfv_c-NkxeJCXVhjA=%C z_m1l#KmfxeTEC<|Gh4Z3IlT25P;z4OzQpBl;@M*;mM|^P@%fztozc=6VdB!g$tMf+&H?r5~22oUXg6b2muRIJcD5)OsUzw z%Q`B9V4k5iYxH1eFCkaRlDk9GfK@9|os-L@rIO2GgmG)wX2y#nl`=^6$bM2t96r0= z&Pck|vtfW$Q=0}fYYRJGFTmziy(u!{x{2fU+Ku*qSMgi`1CuM?Al6XXRJ^Sg;f8IB z?u%Me7OBKu&Nn6xwF>C8*g-2LZ zCvP{Z_6QXDn(o$=1*$~NqufpxRbERhUoKSt7KW8ktW@cN#z48lYJKS>7T3w}!zqKl z+-#Ei({2;06*H@vZq{4z*qTWue5u))If0MkfI~nmZn6nM>^g=sdjSqzcSu)aJwHQ7DQ)N z%2gK9Jg-%&LkqTM@(%?WVC#0A76~yg4_k4YZDHnkrj>IJ5v)YJ)kRS2N^9*<4eQ|V z22N*}s^lUgxVk6%^ij?cJce|NmQ9y-&GZQP!$e1F^5kYg>I5?}7hD+Pj3+Y%F@k$E zpndV%KKDj(@;6hBFf!#S9UR+w&tZRR;d>Wy$}C-QI8bUW78^TO;4XPqx8IfNm{QHY zy<4Sx!?Fz^R(d+#%B=FMO|{+qD}Jmg!rqOh4=~6bS*`5dH2BQM-)?51ki*)jGT$jh zW5^Xc4Xlxc!UF~lXto=pr@m1(XUj9d9eS~`RKUnvxHSaA+}*u(%jRbiKsJyWR!yx@ zjRJ_I`y824s1HeGj&rIks3DL+SN;sS|+;;}{2k8J!$pVP%{Icwu=L5=uL4sVp*C?MYSf{a|Q*+_z6R$DL2q zYJb}SRyH{kCyvsGqL>Q!qAS;6Xj5G6$rIHbEiF%lG;6g>UN1hp4~>A^LR&2}}~e)VhoWGwIB+i7Z9;GK2*OPw8lH`!=ih4=;QA)v9C- z+E&!At{?0(6*?!+Yj5v)YT#0Te3M7-cY0oci2AT0M5Fd_l>Ul8fn!$dwMBgEHwiH= z4gOgww>%Jj#aHk$2mxl`^ZX>WXyJ~b0uGW6b+MXQ+RBRi6E89t?DDx!578F?_PLd7 z?NvTP(7s>*|7sHK_zsT%Q<@+GseE@RHlCPQVzS16^nBie6%MJ_*6(ml%>2g~=`M9= zZSBUb0Ofdu5Ayj!icALMhjvs$%E3h}3$=pr!1d%*!dCdoRQMLQ~AL_I@CB-iuJ zv{{30(sxY5w%{9$a=~83UO#R)1iE;&iVekdHfA$f1!oI+aW|vNz48(d35v2|m-G56 z0Z^^P^+ZQj@7MdsjRypPmY@U-`Y_5uOj9vOdxaA3K}Gh1jgiow-F`#JCOwP@NmJ|M z^!)AbX;vsu$Q-zlT;%0GAo{-qm^aChJ45ZCc--AWTy8E%J61}*{(05LOn-6B>3kw0 z{mnbbJI)(MyvfrG7GGkVa4+VH->;C%zcvjOz7Gv#rDrmelbB%szl2V)ohT={gSvci?is8vvuz>oL#?$1A}``p#rQ#}oQM#4Gp) z4TByPHsm(uW(&eG{%HaYi`{&}zAeL2T&YqAc#lFOfOqSqXgYmfdQbPG$`J4NKl+1c ztKsk*-rh3Ps2}?OJp8K}|7dpoyO+%3)yl!^k(g4U7(|#kr0?-CiOqVB((Ax8LlX?z zSdk>Ik`j45!_3Rg!6K~r`7|~L?w4z1ayg-NQa}ab<%Td-A{qRl#bVe!AAsQ%ez_Jvdr`Tc zAu)}~&WW0jp7?v4-CldOa>3!!*K$eu4spPG5_>b&^mt$w$`pS*oshy_t2GN^8jr8c ze*ID6AAQ3USTcREa>07&wy1J~P*ZM0v9Lm!UbU32X)Mdm?m3yz*1lh~%g60x(84)j zr+V#N6>bHNoocAzZ-7cFiDWb_3_>8_Nx4#~Fc24P$(pw!SVA!utUm+^Bw%Aj5(&px?@ z;%&N}Q}sVg-}NMODixYuU;iir3Mdl5L*pV2&e)7h&=#;k7B=Q>cgK~6Svs3Ol_*C8tSyJLGRGBI()QIwbXQw8p>m=~ zlPXFcjc2aWV_mWalWvsnYN1%CGTzaB>MkjTtImL4Wj+?0*LX4BtLl}K9Ze)C=8n$@~EATkEkXI9_3)oX?RmB_R91Zd!nsgxT7p~|SVD~a`fPL5ns z5$5jL`qWV5qq~IR8Vl=$g##-b>g+wrQ}g^JO5x5z z=pNY=#ucfINIu2|Jhh)+w1KpIVsaL+kZkUbI(z`Pqh`ki7~o!*8|>So*&WE>Mps@d zd=uX(d((g69ipY!k|D1|49S!_A>BUSEyQN=o0_31aOT%RMv2J+h`plXl^MWTZ#eD{ z@YpH7FS($`VGZdpU1MiOUci}BZ!b5-ULi37E}cO^A}_ol(uo39{C9u17AJ;kf#fwH zqO1XJQc*45mh#%HQJ~TV!p`aB3a;>z4yQX#iVHnNAA4EiaivO8sB4AajlHn2W}6Xg zj717me~^zHE=T@l9~!F6aypPa!G_4H=Y=zj){vMFLI*v|^&EeFStE0Jp8nrv8 zyMRMpi1ZG8a-z^X@aNd|b9LV$VZCIdIYRjn7h`F1+o4H&;-WGH|;D~R$%u5NZe+`0d}{}Lz)iU%CX@%g8><5PX25g9wjik$(9rQ}f-R*)+s{wfhJ9%=5c?;z+r5S&3i0RdOOycqUlI zH4k4e-<gOTNSS4T-n!1x3#{@?z`?!snRM_gW`c|vutj2aV0v@b)wXiFPeeUyU4 z%N3Bpkh%|7D`_K&BJA${WtmpPJimWD*m4-9K?yxP_VQe-(bp#Mr-1gtkfuj{bF;MH z)B6k*$0GfeFxlbWSSLjvvGvP7M6bue@Ic8EPD_5*3xT4Ld98|sZq*%O*K89eK713#K42yPXD_lX+xRuyAw+^>oM`G&t5K{~F#KCo>ic8%?C37Xr)- zy5Kez9=9vxMC9UTWwOY>Z^C2IS;TN3?C&1U?jI0XgAc-;N|2HFXESS5{gqddOe8w!=2&ZdBCR1*D6L}?50PaRPbGf2k+a19hFz-swPv%yWHmW;3+jV=% z{R%`pU#XB1i-PJh6DCOk-{ZLBQ*p7~d%p@88auu2fo%3(;Rck@owPvn2?5B;rvg8^ z0n~Uf6VJGdJ`gvd6o^;5?WP;lnE_q#3tRH(x_Yb!Kfomn`~*Y zmY>3$(>c(szU3Veqg2<>?f5b;mdtelCTE3@w_;-n^iQObc>dhZbwsW|o|v~eN}p(U znsT$t6;iQhfLNos&Fy4FMduXLIUYS%9Qgb*G2U9u0n9991Z$)&1k@xZqj77S90XuFmRI=;$||CLC=@zrBm%jiA$?=fnFRq+xm*!TC)#h8C&mzz6X4N!2F@_&r*eHgt4R11j?8ooDr4YR`aLb8ekFHgP3*dOYgh8{_WoXyQG&=PCgM)@pzn}qVl51Q1Fog05 zkJnRZq5*ik?KJPN&wb7f%jfMM==gr+o}wU?C(Zg_V`@hYJa12!elo)S`{pu7vc@>A zrR}*Ir}wbh+Dojikjl#&FLi>5$xIqDRw!5S0;F>^E-$-ZodJH)#Q>}0{G{2#6%6`# zU-(uL*@(UOeZjAdCg?Ss7`M^{1iG{74Ok%NSHAPNpN}bxT2y-loU#{1=9{UC^6XV> z-0o;PLeL%HdlR;UjR#Dn9Ngk=LCSw(>$aJGKN^PrV*%Lh!?k+2ZVal49aQm3rn5U4 zxQy9Y(3cCqX0q5lwFv$A!^i>6W#Brnu@;L(=~ESE6mX;A0&^FaA05W@QnL~t+4;T? zi1~OSq?-f(cBzPagCJ1RLjj)-4Tbd4Yp_r?O$JwNC4$S{Cc8*b*_Td)KO>VMn z+qP}nwr$(Cjmem5s>!xy;$*vXzh|xU{jAmJo~PE0|8?!XfBPD#2)rS;SU`XOZLC^t z8wdS>Xy7V0UG|6)JStznw*U&BU`*wZYiA6ljD}0%@xwo=+hrq7y`#byMUSakp*EY< zyv&^zv$*f^#ydUM8F!Bh{;|oEIm$hBU0Azaj>pTW5NPBSK=)_~8Pz)(@3)UXzqr_T zG~hX8vp@3FY4IZ;qKK9brW~T?$>?4}SKU%n#n)|nxWi<`$6>dnrI^x~4lD%}sQq`k zF~4y2xfF(FlRp09;ReILFqh-0WJ7kiYuA-<9ge_#meznUX5wB-yR33qp4mp#R-dQ& zx=&G>P&U0EM#1pS`z5Agjl{w=D5)mbUni%tA3=~6kM=rf2LajsU;CwIrDF;xaO^o@ z$QI$K%WY@Q`>VIgF*e{?Y^1+FgCqL4*F%g*^1eCimCaB^F<+Q1D&?IFMvkT?+OSl z5b##;!R0TPP0azs4zeFIOtX6P+Gn>2*xVhrEBFn=z;oLcgPHjnsPVes$QHn)s{N`%Q>0*yhKvFZxc8>mQSFLephG=cBDr6@W3w?)mHz z{O+9(I+%nKiG(kO@NZ@KV>UZ?Zo2;5R)aisbM2&uH?x{%XFX;1Y7XPmso2y+7H2UF z!3gSl;!T#J2k8EUZ49tiHf-ZOKb5n_BGsABX&nSHneTY-Q9iPi3kG0)QSd_uy&BD{> zhzki7mFF^m)v5nH3Ke^ik%6(y<9_waX3~2;VGm~Q$HpBfes)F4bQ{ke5OKtS7X z_W`E7%@g~j@8Sr!OXY&l!|rioTs%C8%UhDq$;RJ*1HtcMcZuF@g|zF<#J~GE&l9t zL!|D9_>B{Z$9E*?qX4IWgjHzj-n%N{=iAR@Tzk${ASih`R2MrZ?}EScjHQ##_o|gXUd?7(Xkza6jFIH@eE*O7?e^RXggQdZn9 z1#CQ1bs|wM?bM8m366q#kGNb2X3;(!L&I+03q0zZ7S>X*14T#{InO8H{g?+eQ-W!2*VR{AmVMsbsog8Rq%weF>@HX|Ye1bi^G*K!qcwd;3`f9=u=j%S!t7V>m3 z)}LMfU`zILk;oA!R#mMGa1eRgPr0#_T7E?#sbIR{$gJ<4RA(wmblw@FDb5G~JpazZ zqV@YEMjmh>sL%658NH~dP-giC%KPg0SNr;b62;D@zWf8c4I9S6h?xwkT==2I)}Fg1qKBq*Vsr6e1Lhs!k{N0 zRY0F-ssa-|e;fY{DaOBsvC$rWN{-WEC&VoIBDA7ohm$2B(yxBkKi2YNWHedGT({EB z@Xz*pntfHv=*we_uy25-b|SW!i2V8mQ$q0$4-XmIm*r%h@;?b-3cE8X)7%&2J3M$Hnq_{pGW79#8`Mxig+ks3$>ZM5UdxU5|b;E(J2btAUk;BQY zxGO^YRoXHXf3}wOR1$GM4oh*&OEIB9@6!;C6~tRe3f%i-JFeNKPYRjzt3{ZX67&dE zuG+(hjXRW|e-gK;k4!2>dJWh=HdF0J8(R?Os;N!R#t2-P6fP1odO_1cb_@>zvbN4I zCtyws0u7CPyJh!#(R#3wHiLEV^7xbCL>|=nK=^YkLjGs4utzisx83P_J1M*4EA8P# z{^IdYJe-GAWC$b(UzT&WJ6$Jdl`7mgeDrU5NEU&|I+;UQ?&FVkE?d&3jy&3gDJxZYfYBD*^ zPBJ6nH)|Nr+G9x|HjVHcfo&(@7xmNl$eGyP^80o>3L-O3} z5+8B@9-gb9YlA=In$Oz-N@eZ7gN%ff_-jTS?l_M(FnOXZrdY;-8W%Tr(iwf6ts^(S zS6vhfesDMciPJ#|lUC&uKnQd!Tfhl#5fAhn4}5uZ>2%UpYy@GN&?iOn{?nGe;VU-$79qpDG8F;xrZV7G)7OVAI z?Kj~$P%0>|$YE2PPofF*2LyNkIV!Z(-v#t=7oyk$C9qqj=p;>MO=BYV8HG&v$`i zgMk3mN2t#DNm(a`4{}9?t0b<9UOwor#|!8`y`B0sULicPhkL&$?(*w%H)(I5 zkkE#%{orRozF5W3$c|kNgv~|HC?HM-++0!Nc(xp+a=~}&sR78B*ej8kU|uNnz{1Ff z7rgwC47HxrUQ7yNGV#|(X2{$AgJ+1TJR!di3d4{P7g6ZAT0M!^A%tT)G{T9y@BG35 zLQN&C$6kKA>=()h-}UVGHrJ;B=z2r^PD`%fZ#p?DtEBZVjmWJv~yG(P+?GMBpgj;iDk~-7bvl@`0#Jy52X0G!dN_?ERvz+P+?a9-x3oIR_h+G z+lCq74e6bf)~Jz4qgD?clnc2<^!%M7s_|-}wDE_>alr?Zk+WPRmZ%tg92Tqc$Y{vR zloZ(TC-YS!Ih*C@7nL*$r3h5C2sw=qPk_0l<*(Vf1OV1XrV)p{KUeM>xY7EBoJTB* zM98fGC^DuXvNAx!J!UfEG2^>xMqw$=VCmIh@i4pb{=p%{S2x_3-b^G(BYaxFx(&yY zdYwU`Q(_vmic+b?1(juhxdp&NRT`ujOb?G^ntv(edg`k>P zi$&o?2%IutiIdmIhWf*=R!01x6Xpn@%AHFiRdx&X3o8|}7X($u;0xfP90BG! zmb(2pMPg9m`IFw?KdLPUgiT(y*5EcJ8Y_?Nd6ZjM@JCsCWIzPWra-8`_LiQ7pHnUb zy}}Cke2EXRn7>o~s>ud7E%UR8HpS!k{2<$j@Kd{UPb1aU0Nyg}FR#zv68(NIptG8r z3H-@swKRdD?{bO-p`xCm#BfV`suSMM5nJr?xn;w29ZVDwg~ zQKz6!C;k8zH+xo#IR;dIO9`@V{Ut}Dug&^756TfJ%*lH+sDmb=0Pl&9BtuKkqtC>*z# zboDvlEceMNM|cOQ!`rV-YC3N_@plcBh*yuzN6kS~gcm#yXd-d22Cz=pjdnOO$iJhpHxVOlC=oUhewn z;rtl@^2Js*Y|Z94gd&qq0|~Y}vH3ffi1{wSHJaL9E5~=E!F6^BU|VA6bvm7b!q@#= z4n@)qA0I_oW~6K1>h+5#9J2A|s(vkX!`~l{iqmR#!Os`yfQB-B1}C|SCD{8W-Rk{s zrp;={?bWpCI%qeZ+;>zj&SPB8_%vvQ;2+Zj?TAXH?D*B&-_vbcl48?tx)-882R1h- z#fpE}-;l1h87%zZNn$L%VHN%ZyNxb{PGX8tUFQkA3^`zueK1etwP4Dz9pA)-ze*! z9l@oYF1MFrq2YXRw5W@zKcFGCUkw@)*p)Mb%sP?6vuhyivQxOB);hTcS@r8Cwd+3K^atb_6!P%EKk)X*a%tCskiKG6};bA+arGTZetvdLx z;%Vi-`!W$}PfZVx=PNM&X(L`HEm094&}!kl7K-6E4`N{fY$dA*SY^|+5mS|QCWxlj zIQDLZbaW9rw4?BFNVb2_6^+*cFa6`?8bmwAP^U{=d`bPBwrJLRB+<;pR(R|%MiQeV zLE9?IG5Yi(xN9xSeM|nJW#_P1;zK09XKjDiLsLxcQG$@QfhLat##>ir zL3<66t+v_*Cxd$)*UOL}5(($pj>gQOaLQ5bhr3t%mQ-Qqqe^e{f;&4qNfGlFoFPXPVc44<=TfgEgiLac6HI)LopM_BbXz5*qc<+;zVD2S;K2_5Nc^8Y&sg zh38p&7^@CU%Z^KZt3vguwL{7H22i{ljlr*RCn3y!pL&W&vk5OTT}lUH3G*5v%Oc)9BG#zIniAtdolfC0K}`hU zDE-JG^~SO+%Un|4dAynlF9`_=`hbcny$d!jM$Te(!yj-PS8^NqbRuc73vdvOT!v!2 zEP$ZL&$-DWVKLMZ_?z{t`~8D(9U?mTsK0d;7?ma}MNcfD^1bD77LdhK&>@MXEwr<)%rSGY>;{s%XxJ zWXU3@(kPpIu6$}#@hLY;zXjuA4Z^7DZ>plZpGDta8e7^r=_PgIq*Ct9B9;+qg(Yuj z25hTqW=dEchIno1(kb_)sJ9n{c!J&)QsU+Kf6i)1Li&u8G*JvX21#I8GOebR#VX*4 zN#&#;ZYhsV!cX@vWYak0Yd&K#1Iv!eW~t|Fk#_MF85wz>nf#gR&cb}xluXf4kEe4u z3S=^=E?4ah^?FsB1H9bIao}S<>TGT51Zvv?XH}XF;KHia3%L>pywK@D z^fRuUrF}l3kWYR*I^2!j*}GaNrHnAn=$Ap0^KXvkCgVEi@L;7Rs>Jca8gQ2mRm)jy z8glDFS;sPwvvbsq#c0u<)1$*hCr#-Qq6|HE8cnS6jx7Bh1k2O1Kxo?g8_;u?wdP&;UCvX6K5=XjwKGmJO;dp*K7=VUV! zJjlu62YIGcb^(RDOxg?X`0?KZ1QH$Ah{{%RZp!PHoa7+8$rSrs<_4NvsD z5(xHtS;cgoq`!~HdMqq+MN6Da3K{i^+T=65jP3W4`Un)8xW@<^$<~U5P-Vh}tN{{t zeLB^JF61q_v!yx-{LKzDY^NYpCH7T^H933Uha$ku3Q9>)Lu3hS$kUFQzQ#z^jsYep zN%HTBfZ3#+7UqkBo+PsKwGRoCE`bTM*DO0_)OvjHlcY@y#=*dDh7g{H6kJQ_X$Sli zP^&1)S$dgZgErR5wSM-9hi6^U`vw8GH+T|rQ(eH#LcR5}&HyaJ?==pnX_(Ix+RUj) zvvT^EZ@ZJx@3{u64Z9`6q7riedRCk(AET~h7)6gTnZ7O>;m>xdeEeM&2sR!_VZC0@ zknuvA_86lX%b!weC-AEE&CSIzc3E)=2y%oQanz@OILOFcn8B0ZbeYK~hxfd$UcFnI z+NyqiIiw2#Ci6OQZ4AH=_#~6rsBkG$uVh*bwt!xua=)^Y@AZVTLv!u54Zf(-ClRIa zZd6n9!^V*HFveJ_EsE#{i1Q6uKf`<_su=_n{*#1Co1W{PXjCheKsPn*-5Gg_c&26t zlHm)@M9&>Q`C}yihBEAX7@R`=_v+i{uP|@BXlL{Jh%U?1Zh0#{ltFmZ?xGmA z6;sOAK$+CNj3-Xd(y(1m^WOr$2YoX|LEn-@APgIUa%ghCxd9w(UmK|dR@ydmW$oW| zO=0AwEs7DoA+bQ4oV63*vpFb5%J9Ht*6GddO~KG&F#8LGK*=h9<@5O~?Do4dDie#} zg(!#9h5KsR8|{dtXrFx{!j}*`eFE`ruv|=G81#V-w(<=f9%dZV)W399dJTJ_h7011AN=Ea6Fl@ z$X|5{yd-F`U+ecrO&zKL9#7sr`c4XP}i^7;3DR*Uj5INH)-y zBcI7&$eeZ@GxR&m_j_8>Zoe~mjq16jJcDz;VHLU&Ut}ADR%-%Ed={+M7U! zfScSDa&qZcGa}mfwPP7}oVgy)ONwx4hy_ROPLU;9`>o#kreJZ_goQed3`#|XSKk{y zy<^a?LSBlEbaA@=cdM1u$RC&dQv9z76K(-z5IZ;`&t?a4_u`*S<>z$4w}FGqC= zo~K#TyCcoNe?a{z-0F{-80|h8aU4MlEb5Y~LbgxY6tq9h@RARh?l>Hn*5mOd?(nr~ zq!I55z>9RLbe3qJ1brIzfQQ~IIElgf^PHMw(a}jNN{j9pEq?LTxI`TYHuJg;m5 zo<(ZRNhlci1Bg17LYX55oK^F6= z?WoTkVuZK$R-hW5w1gqRF#KV>*V2qR)ADuOzw_~ld>Slh0m`oE1vK!#)6 z+1V|?k$znC+@C$*`oQVyftysTR+hP0FDhkBWhdPcz&se>q~GIUG8Rnl`NZoi03zB? z?lt$zxtvapI(yh-zG@Sh6ttITG>cpqRg1YC_uT0atQ4P1z&lmlwgm*B7-{NWo}ZDc zO%rFOvzUsho>S;`F_OiYiHNQlzA&oimABz8F%3tYKV)Uhu78iu>N5UKl2qfJEF%_! zfh1KrI$vMJENflB&O1y3=jS5Jf<2n0WGN##WUArfCReDl&ry7?-}>$T=CihzL>iWr|cw1&1wt^WJu}&qBygO6lpWU2CaU&Ln9+s7Z;MgcJvbej5~Hv zyG|2Xnl}}pj_2F-fA-2Y|8^6N5x>u{qURXl9h9Lf&ns1{mY01Og^IZ!^CKVutGU(q zRvrEQcbAc~mOi{$DZl#~`b%9RYicFDfc>Oj%@y z@qb=`3_3&kw0>6ANKz4N33?6X`@CI*)%n+$cr)WNhl{f+Rcu;s$N{vZ>YBsyxu@dw zm<%!LNu;rH{QKxmCK$VKX1fEnq&DyehMK;dwz0hl5?A%1Oh%RXKT@^OEuoAc%hZogbVbd3yL)|U?ZQK z9gE8zCs8-^4_`6p!r;V`Z(4Ife|Qpw(*gsrb3?*MHSNT>Hn#n~K0|+A&;JPz#HQh^ zMGFtqZo^f4a2KW@1E4!1c8}a%Csq1@MXBnh(fxEb_(M!zM4&t|?swWfDyX(;-;R&{ z9f$tO!eK3QbqGeivn9Nq@dPS(wfyg0B|ZqLyP))z6f+8DlRRh^)>m%W3k zulNBSUzF*< zLMlCQX39-bokBw~K?Dw5-`&Y-bg0l9hcK&qiXTRS#p zVT`C!&AB9K5M(l)6&f(4gbKFCmef`m%~ZY*>FTUO(yUrZ0aK~%Gd{^HQkMgHu9wey zVJPlCGGv|_s4J1U$|)||Q(s7y zZ_t|CTL$J0T7CUhFt&8z)hg(N)?b&?X?)fwPe@|ZSc6G0%}FMg(MWu7Ffa&eLH2}+ zykxFI>YmSmkfZ3nt)q$y&1b7LHwWwI)^la(K#$&R)89G|8n@SgzHXJxm6E?lQj(It zzPo5iy%voB{Ar4R=U!St&&!m!8;^WnUlV~0u>j--H#zG=+8!vc2%h*Aw=e`%DQSZ; z3@aD)MU2k75p>&F(}kZR?Ge%oUY{;ygolXX(s95SkmObLj{fP<32!@Xw-!Pn;G0S< z7|FoiJv~+8>#isr#bIx~?7B5$-%$mh|C6ym?(+xw-o=4<0Q(wv94LZ`=k^A>)o_;a zwJ&Iqdnye;zZqL(>gx@7J@4vwiHAxf5)N_d#p7V673b4}t<@+8o6h4)06bFy+~x^D z?ibps)}7~fMOE78%!grWSEd?Fz1%4Z2|gz(-V3ahQ0jgB3ufvKeu3R$np3p})uM$$ zd>AvKc$>YQ-R14&mLT9_k*YwBP~H`lR8-2m^q-iSnK_SxiWtu!N43}LLxV%mLarjt zwler0+R>7; zX}O2I(fQTn>{r#qYz0~m0A<)5kHp*~Xx~d&qRO}+jT*IG=QOL=2btWaZ>U^?fHK5T zo=(Sj@j8zC(8v>MqS$dZ-mLF7D-B<`eNMjSd9ho2LRB+ffOq9$y#vuY@B@2qPw!2u zqohm=f(bL@$K!vsJci{OqWgc$6~fg9NbM0>WScg)lfLp_SjC#8h*(LBnW^%Pp=g$B z{5iWlJ}kl@LF*^6$E1cx`sN(tag~ge=H$pL78N@x$`qMBnFiwLfJAjxrxDC_!INNe z=d2VM9JJBifDSv&VwrO(h>>j87te>B1rm&z@>J9ma*w_JAN7CpzQ`B6USeXHVjQHy zCpqkZW4Of#gS@R%QoetQg)pbgO3I+-^*M`DBvRnxs|*+$Q)k4&9WEeZYE1jO-OB{{ zyORnBzWk0lKL!6l&;--vpx^|;AKQ-?lm4on4H6usNum~FWoTpa5^}Uzs1g9VA#tn{ zqSNFh5C21-(eJ_Rs0Kut&>k+oB8g2~xKp9*+UAfkzSvV?|IWhg*vv*|d`-bAqKume zxE`5Mbl;q>!`W=qfCG?%T(p;V6&x%i>mPt0QUQH3J$UJHaV9S%5(251N)hfTyX%RN zuMFssNa}eDgaV1Ra}g70jJM5Di9wqnzWAB_P;RFVV^;Vx?xxs7M^`%?|N2;J64;+ibCO8x-Fz<)D!56~D)z_1{uE!<;A~jgOvMlDN^3FMf0NpP zFS%3E>p-?Y3BYP(tri4ZG1VrA0s&BQAZ(-lF<$~{bNx}RT?!kI%MDRug?xoOyGd3Z z5}>J~sQ^_Y4=->EILW14k3JF;eZ$nTVnlS1dNQE@TW#Ph)rT)%_w1bbpX8lyKa_$-l8D*-Z?#;gRaK^D{NS4lev>tgV(*1i zrNzCuf!0PX7tti-a>XMOa5LCxQ{tgy7x#?)O6a~@3_3L`- z96C!_c1S>_R^SZ!WU3mA!qSEv?)X{|dae=S47La63y1yN*o`q^wToYRK$tKs>(eIP zXB{3Ime{}-cL=cVAhj!GK2=1i}4lp%UEfPxURXRE~lSCVxC z6dbp_Wu;9j3#UK9Ac5@gc{J&hs{epS^;UZ$1&31>x#nY3s&O#i@ZpG>^vxgdI*C-9n*9^v-EwX z$sHc4JUH;FP`R@51Z=gUy929*{JsVMWlYN2PvFT^L#5qVzA#WAOs=86b|UdmD9~!l zgV&Wz_9L0p4=Ske^ityY}Kms zx1+8T)Xpa7Jik_L#|jh6&lrQxEi>10?u>K>YY;9xwiRPD8%uyD%rI7p+@y`+;M{8A zNKjlfw8vD#+rK41y@|?c%4oIKen=WyHR|Mv_wAsBd-ZR>OPNo;;apCCy2Yny=n53) z;zc`htgy4YJB`kcjt+C{C2A_NtONpnX-RGW0cYS`)a?>aM=wU*Rs|xfYtI{EgES}N zrPNA+Ans>BgSS3s0n(5G>m=Q70G3@Q6?B1#mFrCln{Ihhb<<{f1^Qp?QR^UaY;Q@N zT-ypp1-3?Qzgrv*vj}IIR(0lleSCgMSgpFFRhCHTK@^LtfB%BnQOi#Vh6!SKSDB0? z$VkoLBwKwV?J6^3xW;h(gpU4>sgfcz==AtX5wNF`%wlK+{}-apWHcd3day|rtSyw2LSzaN^#2Q63QQD*l*vLeR3qS>gpTgO z1$ArmoUMxN;bc1XTTb8s!O5JqysR@5S0XMYHTAiM4%U!K~ zZOKy=P5MJM6{QADW&aVpEd;BVHiMQvhMSk09Aj{NHoU1N+zp&29cZL&4Y+MNGbyl2OT(7WSA0& ztXr3>Ib|kG`FNMtcbZeZwBQAlGY*j;rRad#v^D@G7Sn@*7iSC7eFX0^aF>As2dcD) z9N*;p53$?#DfnA!2y7+Jz%o5c3>b)DYzgW27=&Hznvls{q5wac3_5BcL6)BLu7kAh z7p|W)d#Cn(MPv*)p)Lj-_567u-& z6GHX9x!v5V`#fD5`rI6tXKj9SP0x{(MVOus%9j>Wi?#grfEYAl1VN8lV{r1Ot6lFO7xpUQv%lg?34 zBGvn(vC9t2^^uq{V)+aE8CBVk2n9p5tuPHwrGY9a33AYcE_Z`Fck&?Ff9v@F-_M5` z8NMO8xHQGWfzfXvWAEO*aU2_CMEPZUFLg9*xo(bL~8UdF}lJe+JuB{=_qO9ktp1}1woxmDEo&} zNLCpkd>iu5C?UtcUyRdSs=+;ig*aOmhZpjdGX<4*$Bgs9fkaG2gp3FROB_<_NNU>J zLhcBKO+uphY8P$~Y@B#h;j`C!yxh*ZMymmyTs9-@U~{bU`NkeJ=F{(^9=0l9LroPM znL$`?!Ly2BgK7a|GKGC_c8ISD(u?R}rh)&>`tE;`1*KGrmswyHjOh`QAQ{C6V{8>`wETvd4(BczNJ^bHN#G&TEUsCUNKW6Ca>O;xamp^=r zA?Y$k_Wy`$I09M3Iw^s)8&`yS!`%^-e5_OJPGe;^l1A|0(8zAqa>|)Kl{BWVCNGjk zPQ6bLg5zM|-LYY&LNKl-%>@7l_`J?JdQSvJfDa_( zGh|27oKkWN&KZTwcDg6EIKZJcr>0*k9GXcNzCe1lk_1Ky;HqkdH>iq8D-5pARH(H5 z`{$o5u*fbOmDT)@M@SX$4l#^H2tF61Y))41R$39IK?~W3wD?D?#>zg~s5S1_-s@E$ z!Bo(@r8O~@aynYGHchsP;P=0B7^2JyzVXLMX6UTJ_4MvGyAd@S)QUi$66rSsE)Gw8 zB9gj7y13|n6dkd-;Yf|MoL}Hmm)pFaId7{bIs?|Y#TMl^L5UDQ+~(WqvF+sEtxH#9 z+vb!e+%$M5^I3VzWiumK$`mQjbWG+j$Dd-o5YhKaL`!&3zW9A!)3&z1%58yg{o*m> zDYoM(b{;W%HThv2+}_w+24=BYF4$Q2H4!G=nMMK@M-+{w8*vW=jMJ>B%sR(&#RR$n zj7f^gHv?+pqGRDDJaB@VgQj`ZqE|6VmS_$u>tHydup!-c7f2f5bdXM?yj7He1NzNQ z%E?#=Uq%f(av&qp#W2yTmtu=w&5&IxQ_4P`C(Ws0I>Iy}gvg7d|2W_G$@*$1)NQ}; zx7){<{dr7Fm9*Q&s2UKHKsDmGewUKTCgCn1PU~#&vqG@5R9OaKF4QjR^U2WjyL=$O z2ax;~fdp+aVEss8tWDJUV3Jg%#DrNs1)M+1!VqDo31khfe%3(b zmoP~#{6fQ^aMJ`=JNsC=D&(s|$1SYcv2lGiod*;5XjRqP-_CoVS@)uiIhOSG@_zZ2 zj&pWj;2#+#h%L05#)E^;n~O201~Tf~Zo3_)KBMvX_&CwuMp>T@0z#$%V6p_$%H4u_ z6(7vm0P4g#(6=h`Q&O?4^_VdVv>HE6B9vJs8V>w>PG#bA>ja$dg`c z0-k!nL&h^*1gIhGlP2Wf9q58JC!vEC3jHxX`7Qo{p0zevd|m?ZJC?s85iH!GR$2pS z-T%k|R19_{u&QaOK^+LiHe-o|g*EE+LZlJ!BmhVc`?|w9*Igw@U*ek-@|!g%JUA+1 zH7!;zY(9@`fyK185T!ysIk4%nLgFz^|7Js67GbB&s@hBfiQOxsQVz=?LJtQE>oXI2 zML`BD@WADNOmKn2i7M5k|J<6~-rla->&2k}(yrg|_U*#w;IH+~XVaCn`dn7q1z`T8 z0@j^4>{YV(+AOk}9PAX|(5JS_r{zM{X34yb_sIVYwdq<~XG4GLiApA5)+qOS-M}A9 z9J$%h(G!tDAC&?)p#SXP-bw8hQ`oFZLP9}Qkrh9X^wjKl1nU6kAx_XQDB7-G1Pi6b z^%k*?fJF>oU6T%QMCmmo>zjTU5zLXK&+M^nl~|LW&2>PQE2N{q0sG5%-#cPLYt~ev zN7B&DbTEV3m)3LHPR*riT|%GNb8->y685aP3l6L>Dk|Ml9rEI{D#U``Kt#eq2$dHG{Pn&>EE;c) z5~P)Y3=@Pb>LVz0vH*Gl-r~Ar{PkM57SRo;uXkdAIU4-EG)V%5q=7^khcEHy;Zd_~ z$zpir2&+q(}J@-+43wo=_H8k;G4$kD3)0A>H%S_uKI!gS0o9PpCH=Hh-hDVu8;81scN0DekZ6T^Ry}hLF6weYPb~KLQ<%k8~r(8aZ^n^8vko zo;H8VT6HJ&xYnqtS)p^Oz4uD8VAvQC2fB?+WIu&`$V`f&YXJkJ}PTw zYKnRhTog8-6z*bf1tf@uMGJ-i&VkL(O?CqKfR^@w@e%OTI`*e|WZyRkYR@i$q5;kN zQq;(H?;pQX+&Fjo;>@U0A)2`azU^6mMS)6n8r`tu zusSApp-Z;zg+GfPn}}P@#6_FTh4lvxBntR}cy-A_|8A^s7{)}HhtRFBugCvS!5%;& zPyiVBNSM?{4&Q~~ECN11O-O9k>zM5_xAL!8Wvb;uwDimZs>n#Qx}bsEA;xCO*5q3} z^RM%YxSvcbv)KZ|UWKgn#~=LCuSEW`Org(tDQ_0+Pvv(2<)%u%vf%#Uuy*`BhvE%$ zv!ULWTK-J!xj&`z(N9WFMui2q;_I{Vodcom?Co2I76bkq;U8gbm2CvO#$r%QsZz#i z}`Z6?52Iw4q59oJNKB%a&2x|F1B^_nP6?hIYLRlM@PdG0hENI0Sm=qAgy|UMf2LW zCn}Iq{ikgtKjzJY)bYh(yI;0`!xQ~G%EmQ?DHAIP_8`5*e(z}-uO{MqqFrn1kJ&zR zI9cSknyIP1_VF=^UAO%MbT;>~EvK%w5|e{4m<#K_Nx^ERKIjA>0Z3WVwYSB;PKv zgI>R%LeFA*d4qn>Ui(n?0#A7{`e89>I$*rGa(}-bD74)(!l z>RPZ``6mxZZ*0sxIe&W~!>2ISA`308KE7J1%}zHekoXa!P8ar(v`B$;tx)do^#-vU z*X+3ps!XaD+vAl;_@L$#6@uga?oqD(balbamPdQj9H1D&E^Ao1oGI`w9U&S0# zY2?x{AQ|_r$b%7_NSALBQ@G}PBYua&Fq1$oPWfGo*1sAH>J(lDM~H!mDJrM!TnLbF zN&5^2f)c+F3m~{`D70WqT43a6i(>3ck-=90(ut!gfYK22K_^#ttHKy$@~xSQqC;gc zmsvP$mE24JpkQNT%h&KvYdukv7OGpEf`dWX*u>v%^1*I*T-2+RsS&DJ5}m6Ss<_3Z z$yUtaiLIEg)FW zE=~>{8CIyMV-L?#$mk70gI<{lNkl$95A*TF)VriZ3LHy&y~yVyksLAWi|gA zraU*4&dalUdUU4}`aS{z^>EW}gPKf6jS?V=5VYN!ZrJ4$di}_0?1*rT7Yl=$OaO2c zNoi^Gk?ss>q}~Ks2c&bc!drtsW{TL2fG8il5pM|ulh@8_ok4cO`K|)cAEcNygu+7F zm(jr}Jx^SwW>Qd{kp2r}8fShXytSAs;tw{bHG$nZCimERj1KIZ_J((2-MIt=eQ88mBP9BDa~B9RdCZPjllUH|AM<(^t-j8IlY zR5TWoCQH!jtARd3#lHgnlP1X+v|4U7=l=16m;dW4B(ZWCjW~no5q05;PFh~r-~lpL zL+nf>SP|l4CW|jYhr=<%#VS87jT>c<%%5h+!zY8hWl2FHdJAZXp&wo}stKZ(12-$v z?}AWoSWhzO^_rlo^_4MRUI^rQJ+(IhI7O*RBTkRKU-JOv2SJ+(pxasuy|h*+0gHrd zNBbSUa!^ARx*QH8${r(A)6`0bQVh4_nLes%oN=5U&tFi zE~$RE`0G(vHqhaQp1`N z(cFFhj0{Kpl~6P^@IRv=c&`Pp-Yx<$W#%9oyHc83PMLs&432z%`hq&ouXN*-OcyA72c^4Y*s>!w+|1o zAZ9wIfkHw==}y&P@k1G315iY%XMYo`B}lT~E?O-at7PgUB51^pK&Ezf3OXG1V0Q7$ zHpRkmPJ-+Z`a{x&Em$l;r%ZiiC>lYLgoxSD{6 z=U1jq+i9G7m55VCc~hGZ@QXmnnB4x3AzcYBxp`F6yxWn0GtoIZn!?cOZ?IK0hvU!DP~J&SPZAB5zJ(>;?^5>LG*qGJ~n_6)zrZeVqrlDYq>LH z_-bOJiYv>Bi8HTUCbakT=r+Uk^z^{_y02d9x#}w`K?qBH-EDh2`oXh?g~WbdohQik z{K z4FN}?^6Odk*=GVAAAe9_4)A1ckTp&TM0g!tAfYMs-&2RHm1f}-ivncI1}v59|GWTe zeLj|T$oJv=t^=9BSr^3nIt zc)x9a)*PvpRc&>RRs^sCf(9WR6?#Zs_MhUU0mGS${LT&jWx72F0l{29Xc6a zeUAXLj%$X5hycgiVKRXivvdkCRKceJ)w0?sYPB~vPj$PMAjqL2OlOVCm)?1~UbTsdkE6s#MTvUQ7eS)g&5}1M*m1k%LsxD)0@;+)4}V`H66u6im1YRDw^B@2U~t_hpozwCV#mNmia zd1-C4;%LFL{7~slIB^#MdBlHj%H99q?f8O^P*MkNYwzfIwO-?oX$k_4eGduJWU$Tq z8>GVLPwjoZDspV{fW_~O@MCw%Dv1(jvs)gJ)s^?B1T)7%yw~PYCKSKlE0b69d1A#2 z(E+L!3+c3+B~9}z6ES{hWcCY9h|=iMm$kM++ zuJdF$TH0<_NmbvXp`qDn)P;T8tq*gjQFhXDJUMFQo7~{T=e&0?AWhmRG8+0glGKgw zA&uERPL|(M85Zanlfm=R1XbT}gJ$D{ug6<{@p)2TsG_gaO@U$K_5Ke4u0c`0PY3LS zXt|x&Pu*|Pu=Tx&lMo|U@7T4EBBbPT#&MCdJ4LG&jj4be!Xc@I3ScUIrv!^-!E|ZU zkpHYnBAJ1)SSha$=#9Je8o<(tO=YZ!Z}DNj2M|Mgoy9MiBkMnSgvkTsUFQcUN9xtB z69#h_f4rd1b(Owj`iH@*tXGL*unYC<)FX2wS;yu2h!SwA%&NNS{H&kstw{{Ml4-GV#GnW_O!ut*xC$j+sa{ zHu`ZH$#8#2>qUE4s076~rLx&tleBGs}OWAxD^!WT#fQ ze0fEcBBr9GdgZJ1|0`Cu2@MU4nC3T@LPJB9+?Ynm0Q~zRkfzO?i%owNe{@ngvBV>L z9+altdJi;&SC~>(+Su68lKC_6b}zqfs$!%{|IcD2+%DYm<)#MpYMab%2#Ym*zY2C6h57b8tSans5R7n*p z>1IU4``Nv_cN8@$l^eb>BhanaK$dVcb@;7IQWq<~MNSM{SmpMedQy0JbkBT4?Y)#v z)UoaF{O)6CQmv6HsRTkI#Xit|`Oh@%1S>1~4;>DmJ9qDc8(Tw3T*?2fff!iZ>Bs?g z?yn1?a1WTuq-@Z|5& zcM#%?J@})C3StRI&hTRyGIFdT`J1sz1^#Br=t33BdE;#pl?zizrD$U10bVOlcWhZL z7y$(X5Jky<{rWB1fA9#nvGt@+G^&Ew=aM9oBPY23k^j;8KB|W$dV- z5H&CJ$HVH>RY|4jVkLaX;6Ir+PflZQ%s}AA#`#S_etwwut0Yz3*tf)qIdP{}o-=>3 zA=#lR$JU>-Wue@zIl!qkAbr76l~htGItB7;@6v^HNNcTMPf8`f%plyo`+$}#TP@OA zQxesUeKR12WQTBSUAlaYSuP9;$$7J<(1(v7&yea;p^{25iIwmjtNTHxqv};FQeAD2eLEz7-Hds-60))^0%EJhNO_`gCc@$lf&C*>S7<#KWB_8r=L;1C#xWl516OVS{wkii?+B(u>hT(ZKr^qN7AM@-nf*;DcR zHPVM!sHBogF>_?##)gK4h3VR~Zf-KJ5`;|1Lr09mTNi$nNNT#VZ-Em7^3R+zZxMZv za)v9pFnQ<5oH-+NVrfW9BcgI)DybAVAcH4==Z@`K863xzN`9Fed+{QW&R@I?CSgTV zIPY1`p_EaDa^l z6qc6Mu}g2fg{9I>1+lmjiXKcp_vc@9=idD&JA;x7gGI7znNoP$Mol@bl1lL=IKcL= zSiT$_#G|Y&3BZIG|J%?|!IAO%fmoX=h{cUkF{|q_Y}9y4W@Ea~;GJKmW;J^IR`|4@ zQRkydDt#8sKtYjV1N#^p$tB&G!HXZ%d%#e*IQdc%%5ae+K}?}ItZ&IXz=OXZ8!Pmq z>=aEK)s?w0)jMA$l|GMjOk=86@f9Ma3}hs!ZRE9g^7L7H_~;SV<8Y~1wF+V}5Rx8_ zShsnr(0Pg8)I=?Wi;iyDyfI1ry_Mt&YfsGZo)LOv@l)IBqAb$e0{vJg&e_0bvmk~(ic$}uequHdv`NfDwQ#n zGWkuNNmlybeN_-MPhe9Ug@l9{DzumqB{OHrNV#%~3hZr2%@?MUN?*#6fg76vFMxD< zccm!q7RoiaY0D0gG*J}mQ9;Zk*@9hNw_&T{3#D(EEJ_aO+nplczlU?{eRT?|q*8*= z6F7{|nmR!k&6FgIlt>4^Ve>XP!NT1_^Ito^CRGsgU^bQ}GTUlInopTq-&1bp!afqM zCDplAC6yA28$)%Z=Gn4lAs2m#Lz98w$4{LR`S=;|deDEI!aB);m}K!7bofrG4A|WZ{4q@R&{s*N1SK6a2LpO^X^+(wMG}(VK(W8?z+pLx z=07dAn-oDTvyF{5)tU{P%!-o9lG%ui6--l94}FzXN^pWQY&zZ)E9zm8faD)#$>{c- zyY%$gKmWN0f06?+?vQbR{&kUF1_niu!40D1$B&fJC4LMelTj#duxRdHUQ%R*n zBUDCeU&+_UkT6l{GX~}YLE(R%zbFTd|7QsklNu*xYhz<$dnDjQG~X~;ltj5HRBGW4 z_EW=*R8lG7NugsttdELm7)_*$?bhKpoDli-!!G!$3b7H9MJ!sv=&Bmgn z(o>%*_=r+$$QKf*&M}o#N>qXef6x4Gc?}iAjl+;2QqEtr93Y49vj4w>7*IUl?tKTM zB|rS+;2J^It5$+2Immc7P)Q|~5`_Y6cs)wYgGnnTR6h_a`ERrTcMwYh@OtpzQ8ay+ zOxdz#Cg&eh1&YgePra3PVHMO)AK|VDX(6?iFNBC8R!0QK`bA@>+gpT zm7-)6^!F&}PGMm}9~Pv}EtORIDuhD2YtyAoW1K88ikJSJc?%&y!9uD1+Od>L1;mhs zy20_2rzukR!6e$lSEX=acXZ?ofUY#U9aG$c#3O-46w z-GNAnWQkwZ)gq~Ym;?T~a`mRLc9_zKrAgyVSu$nB+YRcRQc0z+3t|jj3#(VFEcDe% zCPRJ$efE{B*Rgi<&{y`}PbwfLG8>|ris%^=`mka}3sc1V2vjV7qXvAdq|#Rtvj=#%=ZBvd6#A-bg-R-YeL9CV z3hw}8y_ifVPn{)=o>R;4e+6QaN!C5!#3|#SqA2x$`8g}zULrLCqDm_L7lhiA4}8mc zQ=~2`A0hjTefaQ^&Yiy~CrbRk;>5I!@MZSyJ4oho7a;)kr=QYe2Uw-frKC%Uos(Yw zX}V&S5``j|`&v-HZY}ztGc61uMb;l@|HRv-^c9u+R!O9T9QPeKLdHdnKBdL|DDsDe zg@tWX=ThPWk-T@rrgxOMXpE7&BtoR)UD$~?o12*Q{QC|5ds*VDBfmtCDS@JubU)-x zh8{JQ^uqO_YIw>o-19lVLRGzKf)YFecBV>|a(L?0sp!p{kf_{{-WaF3aqEt#loS~$ z*6vsFB1j4#mL1~ayLa!*dg^E9#F*XF|q z0Nm1i%wbalD4mN1c{}*^>r}5^nGZfd0?4eHGvS#_O5o@p6#TkQP*CCpETC5;SC&w2 z>t>@#j6XT~wca*aGS{%K%hXtDXvVC0v}M~a3V!{DLM3Z9#>~>vLfq5I(UF=rY2e(b zLG7jC;Sr1Yeodt32sL^Rj9+~m^Z3~_lX?~Og>&lEaPpkM=k!jD1_^+I9V z`+q+asck-oAjss-JHW3epF6-jcfOZS!fc!Cm`wbo; zc3n(Zv=7y(Fu^fi;F8c6a8TZ{YaeahzMFi?m8P*HhBURZ(tz_R6Waur!Jen*fP2X)VyvvJ#XXlyDAlqs-e(sW#fW|N+BlYwsyVOG$se?o@J%QS8W-U9=serwXd|za&Tw^o|a`PgtkNn~Q zFmNwEWlPhZeFq4l<;>X&sAcm;lc5VT+64gyo3RjAuiGRz3Ix_J@SjHSdDnl&yKwW? zoyCGG=IKE>vj2=lTiDc23NB&Crd2HVCX93R)vMR3d+&j~5KK-9=xK(GpEQFOEnO)9 z3>yHCJ58H3mO|gYMMCyq{ti3meJJ`%mnu=bQ~OpLEY42d`qE$LFH%H!1T|^Vp4P2e zOs+Y8xx)RLmizP{GxPEuV(~n^%9F-Y4<;#7{y+ozbf=0H$}#YVVWGpMeI6&|cgyR; z_jl#7(=1)Snx?VXiGDtGsYzScuXJURa}OU{-qgYhX8;>Dv>&;<7Z810je#YR zsWO9m@rF%X(@ROEkTHV`HLO>Q+}!f;9E@LnL5#<_bAQp|Wvl7#z58^F0e#+rrPQi< z<7u!en%IaxSGm8PH;>85q|H{LI~0VlLDZzITf2HTio4UR4FmXD9^>50R;;0cL&wk* zzfn}BV)-?^{*uSWNq!E9`EUn2&h!^i>wLq}v~cMPTC;3{JAZz`6Z2<2=ASqsKZCfX z%k>*KO)1wuvB=2;=W!u{24M<|9>bZ-(KP?PBeUN&3_gdbd*^oakth9-fxT$F-*i2= zZQViDs#ILf9SNOExI)A^aQ57JKJTF5GKv&-r@6Bxk!Pv$^!)h?n!k7%wQAV}2)v%p zt*%%!nfbGKv(_EOu8-HyfxRh>^N&y-+c#>~MgRmj!%5>u0l2~4-Z3+4h1-eN+Papx zi6O5~qtC|Q;eF;8F9Ii;;dImU^By{J@-$(BSqVf1Mvnch7G}v7k+4HSYXZSzd1ClUt3$g zN*#Lm@DV+J{FGX>=|oEx%<|?1T}l#DqA5dvOr09~(80XX4VQI$iKxa|uwnC7x^U@= zXuD?-5AvVk2jGQK!q4ou#{dK_RVsF`QLT!53GYf2{Q9*J<2$zd9lAri1OhS83yAG* z`SQ@E%U6xLd2ni)=l{NtEtIi>7>~CdpZ6*}JX~A5K?{2D_d{}YbfATcms73kziD`k zUHO>vG2w~TXLPO?gQk3)89M@`8t>QXn{8XST z_3k$mAckFT7N65nI=_ycovq{G;bT$8T?`g#V6ylU%v^$F+m1cNzL6cJ#(6!M87pV!rtW-==Cq93&|AHlk{-|1|0u3MBA7N={_%{#KVCdCvh~StcYozE;=!2$B9-GSD zEgyx4M_k^yX?5-f&05ptE7$14#mj^&DMgET?B_NnqyIMY!)O_(6^!5;*1~gKf^c*E9b4dbmrWjlrML#(GnwImK%$&v#S%|#CiM9y@F$q z(H9eqCk<7qUZ0--`!D!lv1sGq^axIjZr;9QxR&uEWU!I!E?++B6fu{_xXq6?u3jR* z3ObQ-6Q_ZNcg1r-IgfioR2)5iG8R$`fRSWX^k1}O1>L!OPv|b{)vhki=Z>z4T;yfF zONoK_gIRm*hD`e92I+ zFYbr;usSzu)sb592EqWHn>oXS{xc_0NL@1q{}M zi#Txk%5`*)xeVyC_%)G57A^E?;9?vd9jQ-`F8FOEzbf*AIs#w<2LY;Gzd3%(#BaU$ z@21md|KtG<5zp1JT}#T8Nz~8uSh8%jfs2_nb-e5oH$7UQyM=`x!rpiT{g!hFu$MdaXM??t&bzH*SV@#c+!IH3lEl7&H$|B@vfbK@G<7d8^~JBw(t zY9>KlsbHbZ{&QBbd6=TWz*j;wL;A|#rtS@+MnF(duw(7|%|x3e;EIs(1Y>;r_C0yN zdVaA^Okq8!3058*1QAaL9qcN24-pVMW5ud<>FEA#%mIAZ%9E#(@lK%N&howEfwYWj zQjVh3Pm|VJUUUh~{y*Z5+_-4&j2ih0mJ|zP!lY?bwNiyt%ne;$GH*ui(&ej)9bwsu z)ikJoFIR3)zV3Yn36Tl|IC5Bj;@v)k&mDL);JEN-%aGwGv7qM6TTK7H2qe_dELEb| zZU7TRO-xwmyjr(xhHLENV|@Ll%%T)2>?swCx87bQ!O>JO#fCG`9joN)lP#~{PR&~x zdvF^=Lf*!_opO7?aT=TRrQlxCKLFBgJNGcqBo~%j7$Eq!gW(Yo-UEk?79ub1cl5w^ za!H>a#)%`?U0r|8Uel*+Y3EgIHVWepuGfPBZ~dyp#d&^2bZp;BJ9+9Hu{m76e2p?^ z&e((R+YKBUbHAEBA_R>nt@Dq<@WGUB+Dv~I3vUQ9#oMa{M0KJ6BE4g$wxD}{-=>Y~ zYiibOLf5X}qRm@(QModuacr=Mdwxf7*Z_yM8@5pOYLy*%4%_~RAQlQk4xSB`xaZ7y zVm)!24z69f$otUYqlOLWi;z-dg}D|&2^(*Wj20&|XUb3<8>*rnMue=(1|C2~R3Lv| zcV(!c!YaF7Ypu=QxJ5f*VaFVl<1dwBDa2uHt}KYTN#h*(r8+V6YPEo4CkbYLBhbN1 zD=YTkz}ci_2U_Sq4c_tjxbf%ADCX>5^Db@?!+>ShJ6_&MND!0S5y|ap78Vv(qiK`+ zG~0gxgU(BWKT?;DZE{0jR;hvy?LT-#SYTOHxz7_X`|iC5#KLvUn}=#vtAa_Qxp?_1 zHE7nBF8&cfPEIMdG;UC*DnJYb(dPPvleA>{8a>O*-%Xt~T8OI59r;f1n@e6z5UatOM4$7SbV%mMJ@CxMuk>P>&rfVENps_kpKW707*naR9VEMU>W1< z@Pu*zH_C4Va2>cv;CWLxIFQ~;-oo2&@(czhozPcqTDz3erb!dVeFHscpp%mm+Sx5U zJfcpGYL%B>zIvTDY}!hw>VD(KEy|K5)AANg8nyt4!3w;6*B&UJ;fW6r^M#+(lPAx_ zqOMmD?m`sIBCX@f)$7HEk~K>vnlob(01UogZMbjVU~%w!C&tHZo7OHbUa)8x(bhTh z7E#3tWgVgFDB@8_Y$%719+yR}9RDGRp%j{~L?7+k`?=a>>`p-#C?4rgNsWqxu~wOg%bUH2M)?CH zq~i_OI&zGegObHd@I7ZF6o{n@IDXpTY-qf>1A*mZ&tJGi7cO1KVm~XHNkdJrr5;cM zT3MQxY6}(s2#e5<1dqd#7C@g~-8ziJLIe1&T(bdAlIYlj<3Qpp({3Mz(adcHaRySw*L`~aHJw-^&*a=f<(b82S zy{`=~PHkJoAq~rjm9{YdZVq1)=l!Ia_81mCWGk^23m$*rd?@Rd8hX8#lZQ9CQIn zv*#_O@uP>euoQZrAL#{e8v1AlgZNqostRktHAPZ|vZBJy^jmlC4#Ywin?m!(=>I_O zzgDtUQ@U>ux4S(5_O^D7-)O<&<#gfV6(L$Nt!>?^Nu5JS0z^BmUc1SgV}>&H-(?8K zecQBc)olKPMazlBDq6m3J#QF)((GvyJy^u{h_7ALLNd;PgX6xLAXNm5Ph><~H-F5J z6KR=?)P49=8CjE{XTML|+l0$)I|0pcos4a{3$|@-ZlVXs>Fy9UwItp$& zw@&v_lMp&FQM^{Ci!{iu#vn$DbhT&z*hOCGct6?qsIxOLx4t)%_ zHw3!2lul0K8P@S4=7}l5VD0h+&{+kuDCRtD)C6Iv!(gsoxe${99P6DVlJwCA{#j3+ z>bssfDEzsGMe_XLf5kKB$(>7n_WLFbC=ffwpiklNhKc?6!^iq~N|@)8>7_Y@D=9>$ zY}aqxCK!7}$W<2DQYZr^JkAFo@p#}Gt<1O#AOq>($`yTt=%~NvBOHGj?h{z*0AINUfsHVm&#PEK}EfMso3YdN>>ycDfeeDSpDLllm2||K99SU z9?N8Iu@^6d+7%Hm8cC54AITALUFy`muPHsa&J;9*TjRg!V;Zk`DfaafDMpK}P6=@E z@maod4H}FXLt7KpN{?V+jy2s3D9@#z?kCn@fE(jUUa_=S3Bn6)Ie+mogVs~gK7Nga zzirjpjSP#fOUKsGXKj2D7%0R~nXt>l`j_0!&XKS4X!H7Iveila{WV8+;n2wUvxhS# zd}1&eYE`cy19{1W3ffH|1+F2K$Vy=(kORAuCDY<_Ok%!Hh|tm|rHrkV$J|&aCm$nm z6yhtn4~24GF9kf0;hur=xi|-#D2T_z;6f5xSdSdeq;TQTB=DS*=Uq;0Zhsu#Pu`_V zh_>n#^AYiWA;%XsjMZy5QK@oO5I^a{&v{(3s3$mvefXdYOPeN*DU1+GdHCiTF(q)F z={}Ly3pN;|WDh#i^N;vCBBIeYrZKSkoQWL^85DdtcEXgIRJV2wa&$~Ff(NZ@G(eXo zs5wq75giVrh*q#H4(!vtREe^ch2Ku&=I!Xv{%tNFbh<^`ckbbie=l~1(ZdE%s#GZf z)HTNWO%p&1vwe}m1w>}c+q|1DT)Gn0x^xZ>4ph8Y5fKW5M_jUCCb*E3ET(xbWHAEg zqKeEAJr@WOASqRG;<*+{>C>g5Hz98cZVybZ0GS_{!-R3?B8zLtD8cQ9b@7P_!%bDV zZT$U6a6`i5UXmMGM1N}le%aRx0EF72Sdg%8!H18<@5t=>$OYlnv;V+hDpWB4WWHW8 z6XGC5(&11lLvM>VB7B9vOZDL4Loo)p4#p)$WfFtn^vPp|#V}XSUrG6FiJ;C%Zfj?| za@xc(Rr~kuPS>vA5FDrEXBFo)2}xo3s&yjd3gRi|?~cu@-NVAdeEA+55>l+xb6+2W z98);hMmHwt_2MvGeEet_S8!pI;RwEhB^S&I6Jn&f`@~K87Y~J=VFxvphC@l<#$c_4 zPH5G-jnwY<=B*_;{f*+@wxKaZ?90xyl65jM3A%#@E($cmaU18& zoLnPM!Q#RNA(`Hv%o9$u@M%It^KPB`LdOGkVNg=y!Z5@?uK#O} zUqqnt^_w?E#su4B$^PQ!%3>tqL4Na}?Z1%TG6>?_hIK`7!ATxe&sVR4#dm4bI2$-F zSiM|-&Efk2ZX(uJbmaI6@+nigaPgvrWrt^)=|7)V6!G`q$<>q>=W>L(DXd`-Me<%w(Syg30CEtze38P0EyE!#Z4?JU8+PX>3QHm4@GvdqaVTebmQhN+OTm8 zRjOEinbiJ-v{35c@R}!2PCCXLw8;Y^VfYc;RA!-uu(E2jVas-dFJjDMB2fY{vj%5lU<2(iLlXv9`5kb{UmWPADde2D@||=xY?qeg0mj8~J;SCIg{_ z2ViyYJ(wCbs3ial&pdz5RD{z+Xl;^Z8a!f*urNZSidevqw{JuG_3C2ZXTUJA*ai$4 zNy7&9t-+HsqHCx2+E&dPg4=q;ec-ZZ|3P7f&XL`fxzuV%z0#PHUfOMVLr{JxyaW!6 z5@&p@OQ*KQ;cX6JDPOr3?cKh?nZf)mtdh{_ao?4&w6N&){6!#5o<2u#oT-_6^(|i( zUiUfIZ`vy9AK#O&k0?{PQM%{Og6?j^MVJ})KLC(HEFXfvOO-4pg2?|k`xh z?fE>n8t^?ANF3NWex(~aVyv(-gXOJUu{=N)fS}#9b*B(fU0t&aV+*(AyfKL3KCfTD z8E&F4I)0Ivkh#L-$&+v4cGQ)|8UApmkc!D%0Kbx9hzoN8pGV#d5BiN8;f+3md&1g{ za3`sv<-WE}Xb|JR4|o3YNAn!i#}CRRr;Q?cE{&Zyg`A{FkC?>BPh8jsW)QLoBUnOl zVz}WQ*I$3mcIomJa~4XItYy%vAUbmNIC&IupT-R;q7VagCd5 zp-+#_n7nryH>mBvV0OS#qiI^DRzm@Duy76^(hmyQi43gydcz)d`Q{8U_vuW@q9gwdX!r78%=+VL#LL@cut6J9lQ0R!XtbQ;Nio^qM&H@ zU$SkrvbMHu)Vz(futTY9r*^`^N%~aQltk%1b1)A^4(Xq%R{dsTGpbyz0Uh4I)fusj z!w2{EM38rvo&%VhdTkH^pwx|EaS=X#qel#)ESWP2CCb15zR(~Q4<<7>qZUnt#dnOX zD}qjt=UMf9d2(H;R<#oC-FJv?-MUL_)@`H)^=hX|ojRrN)R8@!xeJ%jj9K$ZP6wlR z{n7C?!>M=o&eXhd1G3au2HM%$W=HbIkdRQZps~R~1mZCpAU`0u%K5XWkcDN!E_n1q z$F6{c0L9?b7hg8>1pI8^HH~x|u_^bJ zBIV;JPvlrDkGO)E=m`DWH(!$*-2-m_bWMr+q^7GXK9+IFU62Y04gyMB|{oy215+g*eh@dRj@#FY8b zL`t}y=y%uT;xZl+$tRTQsE;r_a!{XU~Pz5(~CeiDGgJm@{^^b{_o(4`%?}EPhXwG9@*tR~x@! zyn-aa9M9r@p28mP*%Eq=@z@r}qBR3zp^>^sP5N}{M4T-)HApz`-n}~(+j=m^y`VS? zbDfP29X&=5pFAe4oD#)6<@m|O;Pme(9b8R3zrb8e3k&zlSFefiqU3gVangm!g?XKv zoaBK0n+ax}1V;pAZ{9q)S>`?zn{q#jehUv2aQqY%FIu=VclZWM+C^|5A%o@EQG@HO zS+|K0tjlfo`MrHt0mPUX03u$naE4i|^i=1C(cURVibj2Vbrxx>5%9fq_BTq*HhCB6nus@VtNj zZ;wGE#t0V>02p?3WZz)!3?W?$6uWwM9)}uX45|q&c)^=JhCUBNC{)oRg+wZ6_#1ZY z)|)!CX;~ajxu(DhF2b0H<~T9tay<1^Ny29Ku3MXi|PiZvu zk1->ll|tcS!3&MV#cD8T^XASefB!HcK@5u7N5zU3a@o0iuTrGcm;ogNh{5*;v1<%s zZgFPG8HI%o#KIyoNf|u962aTN2``@XEt)n&uKnlF{(0^!`9+BxuB^9kr)U6QAEQMG z-=7YR8`PaSf6;OQB1kI(@WQ}OnlKU$n<0G71&PgtZQ8P3h+7_)`~-L_oW()9rt(9uM^kIc?}lYR5n9W-n1A~At+e<5PE zZ%IuW)CGV+1ixnH)^B)eWMOXj@vg0FsZPTdVzEG3jW8`=A8%^etZ{J|TL5tQ?Opi0 zs<-dlqxlP#(#bRDgdswo?cxVIymu@59-&G(Wzdw8FIKsB<0e(D*~ny${V!Fw$I$0s zj|OnRjas*9D+LDy(?J%ucI`PJWps#t&=I5qtVfIo?l^DORAeoQkP<8=26#P1-@>O) zq3engG9;NNvtPM<-B=%{i%lO6X6g6ljd7oau`xXH9XTwzo;9oewz@~}!Lp;L95)r? zjWD60A0mCdKuugYG3;g*^z}(vyx<5*^TMmj6JvedMlHplK-bg1Pd5PANzzv!GDXX{ zQ-=G`n3SqsYTfx`_s z?V&$NltE`g9jh2kc8#w_!`c1>$-K z4<8dRV=h1j4EPtKT@`(OX#6OVJn<19`?IM&$Go&-F(=_cELvX}_qpG@@bHeiHm^=s zy-rgR$_22u_{? zd2=Hx?G#F=^wf&rPf-K0QpIuzg4SLs<6In8849(arnpy%s1#Ql*$Q>cEIS7{g|+hmXSr$Ju8>aE&lhT$25N8RD!u4oGliJd`~%42s?O#y0w_&`(5ZA`P{kub2l@! zA9T=5jU71{qGqB^qSPr(y=`qaq;2}^uM6;UjUy-;?Mn9c$V@Cd zhX(R`%knjK$>w=Psh~|fL`mUVQ82$$KqvN)!_V1%-~{=gT9rzf4jwwD+`-IRDP`rp zVqwW3r7@xSOez2-(_Wq+11eQ0S4Q3uc!7>2eZH-j=p3p*d6g>OS^>;h#69C#OeH>G zbDI}Nr81>Ub|Dj9&N4T^?dtS7qO5ez287BmM>MosCF$AwB9v1^8((odW{-OmTE67YdS5fZuRGDJ6o zgP~?7I4d5bwR{eg_<>}?vLz|@XE`~h$X>ak4{9GI)`GW_`h1WvMa#Eov|xv@mz z2tK=rs|22x0MN`?*)kXA<@#%O)UR|mI`lO9n>jL=NbB zX!mLQ@(iqzU&~zw(Gmat`$A+3j+GUQ1Axg~82%zVMqv+kI6-%f%Uu23PCJZ&@87qZ z$dx4(Pc^F>lMz;72#Amx7a>(LGD)zmi2y8(#{R!##XeU7FDu6X1K^GPO83AE2`hU` zplv1BZA^>>C5;0Bahvq|&&D^_f?e&5fJavJj;Z8ZuHVQpenNSy(2Ygo#$-9yL}Y#>6tz-liD{jfp4)RE zm6ALqai2Gpz9NbBtdCTnm>3mfE)4!{HL6#JF0+TM(^I6!*D53d1Nd9U0&u8A16OQZ z1sOwgN}z_{#@Hvfr%}TO7{n9_O*N)P!;h3xpVlN;0dgl1#$%41j}+-V#M@Nrv`|T< zZ->CxSV$@%M<+*v+9@V33^=f0?ld{k=5h&VfPkff|)8`3;Q%m@%|NYi(`a zdf?DenwfLvYXe`t>TYABy~5ukVs)By(71k(W94yLC0;<6x_bEnQJxVA6t!CIYsQx0Q>M=$L~Z0RQkq6joJxQF zby3C|d!@)|R#xSUXkP^d32$J$klho$L2EZ`X0FPM`u6JLi8#4bsZ#33jvTD%)UB^D zbt|lu2BkiNTw(ft_wF4mXYvz0O=0gqA9Wwiv0;R`tAYjcrIQK{d=oks$s1fA&~P(- z9VrFY%il*D9TRD0d?JmnXG#~P&?6Y`rD$86bXdw`mB$-hJ4#z6*9B9*Q(W7i(8pR) z3qvwp$elzWe)=pFHi_h;#Sz5$;jH#@gToH|r3n)~uKrd@6 zYlF&3j=7Wp41l+0`FvpjKw;;bw{FwCh06$e=kOiwBRfq?Rn7Taq1FnD4a7u_{3nl} zi4@ARw=GydJ6k(Ksj0HQHK=*h`qZUETMaTj^y=P`fSf>Q8OUT-F?X(PJiu)pPc&;MLDaI95ms*lO zOXwI>sFCywJ@|VRBfZ1l4Kfa!GFrTN7BAAfON8m2Kk_%pqrBWiqd~91HXFnama@R7Z=nnJgERtRLy}! z)K$7ZGLJ0e?|r3b4wpE32g%)Jw$TRYCABY9$wBb3%lR5|Za1WVZ6}qm!?iG8XN)!x z^aK3AQc3MZJN8P~#T@7-^*_e(u%dr4mRB`lZewW`q z1Q+IAx}*p@lvPgh-;WkXb0*4qOI11Nj;Y{(5C783H-_K$Oa8SaC!X}NQ{ zB5kzh*ojl(JLnNIxcr2T1J1WOC7?{rpa0#pXFvVG8<14x95bRLPl9nrkDa6<9tBbN zU^ai>*$f9#(ZbSl2Qo<@Cel5BUb44GVRws1JZYR>zIvP|=;cNIG4LD(lJQQW$e9GW2yw~qb zU)%A9{Prl%Q&E`plh{FCrHW&0e&Fk)Ot?D|J|YG8ui3Lxa(g>i&Q409JfMNl&4j#t zOILZkf610rRD|cQK#;i`|Mu$ax$}tW6tT8Em*ujB*hp^kf^~ta29=Hq6)FIKE7Vx% zpVTe9aw>41%lF1in38VQnhjCbt-N-D8HicsXZi)}V)NFWsi2CI!A&mGykx;Fkv$ky zjeM)t5sZ@@g`vp9|LM9s7fv7Bhj65f+*c3Ha$?F{;!4Y-am8;L%pB~KQ`K6Hs7t4| z!qax&jtx|@>~A854GsFyIW@rm5E>fR&1grA&~s_O(!G0s8!Pm&gK1DZP~hQ*Bt57= z;8SP+JWtJk?<58a19a~E1zNXap~JI({uQ~UkWE1ZE58e;KTjQE@xhT0lbJbF20E~N zGcQOx>d>{fsHW8R_vW?%3{(RKj}$@h&<~a`=S>sG4%Y+*z7$oy<*`Yb(uqzT-RBY# z64HzZb~?AI5k&uvd@XD&2ls5j;sj@5gZNdnWy08DRIN%yn;66x4JtliLjuTR9Kn$v z-m}F8cip;UH~CGON$XZF5B4Ocr0f4c4@ox z><_)FG?8^Q&2KCKWH(B&ao-IbH*u<{|0(CHg34m+h86j^Pe=1HE&z8_X9s7GzTB~S z6=lns#R{I`J^KwYRA>UgJb!ot>29LTb8!DnnzsXp8w^X(?*u-%4RNI=e|E1~uc-iL zTnopb?A)5=3&6p4=hqot#6wUh21R|rL7<(87&x+bYo_;+k&Dq^$V`FSnvd^Yma8ra z?v_Oq7w-zyM4eNl7(!+BqJ;}-z7df<8UO$w07*naR0R%964^D(q-dmyU?xdX zf#0h5PVCWVF!#CMTM7{!J2tQ3jnR%4Em=u^Q)d|f%m}=qxLjdVG&Uy0sMtrfn@pKp zjK9W3BP1}>$q0;_Pv(a7=SBAu@33c291!{A88N9vlZF^XjAFE6t-22%9^}oH)6_jA zMAk2Qrfeokz9j`hfr>R@VehDAo6eN-2PfLQeH|U#y@{qy9D|S>5hsaMD%h>JZ(1dO z!$OjIVHAeFefOSm?gB%ap82yTi}U*S?1DvgQvQC%8A3sFVq>9c<@iGq~|8#2k)TTs@lnP|(p z<)pFF&}?M0&{`wcyAIi6k^k%H{_Q*iH8g7cWceij6|2|L{KYG%MYD!v!bsqy`hecO;ZmdGfE5My=X$Zp!Oda(eh z>D-SekM0q51i0_!uiLnV?%cgk1N-(A<Z@SKe{ zX(S!EjaIAl{hWc|_8#3jh!CXyy}PpHwn?m&*6q8AvWIdKMWZT65oF|ZYG-RJDq)c# z#4#oi)A0ffOP5w3@nfPurhF3vD~ZLjb^9*r(!C!!I3%Y5eR|NE6$`2QZ%Eoe<0*Px zBg9m`K#*{Bnfg-^-mp*+2%0mg4k%B+%3XW*qj$VG=FXbLVqfa#yekj*F?Ff|l1@yd z6>@XSgMjF;pY=sYA1Js^>fURB$ueEw=v-ZMP!8@RXJ-@;`jj~XF^bHwiOd>z@7eUo!qeZG_rj47nGxwOD2J+lt4sZatbX;T3+{FSTS?tq7WdTB9 zHFKKVxsS>!?_08jCvOs^u{!V9t61ZOL6 zdN*(05zm`Ed2$}Zv={iE-ArxpNtm<XafzSBWJtf*3CVT>-azu{}@}AcNj#_r8N7 zAs}|kyt#8O;Xy@WHb3La)*`1pb7BSZo4*GJ`_0=Bl9bU&kx&SM?*ILWQZvXPB{T0j z4!nQ|@&bVJxwUu>7Qwgf*oB<%w#W<5P@@kT{iqMedi>;>;2MlWIq^&eHf{UEJV}B*j8||HmZQJ(5wr$&)Ol;e>ZF7Q&ZF6GVnrKe{{-66k zFW@}d&-Sj}Roz{6U2A<8)=LUEBGpiHV6qUZ2*~UR1F1;4g&ZV|A3Gu}EberDq0fv* zsTRmnKNL+4G-+uQbnUtq9FcSYYtwgPAwKW6ALw5Kdff9kO*N;(y-ZJUs%HXY_`2;0 zUDQB8tmQ?rI&B)3NDSs3=m`ykmfh(&sM883#r|1L-6rcX^&w4o+Sj9on1xr6 zA)5#Kzy^$*cWrc-;<0c5;+dpg?Cu7NCo+GeWsi5;D^+ajHxs7{4bhs(=d zx|aHx{zJ+@8Yn)aT&v1}sP0D2V1Jl9Or7qN@(zX#LkuD7phwWsQu^?jfU~jzFQ=oB z`-jclvX5mG)^yCFfqj9wW&FKBk`bvKt)xc`QM_+!AQ*6vx&36L>u+Bgf7)zkzv6zY zWczKDJ<_QDXc@Wop@e`&+WxHj9qEl_7k*EZ$*-)|3$8UR4l;*aO=#4_ zWiolPB-peC|MuhV<1d|BUvrDqONMfALpEWGzu(usAufv-soi>y>M8h>cnU)(q3r&n zOOli?!UN0>zyBR*(U6||Hg%`FwWMVRU5!fdw+%4QrulM=Fj7WDku##%wV#EW!EW2B z9g+rYmP4CguXmBYPP~I!(Xpxhm^?E``C{1!*pfag)EuOb81Q6K?91G?$8w!8reX6t zzwc7(gHqOcBzvx5WcGU!U|r)z^)V@wCzMFo&r%kGy#s%HJWIkNazzMo?#B0I|GGlW zEUc9W(_%x^I38%|7y6|jvD|MWTXcA$ToEuwLaoIERR37v*%r737t%=t#VjT&2lp^K zvolV|8qwMfXl1;ty`*|4eUN!TKAUysB#(6p&?PWcv>!pKROf%?RAjX{PuhSCuv18? z7wecC8;tBTV^XCvWRcC-E>_|6WYPYE+~IYge#(%ytixIT1NRaQhs6X_H^X2^NUK}} z9U9ide!{|_YC(=4qDlhKwrsT=B%-IchOdOX7sbkuH+K;oAidS&2$oMkKNX^mTmvgZyvi zS{%V}c})`L<`HlN5U=d0b~>HJi3;sETHI({noa^T9q}ir=F~+_oSti_+x8g5sAOe- z73{8-G$ci)2+o3*$`f!#?9#m^hc!_| z!OD{Dbza;n9u?ysf4M0>w<0MT!^Er1(MUjrCnm+A!c>d;QP!T15&apuZG9fY&9$no zvi(aU%hX5Ecmdv+CFGh`rG%dn4^1L6a*m0(aQlaWnkrRnVd&Q)f(faf1TvAg#|;M{ zctpD|{0wqT0DA)fI5L<6`)`akcz^9iVi+HtSLj<@{@QqOgrjlJzA-_v` zI(5NHY7TRQHKL?48cs7S?t>U9`%IiKp@){;Jxlm-v5*V>o@-Ub(?*P4F>)57oE&e+ zF$QIp=WL7+64v@Hcvr#^)ysxVi>rH<%(Ow#FD(9T_XvQhVjh)hg_NkwutzQ7m8NeF{)9Le<*6$Da z*#i*i1b&UYk07Q=Z?*LMa3^|Fk5%k5*ZaAZ3rH^kwbk8Nv-0-xPSv^qG|~5F+Hh17iXF zaFp5z{8AXV=jj-W%~}n@vi%3Ii(=j#2vqwMUlylx60)n3N&KJPtuj;hAl=D~#Nb12 zuUfC=iN}}@p`D%cIUvSl6Zo3`>?`dm0L4Ln7d9N!(e3!)Cf3FqJ-LkQZ{zg)*jNHa^l?<6_?PFYhuJ(bF{u9RqUCG|;mJ^?ApC@Z z12YI2{AG)Dap=LVcQ@h!A+G==(kA*$m)BERe?82J(1*x!DQEqT(oNu?L+s@%!O>j- zCy%2C7QsfB_9?pMv_6QDE1E0G-%jfN`BHCx$n8v+ZTK3s{%|7;!)8CYXmNWn+;b%f+;uF(xEzOOhso@04!d=dbfo53APsJ)G-MJ2 zpYKjYPy~wCb)Wh_F)TpROonzIMAYj_TkG#~)Lop;?9KR1r$+Tcy8U=~_WgXTJ2?=FMgM`KTCbKwQ@BI!jE2t4?o6x$)GFvr?tp zzdoN5yGkHls2(s>oH_C0-5%TU5s0@Lj9KWWQ?J}kxA~ty><1$jqd^&vp^-!vZKa^# zP_Y!zq?aT`l@p*0N|?O2n+W1$aTgljJ)YkTR#R{xlRV-H=U)fQD2AC>0G#eiK`}Ny9s@RnNxwC zFHAJG;12i~0*Sy&Mwg8H?VNI>GWr9(oJ!Uq=`Fluo3baJn4s(%ja&wC@$0z7=8Skb z_9byr6ZU$Jzaf2VA^Yr2=9<;qFNn?i37UFuT9>4vTx6u~`bmyv@(k#siVn%QVjTG0u)0Odl=sKxrR3V{Rb!SM{i?P3e%)IoOxvTp>9k!LY-HyQL) zg@(kwo1}IAF@ofj5R5P>n#s$Tmci}_Mg>1PUG`15z(=x0uI!5Z}b1jsl@*o7x1jo5>weBgnr#1UUC zQ-txr_HHh>YU4uBNK^-xqbag6*Caz*`KT^bBdnx!8%0Vn35SJt&>H2sUF*yXG{xu5Aq#`Xpg1P|zfEWUTGN_{ zs(dbyfE3Gd{+MHQSjMBkinVIR-Pb9H<&DN$d*G{B_&}0i5Z;S9yx^>gN0!_ zkB*j1g+mLN4@hYR7&}-?SPUHQtNuWe>C6M{n&|xv5=LmI!-@?F$iju2$v(0&nIOCb zDZ>&PO2HUlZ;{dIVi4DE=XwBbkduHyh$Wi9VSq~443 z*6fVC2sA8AibXnB0kWB-Z}6Q5*tKnU4BjzW$wz>{<tl0uYHM64%t7{a}S2p(uBvoP&z*%3GpY!!5N8zm@g(E1PkMn@wPu$5)!cYxl!Gz$rihEV(G z0fb3HbSbzOM-mu4?tH%au1>Fdl@O5WZO-h3x<}mPVSV`kF_a1qYAv_9k2+*s(9z_a zvVR&3`1~3 zQs|nXt0DM5+k=(@ zPG~9uR5}HBZB~^Y`UnVCj7y&cG~saO&!@NPHH0u?$wZzm09-Xc9v4{j6~^!&Gwd82L?9Vjf6@5#Q&e z`IUU1r6?CsN&TB=b#bv6OG^%%lP=mWX^Cdha=LV)=cq}V)VhLa6c}LQlQAYH;{z7M zcY{GlU+fY(4@~B<=~S_PB{=JD(3Zoe_<#>D*DBQ$#J5KSdr^^uE3$V$$zs3+W~kgZ z4&XQLOhwx;Yg^M`JFyCqhNDyV9~xJ%d>A8OqDd#hGbh|z9q#TGYY29J3wLKNbvt|G zZuVj!mGtmsN}k1d?lMe6dZk6U{03_*Um&xoGh)-(FM~d=744SDd#2yR^Rl2Vf~`UwObBSfx$LS|wknS3Of zl9wicC&t*nR=`x;ippx%%oAgT*V;AN`p5}8=U{`t6hab)ZcZPELPa28^98YKXxy?p zD}fEDtI*tuN!PZz(){}y4FKVY4`&WsJ+=Ck0?^*4H#Xk5iyS0kABue-WETcX>BRQT zK(g>V&0u9yVr2P!k1DBo+GoEtGWQIPeDn3rpq)3DswKf%RObLyzNAKE-nPe0t<}n{ z)9*c-Kza=hf8|tnN1v;zE?i{M`VjV|Lysn)={n> z_Ee5e5n31h&v`-fQitvnd^U7jr}pV?(LcwTQLTo)R;O7RB$1wH0^3;4av{M|4km$m za|*Q}XZEUDm_CWcBTe?rB`nEAq7H2W68n6FrXLy%$Fi8FbTHK=6_BJLU-0 zrZ5UKB6ec`9fpAEn2qq8iay7=9zdi6r>dz&0XmAL;fLeqiOe#L%mG>l60RT$S|^%E zo5ApIgMfLr1hbYmdg6R!x3n)7nhbf7`Wq@LvC09NFnH!2L3Din8VfPac@K_x7BdD^ zB{*A>xcu*MAHKMbrZxg^kY(l9#}*hto3x3; zWB|SZph!qm6g2(^^Mj{xnOa5$GKL3_t%^#1KP&$O84)ljmg@S%Zsmf*WRMMHGQ{P3 zmk-d4DUq|@`7P~R>9LiVGvyXdKVYjlJN zxD1>C_@f#^LEjM}4LnGYAzb;eCPPqp2fx~;e>w6YtT>K-L37FtStSk)lBK8k=fD4( zb~4>sjf-~ERe^6ZWkdW+*jHP{a4UQ4n4Gz`E4C(D=@KAi(R2ahwtTi}Q$gA$5@pUm zKwi1O?KX>w4$e$vas{VI<0n+3%mw9sAc}2!063O2D5fM(n6K znX(36ZT#;%tArhMY7~3C*O&H;NCHUFr#Zod0jldzp)>^CX4>! zdwohCR)0oPi#B-9)$cXS(b#ETf!3R|%uEjK9)C>CT+rcVz|egUTt_CU zRqS#CTOvZFqB)J*tL#6-G%6nxleDMZg9rL3HmGqg*gQhR)UOlFcCRgEIn##U`hob2}7 z7PPQOHr6XSp{EUjk2ELR5ensan*~4R->h1`N6fS>%mLm1%8W)f6b^M zE+fuBfpa3GOMPN2<#ql+)Zh6kOk^tVR6d4O=`)Vi4(L%)G=>h#0NYOYz<-p{Up^i1 z`&Co@;`dL$a-j>(uqg!w)sB**Yx(u?!9AVZ%a$b|3p87{0au<3l|mk+nP!|d!DIo{ z3|uK@`QO+=QSV<1OoEmOAGdd=C_Nfqvlv9Zuo2_Nq92%*Hp#lWy6(ZCH=C8B14t!6 zZh4Ue0d097v{BAIZVujuQrl0o%%A+!Hn>-Cn|oa!mU4-3abkCm1YAGZGd0&HrpEH1}QMgFQZ5|l%wc~V6O*OIBM#E$}rg$ zO>eE`S7G7RX0%tbKC7g$H$VRQcYR0nPJo&@%*XeO? z5#A{KrO2g=h1a<*BBH%=vqWn*6M_fgqJLg7HC^!f`nYQOoz>RH*6FctVkW8~@mSz( zNh4bZ8n({nwaOBnE2c)3nKY)6&+AhXMU?A*237Oqd99IQqg!K(?Vd&bJ-!^}{;-xb|(Lr^{XaDN| zH)lMgWvc!oO+n^B%E{S0#mm)p@9tRs&Z>KZ))0lNvH-6?>BH0}XLGCyraaM;k8gyJ zcNgPw-J5vc`L&XYaCB&P)FG78k9K}w2t3G4d(9991%=_ic(@$hEA5QBsy(M4aL1oP zHmP(pg7SouyzW=Sak*WNkFPNJf{rqO<2oE#^~?if!uzd+KD}I1iL`QcmX+HZm|*9) zN*wWvj-U=6XEYG6XPiXj(2RPM4zC7Lb84~kW8P6w_E4;=e(bl89BYL9>~lBtMbtR8 z&1cEWx}IXq|LGSVHl44+!+~k07eTyx`_peL*gg%KC9v;It9Ae*@(sa9z0}LS#;gR6 z1(D&y>=4T1W^kU%^-WOyaInxyDrjY-5fddMUs+D9X;?RkP}1j2k|$G=DBRLH7aI@yN)pflwc`#g9$8>u}`eh3U+fs}e`)w0O4~ zy76J29?sJ2eyZEhhbG4vd$_r>gGD)e*+qJ%97KM@wN)(tdYuyTulrP6tue<-bA88F zWay;6*pcHTKyFf1wT-y_SGp|@ln&>9Z*1tAl8ey6oJ`_q-mm zQR%rj;&DEn78yiOKvR>;%4azcQ=4u&DnB$?k7!P_6AOMC3RF7xPVy>WOZtRn@q%q!by1CyFWcF(fD+-V_m<;=N`j4V?_1ZlmgXcIGvhr#{ zX3baR(V&}X&>koYUH5MjO?$fY2r6tuED8!Fb=K489eq}+lnHu~JBWRx{d?234Zynm9(mAQVmS}M2W zr^j^j;qRx|6XT>DE1i_G(7!pHzBuB2oi>gXx4Q`j>7uix!-LEcSV3;KkTW)JOWO#~ z^z?m^kFdT=t|7WWAWC$CdbSd2#vQgXwvXOO0!MOfbkz!WMMoNV{5@KCZaJGMh z;g8liCyikbeGsFeM6$+}d?yNIGZKf*d%;n~oT1GfEVGgdNt=Pm zQ?4{mpLg`J_#MB$D58+veKbvLviWeT7M-(Ylfj+QxDVFCcB#MI1tuF_1V?BYf~$SS zQ_XUWRI3SpXmY>K$n!N^5WVq{^<>_IS$y&+VxVh3kLsya>tx1r7OxvcKiUf`7)T7H zSy&3hR{xYIv@g#{tP7J43mq;cZAn6gmn_$Ci!u*?P$1Yani?JChInEiMFV&kJ>IT1 zzNaEn*CS5cH}gx|F0SmRn<3I#Z6@pkgJd~g;JgozZjjz+b=P}4t}5(Y!GgmK~1 z!4&d1o;|NA%IOF!js4DWZ28>&w0eRPb^mLt`jp8hl75%GM=lvL_}2L1t=C}|h&Me@ zgVFj087zA;HfE*Q>qh_>TZe)|WgX9_{Apt%RF83UQxf)n)Kzt&%0mW2KC509#7ZGoF?)m95B{&_i%r<49laBwVc03C_3a znmoq%2K-{|iCwZD5EnL}0Mo4##x$yH_XXigFz2#~6(Hvi_JeogrY(k{pK4+G>b1!|GL zbt)fUxWWR(Z|aA^I9M>PAh@$(Aj94g3NS7=fZCRy#j= zJ{>p9;Zs2S!Egncbm*_YZ~rwS*QnDe*UD)AQA^*4%UL4rb1#-R_h+#XRu4CES(lA* z(+XnfWN6-&P%$SbrMbn4u%Q_DPt+uAHCFnMX9t%oc=@rRvIE~*K0bQ?hbfoi-sZ@+ zZ~D^Ob$U2c`QL+I99g=fmPEuOV44a+=oEcl4{si@svP(fybt7%%4qGgr`H+*JV`#* z;@`UH+B&Q_lT)5klL5N%6<4EzS*6p|h-X zMiO!Mlk*CbAvc=G%0kCzb0p25+_QcUl4iGIVE2hD;oHqzFVJ*RVmF3>v|870kEP(f z)gn!HIv}g~H0baA_t`?x#faos)IZPE9r^AO%Pd?v>&Zy0QlX=>Q|FD3ley8YB$tq$ z1vwkzb@t_|R7D~gq`IP7v55}8zG?NN1R zvlGPm7-=MJWE{X>{FI)o_~)O5b{$B9CGbMWM%F!7s>)m2q9#(LFy&`Gj+y(s<>jm| zr=NgZT(ngMY4ZWJcnfd7gR$7=AA8|8=*g}-NVH40f+Z?2ZFp8xK1&{SxM zUKe9GG9jjM;fuqjil?zz5Ism;)#q_VWB$SF&N1(#obl3Uzenrc1|67ky@I@fCtHbW zy3;}|^WnZi-}bO?m&=d%5rlIpZ4Dk+Rz}E;%W*_5U&;i_-sFbTdlYCwSTHj9LciB7 zAot36FG)~cE6>-z70bx+?he4NCc%yuuMVEB)m_$&xrao%#Nhd7#grlHd-JECf?v?{ z1&89hM*tB&)oKDQ@s=&VsP;4-0lulF%eF0MA6_dtp096R)^RL}?oaDY<}#-1109!G zBiql4yWd9GqL94<2!aW(+s4Mm-mZ9FM69$tnsS2-7dCBR&B zf(1{&kh~lSUM1OSJ$(;d@@o|==ECAye#@YS`OxHC?a%p2V2p!5dG4k z@9&+-DU13#C+HWLP1;uGx^9|%U@~4jzRF=ewcl9IgeW{61Ajr8fVJl6ipzYRMn^Rg zET!$cKbnrFfIDsgIXD_NZAZdU7mqM!XejCx9#0xRSgF^}$xu^1L(idp=YKft?<27{ zxog6xQPP*XA%K#0XJ|))m(vwtEax!!z}ne8(eADE@t)CubEk#-Ci^dAP{0@;YDyZ# z*~J1A>x@>KM_zbCk002^KVI_oxdrR#CFNe3m>$esoXuc=T`R4~J7ABDn`)Gfi(7OnaYDTtaZi9 z{MN~Y*~!T&2-lq{giockWW)j}zaS2FTFpA4pfm4~P)YJDYByQgZn@2G|NQ6cWbL0L z>fp28{V_U{gS>@U5Rc=cqpMd6bq!IC$_XIW^!LOrsoE^oee?tFqV_EmoJ)~O(gg5L z%KIcQmIf~K%ZPb4vet|*UCgA<^&uhjN0P5PNp=sd4d33O32vxi{e`{Kv!Pi|e#HE#dkqP(K)_oX zG^G1dnoxliWC9p}83fL?=F|dr{b$|Un%3;IzW2dIYBh}xvF9Y{)Z`)>-U?&zyiq&EO5xGI zv`SjC^`Lyx^RP5?E})0{cD__q7=k_S@i%%9qYJIGrE#-t3y(52yR=)pLy7!k)`zq9rN_Cw!_ zQ~Jc0#g9#ge>>;9t&`o9u}TcN<`aR2%TtNK{YA$E*4^72l7kK%;#FVIbr!UCfbZA( z=;?AX9ah(8N^?^b2pWl-VoVH&owNf(hX)IEcb+$jvGLwG57~yhgsmKW-q||A;I>L_G{-gGX5weX*2}M4CzpO4~KWwe>&2$)N@bSu1(BsB5^PxwZE5D{lLyb_Rirk zuh`te=iWm&e&p7y*B7m~gd!zB^fD2Yw*ET?S|j9V|Iuv&V_RPu_l1#M{*{7Vkc~@cnnI(GN|*kn=w9)e#&i8X2kK^CHofvG@{8}woDEm@ zgUdAS9M20i9OsXG=$fcj#8mF|CJfG(qTjz`C zHwmoZ<{2+6x`XuXMDN1X#F~pi zjTOr8?~m#(Halsx8Q)s6eJA50nI}2UAuNvU6C2)QE;t(Y{Q!tXWJhlf4D+afQnwC< z&%Z0I+nH>vI~bTJv%l0Lm&OcCRN4CaPz_J_#mf0KpHR9?s;1`fGx&cR`ingdmec1e zg!#q9#qCQoU%7c)gn69Pe2)!UJmc~nUf2Tn!t*Wm-ia&*wzj6%oqMBwS@7cH;zkmL z!R}Trf-_?6i?#^N|MxRYG(4)hW2H@yi%ur9+hCDpE|xV@natib%3v`c4%ic^41>*& zHs_bYr%KGO=T;q)+F_pjva=78)yq+U>d$x$iij$+Ma6Wt=ABl%3ESf9mLUq0W?_YGS{)vQu$Yf~mb`hnnxVeH?Ry>^ zV0uKU>gLoHmv=R*p1JJ7R$={rCA>9uG6gh?@0Hr(_HKrh zB*keO)(+dh4KiMz&_6ir3%&e0qlmdJeABatX<>KdapTh%vd(c7*05c~L(-ueFWIPN zRQ?=YUmLh=2Z_HPE;22)z&GZPYbQ85c&1KZ%-2mPdo&svwqxtjY@t8js20ywFJ7ldHa+O}MKJqr`IoBpDf!zQwfkEgttnv#gx<2D;YZfgZ7lqoKf|=6|GK>q*T6&v;zeRG+tqZ`gUZ-Offm*A;hxg(dU)nzKvU?^^M6fgT_ju@ytaAx^*mva_$nlp0Pb@ zp1oIol`rEaGH}C5XQa7EfQ?O#VfsqDA(_IoY0^tVOAA{f)`zIu+vUicu=4K{1L_`y z2>mY@ww3h1b3$*4;2PmToz7%|bEg`al8I@S{DhLTF9(6Ob}Ui{HlA*|&pb>XcI_PN7GiI&>P(+aDhp%L)Wk&#BD zZ0R67_U_PBR}K9J^U!{4s)lyQJWn?v-*qF0J2&`Kb z$xv|RuG$@51PUnCbIlW!gEQB-F>!LFl}ZQZ7JM+xVO4QLvFGZk2C-m^{QUfXbBJxq zt(n8;+zCr}2IAVf*hf$-SB-wjzZk8AptbDSwRumoM736^m*3P&*TQcl4^SpIx`_CI z&gAt5IG@ZM0Hy-2Q-A2}Uq2+#VQdrxtZq;fSGKm6@WGP>w-=S0y~S1nrY0`zIQnn!ld;4>Z+$;j|z|AzDaQp~5;?3kSM} zMT1YJ2mgGvx)}Gp+|lk^bU4KI_4RE*THimZxH%y~dHe1WT2f3Sw!T>#A}r|XWilM} z#k2tWl)vn{@UpmidR$cLoL7%#vLxRN8g3mhbiIJ6Lwp`5^#3wrd;b}?>K(?Q%z$gK zzL2St)U(hZKHZBszl3s8`MqSZXA!ZTL7 zx4wF0lLTQLjw!t+Y&eaLEbfh{ zgljf-X<_}j2K~pEts^zpCXq7*x=>d;=?gn&$XX7+>kh%Oy4oFJbCt=qMXNEV+nE`N zc&g1eKUE*~f%WtfU)U%_H`tiTR=_Q_?(@6}ak<$FwIlxt)8F6UFo!xPaLbq4pI-wq z7LhOsUt+;7clAPPxw~8Hai&7SVrAqHCWQ=L$cAH+Q(kryPCy6A~n&qF_-Z4^9aE3wZ#e?#rk;J zxC~v~ohL_wY$xM#wYsi}@CBUk%V%?xXYzhO$|=y~L1LD`Wwf_IX8@oSwNNt|xr9ti zCRKhuKBet?dRon@h?Ux`gUS^}2Wn)xQ~P;q)w6B6dF*t0tpCbIfWC7vLk|pEco*t1a9xO)skxYh#d<3h?eIRyls5(vc=11YP)}Mfmc`Bk;Ettg zU0rP*_U=EhJU4I~gh31{!X`NXeQzf7L99ZDk8!h0TNuNhq4F||l$AbgXAD8tv(euE zk<3`5Ix`8}haaX|r_#~C=H&*B*mJ9ml0um?{SFlf$%BDe9dghve{kFP5If*<9|{#( ztfc)^XX_vN+k!jahLYb0^O;eqU0loMea-iL$s1w2TDP}DCh7QkdndLBY@hI5f6mmT zbY_PUJnVPdOnzBTyC(MuQK2SvNp9Qq#h~=lIPv>B5|LANawbW69xa#Blvva&pq?AW?1eGL%p=yJ7 z`eM*%X)fptD>0T|XJpm~I=A4UfkOWeA7*4y7KDL94m-x0BB{;H6y#+7G406#Tn4;~ zf~y5LA1eQs3y^C+H*;{{=r;N^>pUNahc7_Zf8Fjkg)$=}LH;#uF8OqkP@@D4Vk|?5 z*aJIc;!r3j#;qPl4q$Io$kSQ=E#;AJI0IDnP+sGB(ftBabVaX z-KvQ^&Acak0qG9rPUq?`IDcXXgK?)!oL{)d@W@D&T255#@bDeC1_KSx&B@0=dc{`B zCsga~dU-ed9897!xo6V8DsTaC(4fJkq0>;@u|Da6hkP;}DT!Z8t<-dO78ME&)5eML zw8&wEAt26&N5f_8M8?F7!{fAf5;xWBbp)HA*C6F&X?MNgsA-9}1rO8fEtEpUvf=XI z6ER7}DKc(%da8Ph@lcPIz*1wZ@|q5f7G~zD1kJ^CpulBfVmh47N2-%Ze#?#)b|_pB zf$&xP6s)*mD{whWI_K5bm#0>%Al}^ERD)qwR8%}1H&s5l_kM-Ke10nZHC$a=Js#5T zL257dy1#!Qin@P5cE&>*(c+lt$;dG4xyH@;&a#13fx`O}Wn;Ew1C48CM4AZ$IwS@L zJm^xo$)gyJp}FnPsZi6zphkQPc_N8;XGLaa8?$s&OpJ({3wq7`BM&Vq3QA%WxqiC` zOyCLQ?)kFOQ&!~iQvzPQ7XvsYDU;svgb^DxtLY)bciI&j9QaC1%b5u!T%al~2Oekm zM+UL!cxoiwq?PvZXd*>I7zms5fi3X3E22&i6pX@T2$KAmpoz^7A1;Cw(4}8mS}D3t z);PNWO>7g|aN1g;Ye5(wkk?CS3ng$&HsJvcOkfEVN`M$kLtN2o%uJ|0Po>-++@P zv=r6$lo>*E<6<|!ktx?MRC0dXX!^SPkNKJC1IrS0wqFLVHx_<~Mjk#Hv^I$; zY1!)-oc7@Z{|rfWpgtT)chP4)uqx!De_0E@|7<*l;}KpQQ`Z3^XcMZr!fWSYXeMSN zWRF`}$X3g3FBW8WU8b|@)DOzXzkcL-@}=BlTjudm>kVPK+O7(9ceW}w>!@p4`OCq- zUk#u6?qhcQW3(2=BPiFE*Gy9skydJ?7a`;NwjO!>hG1k+wEa(UhNg2OKEPqnUKW7!lQ5wInXAq;Y zMdOhEsN{$0iN`nVORU3x($0X!&E~gVtqF8GnxJmdX!3A8oV}^NR@BqegZ4ePj{8`W z%fqYC50($M!1!J+L~JHUJZ5t^8N!0l$PzulyguqHd8$UWX}GsfQ9yFD5mL*4QdC>bMo<|sxH1RS$<1A>a|Gt)5{}8K6kl#V6+_M z{^&`ilD`EcL~3KEs4aMVqGJWLHQqQ0v(~@NY5^RS#1ynYnAlJv*2B>zg0UeJ&vu^N zyhZ+&r5z}a`Pcq~dN^iMD-);0vtFJmN%R;l<)GR5KQvtfd!22wZPFwSo5r^7G`4Nq zY;3i$ZQEwk*tTukPR^6}T;DHv_P#Oq%$l{Knn}o!`1|sZ}((R zt-hIVEGLu`_VoH>#sIK}fd9xB?dAlbnZ7EVb}EeY02)zMlkC*DH~UtemHSB7dhN0^ z8?+UsuCr=-Y;Je0wujA*pgAwL#|wnjRyWN(X&5-Tx)^58vCKE86`unyLTie9sF%U% zdb63^Ls`-hZB8e?7w3wrU|scu+@4ChItXi|hJxGYA66x7w;PC5yHfZ+7)gH^74DCO zX~@#V)_j$9CnZ!n6>D>t;CXHM#oc(e7?CZRqX|vnN#uncD;2ntGMX43qRs#(l(~LuTHcnNpHI-%l zs%l47BQv2(Fzg2o7Ft;Lh-y4L$7M$yo8v8cBpz=_bTn2e$8Rsnu-kmZ8dmr#71d>N=P8pBN#rPVVnMbQh_UX)K9Ve*ou zNsYriBlC6n@&GL>L=E06wp14D@@WSlQPG z6}QX8tY2R+RFK+|h9%I`t%MoE{qlX2Tsrgvm!q_HqAn$HNF9P%$F9WOVtW4|F1wzl zJY*9pgRDz|B$Ogf|HQOd__5Nrqx3g$~n+I8-^jVl@w_8}3I{osa3bEBBt zav>#!pK}Rqrsy#m-{sqM?4Ibt@z&TVE3oz|ag+a`G-O5}lWPBqr_+oWJ~HcDsnxZY zO~vN%P6#TK(S4-&QDOlp70kBiH_;)Qn`nS19g%%x;!gAyS(-qV`zs^0SiXYtc)l_~ zp&*nBuWfO05k}*B`KWsC0e0#+DVpi?5ywxGivGp%*#RG?=`LE&oJrb5Bu3AsR!iXfh8XBeA4`Yd>e5gw3;gkXG(-R&3mWEGP$E*5ySvD< zm2Am@Msnp+FdDXNN{40>N?kr{T&n~y^q5-L|E_24gi)W~S(5M!X{*SJ2=StFh6t%1 zFblaeePe$o`-5QbcUG)A8A@Cp1GfffhUd}7KovV;3{z2)%>y#Pa}vu6Ki%j~t+=bV zA+nkZI0f@Tav2pj5Q%?3KOEUFxbq>ks3`7WSwJPU;O~5kf?7G}eyO>?fD@W!-I2It zX^?#Ym$a55t|J#`-6Uo?!}vMR^V4P?-OGbFLW8Arr3DnsEVV96|3-E9A|&yh_P?mw zHY8S%rZ_#R z2ndZNj!o9ODL$f7L)N9K@2yWy6M&iLhmA3V{58~w@1F4Wz`(mtWoC7=_nKjxJvdg_ zvDftGf>l#Qv2G~E_Z1Y4)W3?|Tl{C8bS-TJrzyez6=MpWlgRX*f-gDv3f+AEl;PH= z9ey~0!mqfPJmYW0yn^|tpP4WCXQB}#(w;3%9e!+;nPbhXvE)#XIiATG1!&ERm5}~u zm z*!uAO#*%m{j@blJox*uCoqRazm5fHSARu6SHEo>E;RNwvwH~_WabMEvhE1JKcIyPe z@k@HY>;hADh{jB*zEA=I5&pvSNr~AOhR_tiCIeJ;=vXS*72?LzDxT7Crq@efi2~B0 zKC6io*>?1QPcbtx)fcLGE-o%aMPJ!$FMqtRS0ey0Q(sITnbI880lU;Cl zs1VSnFhug&*eI@}A{O-Ad@61_IZPg**RJ?67!Py4 zDu~RiOR+@-PMMjTl7mC)h9#{4p-xQfTK&Huq&S$|?t7s8qUPLg3OBPiqN;>jC@lHW z8wi(%fQtbIA4bAmIN%sV$6XskmIfq`rM@E#7Ak^4jj|=kh^6E1pVTDb#S$@Neql6?Q z1bu32n<_PCLV=ZQuqQ#LJnWfDyRF+^N@s^^{DL-Q`Cll>cR-w+k*(hRNL4)~RvOzP zc4hbcNTc8--@j6)VJVXsvp`(m@!Qr`^Dz9&r7ZL7YwLqRbj~PMGdD-Y`4o&B>4DJ zrBW^Er;~Th4&Co84D~(^3Riq)*T>ac+Qx4kIMBD6-ArP=OaM0U#2tuIn)*27?Qc?Jp3tDP{Dg1 z|AcT&GI+KtwUB8CW{QUybvmFPH$Y`Mz@~qeXw6w|FsDlys)!OH3-RzTxi$%bhv(_) ze5ESSEv~=%Z_5dbd`fae!I_oU;K(BiP|WX|=#LAedv&J9ZhFSlZKO$&!X%mKG;QI% zKF(0Tih_k_Y|m_cB+#Czrk4_7gaNCzRRA)Pr!sate5#*hV33kXkuHsMicXzM_Xpp} zzOasl*V@x1`)WCHKuJl7xiZjS?=5ib@hC~xZs%DVg*!#Yr;Ztk$(cdVhgBx>wcEjK z^5%&4^7_^wO9poYyK6Mxs)V&r*zj{V2U!HthzQtQ+u@ z2BUDD-jJVCc@J-P4lyCARR>Cn=pFwW+GuWlCPA6a?Ui39b(HM42g5AG2p{tmas@H= zQv5NfAn6LOTrXwG+S&>8Wlm+NuC2m~@l={30sTnqoRS@TbkZ+?D@$| zTgl7BcP?lwq_wrRZ?3L>14Mnmwr#QA7%LJNp6~FC9w0Uq%q@(TSOQrgED2g}-j)Po zuq1PX%?mLwiZrL4h?O=nDyoPTt#KGN_CWUYXPyluPy5PyMERTYuDqu$);PeE%BEGm zb}sr5*Fh$qyH4zjj{llyz~Y=fZqiO8+d4`SP4LaxNjscnpH=Be9Mj3g0rw4RQgfJT z6fSWxieQiU5Wy}P+PS-kNTc_8N5tl~^F_64LLy>58&cN@Nnwgep;6$#1puc1ko?se z8r-WJzqGVr7}v06GmeN5b+GeUR}|@H0K~%Agj7X!y(m$pi>9OH0RaIaySh2us4+W& z257)3=A>d+Ab$4s6LABAPd;s&w=BZF2G)h5Jk|k;KEZhVgR$}ygEFPmGcC>x6s*2F0JplUHKG4sFCnre@ zUd6%~8VJd?`9F+prCT+K(M97XEo7+Fb^x4lSlp$nyTBshBv#7ILqw&%@vU)H*UH_~ zX)=slwXt4DGb*mE_VV>dqo;1Hkuv_E_q8yY>8T+{B<4cOoiT>}lRbUm2NxFLc%b~$ z&juGk#8}EOL&UfgRj-i{>T0a#Q*W~%;ssA2R+cbS8_;l!7(wxQ;u*VR-*_?$tc~Yo zDl|I~c*m0?eBg29O}-464I+0hD3a)vpM^$-s(gR+@_67Y2t~O)6fN8T&6&9jKv)}L z)yR;wZw9imIr8yFLnm56iMzpMFWwN}bo>6nrCkE+tAq(B^W`i&*|_)a&mNj=+S9dL zj&NPS>%rK9++@*jLJNOs$5*VyST51yUa8#(V4pVmAw{`oDA90Cavn)7yZ&-b#^ZT+ z>stQYd<_Vzt`LhTf$D8hDH%_BP~))>>6)ty!(6N?nnK*%$$;~bB9jK21|gM; z2kx6LJAV5c|6cq|z~0z@$cS>-+(HH{y&E%@9}uJV+@1W4cVo)qDT!QWOysA9KvSyH z0H3%$4g~1Q=8RON{u%H3W$iij#)LkffWw0%`msj!@GK8;?p(w}78F-la|c~#E{PAv zoG(K<@^=~eOLNfg5PAGi?U858KM+p70I%&De7M8cF<+HqA^$ACXv?9L^E{1M4VPG6 z8~bJ0L_SXEv#wlYs>=ypO$1cjOcjH~Qma~FLyee@-#;_YZkPe{@IL|p(4~;p9IO$` zs@3KPBoy_ZhgnfI_Y{6UblHqhpC!c+=aSby%RAF=&hkC5$z}Z(c~1t}zSW5ts=7(! z&+EEtuCN2F=N0=W-vdAl?QWkmS;#zT|IvJ}2mRA2uX6+=a<9F2cxEa^8b>B-GOqg< z%!gVdaEDBWfRHivZIH3g$+zKtYYX9Utqu#~_5=oK_A4zF{e66_NY!29x5xoj=W~Gw zSCjqkz={fO?MgNU$^d@R!uCLx$&M@E7l6w%E!>$7#k{7TC|{%k*ZSD)P>LN>2-3m_ z>HuQh@tX#!%s&wZ%y$+wii5%Mpk|&}FmSRF3W3Q%$p~4cQoRT@7L883Ryq^|lG5I> zNY6hoC{HIN)%9dfb+VeDTf1F*5;}2$I0c1LR^l@f;dbqJO-bIyW?Xx*5#5LDdiPa1 z9PD)W;VZZI>ijM+36zp?tsxyXsM+j!SQi;Vm5#?tzF%)hg%A7{7|*2#`UgL6S8Bqz z|J_*Yr4e+9Zl_=*>8eMzL$3>OL`kRS*5V;fQ_Eid7664OTTE438H}P!pZWDV7-_5e z!AD4XIzBf^eXBs}l{k7m?@V)6`8vj|E7?xh;B4aqpP8AOMn0zGS@UrGF#?M_)Mech z1t3gQi25KZG!?f&YBH(}`P2P?JP%4YG}xE6w_^K-SHrb~%*E+^-tRJFf=_=*4NDvq z{=MD!=+0vf=be4Yab^Hhe{>LD@2dK;U2Lo>94)P!B5oEP*q2&+rAeZ=WXK4Xl<>sr zYTK1iyD7%|g@2}q{k|bYcsCvg!bOp1lP^b=K)*`G#dVJ(`a%%~85F2|ad)@lG^k=t z(|gJ>>7Zr7(tEc_sH$%#lp&kFziRzlz{QC1T9qP2`sZvB)kO!-7t`{8gLI6TAmjE2Jt4A}u)J$sZ$fvrcrDY<4steEsprBG~1u~g}>N`tn zG|~{MfZY2TcMm)vWL>PJ?HbrAb0+2Wut+bNGw4DCIR`C&FOU93%oo=vf4{x?G0jKo zcY)DIx9?Sp)56`c5uxF-e0`yNSN&yvN`KA=i^FIc92VFV8+J{LwMohApl-3S^(b|cgvERW1%`rDSx%xV zp1_Boq5*LhrMnQG&+0-A-j~Mf0rX;(*Vzb*F3uDU{IzN*!1pmg``%?q^|_bK6Cj$iOmX3NWIIN? zPT4;M0hWP;Q)Xs5XQY5I9maI4I#D?GJ1z7R^6$iIgG?1I)!7T+HgFEhIzK)TJh6pp z_{5r;RLVEok8OPNZG=Qb)^7+C)B4tMqPXXO=z6lI?pBp<0ZLw7xW0B`Mh7yqBtnIQ$I1)z#Cr#9II_VhVRgW7VhiLtSY+q;tmAdBP}P3wRplg$WRvXU{MDzk|gH>!wjl9wmfDJR## zyGC4YbW=!SG&D41C%7+ibj7nuWsGS8;(@x97(J9Fzcn`8b1E&-b@)i9GlYs@P<#T)jdFC@B=vQ6z%BB&r zGuSsl{GQ!F1GY0oYhGMkHny2}dL9wSS{dW5>d|ntxoV91n>> z#qArA^&C!+ZZ2NMu|}w1Ht4&EiirUBA>FP|eeZ|s6-1+zq|RQ8MI?A!)P9fy1*x@aBEjj?A%dvyej&I+{^SO4%JK4yLp<>wo7R?18d_y)!g!pj~j~9U#>_HU3)pQ^Nc1>-Ft>Vd5|HIfGsO ztu1sWd$xa0XJ2Gv59$}!OAER;izQ3msDKLxMMeG6%E}ba8m^*(=lx0nq*=X~T_yB@p;Tl}6}(7ZU{q-~NbD2dRL)Sed(vn6Bh>G@IiJfvazvTxfDs9x zL-w9`V@kq~`7bdI9{12igAIm~kIPcDYHZk8K9uki3lmu= zns+MiZ`Wmc@jw9x>(r2HsnDn$-!*gylvYboX75YSI$tK2*2(-HC;~HXbPK^0D-c-z_;ygxM&E#>K`4gFue zMF31ueW10F$#K(5N&F{9O#~b^OpKdc)*ua2QhCL~H-ERABz!Ky*UH1xdb1u^5@etu z#46j^yC{#>-P6s?;je!vHcvO|^t_OmE#J6fR z?EWilK`ch3iFg+1)79_@FoW>M>jy&DF#TvDKO0!1?|LmLBJg;W^U5BYN9g1=>k+o3 zo$?+=(UE!;?FS>j1}UZ!DcRfRf$&NLVexn_C%^-n*>Z?Eg~&gAPlU1GWN3cY`zK~Z zVpx*zL+TZlrBqoti~q%yUOFfvt{s*X;0g^kIt0DP(oh@KvI__xR_8Nu?LO*dL4E+`%WPwA}nlyS!*6`CP`q(9v_TS!1^axEz6Q%;c8}d zDVhD{r>h!uNu>og(hCFB&ckB@RagqICydR7XKR$DgmaFw)a>ZzDc%`G7c?JYqr+%0 zU0YoZ=bcCmJL3Ha{gJB5c1V>HJYs})hm9{+tp{@J{f|lq>oqpComhZX8s<4xK?3-* zvzsMS){JoR`+rO)cFJsu4Ejo0F0Zd8oJe{m=SJLxU^#7oqySPk9Pg{2G*&-*&p!p2 z#Ds7lRPR1M1vD60HSXHGwS#~Z(I3yy*-n0Jv`iCR%`dGQ*fbh}?w_9rl4&$_J~9y9 z8Et7vl%QGr;WvZ^gd00B_6wCGpgpmsgrmH|<8z~v@f*rG=1py>B;zKSx+^N%49UvuY`A8 z>0OUvw^YjCu-jH86oq^<05aMGZ~xGrx>kzi+b98(1(13V{Q6jtS_Op9q>uZfdSb*u zY8W6oas7O)!_f8S#vqe@D+29}B`}gXz$P`~61~#8TT|Tu1cfx-V+rxD5$D#sbx5thjue7I;d!*|!+T+}ydrlNp~2PxW4zQgjrpI9 zH+z;vX=BnccAUJtJb2zGAsA04b1uwjLLNp&#w+4XP1ndN-)_VMjLa~{4@R%ZT8#?V zy@sY5=QUm}nF+DS0B86>nz2CfUvB*bsWmSxjQZ7z#%RZ*9RTU<(-WkX`H^N1J7vAv zP$#20wfW=5>+(A6ZSzDE(ypck%go1T5&Nz$=QIB@dawD2JHXeCY-Dcv*9g~+>T5pZ z(|_@yneW-@SfMI$6K#k)0#u8hJkG?+O&-v{Oqh`VRn_03#XbuRswHB>azXx66#ZbK z<-rYt#}nRouPO$K))AFp`C`V>6QIq$%2t(x2LFZjbl74$&7ckqp#1SO-XLh2E=HXS z5^7xpiVEp%%uL z|Hgs~072e#-^F8ZNVsu$0dE07AOOSt&&l7V-LqVM2h6j_h=dRbjlRsIvhEFNGCmCK ztgQ2`h6}i@H}7J$wQ3%c(i$jWRwWpd7Z|X(%wK>Wh?~xH%6&(VB5H3Cwf2v!nwPJn z2G${tZ)VxJ?G6t*t&hW44??{nKDW5;C8_$M!P0*!>g5rO#Q&o&#)3?soQksklcoLzpILYMHVCj_9`BmKAMK}&v|3QR{eOK)6J(ht z<1rHG$E93kUh)k|E*siy2Ffn_+cgBSVA(;rNHknvbFd-+ABwISCU~TpC}u*y&llit zK!P2C6>)1w-$=Ij`}=QlG+1n&(D4d3GZw`AwI{B!Ox0|hdxZ=coI#~5ord-Se1_Lv z8w4DjF>g~Zvk#+1iMQsVGa0O2sTA?*8-y}p>ySQ!EA2KD98zy4@Plz(CHc4`0t049 zJw^-$tHZLxrM55y0!whs=6)mpVlN;_@Y%vUpduA$Xqm0f8I|5&Y!RU|{UZF1&6Ur1 zQA9SJ<&`T9@l}Io9T}@W}#~W!wWp;wC}p2?oO>8z)T?n}&o?C3Qws>Pa60 z7_#yutdIMuwO**qHs3gt%Wd+bd7aWCmOsP&hqZ}dSTgb_PXWwVD!J*^Oh@DJ_*mm< zFvc+Xc1_7@xt06PKYX8tcH}{A2jbCrn@zi?-`@%n*iPl(6vmy5#r7KO)ijQC;^Xjw zhtrj)BPLVBhs-w&LIa`wS?HZPRfuDuaGbjX0sCMmpeVwR%Qi2ULCQJCL_*rpEs!8- zeYrm|oB5X@p&JuE#3)W%%UKn{oYbfH61nDjld<*ui&Z_+Z_J3|b1%=S90~7nVk!~= zG_Sk0;Nbl;@^U%OmUs0aY0IBUPaT;lbec6BOi3h2Uk5Gxr ze1Ki4P(m2k%J}6IFBlANiRCbcID+P*Fd&9hO`zcmeZL>hxBb;e{G90Gh1s8BmQsjLJv%~MqDtqsiWillqB=l`C zF*M`xghw={FgoS=lj3b@k*Ah-H@9oP=yR#tOSY&2X-;YY1qB%uE|4}aySWp!NLV7a zszsAmgRGAN1b{9-LZb;$Vc{p$Div@+UA*w&1j=eEX?y?C!|-UpdBSBwcHkcz76Jms z(2K}qOev_bL(nVuq>w*=p{^CpdFK$%qFu4T%s z-1AD|hdb{J;jf^;lGmgmHE+Z%^mvv0U^-GyR_MEvIb+>J!*s{Q@8FZzXap`B5L4mC zup-C#Z^bP7cV{Pp8=?R&R?3{5OkcKF2^vOL_7*_Ufr!&9bP9TQE_@dI10bjZ{~2=e zg~&4EAnQxyZjl>hakUM>Xet9sjQ^6TI>!sw%TrVyH8AocysAATul$GA1jyi1tr%z}dA>)kQg#j+K>FSYTg` zHN|+LwiZL; zR+r9KM~x6$mW!(O6ggdnKVgPkVQ2>)2A_!FHGkxH)Xygq)faVY;s%2ZFKdjQp7+HF z%woQ{Fdm`A_((Q)iay0QV{rbsgH>-(Z>l?b@Rur#Rmg{q51E9Bef(AS!WS0 zTw7?M5K<1&K8s0pn>HDjl4BtoiKi_Y#5zk843eqt$tQODyq^51V4Sxbv-Y~@gK-1C z`hvQ`YaA>HC@2}&1d{1!XE@I^=jUvjA9UU+Z=AkWI(u%_JP3@HS-puxS|_}uM%31N z_dKg}a}C`cK~V|C1kUKgV_B`!z^ z8~v6+gR?$i5XjnZuI<|#iGI1cx!dmCYbe&4?w}B8f(HJ^8lwqT`rA*AFOk}hPUjy= zxsIu#&DpLryVJ050{sf42BVYgikFLAxQU*YAM3w$eX?ZphiM89#UngP#>n=MjzTIk zmUCKl*(=xjsQhj8CEdxMdOy!Ts#j<%(L(8kbUyn?*l z8_P=+xNcjZy2HU%|CnZZHaY(dB^t`Zc*N6ye|P~bEhtYiN5n%)r^8~SAv~?t-+T`F zZ8%3n?h+S~_2u+?B)M`k{nqDUKJI7#vAB~485-bPg7PN@2nwi?8tI?%qGDlr`y;SyOboP}1R5E#oa-zH4j%Wh?v409tZgRd4 z2zS!>ytRP$^XfbR?Iss?wn_ zxQKIYypbI2hG^#=)u1ODi90Z!;bD8HA%<9yTt~QhPX(&n6PD~#5E=#WO=#Uky|TXJ zB&KS8hTFmZO|ZQda~aJ(<4P=mfCDn|AU~CGFE*w%gvmfl^|<6O4)A}rwOLr;QW$<3 zAD}TNa#1RfVU5P%N+woyf_wS@k^RTcH4Va+x7OueCYbl7MD z@J0tR$|`(2>d~kM<_H=roPYi6cB2CPqZyr}&H4*|p-Pzw%u>j|g(ztPLB0e-+W*~& zx18%JJNAy`EH${e zwmGg42ozDOssIFxfJUbyCD4mqZy?j4HKjszJX;wOd8SE)LamS6AZYLL-&g!P9q^MR zHPRMFkjB!O`wb&bh@4(xl@iorMw!$Am=-mB@^V$fKQ9 z4jeEt5>2*4jQ;*V5FDiERjJ1@ZU8xYVFLeG=3kG+5>}#FKhvDE&fZ!}7nyYBgK{5B9J9xGW7uc^(sQ8U-5N3ldO}PcbZLF#EKJ8^sPlV~nKGo5QDD z$|cgHYh4cH?nzMXr$SUDxBIDrYGLN;oM}ifiS&lw)Qs*X_^ldzKDE1Ym)K45Vhf-$ zAa}!(bmU>NnU*t9>Hi*WvsVG@JX^r-=+%2Z^3H$EAR!N_3mQXGqWtx+t7(&WzWn9e zl>C$}!)mkeca56fg?kMKR`J>y?*vMeJ7VV*^9LRZFxt-q4I6eoQk!tQA(KXOZzM@D zZN5V3O#DS)J8~FypgG}SY^6!C#{9&&0Ea0hyuJQKc-M9Vi2cs~=^9QJ8Bb9_IK(Gp zM1*Lm6_pw9X!$9kIaM!is8rFt6kO3Y3+0ojN%i>^tuOPD)|(0dsnecN4L+Dg+-WM;QedIfkT3ZPR9 z!3GRAd3e@~mGdY=QE5kg90s(&DLjZjzmX0P{1XDkdos(vl<{;y8Z2c!1~tS$kv$Zw zZO+eXlgWb?mq^7?-wm*zrhJ(at@|9Qb9>ua3$K+1ehe)SH`NFJkI(FPw zQH^W86@%?5gN2kdd~gl>Ov`TdzZ&z`mx+Xd;Aon#f~We2nYB$teBSL-#4Zk_Jr_)M z^P0bgH;LAZ?GEsO+TbZTx-D;Pj$MJ%B-T5x6UQ%)_1NBip5Z@#Y-Bt=1rAhb()90FpCJEv_Nfp~qUxL16X}M$Wi}Z8(@j~j3jD|+ zV)NW3=WsF`X`z%W6FbwBQL^22XEZU*E$_tH16~9+XKFs2ozQFdZ+4{2XBh}7y>rDn zD4+DKa2`_9Kt*-z0BP$NdNPoo#L8#=YdiRgaRMeX5b1)X2}3{a2#3Qj8b%J&Qz&gL z89}@K)AKYYE^k}}Bpx&4b5vj(H5`@oW@JuK;T}c8oZU(@;#4<2tL750X^CQ*LjUoV}l7AE*~6kJg~~k}Zs8 z`bL;uu-h#dn=~HG#3=4v164=3(tv-{ADpC=2u&9cIU=ViQK4 zND!I5emOa~^Z=Z##g>mR7IVe8rVSb`Giq$9>TkM(YV*E@D1v*z!Q_BiLC~P0ycg-5 z{?X_gAyV_R(@7_%E|0et|4b;ilr94)+g%A9DWiHoWyyYFX>?FTu2m2qD9O_NUdzbnLSH7;6kW7mVv1%2FoG?$;Rp;Ko1 zd&znMva&vQF3KhUhae=NDEeu$s`7G&EqvO7frkd~f;i4%p(MN|5b$a-TfDDY=RUXJ z7m6xxn5Yf==;_{;+U`TqW?eHcDtM7p?Tnv-s?#>}&@uQH)<|+|x$F3oOg2-6$_tQj z+dX&iX?_0(%DQt{D>9Vv2nIOfXKO7@lPmN#37w^~NC0xO0&lkt#$ogB^H=H9Btgwe z7c7B}p492xU1E9Ck9Ee|45X*#$&1^zAn&d}5?T%}h+gnEM73MQM}^!S8nc*nAM_35 zo>dLSk3rXYr_%!d)k_m9@mOUnjEETl7fc^Kjo-&2A|kBU+NCY2wcDYK#$S`f`WH8r z$KM8y41N!ci^qPWM#HVpT){>{>Z$e6k|8F94-aQIvp9FRg`XPjWT{U5`xpIKR9IAh z;GEl>z{VwoTz#<-$o#=!o-gw|%kCTC?NJh>RJKupu9+9>ul3Lm8Z}>sgNdFwmNyAZ zW%C*8}xTAWh+yLi;IzektJ4XMZ|#=*_}N*t^RYu;##xa zt$ph~umWwx!3=fsv8k6<=onM&7#kTu0($GhSKGohYtH!y+!8J z0yFfekLve1^H0pu(Yl^27^+o)`5Hby%{zhvqGUn1Hky(ykZ3d=gF{0ZErhsR%z7Nl z_|Ynbr7CDtWwwYnPTt?Ykp**I@Y>3OJI1v7box{CznR*z;4@A^io^;v8*te_BG z*_@%R`qxiwsDV@lhPlJ4&EKFX-wDc7W$gRZ+{H0V|sfNTc)@&fk(B=aA#6 zR7H%xTuhf}OLx>7TZo8=NN|h|N2V*GQ;xyC%TpdIvlCh;$IBO53Pdd zxr&t>3DnDmsl%GGHncn~Oo@2%LU-vJ1L3)bWoCL>q26v3gs{-?{!bbswSjN%_yhsL zf?Y)A%*F?O`-?Y+1Tvk7S2eqCo^Hl6izqOECL%lPwrIj#dq%FnIij@69%l^@NtS{| zl$BB7yb&gP+ay<1*PW@GsDG%D5iggUSCS#R(b~nKf>Eiy1t|Me47~fj2iNo$zYjgU z>svNN;d1^#DVyJ3+scz~a;5<|BWS5Vtylen)sfsG9FE+41QuL)U@V6J@~#?fFdRSl zVF6s}Pmk<|Hy6Z`I)$FD>-_iqLQ_imR4uzF3HsL$Zr}b0%xY>q#l1+!agZZrlS82l zmbEwY6-C|RN$w5)jfp40C51S1lJC;+)i*EG;G<++if$iWJ`6rvj2dStQxy&#S=Zis z>m*yRwD7+;4yZVi#`L-#RxSh$TLX?vUitE%de_+Yd9XmNXppV>t(D{^{BA} z-1tw(;g#sw86<@)!L~|*2M32_d9GX=2!%bbmi(*CyO-01uzGiM75YTu1NpNopPrk` z73C(4h2za^i{A|UrSpdf(dpVQsXd{Q(Pet;V9&g>+UdyQsKC!Ry$&z z-~H$>T+_+{RuE2IRi?dVFcg_gCU47Z@Z`lCf0>lu%1eF4-(DS)G z7@p@%>w>u)50(h;39;2HET)o!tmw`9V*yaFZ*k!B`^6{Y0&$6iU_!)?%{O}?7~}ur z0ti{!;`SjXb^C@%M@v4!lZpWx`2JD#jw!Ey1;OAxneU!%FMxPbsZ2!}n2Vs(z*stC z>DN_!j(`v?=5a0BF=qA3>!AvwI``HG&*cf3n@x^N8k$Q^x!;?@WTMA;n!3hr3NT|& z9Gzu;{si{d%Crgccosu!$nWDR(}PY27aq)T=Hu_j$J^#+8&(I~fyc2&IZ9) zGyD4h1p__6P$hrp;Ru*)br{Inr%{urJD@Gx?t@mugShd08}@9gGh6CD$>Y}T=gq-& ztGnCnS=k|b{kGfRKel4NmwI>0Xa1|aHLs$AnY+KkVSkX;@uzU8Ym8FjH;Plnf**$b%z|(wa{2k3P@a$X_ zT76$%{oK-Dx)ocz2UI|sKtLYA(R=VaA1!XaEqz&nbcX;b!*lP^pn&+HamDR+9iLeX z0;>mqULl!8r`V+Pwb;FZt{6~>?Zzy$QD6~)yH=L9%GzGzwi(jpmogIO8ip9G$J1D% za=gEY3pd_iPN!p1;@6>dUpTDFGC*ASeX)C_Jlh4iIT!GAsig-6(>AfE~ z>2UUtyYgVD2%1N4$i~q?Zqq*Nyb8-o__fXqe20S6_eK zZzC_+5ur1^Q#(p46KLCpUHc`#UyN@Tl=aT7=2%M($Iz7FeMNTV+N$_htZr(jhS}y; zF4`mc@K#vC?AnXot`lk&1@pV}l3)XxZj2nlD=6}n6dD`!M`wk@gEzDJE97t{3yl4i z_tpio$_5=Z?ge;fmw}3XB;>+(42H-bsB^#3C(yj)?_e;0+C!=flZ8vSfRA;+TSFCRi=avu% zqET-$b^EmOa#+Z6pl$17N*{j)#^7E(JFwY=+Bz@@CBUHJ76N<$305It0E_}tN1#%L zJ&8NYmBbfXp9_qrp8n0vAGd){TTEfO%qVBK?%}z(*SvVw|JcS(ddJGLP3_k6AUt$L z7i?CuftWotzQ!B+4ebP_^K|yeVYXP@l2WCf9ow;z-4>pX}N(38) z@M9X`byRe5cwoH~v(LS&1sJB@;b1h;f07T?s&c&{ck0=}_x^y2PLDu}M15ZG$t}8v zV(5w!gXhmxJ_CMzP`6iCxuJRoP7X#drt|QIDi8bqa4zg&1Gp|p;{3ZU49A$6nT5(* z{A)jO_u;<))^BYK){p#! zW9fC#DwR59C)fyIM?v;y;y@gtDshU*znb}Vk#gY4^BdqjuO)aa7Go!MWN}HqefwV2 z`I}FjELt0g#xbUEg*NcNP3XMab6z*zHqhu@C)R5WJt3BtF`04);bh>^QJ_Nj%rkFH zCv<}UfV<`37Kl+Sy6MVbK>1vIYxr@8JOviHPS2(|Zf+vPyot?qEq8b$(Fd01V;ij`<*z2J6b9qxQw%>@iaj1l0NBEu>#2S%jZX7aFq9qm%P%z*3dVPmpXC zd6j`DcY)WH0#hGU%%WYU%SL?UL{1kOkZdPU%T7x$dX@l4)my6JJ4Mg>s?@!T4Pv&KdO87s20$fA5ipRE~59% z|1{-j9#oa+w=K82WYAXKf4$m_u90pG!?r(ZT zJ}BdB(~o?Kx#Q`-Q-UQT4RqC!s!WrWgFB20cc&V#Hh~*L3r-Ob$(5nYXZxal1R3%c7T2%p6QouqNwO>rvC| zz@^pau(noeGT-=-@Wu}`Mq_5SrA1$svtA5ivIN|Cgl}6$b+Y+vf7@l!o1o z!^p%P|c^8e5NA3tXi8tR#Rk zCie1iNbz~6*PK$T82{eyXO;)WIpw|oZ~8+>dJ5RhI-*--Sn+y&Ob!FCfIxrp=5hlm z%)E#>?M;HcHU`svp?t}D5vL-|T2C_k*PJeNR8e;C#YhSa&x)sWj}n#og}w1ZH{r|a zOF1}9R*i0BxRV!!v_xq*buFd`WBvsM-0$u4YTV==17C^4YuzC^o^QI1hrlKH)TXnc z^lE(Tj0=<^DOlc-{V96ht=EZ|sxbqr={~HYjC3LRzj8EK8g`nRjOp-^dc*tge$i;h zU>4vKJ=18Sr^k2Ln#j`c+HJ5H(n|S105?I%zL$fCf0KoX#d-ADAM}8Qe|J_4wQ5v# z4GMY*tD-A_fjUQ8_2PUU8($L@BmWLX06j@5CeXqp5{BTjFD#jL8#aj% zAizqLw@Ee?uFUig{F!Wgf7eHkpHThAtzso?TdASgmke4ppz((N-2$ElRKxzTcOQK_bQB@< zqjj!;aBIK-tbN<&`YiIF=F`=yHz6L;iKvKv)A506pUQFa+UhCq2ZC&-IwghS`6S z`%p6qz2V{5v3rl?FJiJZ&n3diQzwpQAe{#K=Qhu)0|SO?sPaXq{mj{OvP1q2uOM#u zjDb7WgTDG!_beYXxi|#uao!UKkGy$AUm`l9*QdG&l*I}&$YDfVem`-Fyo(gVdjpI) zB{Vc^p@1wUUjrnvU09CT`TGaZ{6))YEAMZt1sPWq6zS5H@SKR=m|jK6b4-~&m%4Ur z3wb%7|Aq+7iH{YGK~QJpb3TOWci(TKgNJ?-g{TR6EguUASo1b%KnG*6hOL&Z+jpaK zh}ar*$eJZ{_pq?=ru^qoJh-#y-K!a7Qs5Oq?oXsy#f%y2ewlKp(2|MR@=* zXSZ+r3plZroUB)JBBZ)-$#O~9|GHIkJJ0+c*@9lae8vFBvBsB` z>9dl>sO8t4=`IUgyf>6F(j)+iJGE<#wdcdnHdQSQiMDRlYCG_sEo0-sVeR@&;?dO- z>jCPq@0&GgM4j8WmfuB2MQsHo0^h@Z)0Q1HXTcJ>cP}v71FhvnVr&o=&ye0lloP&- z^?aY-6Z3+1RzkZGGS^F&uc75D)(YrD_{^)IXITJGeuo$3%9eK7{M~XIF?JIDdhm!U zyOPm?UyqPO3I~42RsdwBSZOQ*<%Sxv{4XAu&jJQU=BTDdVU3mx3nReZ-i`_vDj)?S zESrY$x?Bn>hHnOr5U;%bM^b=eVP68k*wM#JRRw(r53!{3Aa5+4OIk4$HKWZekv}$2 z;eCc2$-_sEQP)miL(Y{_@x`q~;vL*j3U64BxZb#Ro0jpu!d`_=)ACyN_(TbnzIGbH zOZOM=(XHEeQHAn8l-tb>5w;$@x4u=M=dBz??``rd0<~92^oOUA&>0_ z-eDQfoxdR9>C&aE(cT0c$WI$HVvr<7Mny)QPzgSN6Kljul-6;Of!3>2%OSms3k@AL zo*q2-OEv?Jk*xe7Q~{LIrb*M6l}$GOby`+p74F>ir>QgMNN$Zj43RyXD~%p8mn?Ds#Y&o@KGnf( z&WtJ21mIxeadbp62Y~pWe_j+1?Z&M;cs)E+uOB6b+kOThZCW;=PVL(`Lbzg2IypId zE?qE-di5Vf=lHv(h)BtOT)$x}rAnES`u71#3)SNjbR7tNL}+;=Jl129B{Mo4`1P

cfJD(#E^uyDgf3MIFCxjsHd>{%JPgd~e_Jr^!=i(~m#zkM>kyOpvEvv3yw;;AO~* z$3B-^PI<=&B^>pP@8yVj;r%1e`P;D*w0Y}x3D@EpSW5_Ro;Y<{!t1S?H?~WWB845V z>$SYb{Kk$POuhOJq(4rck+qKJ+{|N?E}gT4*VCj)U5I}V&-JwbC>X;)2k@GbO4Kw? zjw16AErZ7+MAp_N%9<4sd@IO20m_{_w4q&lex$#6{~2sP4!omLx*#0>rk;-<%h>b& zSRY}EsGT`eM!W0`$j+YoGg{V~dB>uY`8AJ}#v}Nc4WT=1kfGw5loW>(mO_;lp4W6zp+ z=)FJvBGx)A(l}l=T<@aP{-%L4xbOj(=FD46yLa!U;X}WLFhg$4A8Ibdf;hrO@kWdI z%*6xj@RTj2%a^Z`jdkKksFkXsWRkp(iG+tmb(?T>*#ta$C!dvz7Ww2APZXJyf0`nIwW2-+v6ro#=>{Oww zkCOaPghb^%7~9{D|4#h|3>Oaw!b(EoiiPoI6&gO|8}Uvs5CfT^FHpy*aTA3U6P015 zN)#^+z{H#IaoNvHXPY;3GIi_OpYHNKv96#{m$Fp@uUn5U9bo-8#Kp16r?J9^X8@ZF z_cO8bgz}p{d5j2He$Mj>=_?V!Yr`1my?hxG?Y)4qMebsw2DL@$hKGm46FXc5vv1mL z5Dd3?=k{lX*xR>8wNmwK*VKxz5}nh*!ozOmnsqd1{t^)Y2~B*pbO;Hf$y6X!s#HE3 z)-2T)e8?L@`3A&u!otGA2oHDsR(J>bxv~HZ{lx3!sVg4W)K+QgY~smV||cZR9~dLb{emq~z^X z%b(w)tEXo^SLFIFUAcx9EL={34;}~*1m(qSmJ=`xMh_nhPa7yr_NGpgx^k~>ov3Hu zL9(VHi=YTVL$QOOt4{5j1_o~&XuP5bkcN1?O#*pu~QXS8yy7A7=XE~2N?p^Zb z&EwvY4Gk3AjGHu#?gc)OX9jSc&Et5V4U@h-yCCEb;IPBq&aTG9aU-ZsgJz<%u#ORy z-N`Z&4V#-c`O1L}jG=t}ng791rB>PZGmn2eROS7={}7$vb*m-q-wU`;Lq?9HDJ<_; zzEuXD2#@Qk%9YC3u3oLO(eS$R`QIKp)iD5SsEELjkWl2hu2FSh#78>zkOTYJD5(js z>*kh&PM$hTZ_0$wd!!_diTB#E6DO%gwaSn!9(>KT6o0OkW>mpJ(1YcW!yhM4)5tLs z>HPT%WaJ0X7byX7nR)2KRjd%BI{=;q=`9ynmfdD!DPtxfo(BKsLG?R{24vPBaIwIJ zSOJzET;~skQ1FdlCtPpg1C(j5Le0&8&1f736?4HRT7)Oqr~hw+kye!NO%*mK~aM5i#UDf9(`#0jvs_}0ssyT+gV7$ zd+EY|zk++MUA36Jyb45zdtm+l{L3L4G;|CdKYmiE4#rHJDr*kmEV(Ct*1K?FTD@$( zxX52cM4SLCJ^&ilQQrYWBxg`-xdVjCn+6LiZ@X`Ch)$^2ml1{8FJb*&r(VTxqc1nhzAWhrSS0ZHBi;jp2u((pHKM& zdw#Gwo=Do6z@N#-_i6I{#f$4G2$(iyi~u8y6XpWNP&uhh~7*hal8WTOL?!bpAo~CQpZ-{qG;Uj!SS+clFxCEX$6`X<$S#lz; zUAsXHjG_x6s#K~#%NNb2?Afy5*<>jn zSs@>p>ei|*vR|cHkc#@Um1@zXX|ttrmFK!C|ILBN(#Xo!$Z{x<&xarAe5^a~^1eF= zz|MNEE1#A4Osk%$lruDyO0UpNU4y|N`Pd)g@eG4e?BVXN8SXl7U!>tp`c_H9c% z8}mvU2>Fm%JGYO)Ge)XsOoW&Jy+Gm2fpRpD#l`_#VxUo+m?%M{YSQBDxrBkG{ zOMdp1shyl^j2ksnx(I;20!jApAUuEmoSL*~Cl!uG3KewZF$)O|3p>L~!o5ggFQFe` z>mq~&!)_jrx(E+_$4X+>yv3pr)UlC-awN^SXwnE44(2_O|K^T-y@pL&i_*}%4o?_R ze>-H92*frmn%FUba_4LPoGPV5g@vrVQD^|_3wQ~jR4-k*O07F|)4V@QWvg@!FiPdz zfd0KCBnOTue#Xim_?eezfdWAg7qA|s;^*4d~6f<%GecUcR% z{+S;{FebLZ#6oXLA5co%@xLdPlgPcnxC3YvD&&cfmt8NCIfth_E29i9d>X6}0oMSxwdq^0QD`c=v7qZRUHnYTg(E9C4=w zQIV1Dz-Df%0!MinS!+*u|6iu846yim5T@A2NZc=lwQ=^`c_E$D@{7Q?#p_UtIaIIM zW5|J@emNlIsaRWBcL4b4%F(Gq8wo}7XBMdR13~8FZz1P3n8zF}>vfQK$@{AmyuTAB z&!DRe3{m`n{erM%RW_gy_Cetbe{V$Iyt!kLx8fb}Tqq1ETc$L>q6ytE_WcLJ7{(kq zqK!?ai1}GuGgSjc0XXg^OqwAn8k*6+eARcfV)Z)ZOT3N&gdrDE0P`UqP&nS~?d5*% z?z!Ddmn@Dw)lO%Go#)T=SLg4&_UwJ%#=n{TfDs$O?-3694tfsAXsrk?E`4jRYoS}t zU${gny+|fC{Ah?HEQ$7OTTqAr9q-rtYw?O}Iwp=NohdQS6zui0XU}WTmxZ-Y+K&m0 zX~J4c=V6fr>qs-r(Pca@ZZe-7edQ%41|*0r+jXH?Q^)g$@^EKs0Yr?=D1PoK{WTGW zfYn1`p zqlOJ)1ykD2Xted>&ktdMeL)?Mdc45>(B5X|>;*zoqRlzDyqwZF(eQ!&CCQo<81iev zZ43ritJ7_>JghMOv_tvs9^_#*V97K)lHg1WL2&%0O zcrlZd zio5CKuB41{@H6k{b?S#Asw`PDQ6TRbt)km3Z!C5gPr{TT41WHUTy0+N;Ky>Zuu{+q$Xr`WrZObaZ$TUMRFKLhen&2DQON zKZ1n<8hGbH()_L4ccp#N?jL@PX86}yzlwle3W|i8?1(x ztW`_nRdg)Z(%k1v5Gms&r=p<`#D(A&X_e{JQo^g9j*s9eIzY6 zYEVbv5VNwn!uP0f*Z-b)+`!SJeIC}9XFd-Cz(YQRN>75Svx^_P3&f{CLDv@rCchq;6c-tdgT4y%Q!WAkUQ-u7tmPhxI8=bK{kMNeF z$0~To9336!Feo!LZ~7I1m>dB2)R}X1kLAVH8#mN61}u#aN6?IQjG`fUZ=z)V+KLQB zZW8uNkKW%(AyMC6U8u?z68urMVQt;q*7AeInsn8}h; z2mT=|DhT}i=sanG%Q}WlA8K8 z1VBQb6wvW1OMBKV3?YpF2;Z@A_4tc{`nK&#t|1hdc;0y3mMrE?;SmB#U?5c%@74YL ztlVBR$OEW@;1k{}6bWJ8)jf}J=?PxL#q+r5;_IcAg!yEO8;n02%*y(#6ov46216(# zA8q}HEfQLfVkL@aK~CMGrK_lauWs}*BzUwcOD5xe^y@2*julSeaO3OOz~e4hyqs>{ zysa|*M@r&x?p$tQ+ZTYzpM}g5Z>7=+KowxT-;m>mXI1lb0unpn{C?+?+1O;+w|k4D zNu8B#K9Ovc3J@u3Q~SObX1CCkdC9tUU*o$^yp75n|(!HI)05x?e4tZ zomIl^1cCg26O8e52C#t>o-$<$sq&2n#7FC0eG zx&bjJ(3@n63y{HTMaXjg;uWG~OO+^=Ei^O~!o3Q`9j?rdDz%3XABz&ViMwRkG8j`m za{w8tU`J^5I(_<8N&sYFwyy-Lx8g;MxPlg-OOJjcnu1DhwaeUs~kAi-4*yfIEZ| z5#NUbM98~o>yET&&Q!{pHA^-W6NH3@Ua9g$d3OMUu@h&YagJ1&6)92(Kf>e}D5hZ3zz#_xAQKWXN~q7=e!o z`GpXcAg5fh>N{%u6)-KeM4)Jj*k6HB8D^|1!+O!GjXB0m-WCbkq6>HYhxDkWlx#+^5f0)AF z-lauzKbkdXq44x27v=eaHg4G_9>cHOv>=BR_F%FffZQ>DM}(Lj=@fz%8$<3xFBD0@ zGlJ545H6oQbxv~6VBN!0Q|@ygYE<7Bz54jORsa+ru%(%^7m628nv}z6DO5y@ zGzC=&rH;AWexP|1;faYWGV%e!cmfbpIyl^_QLS>*TGguxuU-4jJ*7V){*IJ@m21D3 zurw-k*UC(|Mz0|@x_*F%&sy^ACUvqCS$f9t4PYjGw8gLCGUcxMvkqWph7%q&SH z48%N=tR z9u)M_)Vq5pyEIOzY1aHj^!U*eStsZuFn-bunm&604I9`GhLl4}hZL(J55)M;#qgm0HXOF^Z@VLdE<@CG+nm zXvfYUs9BS*;2EtA8V>sS(`4@QbA}+tGdCMT5fO>QEn33Af+J!mZGn zbot8FShN*y3B=-j7684%UIn#k-0SoXYziL=jEQHA&oe9xz4CeFrr%GTWJMZE2E%)~ zb{v4ro_^VXkTPdVPyKp#2Xpm!Qb-)n$8nv64w~UTedbdFXHsd&|18hvHWmoQ*RNV6 zZeP$xz&g=fzfo#S5qO$XIi?bCQ|I<=G)}QY0Af%OBSuf8{Ra(w(o$xJt<4(%))^NC5YTX+^2E#b~JkUKq_CZj4`>bEfV_&^7Zzp z))T6a+Px66;Z4HHq*Y96N_fnO!BC3IGb-(r=Fhesyk>H{4I9*U{j5|m@s7fK2I>$g)(C$kxqRB1LNzA% z;PQFokwPGZCBRjPd?=0KU$vFh-l1W{fSkH^YD-nWs3>_hAbjP|*2R2x>pdVwuTil4 zSE}$i)#o*UXXekK*kG9^q~RIm^^Zc6_6*cE@LDn63%pO)Z{3!A!z&Jt1$fKGjT%Cq zl`QUz>RSebM=O;3ycGYpbbnZ~Y?UZZ7y zYZdL{z%Pd$xIBlT;mMLFwUaBny$>EfRPxu<7JeX9XCVHmI13`wwQ16#OYwLYEt9NU zDbzJ5Po1Hb&HS)W&=x5>yveANhZlbTuZM)}8wFf?AZC_&l$aw23)6Q|CgZQFOVAb1fS-h~j!m?6Dz z_n=pxnm~M!=hz1!q~W6{umHRm%|Z|5S;WhWW=tI`iWlJ_HCIbIDyUwn2mEtVQ@$RO zHTw)0N*c8ZlvKZg!>MbBHuM#Pztm1nqfL>K$REhW&*U3;|2{2Qx=KPxT4fZz14{{^ zQ!vA;`HW3Sp{_^*VhQ)0lG>PkJp%^x`s?1TNkcO7TEIN3^C@TJW?xg!?wwe%d}&PS zkkS>Lc9}9|EH&txUTAS9gwSBIhB5`%)UO1(Hpe{tAFA4(KKtVw5TGfQY0u%)h zjtqzpvMIo8&lAlh7s% zM#U%~X|;v!6k3j*`8(oyu|_dA70Q2(-jq@Vqo#d8p4swRuZBLVBgRgo6DQBSu3+Zx zV;(@B>{GfFu5nxCqYBVuExL~=ve+aZL+oc`GMi6gJpw>sFI!UP$l;4epJ0yR1vQxG z`C=U4@w6hVf90LPS(Vk*mFm{6L0?v_tWm?@JzSwTVbH>e(BvQT1|#AqJo(rUr7f9J zq9RHawpPFuBZVoJp4aAE*Pm14AsugTXXmhK>kg@kwbOBkDW01|CF{ot#`J6o&_(E8 z1Mj*?I&28x>jV0?8Td6}ttLupeGs?v!w*FXJMtCKC|4VJvoco0TOd{w>3GOAwtnH9 zx_nJ~&v}pXLIsi^|9Uzlu%T!|52ypUw^2=`R%U^$@fQ7`F_^5g9d%m zTaw*Zt@)nNa2g4fXaL)*TL-FKsRF_wNScp8vOb!LgWVo&WL^WeS3(p!a_9h5WMVBG zP!&ZWz2?n0Q#fvvq4gYo8mS4!CujPMkPJR~cLc1Ox~pIymTF zMZA(O2xwsgPnxG^KFZJQEqAV*=(-Ti=Fit$4~i8Q#NO9$-lCav77EzYLUs_&$eC*1 zw2{!AAm0;wd8D+sve;G)gsi*{mqEd!w_{Vk29iI9cLKkfQKgVTcyRZR`_Rvo_dq!} zfI<*?rf{$~)vr@4W25@Dr2qiAF7SMznB?m9>nxvw>94<(UZSA;z=`}tFHcX(>ycZM z?omLHhUKejJZ$Cnsez{Dw{G8|C466SxZ(TS{sMR_>+>0X+rJlO&z@DMQ%pQQF(dWlh&h}0J;%;4`EP|$!eMPU-u4*)vW z5#Z@J~}yOp^yVW_!t984~G=?M)V!Naq~`$1p9;>y3eDeG9{0mD=MndCFA1d zE7JW!?-jEUS$ik17}g++o$6m!7RLt2D81~b%}*z3pIg;=OBRErbURS=vkyejM5hwlZDSy_Ib|K}r24RJi?`5e=uYezdI zU{07kldXev^i97WRH9f>0I}OV=Mr<=_sanqJbbJ)I@XejVbC;cSckfIZl?h;$feZj;hC^^>Kph$c&va%~B}R!|5lV_J^?MA(6k$-I|OFc{cSvHa(D zTh_0nNz-Nt5CSNHGC}yQb-QkqH&1S=SGOiu={-P}4C^1DB}bhCX?*KI1!SxEUbpyOi_4cSlg%Sf9tnT1|9&$WZIz^c zjl)vZPKd~3So$dOgnJl{VkO=_ppl`53YUb#|vJN~@A4Zo+AI)92cjQ5A) z5ew({3+J&3R`a`V@xLqD+S(de3H!psyk^}7`jPh+!n**3N}D8;0MnjbJCfg5^`xyC ze-F&;UG;{J&g<>3?ma)A19x@Zz$@`F=S_nA+uNMIJ%MW#CF`t#x? z89(Ijp@mkP_T6aMpnh6Z1x8#D3_=y?Bu2(3%2OpCQ6hUQYwMJ(4_$2xw$9Imm#A`k_L1yhL)?~sdT^MM65 zyipT)@cfXJxbK%=1te*fs@mh}UA$w_4ZPvn)VyQxm>^vF%Yk31WwXW@s2Y53r+rLC9;7mp60xJG*0U4i*p&VYkcrm9|^{N?56!R9(ASf_GLPC%MzENEnzI8jm7wq;YT>T-%2j*PQfWfvi?rXJ~^nWAZpQ0)%<}0AHsiDby98tVayWlwpf?`J%8>#@uXU?3_Z`!0Wk}3ew-pg073sEVma6$VpZN@xF+J~po zx7L^FGv~s5F1O)}TJbU)s{r26vv~K-oX|N8SFFU-W+OQaj-zcv~CGxlZ zdrFv%$L?7~gsC4XR3S0KuWEM(Si~Lq8Y5uXfb$P@9R_RbkACfAkKeiDAHBa5aR96= zk3=U1*UWC6zHTYieEWYrES0ag9zw=7>iEf8EmOJ_x~n*(N|n;n`X3k9+e0)Rm=Vo&AEmzUBwIU(ff%HRxnfWo5{aQ}fMFr%Ut zM2onN=J^s}Vz41C7aImrwrp9bN9T4_rE*14Vv$ji{!x+Aa%ma89eoKt|A4hYAHM!% zJi(iBo}}*WKNXnl^4g;bBrJguQl!-myaS zz3)5=iN5d@jb$O*u%Kr?yJ{>LuU@@D_W}Zv_6rZDSXzSMN@em@MWyn>dv1vS;C+@cmK$WC@9*xf}jGCX9HGHeY$rRMa*+G zS1siD)Tk>Yrf(8u{YuWngdoG!jt1&?QqqS{^u;_K3R@u)#lL8Wyn``X& zVPRna^62NcUwytrGn89c|7fXG5po5&l-368maHgUyLas%&$4CvF6nQ0y` zqcgm6MWHjheEC}36R#`F$GZpx5C1IvSxIW_SD%U%DJ(g%ct@6ZsN_P(b+2kLB}(yY zYl}Y7awM#C?0c0jE+xfXEsFU+2SCPW3!|-ZT9dEp+wmy{BU^XwrY&1{2~V6AebDw% z@p#B0MSkYZ>rP*?zO3>^MMC=^F>bA_qzACt->)C4}b!5YF7!ivFh$?`QcdD{-I~8(Ry7LOD95 zu$PJ~wZwK4-(w`HiNGIeJBs%`uNt6t2bBbmeRuO*4y@N?s&x-RBKcoLrxP0@G-qJv zYmMh?fx^NL8w823R=RuQe(;v@XAml%!sleY;QAEihu<0d1_dZ%cx+vyaw?IzU{Q)$ zDWQ9H9JCy%h<|8(Xoe6x$2EAqdh^`4;yn-+d-CLov?BvI(51^)*nql3H*emdXD?m| z$TFy|E_j|W#{eHF76HRP3NiAr!a|ZeiaSu5g*oSO0^nay3eOZkO8EN@NypKc7~c2F z{Eh?I2y};dMe8IK4FH5*y?TuyE#8V+>ZW6$p3_?ULI`({eDBBNT-^ zyFBjhllNJ4E|^UKPF(8Y>X z>%^6>vj_~jaAiW#ti`qo2vtH59{%kZ6)NC~U&ZRCF6Fh7U~C`VR5vl3U+*U8|8{ss z@7t$(K&fAVrN(11!Duwb<#~CmCI`P22rv_-;6UraKl|`Coq5w4;}CuT-jYl4DS~4) zJc}H?wX7tZj7oF7w>{u33HqnPvliwHE}&Te52$A2e`jK$>6_U#a|u`1%&r9sShfIU~Q#_4d|@ejQp zluocJ=MXwtYcfUQ9i3UpR7>xYu3U!nF4?{K9eEy|`3+sftF9I&ApZs4OQjd9K_RQ< zcSV0fe%FWmw}PxX7}__=c-PmSf^{|iqd488;#8>$k$#p8hd z)#*I8nk-5A0msA?pEpKzCcMynHk>}8X5eoEI=tR|cn_q9ljPpLfEayZ-^w$la<094 zWzt8&-un400Wr-p?OU@NwQTN3A)z4%w{}y(@q3Ai{gVj-QU?F()vN5;vSsmUP}f(& zl}Pf{wJ|ZzAEUQ@Q3;PRdiE~lr8NP5Krs{SuJdPtfOKJn>KX;dxj|wq00pUwH4oQ# zGNOE}DnL+q?!SP*EPxvbwSa&4{t@cD{=bj2rszNQ_lVH#zsr11fQKeZ1fR(uAWiYC zYJ1L>0g5z#4GIc+OtIS|MgRP_a{w(AG-&e%&(#vO8dTmfu0lXq-eF;J%1+aVFe+3q z5qsBov4t2Oa4T zO}=U%`FpJU;apln@0hgzZ-FtXu4Gi)J~T9JenC$UpOM1`Q0E@~>CT}mYTBxUR7Yu`$O0fUP$FW!NPx6WZc7<5q>ryFJdOuK-j>>l^5x4TiNhLk zq8TY|9QTQ!dx3!(27^~D3;mz>uuM9Vj-(^$NIH^^fAY{L(Zj*wUARDWcoUv6d8@_|~LO?ORdK?AZXs4(O;vG%u=+ii@=Cz$pY~1vD|&s&IgZ zP_+|m!B~4cFs2^JjcUpd)so-VM=LMaxTLgJ9x5vl{>1Lt|O6mVy#% z37x7{@VnJM$N*&#?+c9Kq089X+Ll5U1Df9+|NW%21_C-wEgV6asYoF&mm-C|TIBO^ zZ-LxnR5Fb0wd(_~FJoI5^apJ$-_ZB(7Pvk;1~mqCHdyJ?dC=4Z1-!Q5>Xf z3K6J-@D-_GY$GXQO7qDGVc=#$^W8kT-K0Z69OQEriv%?A=I?)xvSo9{;AdAss0}5B zB$AG#Bk4#wl8&S!26kY*=?##ADr!(tfRg4N4(Qt543sJs@+x3FdhCR>8jIta8g__L z@TE_0(!!u9u9-7)B9-~9qYA|i&6LU>+^pC6UCwfQul$OBjfoPZ#m{r%Kwx_0#@ zJ^A}@bfck%e?1})qmLOeh|;G|S1lsK1T1p*eSuxOOUD$_#k`I`o(I$kiwU@tNreB|KcGaqVLBmIlr#~-T zl56U{WEMaf=>S+XDI30rr2JAPiqiAvl83pUEHD)Fz@KIi_b9oo(J@V$G*Z2kD0GgK zzjO7*4RUqOC}50#h4W$(7)v^mj-(^$NIH^^*my&Wq`~{7=L|HXqcFtwh$%W607&~c z|J=wpq8i%q{q*y%bo$J>XfPH>%2O;5rZ{v=@?2%hl&0ZB`ioPEk8r-mKGy96Y;BDr z;N?P&`|l@C)7f+9>GGB9bmiK00@=AnA*2yB;{g6a|I;g1uT!Q>8Q?T3z|Xtm@4x?! zRSEqr3H+si9+B(y@UO=jk5TkMYpyzt*!9j`e*tYfckPwlT4+&HwQ@!B`K+XaXa2mE z0iHk->YghnZQZb%7A#ywOINOCV5c9GBVPoMtK<^>C>!mci9{wJt?j4r|+zUAZTHj4uin|kpRw;;khsDE- zgdg^1&rIqV#4736wZ2LDrq3pFUMyW#8;3C6eax$kERA`%&RDWh|7O(vO+V%i>id(0 z_m3dUv=-X;Y%Pp^u%&0UKwY6-$ByDoMF^odc&&7~wwlRqPE7ig%&I2UF?Ke)pDDgI z7SDaj!q~>QZcU`?*=d0{&KQr<3`q#@l5P#fRj4Jj4r(7w^Y^ebTL)pfefFmDH|XSv zehjsJ|9{UD`7a)Btdku=LPEt+5>IMSI9VX>MVt$SxP=Q9)IyQBpaU34`DaM);`+JI zXVP-<*6q9UISr8M^S{kO7^r37sViKl0CjHPmciI(6cQSW7Ho#(jKJ>R3#fML^jX@y z=O;RF=qUaD0 zm`qXh+wniBdDBJ+(dOf4fM@JDB{3r>R=JxCdk9LngS+tQu2~s4Lqo&JCYg=&lT#Ns z@)1w-=Q?5yfE+chEv}M6;(kcNoUeIP@jdI;#7TDSg!`C6y={o_3w!?akR1F?_K22 z*H-~5Zj8+YBH{`r?H$#AhJ4)S&wfiv2>*>_xMn230HHJaS?WfZ6pk!qyp{b8A&9Cb zwjwb&Yt?ok02|HtoS}_*g!()}Vv52ZC6%Bo#=)eHk#5Yp@%?594F;Ijb%i;QD>{P> zm0D#w>etZibjJL*GuUW(D z+@T-WG;pc$cg)+O0XSeS_uw-lUO4t_?C%+C#(uZ*EV(=Avteb8(56KI+CsT~G&KiZ&uk$*sdfS^Pj zYEHT8wZehKc(l0c9~=@g|BH%c9j;xwPBZ2#6q%@JM=;L`Q{koeqM6 zf=mp=3{Rf?Z9oT*8MEfmHKZ@S-e=NV)@%=&bl$fZfDiYFgXk&0ua!dXoL1+ddvBgG zgXOV`i9)r1n*+4h?n8r|sAL>Ea-3{P&-@emsMAQ*N}o&A$E zQb_&aN(m~zGk?vPzNpkN^n)Q3Jvejiq<)-b))dZ;$TPC*zI}=5?o;Q^rxIjOo33 z8cHENK4bQLTJzn;7-YiQ0T4HKif-Li*3C?Xjr#)P3qmFGe2L3*7zNW zj;qybB-hdxj9|^X=XRqut(sBws$Y2WqT9f~{#hlqy{Pl50bC8m7)+fpm)~`PwAyjY znS&;c8-elg;OlnBy64Zqda0N^dGZQ}4j-l2^A^*uY}Ms*%RwF5wcSrSovG2Y48S28@J$l>}Y0?f$Q3F}nOXbU!rY@b@8M9>0)Pmoq1^)^CD!ap2nl^JD z4Ie#0#uugHXeypBue%%1sT*=m>o#gmXU?9NJ&YDgJ-cf7QHCAKWX>7Bx z?d;gLZQE*WvyHW5o8P{l_xOIoI@YzWIoF(HoI^K1hCdh68K~0vqs4x4K(n7UkN68Y z{{<}0mt48rL*iOtDv0pty}y85ME#qvt?J)JDPSy&tF?$cx7k>{AN961YBXf8g7c^6 zFKDMTFtcl95Z<`d6~8S!q$YVLOsNFHwBlD7hibXvpU!RpRICa#0s>>r_TStLdJP;r z!G(f`j&CdF5}>rku(Sf2FDouV_izf)_@=jNxfkELeQH%$a_!Bh)|rIy82wtRaO zUF;l2tm`MhejfBSa=6VoNKmBRV+XnUTfBtbZYExUaJfz=3Y3X{k;x&Kc~gA8kN*Co zO-mgVDB^r8J<$meH`lB+vHf)1Yo<2SogAUWRjXA^?LFdloIPC0+$MYj@_c>!u-Wvm zDLxx9Kdc;E3xKqmzJ*pT@WJJRJ-Pp2GnADf?)w`=#>q{O(py#(941PLKX5@Ie zU4#pi5+N}*Fo7KtQGqu;`Q_im+?NV}G(fcD=Na#55Z+?_mgwV^{UkMGR&#azPuszF>)456<( z*e~QV&Rs|bndedtH+Uj=MB8s`<>5bn&tylin9ooneq`ZoL~NuKRXMRRk~4#1qxMZRE&3o9gT`QcgVL69HnlPS<&-_Bnn zC8_rdz?i3nEVxpoAso^fOicmThj$6-ciy>UWMtes6z=^a#~}fOL?n&RX)2HSC*2iQqY2A5 zP3B-UyFx4V^g(YBD5A?O@@~2f*zyERCJ_;Ec}_pD+o@LR;(0jU2&lVS%Gt)vC71kY zvT!a*YT2`uvem?zO$m4B$lkI5qWQ7JhFXX z!sX-qcPLPiLjVm0B7a2_33!R=w4Q^4ko$@bkrwioBvJ4!sCC=(IVX#4-#=Qf%~<-G ziMYM8y`G4FL zYUG0>v`}?zF{|a%ze@v_)Z}bMJ1X>I>JWZjWxZ-=mD*jc@$W#wNjfbS;b4}^P&()A z!^aEyu8Y(9pEQy=H4|GS%+vQewS;xBLslSt;qat-QkITeCa*~&vz!&xfqnK~6Ix#! zai0QqaG5&bsmK4P2h1+!{Yy31@=Xotk9_LAzdh!}kiB^azFp1sqH=hg4xr5S!!w_% zr!6f_QKl*XbgF1x)egNr$EePy&(N4o@8r-?a0%Qa@R3x=$x9Z2yofXf+k#Y#bq|y< zN)5JC*dJGSswG3(!A6N|kZ)itefj2ocRzWZy0mXU*A<(kNZXKYbrv8w{Ooo6D7=xj zgP7I2%v`NjTSKZ{tMPFFQmoqb9^4o2!sCvslP#QJKb_seG>z2ynRHSYS&$KMyoDU= zMY?Ouk+ApwCyAs*sC;3wCRzE z`QCqJ1~BP2MA{_bR=7@59_XzhBA_H=`fh;@9i%1>5#!=or15n$>C9xighQ8-egfl` zg^6ap&Yy{|{qrMP5x=HYzU5G8slh*m7s!|jKvH)tTXW8Ji%%A-NyuO&y82eBtj=5% zzi=kQpgfr{s19WT5$w;MZQ$5eJk6mo)C>_VSDN9C`RR{~z zu$BI$PGA3`K6(xbq9xJAJz&V>4f+-k-7eYA_#Uxv)`JArX?=zV3pQHVp`w*>l-9!P zdZY^ul~$*pG{+}oE)_nm^Nm^hjifiOE=SL4aCbYFHJq!8J)+cnHgEAy(ddtZf!U~^ z@{W4t4?)CmPb5p*?Mjd!6>KBMRkPh{43VIxh;{Ejv9bMY8Z{Q4Fj17)A@Yk<@)7E@ z(Fpnv{g`@?i%r_ORN=>}Y=*_j1bef`iB+fD2hWG&Et2iu#+*#QWw0$LwmXSuR&q$k zL68}Rnw;+0%_2m1{6#yRQ55QU8rmIKMS3*L?1dG;@?Jry#;2zE#l*f)P&IkBasnqBybzr+q_0nzf!UWD-=q$G8cw1awGcUmP2=A*mpL87_ z*V zfYKRTt*l1D+#CsSgDZa=^Wu4j^x`qy9) zRd}>?{&D4Vo`E>>xYWbArOi@DwQh}bv;-~njj3f`3140Cb-)seNbH;ER(q7wKi&=L z?nYKC2XwbnX_A^)U{Hk0#rd1wPt2{F6#5?Tm#*P_N?`P$d_|ZhNWm(T%H(eICh2W0 zHLQ@nB=e~O$3TO8f@&kS0|{&LqInCNZfuQSweEh|EU@J$VQ;_p3_mkdXzNnIRqesS zF&u5obz>d?OaCS6wh-%umx(0ZBj_9F>{~djuHG)tH(YuTzPN-=y+}3a9`dcUo0&R1 z$$Un+r7~sbGYl*&>&;_f>(?Bq^aNih`|d}_5Y{6|M2iy+Ed!VbwUCjfQxnwL!pnQB zQCq=8F5s1`aNP_s1`2R9)HHPZZAMXvMVOd}{?qCpfq5|XWZ`yR$8bmt+zyBPr}D&E zZWgUZrBL~EjEs;ubUhpSA68c@Nq;i(-rey?hCE3kl-|HvP#EJ_2f+c#CA(LW`E{-9aeVWG5 zE7Lu04o$ijPfBz_hsSfR3k0nDVgnT7lC(bsF7Hq1ON}QQLQIxMN=0PvkA#4XZQ2yN zeo=Cw>-uX4449UKGxgmkgZcd2x|@OFU(G>+fDlvCey0QxeH=t8KB^;x{JXUq^zYh4 zyhgMSC(9u+7!Mp`T8OA%*n2;fJ#Z1Vu18dMKEj%TWqG7e1cu4}Dl{65oLKi-zMAqG zOGn4b!G;B#)C1hhS}WYak`iuvXE7t}%`b~ixLOJPM|p@#itd!b7@`9rCm4Mwe523w z%EGUwqF@K zQYv$h>tGdUI*@YtF^(aD zO8_11F0^M^q7@a%*iXjbohBd?Ww!?5Hr|Zl6v$rI_TmgSP?acl8wP2zv(JK4Ek@a2 zl#}k(1!jayb6&x9X373^*N`y?{rXApRl{F5dO;C|?fSkyCeQ&}cV@1M4^padXMf#+ zf~5q)VsG?U@tXb}yYy;_oBM##W8tt;#e~SZNT;QCBVs25?ylx|pF&EmpZ*0h^PSWB z{i%Jq^IXF;L$t@HEA;paKaa03@zp5t;ct;Io9OfM$_rSd>#tUbn{l|qcf20y9eb(? zYH#rRf>IkSSL1Q_6oA;Ng(?rGf=Ml8tUHMDGvt3(g&fF|j3pqS8#nYFhzg)RnEvM`qv`T7!myXIH=Ej0JcquM;_z z8tr zpv*DkPO18XRc1cmx2b8)1cd&2GLe_N9-%;yt^UP-7$zqPv?@2OJx!?ypPU}(U^f1uuK*B(k8hEm^Qy&28 zY8WuEMHTP7pf^!gN~QHo!0I2YR`V$k&5Y@P0<}$zbs=+b6!?GZyAkoGp~6&v*o5=n zH!3{l$&~p=SctX&*WxmTzQN=7xR6;0AqXA|mCN``++IX_Y~UrZcq9jY15MvnTn?aN z>8yPNPuF<|p0Xz!o8=M)pksC##Gs&@VeAnei##{G57J0g_tbR|%Z<*3g`V~VXsf&I{C&aYz(HFC?R}#rU zB5jSnyC1xsIAb&T=W9BFzXUT{E?V{>sJd3`3-0%!+?p?fa-)jFT3X#sIUTN5$L|ZuDl)gv) zBnz$|!A%5v{P*my4@%Lg8)MU?x!L~DmCsghI>FXRKwyf~2jp8KqVDue^qI^1T*iYmggcwh$OH&|xF8-FYLoOrK_B~elRukjNk;QUM zz+ugz)A!Bpenf0*GJv=ZJ}gIHNK!%^LF#r2C=3aEze4+s!iZpk4XdFpWuO%a(Rbva z;XtPkp5O1bEjSB|42-sL3$=8J*>?|TB7+sbBBqWer-{`cXMl^U+SaDqq`fm*;wDz? zCMxvWTeV6zq0=?g=}`y=T82o?b8xvw<(m-)ACMHr1f+;fHGj<(HeIGoIR+U`53Y!X zR%M#343-mIivZNSg>6@|1eFn6g$ zRHst4LDvxmO7OT8X|(E#4$u}<6Ra)Kb2$q@!3)3Zi$l^YFq zuFImK(Md5298reQZCi&oV$@OScxaMV-EUDN;*fCEK=V!Ujs7%Ta&^^({!NM4J|bV? z*Lpf?J?4=6Eh84B1D;W=tV`-aLB*=mK+=Cp9PXjuWK$*WCYHS^mZxa1#mJ@ns6g(g z#zJU|YH$sD2fvF1Z&Fs?*YVh1x(@u_yQHEeR9?7HYqm+*Y;@nuiHIkd+x;&Ax#deHEg^(K?)!hI-@w`4)v=El4O-^wyv~a<2fU5RV7zn3s zgX6-{?(>2NqI8QTFJIQ2Sj|Q#i{uSrUf@xb-1Q@DO_0wSx}hjv3gmLv=y?`3pzS>X0>s8QluLe_0?@M0YvpuRXr3fe6b_bnKYfTWJ@aeL1mr>#XcyzU9DFfGJqbG9 zr_T-TTr(=C1Iar&56H{oHH2wY`A|qN>1saAYsu|{<58{f(OO)2sIs_yPJpmWSPUa*fsRUzAnl)> zj}_F>En%1D*-{9G+6%`rMNg)df3bhXr?&+pc0J`p>leOqYF5rhK^&>;wg_eZJ|2J7HEnymg+#Kq%M^QegsoFO^0Kr+1(3;g9&K=THiBAWb{>TDVw;6%6 zx|MUu=D!ZpW&9C-@9k5?S>7zD?X`da-hDT`V5+dNu)}mE)H|9)#MDm$NET;Huga0U zJ2YAB?g^@=++4+A<7Z@Ea_6|U>cUCRR#ddABz@!L3YVz4RnYHUx%mb=taN#K2?Ogb zMEhFZ7DfeAV>^klAgGsU)k<}lGw^HZ@AZLW*U%k{lvDqR0=l|gu)OthwG7DKHBW?& zV1l&$#xgsfXLCKh<9bmFE{eg~ZZ<*v1;dVbTeM^mn9~t}HnYOs9m~f^^w;Z%9j3N> zTlF;h{yugi!A$aJ`&oW>HZGE{T3_qAbZ|aeqNF~Rpr{^EkT){&BOzL0Zkr*E?RJaC z3Mg}K*yFw4?d1dcR-c8`s899Ac#j>5V(y;%&Q$l}BGLOsn{W8mn|j1~C_SPX6h=)n zO9I+OLy?BbN*kb}7*>CT{bU^pz0!${X?`0|X8$((^YIN&k>KWP_Lk@0_?ZEcsmB%q zHa#^9@raU?1>DEDp^n;$_O5KA@W*9X48jO4i%?^i-yNl1w+}_A`BXIPk|DAK1|A-M zg^(n4wU_SP399W3!j13aUGKHXu&;A!Le;7t@u2^bP&(ts*gX~rJq+ri3Dnp(F|AB? zJE7$&wa_*WI8U1!aAq$QeC(U`6Q3ek`rn<9(1GX{E7>7ZYd`oq<-|TUee&rgj+Lvr zgUPh}9O*tDj^SM|-q}5|84qy3e{YQaT8T)m9I5x<^Bcooq^FX;q}S@E1`U0hWvDGM zsjOD18QByzQ>s>vZ&Rucj#42-zWc-W->C53L?1_0_O({aW(w(>Q z3>K!d+>g6J(AwBiX;V^tmxVr4s24V432YZRFA~q=TDIU&M>XkyD z?jM%plZN9Z!k_4st8^VH`}6ZHqnKbSvyD1) z4*LnZ{Ds(i6`WZ7!PUMoOOB&hxSSLeN9c8h8tJc!h6?p3Fw*!cGLKMvI1s=~8wrhy zT2B&=Kt_TP=+7qXb^HTWN{ZYx=_;3#)u?fO(?&$(j>w~L{rr4pW~STss#|BK$Ml~1 zbgQJP)7~>apY-(TycUYo+jv8imgL>KclGU&c;|{kZZl13RnJ=C*RL!&ZTiINckdO* zo{Lu;t`LM#_dqfJ$*L3V%RV4-rAirx+{*!?cDGB1wo8C4NfPQ4DwdbU=_P7%qVcwj2u~{%i$jJ)ZG<8t4h!-b0lA>195;3E+W_OfxWIRhs~dwFowSj-j{O*x!HSB45%&N!4ne*)H8^RA8m_tTKIG;PAVPRnSI4%?3 z)K>P*4W?8ZDL~;zdujmjq2Y>lrXgoz=2-FZ@`OQ)^BPW?+nK8{H3!;io0F51t5^cZ z7{Whabv-wXwwtd^dVo8^iCatzUHM_}z+^Ic6lTMZx5vV_OQNc3B%iolC;bWF+CQHe zO*a0=1CJJ|KOf@6R$JZ7{4Q5HEgnYfJR0Z^B@OO^Q^7CxCAML2L2uBvh*dbc7wpzc z`J=?W1`G!{RU7U7P!!He5(x{ZyhZedROkvF%bm{98-gCPc%0G9x?lftbp3ECDA zro`x-h9?A*{eC3s|Gdlq+E9I0UwAv?_=j$Utgy+eK5lW{9zO;A%-_meh%&AQA{3Ly z0b^|uQJ4U$$7hm4!>Jna&UgC&-Jv)ocxf%H3>K#8Dcq{#Lm$X|!r(Q0%Fu5a@p8b~ zD^YDTQ+c%CDD>X!b@e>R$J;s)XodSYH{$YtEg2~o>sbcDpy#!T9Pn?4xKtZyqfALf zCA0vSznCP&RC{)d+^Ob2gJ4taFm?Mu%U2`gWLZoPvcVm#2Icm~Xfk5M1Reo>K?_4c zb}lYc7n($n8$+iN7RG|oHK)GFUNeO^Pqm&i)_d_A`FLd)>5bk`T;DcBw5Q$LmlV41 zdvSDhkktwo|5}yF3e-G8#@;mUn0W^XpD$rmlJ)V%2zs-W1N?Pju_ct0*q6=MZ9YS) z5th}y2OEG#kt+;IPSrUx0*k8Ad}c^Or!zT}Gpu$oX>lM+=t$mNePRa_hJGA%gtb5s zq|}6a2>sr&%)>9GPulDnrlrHDH(BTAwtstlHXN>^^wSlMNB1#r=lS^};PJIN@e$sx zCVO1JwbM%$gystgjQSlm^6gAzI8vf-oE@+&f++VnQ+M;$DqI#RtsvSymjDwN-QVNr zm^_A#Fb4mstI`WYqQb>t#|W5Rm7W9%8S@|~4S=zP7$;m_^!jMnt*Mw^{(9L0jF)QEjg?7rur!)QYuw`w16VtZbNF4K9k zb_JQSXAmO8*34FG`2wyN3(^nJDK3sjNX7w5)t>S53TS~~B4;MCtcFm}=E@ch^^K9h z3@juKm#adTm7P;bS?Wvl@Ba1AmqWm<9&4)2TX}2H;)7x}MF)zaDKaLI!se{?q7$}? zdS*GZvbz%H=?4O0I3r*0EaFZCIJ{gP%e>@(BrYm*+XF)jR|CD* zO$U|bj+*cI>R!+d>MoLVcSH9}@;yRVCFTg#9TEyjTmY{8r$eO^Gj3A;I)+vz_K+4E z7F{Jrjm|=ofgx{}d-A zACze2QT#*Y^z>?#B3Om!YbtgG>-KM>zd?59i_obwMX;Q*`XR-feZkb9Vga&Q&#bH0)(%%*x1U6ns^6Z#dkE0S z9=`6Qhr3kiGgbt%1?c(&eG0nN^ZAIp)w%T%uMa-x=F(nRjZ@b33F%PmrY`sj>`57_ z5Z7ZwNvW&R=vx*fGYU%TF&yyY)+n;eh_Jp*-dOnpxD4Xle9mJ_&y-1|VeBM*nDkR4T@Gy&L zc|})2pZL|b@eXVIwW);y9AMN`OL5y#Hj9R8sG8^|EyrGx?WJRTESK(yVtvT%(wi?mBx0g3Ji*qc!SoXYmBn(;x!0e>o?k8>*&EB0 zF-lnK$sqolnQj_ik8G;Gx@F5&8rIp09N3Me!?YW4*uGqV1AA=bXbBS+ZciCnceZm+PHVg+5a zg+FtK+QIY#(QQ+QxL9OV!6U>^`_>x#EWK+<=gyq`5g7YVVsV-?M(l`)%{zXc9g|M> zB_g%lK&!&xF|)~ZS=c;EHf?O_{3yLvpzX)UGPU`^<@@+F(8GkE@zh%<(n*fnx2_O@ zA&cQR7U$@VjP?iy!NqN7I(%XUvF1j0Tgi{r)vUl3MoR3cFz=N8agm+fOx(-Y_u;|_ zIIM_57;mO4gHKNn&#%o#Eqm-dyUVJ7`^UgtgJ=O;U5&aCG%dC?c-$z{ffgj@0u=s7 zjOkY^qLAR=_9jitOby{wqfJTA4qzT`86UB1@M!{8SmXqq;LAUongaaCM{nW^?Rhtq zUAwY<^OS44!&%H3tt3q$ax=%%FnhWVQqVGv*;tdHLh+mZh^RHqc94s&X^h%#u#O!b zW~9)Hqe8UC&CgIZFzj`gfM{Z4M<(S0E|&cxQg7G{gW2xu?*{qqyKUk*o#MstuN`j< zrYCgD-F64;qA&{+YSswhN}Wz>Se+&ug0H^IRwctKJsK?zW~1&m-`;fnaw&oYxV(6U zu-r+eX%6>2MYKk~9VI`wJ20pJP90!o{nbExknAYP29TGBzfzKie-+R}da9$p1i<@k zk9hvhjXPuFGN-Oer@XgPQs$=SJQg-wKFmg-quLl}$YkfJJ`z0Dg><5=uWgf<+QT;R zE7<@_xvl=Yr}yNjGz zKHkSwSf|Z|a_jfNO)b#;nwKa^?to~6hsaRMJh-!LiY`-XZY{IxadzKwe2pnpXUMFm z{??=$mZT~fAoSUkGZ~kE-DR{-nF2qw3eJMv<5_}wT(T4j>Sy7g(s)!~$SE{!?^H@g zNea(_=6Cn6BE_&7z!t0Je8wE!O3xgiiANnOQz-pInUXO0;ejImAT`ouXgFqC^r7>2 z9OEfqu?)+)%~G8LllJwrETu8&v##o0#dH@SjA}|6;ru;;nTn95TB!AUyakBJNlZCD zZr@j`dRNei1kQFR&S@E;DI+w|sM}!k(-8_9AmCf-lyvKa)<`npnZRS1zzDvcU71M$DO@ONy(sRq6F5b|*tHG=rf zV_}2pIReB5^zV4Z-|H$>D}LiRqyEyATW#I zEMq2d>Wm7Fd`he=XSx=z0z|n9j?G#FFPdmHhvbqS7wOHb* z`Clvbe!e26*|IfkFd{KKpVq-9)BdjhxE`FiS||A4}TePGCvXuKtpP00j}S;}pORHHr}mNiHU+S(pC;H*jDc ziS68|+rikJlOsBv#a1X!_!pnONOc!qISYaWtKU$L>U`)D+5Qnf;j0bS;p9iJ}|NCyDlB>L@a};KWBP z=Z+3Nx1g>!yRwq~2Ne~0bOp8xy7b*=iVRECm1nPXJ>SO^XGJeL=M#sw|0eV8--717 zw2-APjVGU5mq)XMwT+?Vj-($B?d`Zbt@oqE09ra+0Gvz$8+{-KDIsPitEAF-yLDQu zYL|KpM1x6fcz%;B(nX%_zmu*jz)vWLJQ55ath4n0ojV0XztG23i({8U0yLRyPZC*1 zpz+jdxp&O(&gyd;>h(U!%*h4>;x72^96-&RP6Bfpdn7-4y~v*z7;fH0 z1BEDTU(uktOB8I=)WKbxk+;r7thQ9uOzaEL3o`$O%lTU@8OZc#>7b~HHPQEeyU%%l zEc#ULgxB70)@p;wT83{&epPK&>CXg3;oH+?S*cI9y|Wr`GuNlUWVO+5q!a-g!h>r( z>UR0}mvf(1zRbn7yLdO=g1+tWJnDD2|4!R?uxewp4Vc0DM(Zbi?GGT2%wkochsYnB zVS-BS8kQFOf1y?@(ZQr*A-pHf49#>TpTBP4ZziPn0;08aZ=izwxnY5HL5Rd>~v{!kWX8}m~_dK=?hKoJWGB#3Yo|TGaa22OgOmCqI1g6WFiDLk)W3pTR%56t%b zEcqxKda)YxnH@i8r+k*+wRy~y}WLc`DV?T>d+Ouo-L)-a|M0u5*sHECv89Rt((xORp z^0&jJPhZ1DOH=au5`vfw=8L_mg|4|)cA3`df&PS1ab;RfeWj$3b%i@SPSm^1nX`v*22Dl7XubbE zV89L;w3IU2Yy)HliPqyVVR1-Qs-nESTd&%bcy;rJwz6?3N&S#2Cwsy_#~#{`fG)CcjBkr$6-qzD)hw43R@J$};eukH zd!yVR3?Qy6)GXzE@`o*5vqO0}hrE_>;buf>kS5ChwDGWSarT#A3Bdhad8M|w8OilW zJS(d(3*@ZiaVCFo|A5v`Su$Q8YKi% znBa2_iHS*;d&Qh5%h-8?-Xn=e&NFosRG=#d;tvJVlzTY}A2kDi&X$+G)8~c_hiZGH zb_O_ic~#x%uLO3ol#pm6>Pz#}yo92$Sd{g^punYWyVlr@8hr^!5m8ZUdirEz-j=e2 z!7ydnO$#;Hlnw;AwMf>Cj1-36UiN39AVmP?=n&A{%+$)bslyXmI$GW^xwSk`&Jp4V z-howK#NR*Vav3`p1O}PEk^DBQo(G2fJ)()6nJzZl6q+O|q7G)F%hNbknD7vgHOf(C zV(>WfK|JnIP7Bn<2Fs$*$l*P%%}$p>y3S$RCt`%jT)q@B{Ld{ZK_-2PGY*^I3rWQS zlhl802{_q)XqNOI9UWpmc?VqZCnh8?H+kCtCqPWmqP`V-)#CZ~7ZSZ(*}8H#Fv`z= z_Ei?+3x}t?*RGvu?iWUlZR*t~5TMqeeW=D*&Qtz8CnrhN`*C>Qp6*MPteVJW7(r_| z8Eqs%lry?JbzGTHvogNp89ZkhVel>9Fs*-9a;1V$yzA+FTA`LTnuWw7ekSm+%DK#K zsm&dQQs#3)2udHU5c=D~eKZn}*L}L_Z0`sE-rnQlpP;al{@p>0wkt4-90A|Q^h~W$ zhA{A&v58RY7ApSNxgJ&CO0%@;>hrDQlR{71XI)w-{*0l_=~e1 z8UF`TjmbcenGm@F)@{?P(hGtS#=i#shtu^K?KT_v9xs=oOFff2cpSTE;})&;N}hMn za8GIU(blMDU~_AbsyU}y^#EGQc;KEF5T+%2Kya<7k?y}5_X|Rv;zJe9Eq8z9RhxcOK3l37MetL0 zdR<;3Lc}#EXRmj8!}s4bC+$9>6yY7bM;tPbR@&an3qyAd0gDBg>)Ap=;n`AYB<7$R zTtbRxpt!yEMr$3J-W~S46r!J|?APUnI4CFTA3xSPqah|MpGEpCaOOSPYPAv`d(X%3lY^FkEAFM8yX_U^D#_w# zr1O4#d(+t=)0=j_7s>I+2}ZS5ZY1LkJ)FXaOfVXE#ti+PyBc#Bx96PuK69qpB=IAB z9m(%f;A5jF5|_@FCA2fH=VeO3@!&9IHsgt*=j)HE_}CP<4`ZY|R${n=cRqx2;kY0ng3(s zmujtUhp{_XJz%5x(N?Eu?Kro4V?*-6dD8r=B!%(60|6n7o4^d%RJhbW z`)KA5id6MD+iZ4RG{dAeSKoeU%=Ai-dAfwlJgRlM4rx%dDT{TP-T_}K(8Cwcby++( z^C2%gRd1AK>N6neyF%|>Bab8CmYMB&#{1|vs)OL%IO*!(lg!php-njna;H@K@R~<$ z4r;N3%7~0cz(xP>!WEYvf$${y2nP<~yIrjRB9?tg#(KYIHM(>c9zy6RVGEt`t;uA! zn2D}9nEeq6w7`+eW#*IUWG*HJtaw1J4ie%L=Lt;$-h#}gUou;5w<~m3-gUp%kx8Wu zLZ3Jdiz9eL*<6V4OVc!e;~J5V-G5qSCwnjObAKn!n(yQ)|y<{ z)Z_bjqj9G|Zyfiz)F9+>35G%GqY?C&8+NB7@ianK6?@0oNNL-2A{SSW>+hJ}E3;>v z5gz-$w$PXbMqy1T_i1a__AtZ1S585IH-MIFTCa9YQ#e2a78(j_?x4*;r6ewW!)C8+ zcTeY+_Tz!nXY}|6efnVA)tdMffGb74`dxI`wWHC`lf)1>#GXAEd%ez1MrN^fK0AJ7 zACzE@&}KdzifIqLYee-Oh97baIg;cS zwrGE`I6D6Z^&q?sm|49$IV~u%c>ZQ$v5wH2@%dSf{eo`U!m2d&uP^*6bu7nN!p=@# zVmK1>IOrRir=n40YI{Z zK6eQNFJx`QUIET`GW}q>4RZ)tP*rQ*#6Gf3KtJ<%T8-^VQ#>XfV?_tl9=1;!ytyZt zp_L0@8Eg@GaJN8g$1^DT7;1}dG z-m%mwl;IVwfFE$|BB|zH(tJ9mTFCI~e{`9!{=XLBM>`m=skwQb-5N>gmWM0EH$o@& zlG0MF`uL7=ZcFabS+~~A1S4iT&C0Pf`CLA6l~Vbl08vR{*_DBu3ihi|hYPYxe^*z7 z7SRjs=mIJv{o595Y z8ydhdas)eeCHzyHTg&V-MEhv=sEACXWkjpe=MT*FI2T5MhyUaK2(%1%Q8+j_fap9XPXtlB zIXxWisS!VXBk(=rzrF`G+n&pmb;L;r6%WrC@bp1*e}c_=qNkV30ojBk%4Y$9P$ z=d$GFd`Hp;Zk#DR9F5k6`g_U;T`B3t)NF3o`)OppDru`=_*YsLhN}5ukzxs(8OMO{uX>MIzk*^1i0}!+j3?xFvMwbwdFg3a#;Y0d77@N zMw0&3+hwnTXBl0)A(mtCU-8Ax48{$``~jT4dwQ~mz>R350*L)pPl#u?tbk4P>C77sBBwcjk>OBzr_gV7gZ3ZFp{ou@jJ57PQC`+-Q zxZ1#lRk~<~@bAKY9DjcG?`{+doY$n(-Gq}RVKn@md>Ye=QmYd5`5KEv|z_o?Kw`8ygp z6|fA4YjK#X-Ryfmzq^_Tx=2)MBfLa#%LgM7y8hhGU$1wV&V6I>yJnc5%{D>A zJ#EjpnMA@$t;6O9Y8OV+v)~srw*9^!dp<|HWPG=ymE-$vErK1{f%sd@4snsYm=+6F z=&Hxxt6jS7(c5@Eo<fdp4O~b%YW#0}1rg6YWowd875efVVXhCNQ)(zmNQ9P6@Gz=9Dv6+C zHH2OEC4EO%sKlGS0z5}#KJnog$k_V1n?j8P7^x(uA2d*oe?4uvW>p>x0)uDyhql3K zVawUI%nHv1u*bh?Ol9G-z}E?*62Fg*&80ItBin9wWQm9dA}%N03QdK}NGlAHNE?of zWp=;C>d?qlwOMM8Da(%fhn&-1Ixl9#uP2z^zGhva$#&*`$INDxC970Z$#E6x+p3?j z1*ItN#}gjZRuK@zol>tBzg1o2@o&2VHIw zVW&9)i$(-+koC|RZPO)asvn#`nQ4H_Y?nEC)Wzjr-~Dp8z2!+A-7!>?B@|*Onb|30 zcGmKgt%IPZbICOVTd4h7PTRJ~_;{Hkvajc=6YY89`6%$KmY;;=HcoJL!I`OBNCke83TIGm-oFN1=!cjn@akUZ{_y`nSk()YTJtnRkCjRc~`5&WyrVr zovPPL=fDysPNpmO1s4gWgi%KUer0TYTvo$pO8meSpwgC9R-OUZMhBqgpHQCPC&fpP zCn5#wV(Tf(cYW>YZVGb_4bHo%3|XtCpP`qXCP)uGw+Isx6Z*3XDEn^V2zvQc% zaXvVLv0ZPBk=S-~7l6O}v3X!K=5G!!^KjMkfahwlow}997qa!SV=|R@xsff7#@v?5 zlw*UrW{$&U2wkPzk*NII=X(FJRIO!lKGZ>`g{+m(PG_tR#ZAr`JY5n(&(0ucswU*Qsz9z@uUYXOjuB4F z^b*eC=8T7uK%uxS*E?aQS`YBJXFbsL0zBLZFapnhe>_|2)A1db>D4iVP#?xSY~RAEAN!-8@> z%piQ*b|lp}#)EvIGb&f(1&FbvXOIwa;54(;87!t4IF;X8YnGfrX|)hA3F@k|0rVmJ z#>zC;9l^YDYFA+8Afwbj_Zw(Q8uAhor&CoHLO!2#ET)$fzvmNdwZ}2zmU!ZAYT&E- zZ~&<$wn`nNFW(D8r6MWPs8^PIfDv&?;0p7dj0sYkM#uW9MS- z-3f-zQHZ%Kzk`7o*A+4h=l=lyu>=Al(&J?h!0(_2Kb0;Qrj1mFRJB?&*M7U(grgtS8a00~$^H#D5%>Yzjb2@p3kCEMmyteXY-0OR~V?$!yWJWY@@TjrXv7r)=aL`E$ zOxw{0ty5W})?Bqe#gYaSf!%#{_XeNYW(PE{RIM4zbWt~wWNeTVK`j3UygG~UYo`0x zWduP6C?ct6FvpC`c;IL%h-keGV{`~rq^{OKcBNg(H}iSV8I-VLi#qc1|9E@H#=PFA zYq+r++qSL7wj0|{lQgz%+fHNKw%Isolg7rq^ZP&7S9o6KW%haOW6!Kvv(`)zy46%| zD7lI3XEGsYGr2vuS95Ssoc#%hF$Yv0!oW-*r6!U{vBBGnM6l`|6ri3sb4u7epxHW zrHo1YYK(@^V{$Yi!)!L`X9xqAD@r_itar= zKB@c{AA|M#;8*-_3HBlERZ8gNq156r`*|V(Ya3v%=!W%B>(p_)SxYktq~`AKFYXcBo7UCEX4K|pXLRS5F^SdesqCVZR!J-MOxJ>+o6to8Z%f@~g=IET zXkK7KR+4PT{YCNJAI`admG4Dz+AZ+{s1&5)ldJ6$tkIC49v8=9lw#*B_tMbkg|I+=e6CgPX@fUK&B^9&M?j(ORm+E9+Q|#-R@6| zjDGq)rha)GShZBGow?p*2kgB1StK5PR>_U#xc2Dt>M_~1;RXj2*~BB%VIht1tV5Dr zQZT)(e;8>!0wF%R6s7sYvadgviW?YMJ+qyc0C}7X7d0bR+7FvARS3D*<7y z6r~zGa_9Fd_j(Pn*-bQ66%i9X7^vW;&sOCo!1$h=<9o$!I?V2i`4^YNjc5z-pj2p= za=f1ZaCY&DZwI~#Q2!3@#iw$?9PQzoduF%b?R382qsg}v`5b8)184`*eybl8#)?p7 znxqK@R!c=o)+^M;!E0fT-Nz>TtaDZBkr9l47Am0-a9P4=)L=C(6nw^%bPavah7|2C zl}U_iSzfwbZc=AB+7!4pfVBv1~hkWhMz*(#< zWnrnyy+W{rSct##Ur*8BlR}gIFdEj7-o*&kyb~@?%E=K@i1JhnU%q-teB$mjuU`DG z*Cd2&B75q3ofSSGSSU28=k~;&(X&g*UYa3d!iRRoAUYhyjR>pXErwKUWaZ<*PuY+<2pEa*_^<%?_32$eS{N+l8wo_7PYuN9qa`vC87Z*yl2C zv$T$VXEP8C6AW$()Q!$Mq4gQWB1M`D!;3)2?@%8R=Bqe}+G2mk%#JCny|McX8}w>? z;fTeVIV-eK@^|lEaySUX#fLM?VgW?2n8ldzf7cPm5t@6azix;)eW8Z3c&o zCRf9`HJPv_RT-X<6caw#judsyq#1@ESdb;BFiDebHa*%L2xwd zSO@)hO0>%Sq2~6r;iEK)_!Va`YHN`G!sv?TNyjJ~79Td^UZ0uz4@SS}L9xcW#7(!Z z;Mmw0gx3}W&(af-sUEYdd9u+LF=-`wpIyIhHm65LK;j*Ei?)5pW&hsI4_GB^%2+P@ zMsnx2Tft;ULl%HesQ+XVe0Oq}B%Cx_`G3j_7PB1ATH$P|L8rGVxMwIr&j_FtLWj=k z`63>roNb;hm4;jkX?Qi~>gd=DL0xQL%!!3VH4YbFZu0$b$ze3%!56_y_$v@B6 zBx*a~G2X6@wUXI?i@jCB0Xrt+m^9Q`ncN<)GC6H!XZZPJDkM}{_x2R+V3>{Y1ILpa zKCb^bX*HSYirXB=01=G7UP@qhW$?v!nXxEsyV^XAow7heHUw%I@b7 zD1dPID%>0l$q&L}^GyCI$EeLN?UX;?Xv%-s2IfH3JiZXj|KVjkd}2N{dQncL!Di*r zLet;md?L|@sKg3*q4d3_&W{3Xl*n>KMs5(!E>|Qn$vN_fj;Ih)q3jVkOy9cs@hge` z;GE-qdaKTN<)Vw3R{dS+DTmiyWt~0>eER{%lALJJmKq2cAN(wk)>zJ*JHOovekwb$ z$h~<%df#4Q(&Ya|Au}R?NprslDiU9r#y>fwBq+p*M-CZWTvE7CnX z;}F^oIsVuI&@UP{-TBz8$K~UfHKMBg;8;2TrcXGK=0`#OF=SqvZBL%e2};kFNaOAT zB5qJy5x#lzu)F>)$W8il4fHWBCr@xy5#;A@C%1QvWyz|EDonJ28o2LJs(aFxriH9U z0}PmX{jt`Zz3u*CY+BUo<%S%5jTY(EMr!b75hjn4!)lNz2dcK1MvbQOUw9GMHiGqc z|MofI;qhkFisUcgs%?q<@Rdr+$}IHHrD7|_ZhOf{wIdnRIh)XP$%#A0!zU39*gT{sw4Tz}C= zB?EhnWt-C^K@La%lxIXol{@+I^~mip`$qNj^t@&M!>Dlb1bToO|xWY~{g{^7_R4hSRH@9$bO#p{FpQv{W=9fw<{MiAgGVzN8RM2W12 zk%+-BwC{fL_j&O~KVPkrNj4F*NujMw&r}QKEjXeIjM0?*y?Ww@-_1uHRN1cW^L&+^Bue;f<=0ta){tZRV1~W(kH?i z;t0z0f;5*dTK^8=P{V`ygc#87Y=>Sge%_=H{Q+}}^JEFbByo27(PYx>xQNNYPh9YfMP(=e07iK2Xlx%vvHuYO;l4w`_xNp?B#B1Hu4$ z?JHg(9;3Sq7n({X^HXw~<1hUs9_3K;N6`sAZGl#Y_ztqPO@}e=Q*o7La(_~gqQz3k zdE91y?l2a7bg`z-&(Fhse`8@~E%y)w-{SE=(-m;S`i8485CjLYCqZ8F34j^O-KTzq z$Q|3#q1_%czQ*f)?08ZomrA3!TMIgnx2PsOO=h-DE_IgphGgvgeRs85tEbjweWXc7 zz*eon<9>WOu&Nc~?kn~zq?JGm`f60R6}V`# z*_rI4-xRV8kPT2@@zpIGhP|Rl zoG5AZS=8(rvC&|W!5_fnb0yMuV|Z@9gWWzZFwWll{ya#;-I~~^k=)sf3Br~#F4mQq zkIVFHg1gD+=@FQ*UIK>r94)pPd!F?c!QD^?T)sKG)A%3`&S2i$TW{MPW0VqJ)Wg?Z z#mnpUI+-~uBe8v-RqXBf_A`oNv)uUCd~d}5?I{{hc7iZ9b@|zq5QRmVxbO7=^?H*h zCn0M(N(?0pv6g;ht)Ad!!Qzo(*Tk>(e5WsAN}{6d71-E9z_1XdtrMQl5=sr4Q6ag1 zfEv&|*l=Vb-vod0dK^N2xns37(;VRZs&Y5++72bSnB#FF2FSaDQ4(EZB3VZXSgbwt z=AsGOKjbTvi(wD1-LJkaj^ow-^hs!C`BW5G98vpv`*@^}Jo%&rc7Obq@Yt^&gVtd* zL15KvxRy$zjfEH1UvIIMD-?$>9#5v3&*^e(^ql#&?z{Wtt>XtLK0k_rd3~eDY}&}J z7#{_yQ?F-IWqh@hkiTk+JR0!g%GIkSBdYXt<7+DTdV+$%RhT%FK15h>Br$Wrdia0x zw%B^%Xt&wUwNOSqo%gUnJxOvhUP~Cnu^B^vBrFTt6Ir`n-1=K=atF5VhgPD8$J+ZW zJ+h{oQxX3TsxMf3wN&Mb%+EONvP&?am1{1dTZ z;bYQ%WCov{`-+poV64X~|JZYqj?ALYgTY?VFBEk|^kz{?2+3pGd1~*pu5WW~96{{2 ze(v_(#}}88BF-rHN=X0g4)fvXwS+kSow*HVA`rdW`-Q`K0-><%$MHSd?mxst79X}5 zCy^9+NU1h*;LUUGh|;BOkm;GU$V*A(#|mW2HynA%S(cxgu$xMIL?Ha2FtRut=s(Hk z)XyJAz%6_7&-Kju*<()PP@{f@{LE)eG$2})b{X5k6 zJo@M90%NzTk4M99?iHlDQA$FFI574ruVZ9eTDQY_Pfg@7lqlMH}x9li~_ zxak~S4fupX>9tuQ$a(zXUvIXBN~Xp9zT0%s$fAorElwq~!BKtE_0d%zY$=HC$$QTky`x39#Imd6}`o@y=bcu6YNkI6=y#Eu_U%bii$JW_dBpePCB7UzO zT^bHQD9BcYo&Ei8AtP#_GagWn)k8eyOc>j;?}i(pnCMA>CjrQKs*D=o8AB;ij`&J& zh0EiYNKg7a|K+{E)v(o{9p7{#7flF{x-po@Dn1L?(Pa-id7=u4j_UCN81Ag3gVdzP zr`JMA$e+!5bm?}s>t{S7B6w%JFaog5i%=&`iX@sC$ce|Y!%SvB4>;CVMkpcMqW{U} z2m>^njHRVz`)lBallYTEa|kg9R^;_Jjr%;x5&k036Za4K?K`TLAr>DvY}BN;SX?`q zB0+_H!dlb)68hUoI8q)6SNbKP=I)X;8U_}|X@=qCGNlMawLROEvyOz_-_(BNDw8*RVLLG>M^bB@u*`Kjp z!5;S~F;(uJJ`pvH=?ohBqiMUZam;~n?8k&V#~6{tV^{m(xBY`Frz@sCht}O!!sz9J?}_l_*Dh`$93iPrbX?(Ud@Ia zh}8km$L-l>UG~{)m<~`Vp+l2jk!_!iM}kafRi@CNtWgpciz66Qv9i+2Fy=&)RiP0Z z2@iu~rbK~+Nwr4eLi*?Jk0{KZ{}d1fn0-1E*q@kKXAwz#hiiq}m>$pJ5@~M1*h?UJ zIeZaCRBeJpaaSvXOrSUJHl2|po0p4=Y#u+aN7x=RpCUxvVF`&TQ;QmOAil(3VvYz% z0p=<7YtgTv`x-vacJpX|$)iMpQzyZJSCwO(2RF@peAzfjKc<{7$V~y-X+lHqdnRXj zedlW>YH-gxm8ev`1O{;()t&ZO_DVv6^^6ce8R7UEJac76fJ*rL>X&-nmi$c5E6$Yu zC8>WLdL5RlO#k9eTN|JOsj~k^aC`f~FU&y@`eab`@tPp~O(4y2Xiwpy+8`6j%lQY;!EawN0)nu{Xk5=-M7DzWa zPQe1cPkci0&PVp3)=($UkdZ#EU+P@~hbkHDo&?#Fe40d};8gNDSZo7=dl?+IvZ(rQ zT4U;Y0Wt(<=*NfrV~kSB*8p?pUE%#gG-hM1CVo(biyu-byiJ6&FAtbZ&2fy)Y#D#8D#t1Y*TW|}~DTWNN zm&+bi-0J_d0DS=ZfN&iK8qP*RoD^n0s{yKvXdvkcd3jo5FIM+deFsp!Ef8JMknD;2Lbb9wcQfb zza4hUQdri?bd04Nl+X*xan_#C_BW%l95gn0ZEfxQYC#fmCn7hC51{(n5nC|x5sSf-@bC5N6*~!)PynMT2m*(g zvu)XyT=|MWNJa<0T=!O#T=tSxL=q9l+-KTU&#L}2xlL}5BMAz8tn9;cA#J=h(%m4?pHw6q*w^q@H(xhYhfs1Yo?W`_+IN+kvn?H9zBT~F>qs^ z5P72AZs-wVnXxeMFE%7%`QGX9xf~=dqtKCW6#bIQm$Fqh0XvP-!1LWnwN&k81jFKL zH2ma-TZa;%O;8#PctE6SU4&y5eylIy6$j)#kudKt{~e$0+O@(r|7&rY(WO;rtiC5e z)2N1>kWWku{jZnV?7*_`Y1R>~92Uq{AFBqcxtuqx?0q}h&32{XwLN0Mkkb-BKR+Xg zg7ygNg&m0{(u(=VQo>T8pMO^CBKUP*#Tz1Q9)E8b5Ef$wL}91L&;D&+F{)D?NNf7r zB4Dvs`B7MSbtUSaq%as&hoo%}b^~(4K~htt5o>q*Ncy1S<_3Y(Ku17net7}aW;(j3 z3iRM03n}=hIwt~U>2kimtUx{+jF;YyR5YP|pVkv(Z!cTQ>wupG6rsgOu}(4rp$H{B zN=;Pc?C6InM>jr$5>@QO^!whz)1NZBD9?~sW^u%ELhGBG20VdyN&V>zK+^t}LzIPZ zeb7ndLSjhJ1^z{tGp@_W6zH2?)U_x(pHq!<{h$bp<&6};Ob{$5V>Sc=s_<~uEKGW8 zC(qyP)J%!Y=64Z&*<85^^(xgPmml}V%v{N2HSl#N**s09nKgt$wi}JgMj^nB4|U^& zO`IW_Qe|8d0XS^75l%8zp_Nj^me6W-YhF6E7TXOWU|Vdym;ghGO{fT}2LFg71L;1z zTD5Ze^X)}ntoM#wMD<0SNH_HZaOe}Xdk-<=8_*ixYSvB0Vu`gBbYvxsevZ#K%>PW0M>48Fq#;<6!V+fP zbH|g32e5=J(WNUnjEWCe3#U8M>G_|1)SQvPr6SIq;(wU$veeYnL(1v*jS)dh2w&NI(MffDx}hCEhaKVdc%zquHOSL*5jYeobQZHOfx15lEVhr64cKy4o4ujDIczED-|jdM zU2lIN+xu6Sw%a`Sno&P?id1t1x;L$LnE%A_-gjC2B^2e9m~b>aXoZ?C$@Ek@VL*xW zN;yLA>%D>6U)6bzx%ssK&6CLmh(27`fFHDp7yW0V}mxMc_3(Nl_9VRhd)+pI+!tk1ZoT3P5|_er;^3e zNHhlD@Fpzi!M}g@GiC{mCTmWnARCR2aOAo2#7CyZ9AC5LrSj7}=A5^hM9TDYY0J$_ zTuj9K3pivD$72)gB#40MM+_-ds544L5Or~Lb7LJ-a1b|~cDKaYh;o?XCZ@Hy*Omh* z3jTO=0~`-O4zmq3;KdHNy39*U&6MH(3Uy}GAI+W1X07Q%jVwrK4oLWAhT%amhR*dQ zm3zrYO~N>A*DIkb2vcQn+7?J-xa?mID@?p|3}@Ki z)=}sVWBLP$Ay}^t2h5b0pv5h(D4*}q(4cT-$1664USCQgb_h4ns2o1w3*^{hqcgBt z_3IY%5yjbTH+`@MRjvBKE5V?xm!Q@qozbMIsuEFa<1jiYBs?+lul`ubG2u;2omf`0 zsr)wm8I4GOBr-;r@A36$SQ<>O$%t@;1RBoyo)=gmOBL$mbZqW~5w3;X7s`RPV@3*} zXI1yL#J|%$V8bCvr(dw`W0%tamxW)~* zXu@q2CJnMl9cHq65Ad$newD={B@y!OnHM5CW{IC-B;so0=rBNYj-gyg{q%(hECH&a zvUTm+%`LG0Ln7Bp+_y$kLP$u6L8EcigS8A}o^fJk{Pwpol=6+4+)4b)zmn&>Kjo{e z-XB(5R`>XpJZ3Ddu;7>>ULfB)fB)nQ842in-G~ZqnmDu04;FZn1(1r!#>ZAZhR)+# z${^@bgdeuxUrW&@8X76UO;*Exz;Nj^SQs;p>3|YRg9HFUI>;>pyJ~j_+?hagPQG}z zYqaWDZ**@q7o77g+|u!oR;_akwWt*=i#iv*a~y`yyga8*DLBv+ihF+ON(k3T8;{uY z=DnLIgJXI;vsV*t0J2H|i*^x6-Rnjm&bw|Wf^Y~4ioe;+i#SaE#dZT?K>4`Vp{ZNo z3OF5L9;r~T5gn+(76q(Y3P9p4A14B?DviJFE=Qu?E;QcP-rbIz zHQl~c2mnftH3`Ay6%ASSmCR-OF@jx%bWKfYW4Fu==XsWT zQ|8Ynew=|{gnkaS1|_K%ao-&}{Bsq9&WUAV}S%T#tv&02`XV zk>9&JcdGM^uq%mF2XMfxG&!vD^XJ9skLHsk!EJEjrZC%R`IpCNK2@xrQcVQS-Hu{U zcac|(xX94JimU;N0x2|tyrL(9kd{U)f_j*KyHYg^VeWhED(YKVRRr;IxKnHR)NkKP z`oTeX>kl`-k~*eAkuA?Hm)T-dSljcGqh9?Ud5MQ1crl9EOipP)bD;O8M~uR6HK>R) z+tO082jVoG25dq0B}?S#rmFz}1$aO}V26?l13deo+b-Vph86~e!5B4lqrq>5Tfo$< zgpo)QD2N`IhU|{5VnksPrfs=aK)vPm=CauI1FC-Gd>v8lWwUw{1Fql2X@oY^#&R=pv{jEc*F%02r`Y24hLa}4z!n+rm5EL5jsu7 zzeh4w&q{8lbTT6Y+hxr&RxdZ=a@hm%J!lds_vzwE%HC%JCrNzb>p7y|o8EmNofn{0 zQQr=bN%C5|#pv_)B(o27`mnQ5>w)l%5b(*ucxw#$l>843;VZ(CBa!|DpA2lyTLF0# zH~I>C75cS1LR^Pebg8Z>H@WkBmCRbz@=n6PfTW##Ag2i`zK-?6`+6()T6v+gU}a9l z#t=knki@}ZzR5=V=m}GzC@8fFdgjAd?a700%R*WJ0ut3WWwD6x^2+fdXN#2(nxJ47 zp$R4MX#IxVnLAz|#3HulGt@vyD`!@zR9GOOU_38rO%XoS`#{d{T%y;1Bi?AKtqJJ3EbTMlh1orsP1Euo%j9XVQGeYroJb|jTU(nPkV+)7{4 zkmBl+Q&T4ns!-T16l1m6tc3y6sz@9GS5dV(WBf2ZJ3D(Q5wbC|`4XczQ$1c!BXKaA zgv)nuq9BnGiE&hxXtg_j$fz75AaE6^ZtmwpqBAXl{eT$J z-0z1V_~S3%Fq25nmKt~giE9cDyHy?rx9oJnlc~xb7SkLk>gUy9VB%(Vjx>^#$tIjY z6=tJ|T1;YlHhqHCYQN=N?=}vt&ocz2u2$>h1V@kpDJ#XsQ;p$qu~FFSa4pGTCoR`n zq5;U`3a2~2-YZAf>pz?cN86%-laLgc-{*>~{PM_p5C_&x=X@#8Tkph=SX#DaJ8c}g za{1g7Vsa%_>sf#?pv8x@A9=PL?@O%sU`dNXyh$ZZ*ki2S7-hQ}g(cCrbG;zmWj{ji zO%NMZ#Kj?5hzvDzCJ{`-_eRlz7%`ZD^zOgAmk|{8w`Tj<%9o3R%;bA!R zoR2Db#;@lQnhrLNCkm1yS4b7IXn|BpEGsNj5q#dpd;x9dJ| zaN=>XP6(lmLSTLbUKGVz*2mUR7Tzs8;p9;RZY#znbY5XMi85jp!VJk4P$QDQ53V~E39zv9fK5~WT zC?A{NlbN`LFJo3CZ^dx-+JAhHNvWUMY&RQ&ee|v?X#`voVlBzqTgOEij*NoJ(rR8` zXAXVu{;U-Lsl_d6?0J>#;r&+H+P>vDtxG}AGFa6Rz;?^@|#)B-Dus(PWk1FTJC+o;1vEdS{} zwl`MF@$D@ z>$V9=Y)g1RVfO)2jMaTqiva9&KcsOXtjQ{X){>&&u&3nm*6;4;qA)XYRX{HB7pBch(le9V;?#5FVrhjjRml6(8Dkr`a$a{CJr?^%^o`~Z-*V6t zr~=HyI;Yw+XGa%Azb~3thK>HT|_Bu1Dw zSqsf(!DEKlRWk-OhQQZ@ZwAL9w(Mb8+Ep0RJjt?@@;OC`lnUh}Yk=lZ&6mgdk*bB% z`SQ|`XEGL@d;dMuO_=W+)I-6_TQ$|5siYh@K=WwHHfL~HN}jJbm$+7IDVy9uVe#uDxD4cy@V$E=w0Lx(znpum3OiI--4c6qW3h74-g*5g_wfknV-O_!e-uIJ6E3wp z+7Y=+$?tHEOtCv;4V*W+wT6VaG(u)Ctwk{B9D9Zy2Rh4OWMt=7_S289tWZXUZaQr0 zBV8>}mj^vZ0w@oVDAjBR$C*pYORK|>p5Q{c!xh~9o8C%F%`An(csYW@^sKi*Pjqm% zJ?~#ey;4^HZUpYAHS@ci{GARXlrjU- ze+h$+n^j@k!Pa%b*gfP191T1nKzJ~mGST9E-KFv5SpVc-PmAJnx-)uWhz$oTGp~e( zc|6%v)|O?jcE7p<%e2Zh?rK0QaT0v1rPJR#!L!9$V`~(*i3C8JIzwzKPcC3`9i__wh^^RHtC_cZdEPAa( z_99@KOeUw@wzwLRqFm+yc~G+x5nJpe`#w#^{{iQw&@TP=ouj)2c{SDqL!go{I8-C= zLYH?gukuA@9}?l(81-(2)ZZlD?vAGnP|-@!6$k=l8WGpb!6Y617g|^{2*{geN=rK$ z+k%-XHTA}1->Q-}eP0DY$EmJPExVl)mfj)N&NiwgMQ=Ss>@?lCZ{AZ9d(Sn)=kaua zXi(8EWC1NEs#?68mj^lqPtF~y+wq`mC2iF=xzxZ&b@_cGRpR+Wc&C_cH(2d93%Zr_ zVO~~vpufM&Wx|ZjWcG{IRs{q^hSjf(vtK^dBcAw+F!e&MgNIcAdo4T#W@vm+NFs|_ zl#L}tW7fS}mVMyRoa%r<17AV5=zQa&7@byQA){xR7Fj;5kHmOdZE8xnv50H50q$RC z0_V@=3}swA?{PafIuO9)rl}WiZf;%5$s82&$b7$12EoV1=XET{=GTSSL#)HPuF@i$G&wqpZ zI=}7hD2?oWT*IG~ky4}MiFx1k-N6op0lQ`CPtxD!3~#9f4Kn$(ad)mnUrSeu-< zlSs#*^60>XmXjob%}QbkKul*U10l?+g&si>AXQq$u))E>ieGzD!Zk@+sy99FFJF`r z;41DZC2JoA3lxBH007c?2OFGpJE_XkOV`E(v?iz~d(2XmHl|0xTsZ?0G39Q>U7q`k z7@BTZFfi*J@2$#roCnD8ZGn48%|D1}r~U7bg^TD+y`J!oAN3~MvdkT;BSNBJ=(OWv ze?hILI|Q?~83m{{MU0zOVd{pSEk&wpHW2p-odMR}7!wJ3c@H~1y$FU9SWMC|jf8M# zWT~kC9T!q7xpfG1*;)o<-FgmR9f>=U4(b;%iX1hFK}x{I_i?c<#{0e{1wcwMsIPbh z2Mc4)6s(af^9!fWRy6iA2Z?Op8G)7VG-5!{L1;YL)56gk_kaaxGC*!G{A|1Cd4M+@`sFcmPs};*$E8Q4)eIF$#o{r0 zCoOWI{}&kplu67Xvw}s1mgBaP-uZ~w(?IbWM7`~1y_WzhEj z=nk%@Vw}n!lNHY<#9b-X$Z>rjxm#ykx|fq5;fqyA0TP8{}7S}An+@ly4WSsAJ;S01QJR&1#u6^ zb6$ryr>xsmc$UzaRo`7;O}GNGh_0O;!wwTRn?YMHc z`68lAtcwBFH*VIx1RKEM`N^0fp%K{}2~;0+!y|ohQrD!kSFEKQ&eN)q-?8k$;pQDRUaHEn06ZR=&2dLD^lX4HMr=1(1> zm)b$JR*iUfilZX88lS<%(OzxImOZ;xZ6#Cn5d*0+f%$~Jp9&fxw`tLd4Y!*4h!-cf z4t+Y+PhBd|zWx9C&pYpBybSPv$8k#Kv-^j~>1U=^jpuR)tex&w4$oe^?!3P}|M?R7 zp21goHMw$|p|fD^B|D|z+rx^-ki+?rZOlid-`%;X3OqcJJCJl#O(v{J)N-2DS|Ltj zGo9c#@hN6UMoM9t8AcU(?ULnY%+dF6=}JbZH}4&I$EVDmqv+k;-K9!aezS)gSdGhs9)l++a{`@N>NW>?L$kh;~`TYpPljtt~h7b7qEiF&anDu@fO=9!J zyCu{&G@!Hc%Itc58au{!-@3nb554;ksrhgSz#_nuNBmZ0U{dt%2Ijs6 z|6+orB@D?vd%BE3Z(OM>6-{nWW2^LBs}u}_dZ@ZrP7k8+yB7tq05@n>nO=G8M$eL&DY#gyfALofW{n=tb^ZgM?{DTo*sfMzAd`F@ApuGQmM}4M}?UIyw(=|g_+0Fox#%Xcz!7E8*@cFAf zm70zW4Qy~qcjh5ao>yK-Q#4hCwg2JdM3vk^sgSKK`ge5BOw>^fN#K-koP5aB%3 z6fOwLPI7?VvaXi|(y2I}bRfXYRX3q~#i|a?qq{W--el}o1hxa06T(U{4vGtB@iT2| zuDNpYH%=lVKax);&Pq&$7|8p(YO%B_g_|KT?m`rxP^sYv-kY_m&$v6GYH9VqC5>g$ zf86}Qj}d8ecMlI!*$+u;MD5%f-{6|3vk>pZi8~ZsCZmue0$58xNQiuGnjdhbYgp8V zZGCb;i(&$=O@YkrHCl=@sYC?tfZ5-koSa-uU~ZCUIvb8kNqw;k0#LA2_y9cxw2-PK z*WSTGlai%0Thk2uJD+x$!;l(mgu9L_SL}S9y4^57#;4}lDUEFac zo2HOd6pQ$bw+flONW`z9tOUs%hJCL2{Akzuav`J+gjZ{(1&}9wt9K zpBe`2SE0&q~6@j@68jucTbqt<@iGV z?VSss&n?XL--ZMX3?VY;KxNEPkXqq=F+5#?ej(p!I z;gyFs_<6W_i%=WMh|NJi$rM2c!%<8Q0Phg#h5-}pF+u-o|FAAYMG^aov=AhC2T<1$ z3X*w%`>&u{yJdlZLdWxdcn(-yxHy~FhU9&FRB6;Y9^inUs&nOzo*Bg~be$2EjPAG) zo_tg?sQxpwKVY>&OeLabimVz){MA6>KNC}tbci$4J+O}TG$iQ^E8BUMos8q z2t!NVg6O2O?4T^Z)@b_w!UbAxSh{W;l4!7nm32;#P^XbQsGaTiUk3ajZR3-ZMV~{v zhUq_MkLb05dbv6&$yuw7TrEna8?O47g@#m>KICs61(S*7*$Up)gcB;(esz?BqcZ}m zhdxOMKN+l=NkE{!STDwEwcg0wWU($PgCm%gOU(@uy#u#$6uX&{SP~iXy@8HJ%1W}i znIYOQ?J7R$&Axq55(6f1mYZxD0`k#$*x zmR*dA#8ZQ9S8&H`<2?v+51Y@G&3`y;imE?sN`Vctz~>mAGz|_vk2>ndHk#6w4K;7t ztfje$lqrM#6*E>w6faU{cJg2{?$j?x+#pZ)G#`Qm1`ZCc*u$l;TsKo4m?XkVVcvv} z3`HIIM@3**Ys;!RiO`SMNs-_ru1Op|gj1J3i0AwZ85u{~2>1?}xeHDJP1dHYSDVt3><#D*hnHECly z7Klv6jUX@FB^`dD6jy(z);TR;w_gt`DEvd!V%Fy5UlAeb>MEadRIjd?L2JOh5U!b! zo)$g?WPTu4>BtvNyq0pqp@2NfxuM`EN-RzTI=oe*x**MJjLh2DV3ZibQrnM z)$@}&x4X@J5eX{Fk$j^FItozr@xcjgOuf^F43uGgbf{K>W8&c{$C{N|E)2H7EFozy z7BY@Zz%f{H6%!!S3So=mEe z{VyUpj3qJ$`eDO9%DKR;8XPGaVnjA!IF~3=Kvwo$SG(+_-rcvMh->p(Q!*{+m zBhX;ailng>?nKC+Wc}JCj^%ktM#p%^(zBgyCBM=Rxt#JIYi|#LNfM$;P1efUWmFX^ z9Vzp?mD(*a6;xmLLReH~uOC>6dGkA1e2)i+L|C(BdCZ2dg8%nn2SlcOVIvCl|9v(N ztG+*44h~mEpirAKTnh;PGdgG7Xg;GyVHiqf_aU_2X5A72!3$VH$4>>}7ja==8LRn^ zMZu+oVWnX;4kM?%7e%Bfc38STjtyLXBpr0Sc@jpgGLyN0ub)Q*v0JZ)WpLPu0{ZWY z3J{<#tE2|9dwlqSt1@@6`Kjs7XsWiIwjE#&?qKB!c%N&Ir zg_V%eDA7zhG2j2R{Nr|O-JIA(f>>_J-GY12i|gg~{J7V${=gtLE1{U$AFI0cNUu(0 zEM?-|dwgPxE~layMmwyCWc(JyjWNN7En@mRr{B4VuD?&`ah0j#SJ~*ISGB@U5JD!0 z@p-#*P;f}PSS@jrJ~464b!A%^6pBuFLFG7cMW?M#XHHW*a=h7*VMX%HoMDbP!5TwY z57+`%mOfoi=>7SA{A_nNGF+4-Qp-&>bh?Jj@NpDS&Sq#$M&ZfZ=Zy#KZ(| z48mzYCHWv*cVuom8?It=7gwF3ESzt7>6@*>Hi@{k^OVGR|sul=bx8SUHOjjTk?h{3Nk^4fV|madm?I_za_*yA<2?){8M zAIE_Fj=LJFoP=e0+-e~&u!774c8I!{s(F2INV8muS56aM@IZ}N&>hQ@nLua&@8M72 zo#z;^N+ioS_KYg^t&a3eEWYi>irxOH>*FXg-i$!_f;ntln>k~IXs;>ZH=FH|j}$oS zwF(?U{of2wcY3JNZ3H$O@b8;%FAqao4Q57@2&8h>6dk;NuMfXMY%0A3at3uEYU^ym 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 z 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�V|UKLazbwN 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

e#cyc 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�u7O+Lr0w$zT6{Y%LlwaDZqQxD(Ql)IO=un7=1 z!UZ6gv;TD6zBf5cjz18m6bI@xo>X{5dmwTUE^BPd2VAK!appPQ?<0p7K(%eHGju7a zsC;2cj^ZI;GqmAy-_Ze>;?ai;01Q}~46<%7sdhVdYH@UxxR1sJqdcKcLNR0E!_^Qz4!;)%7AbgE76v)-D2294u95P@*lxXm<% zCf#lL*_*O$w5~nhPDS}8TpY4j$K`4O{`v%imL=*jKzcd8_B>THd)hM5BnG)edDE5N z<;g`~sF3@Ck;;a`)Tf?L**$xpCMnmh$775gHTEMqI{uT-UR#qE#M0~aMnsZEeF-V> z2>6wg>gu@LBlOyDfjwJ&L@Y5RV@&%d$$kH8BY|#^bcIPx=U?(5B&Jp6{Lq49Y?afH zI@MaR3f1lL{1cX(Btm8C-QkLNN$2cAPGaKL=4O6QW>(_U(u*{cwQxcg0xn`$3>OE* zV3Sd?cpyyIkQ0b#`!35Pg~Tk(GCCan;(FY)qY4DVL6nyg*DSPDB$BnAFZJyhFX;3EZ8vBQTX~Rg92q`8*DO4h%F>YW=p<;@(gEzRR@WOz(dnbW4I~ zAE>m*7syudipeME68I%;eN}&78jV6Q*#E^eTCufPq_4NvZDz&4s&n@j=1(KaBzeEC zZ)mOFj|vxnS2y99&#?x-0uSxpJ_EN`DqpE{6j2BBy$CgpX3%KaANif$3cxN6scvQE^~uDF^}Ci@4rMJ*t`0*EXe0qQcmI zNQFkO$Fh(_|Xo-$z zB1nS@xYt&nkWtVqHLZ*j2$oO&iHyTvVlZh71j{0X8IqV$}U4n9G_jLlRiws(}o)YLC<^S$2# z5IWU-zpen`#ok}#{S+os=yIxX(7w`ljIi@3wxYGBuD(>HYf1G1 zXG3r`p{%AooaJ1Gla8dRsZ3yC-~yvo##QzJM2HC}xD*6r;N!E`XZ!X67To}6ZWy;E zBj%Deq`kjTLEmMPYv8}9x`)Z6nsyj9Ch!oWsQ`YJkykcRzFQ~aou1H8$8h-Gzd#mv z2w+#8B0ub0y_o=>q{PG>V0uB>Hln#91>P9V?;BVZszYnCoxi!D*C?x(YG|mGJWgkG zjuu)o4f9o*N5{sOJ(>=^JP3C@>WMPW}hfsSac@5UjZPbkiX{buN% zRrbb>tfyt-ufBMoG_o{&w%l~zl|RWavtM9L2*3%d$fEgiehR>j z(^z;O%`{Y&VoAa;audhX0(q7s02X!qxZ4LYE=6+>7vMhzaxWqpR-<1z*pmCSB%#vq z_f^8v@kr6}xxP&ULC3-p6{2&*i-kYqL*qn5q=Y69;9I0yr(9elBqV4PeaSIP$WA{* z8`8N{O@z|VDbZcwKlhu-jq1z4SGGp{(V;)HM0190s)r*m=t2ab%LN zc1MJ(m+X5(0abt?-CxuS+U#RscbP(O(+xQU)Ao`Cw|X*}Z^!W24BZAH(fL}*MaWHT_@oN1#Q zEAn;+p>mWgzK|_C_9vxVv`|r*K=F@%6WSe!)ekK#H9I9t>HbaG zzdvfM08|3>^h2Qi_V=)$ll4!xmCGDFDT(Jr?WcaBQgDK5F9Yq^31uH29*W-dp8+hb zsN_E`E{J?lqEDoJnTOSwp&Y=^9fOM#JQU*FH24kCT^~w!?Twl`(Oif-9ipdb{Ok8@ zjX@M!!q(o_R(0{|X(FZ7>l_&%7i2;+QDkOisee5jskb2^!F#zTPB)%15YjZF?bqn_JfBQ4_i8p6WfbRjXb>n$um? zxWOP@y^&e_*xF=Q_Q7Zu>bO!~Mn;CASb~FvL7@2YDOUfGWyKTc+fIdUK4JM=@&qr)WGknR-=Dn40W;(?WcROfS4_*lpa*`} zv1O;>nk4X#C3{mtPX@0N!-gLtgT=m3@X82q2npS{1saIA7`*-$1of^N}vXDwZQ=25~Ucc7BF0xt*i$;|H zasyA9Mr{kw;Cc@eyi)!W8d?bT_U7Y{(J7Rel5$3wDu0X|-jkD8J}2a}_uGAYk8B6H z{R~*$N7K*Dma;Ba$BI@NbH^-;+uFD_=@&}{>zwTFr+iKUNGJ~Qe<#0ahrrDLV+CGn zuIY;Ni6wAA*@w4|&34M^?7ggVbvQgss_8Aktjy?12sy+c0S%TNK#WOqm&WVYf6!w3 z!VPGdqM%6!zRXeCwgCUcN250qD8^4p)X8$kDAGL*!1$}gYTQx245W9OT~FZw^et)T zfVwWL)&!dRFF%bQg19p6ieiz+2T5R4H_sa+`ifQ2&ujM>wYxtML)7cViJ^1;y>D%eRhLd!3vgG&Eex*K@h8|pS&k1vGZfia8)ql5R`>&r`mH(}Q4yJz!BaucH zAc%*}R_U%`;S;|E7aa7W57Y=TaUJ`rs$x39_@VsuIMthOb6Byiky?emOPIGQvpLW1 zyeafP4>=!-|5EiW!wP;NW}D6%PF-0GqjSvpi2Sdm$$a&t&f!L$7{G@Wnr_pj9*_kK z*?TR5E9S`eA9MDgj)NqwuC7Pq`nSX%;le45o7|<_O}DjOZU9l;cutqg%DxmQ zXWg!^YRQu-<6(O`RgOn%R;WjE+suMqJH%pVMH1y`zz*6gUicNa#3u)BEGK+?NwAUN z2toL+GAwtuZJ?mV6@xMY4bHo;}{r6_C8Oee(89O^?M z;}_p}cbK2$dd2Ehii~TH4QT{`66fs^58S8@!*Uad~YM0+MC%24dru@z(ltSKW=bve} zqP3%M5fFM;dDBOS0T{|VvW(~PJPRW~zYfA0J}Y))1yp1ufW)q#p#vYBulaox1h#tM z<>KOE^U;sszpb`NP3dgo0ovlf!9?wpF0prtsXN2~|E`sl zOpG|7l!XG-gosE4xw(xtzqG2X%qDpvtNnwN)(+4U&}Yr-QWIO9M@Rr;9*x_&Gcc_? z6~+{_7bD=tkLW9BE@%y6868uatTrxIhr=et?E;|B#XhBTkh`96eenzpVWz~68XkIVR z$y+;5Iy}7jg1T8isthm8z*S_-Bp@K52XI5Cpv7B%pPVdXkPF`lx*VYjcX;6FJ?TgONSfvnwn6`48=q|VZoup5ZLygE?cH<}3L`lRHUc&wPb|pdD-FOsh3!2D zL{6D-^@MVD#u=#Dzetd_4`G4m_i_c+iNMZC7!+aOR03rbuALbxub{}S&x~&!@#Ao= zt&EyMAU#H}dZXT|w*g?)X5&XnrI96pxUeebY>9*;h%tL%a^&Isr*ZTu%}EszM`u+Z z^i)mr#Sz$?OxRm~XW3)nt9d`2!1>(0z{$%g(nLlM_gQdafs9z;ac2d#EWuUCiZQKO zt11pYS^>lTI?W*SvrkUhDS1%~zvU&bjGF(-P*ALWeR$TkPz7ubAEa`Ttx+ncR#E$e_(v#pN0Bf&SS2$I$O@44%#n&mnizE-(2UUJwOJI6im8^!G^5MLK5w zDVtSJcrSi*+v#@d+%#*9ZeVCj5}|*#(!6)c7W#*)0-j(yGPj@z8|m_TCW*6H!F3cV zIP&57FbQPg)Rh_!s(qrQrQH?Rbmyk19*4mPj_W3760xZR`c(L-;a`pCy4mZ+w4&q` zlrNPOl=1#`_~ov)ctp_9(I(X0D56h(jJxhC|E{}fX3g3l(JCI|LcS~HGK3~59XxKR z_AurXe$L_a66@K%8f3LL3K0uvjeV*#o~%eN)l)5P@!`vFNn+<($tj9YY@RW z(oOH}1EX0^O?4`oD$x(=HRIE3j;qwlSzEJGc`DYIB|mg%iu%-%z_ue|bDCwEu(O=l z2NYt!vFgYAV5W6FF&8^sQYzT0N{TTMTJc)IU{3%v?crTQkN$n^LbXEarSv+uAJQoX zAV`xr%le`VY*;`)@iF@`s{05^;zZe5vU|@|(?>0dK&jJ~wF)4b9qkIG(;Zt<{$X*Y zY$#c$zM+znir> r8(btHZYE*jtS>A7&z8u?=iPS@qF?8IRVJnZ2>6qiR+g%gFbVx1BhhYw literal 0 HcmV?d00001 diff --git a/asset/img/logo_v2_wide_trans.png b/asset/img/logo_v2_wide_trans.png new file mode 100644 index 0000000000000000000000000000000000000000..ccda84b2268e8b7771781a55fd9906702ff4bf6f GIT binary patch literal 549014 zcmafbWmJ^k*Y>E0gp`yb-3+C4BhAp=p>%f*EnQMWNJ}?JGc?j5Al=JV|b-s2;l?@V*A_r(b5{k2zUMRr47mL{zWYrg3^*am@FHx->^?D`4iWQ z0ReTSTYW|FkJ?XFOaw8^ij!AY7NV29GoM6P8LBSVey0xneuvcQ*swE+?q|M{wr<40 z!r6*h=s_k*kLEO%xl_iUF4=kQ>ba+|n(; zulIH?nj=b$b}h(h7`2;bRCKhgpWhz2qcEQSae47A+*@tKS?=(QiEjEf!NoOHnne|LQv+nDlxqYsjDSENF2Pq=d)#M{@`H)24* zgyNAxfJb-?SoeM{nOyhB3-YUkm|5^{!x;V_Aol_iT-&CKgt>AggL3HZeI46uA2C&L*i zjJ3PEs`O=*lhthDMmFxpSjDH=3wsx}cS?=f#s=f^Ts7x!bB!y%uqBT__7;jVS(u)j zp5`uX4pOJp*HVJOop}<`@&G^pHULmrW@Hg)6huWu760~l0%5j=HAF{8i7=WXUMiPS z%Uq5z+{Cf+1cddQCT2G^ZW3Dh#)2iK@biNw8~Bd)q*RA)#EebtO);~Oz%u}*901UJ z7hCwI>XHhib$8xbSna)rr;RhlxwXkOn z;a@yR9Yd+rlWa*tcc%)bBHmzQ8?Q(+x?jYavJn(o?I^K9(hLLk2eFi+ zrwMJalm!+k5soxti)$tKc?~R>DC@q}M=quDUYc$0lbA!I6>UgvD4*4Ym2(9Jq2EL_ zID?}E!v{>lyXXGfgo&`caLj>diXOSEmZ=THle4p*<+BMCNf#{Yq&@-!9QA_i78+4! z?)NTai9|auT~{l5kC04Fw_02e7Y9CC>{Ftk^M7KpILF>lmP#nlO~GS3-iw((<&Uaw z^>CX50FY?l`KU9Zf*d*rz8zZN8PswmC;J{%lNr|~8(SaDMf4h((qHJJLD-<-xH@Db zyv6q8DduH^a;e%ahwWHsnO-B4gyC3&PdcZiQU-MtNyo2!D!etliRKsoHvNdY&*as& zZf9p`Kl{2%ytx<>w83-ew{3w?GmjBVl2-VHHj8#Jq4a}%DdwPvaOzUwR6RQs3hkR? z7&Z$3)ad~O3@YsS_W`V!wjQL+GvFQEL2?(KbJ~&1u5(LkZk(*hk^kqQ}#|Zk< zc&FY~G=xR7=;DDnB0VqQPwE_W?{WKcC)O=T0mre-=$`p)_e7ka{-U?RLR2(7lm2EW zi(GHsVv83nJmG+s*9oyQjJlkc0Iw4?r4EWc6H=39HVSpeQv}AVYt`<_aM~=&or1Yn z!TZa4WhPT06Ye4KIQ~Kg03P+)>Xj9gsyJXH%^nzpS;>UQtZ!wjzYHn?wQ`Qc$&wHB z^7#^0XTl3ricr0up+VQ8n}&etlNJ}a;Xb*exl%IY7B%`SbI`cO_SwPqz-&*=+}%6<1Q8mtS)aH<4G}q=jD}=>+r|0nbC@8sw21Xh z&kF!)DgY2ImzAA8WxZHiHMm^?Ar7}lmNDV+He+^u>n@En*}*B=qMAh*dDm=j3H`X1 z&!tkOot;KQ?x)G4*oFSI4A#yt_^t5`i1Z!0s_SSJKyQyB9nDpaMabIZ3I`AT@!8!Bc{-I7-5{xhTUx-~qB_yPc z>8Ii(mMaovX#%l{W=YKOp63d^7khQgkmaPLSGcTxTLHZA1Uru9In%@3JUq5UK+pcg zA_PKJxuZRgH8MF&G4J)~g@6;Jm=83T?uMq+ycLzsXkjPxMA?`r%;bG*&_ItIM z#C!?G1jXLX)(#~b!O5e`TeI~eA@ou3^)5TX2PaXYifQao3VfoGOHXIU<0nf4_^Q90g`Z}6 zIaWongC>UY$!MTbm)bs)0h4b#dmr^9vBI%QQ{G8CIi1BaEqJ){dp!90FG~s?N^J+mLFc)Pg(qhD5_2KJ?QCyf z_pb$C93OqZYQzAz?fj4;0vrkFNXUrrIPcN9zA<1h^r^Cnr36I};v+~zKp+s@9`wW9 zoE%EclXxkbDyiHo_ix&c2u^54lmAYowmsi)rjPbFUE%6h6Ai+Cai)<(qyu*Gw3+zK zY01S~k+YM>9wDLMvLX3HwfN!bv{e7vPqgvMc9L+WBuc^5d?wnLDJEE~UU|76M*y=d z&p9%WZn`EbHLnx-?!__9`fgFE81lbt_AQZFkQaFWdlaNLGrsfYZ=dAsGC&C1%9Yw` zo@Kwsx6_s@b~^E(Q?3Y_ha#!&{pkL{xlcS6o)kILv9%!cM0!c@pB_5JPAXQu*>DkSYO(witS~w86=?xphoSo*PYSAmoR@5d|fn#09YLpAG!k_EJB0rz)rK>FUbOO-U&(lV(}J}7c>gvW%w zu}|?YPbL=});B7a+rss7_v&R;$v5Tqt3N39s=4`kg!G`e;+OT`555i*K0eqep0X0r zbbvXfF&$G&QSY@+?B+_xFAwQ86|9qBEeIYCWTa%)!Q=V2yT(`7RnNo~8$i_?FcW~Z z2_>O@M#(1kzXi#gn)teOxL;Adcxt2zBm|Hin%-n(W%0G%xL0;GG&nzZ%kvpbS3XBnrK4d=f6VR(1E2bAC7~?2 z0X~WQ3Q_}nw{km!WakKjs(z>KF+z#9SP>#$X{yhbuA0qeje~i+yoqS3FpTP_U3exq zO20SLP~V30zZpaPcrI7-pm~HDDL5-(+;vS4#0jGyY;SfyAi$;5`3@g7xSxNQuxd$E zLzp7Z^(@oKB~@bB>P`QaLU3fi&~-yqST+Lst#e>3Z>4|TG-^xt>Qvb!9DB^&-e#<7 zsOPq`tLq*+6ceV_WM~ZUgWwQLG6%GOpvXyW#gYY-&4(kIy{K^#^PCiv`$e1u<8Jk&qC9~SpdbA`=rrFH_bIG-wvgxffV|fQ2 zCju`ao?9-Z2^f36UeX7G*DZq|u1=pnf?Js=q4UU&7lTQ`5OZ{y@yLx!Q;<3OVOmq3!`Rt=?E&4>0-38pLwr)Z=#Rjj%K9s#*b;w87TRs@*u@$+97Or?6djGqXAxdMo$7Ef$$RZ8Qh zKr5n4!{3F^_Yjeu<-P?Vt;#N1T=YG9@6hMljULdEyA1 z7fyl`g={J#^E-6Ir-W&1Wk-lHg?$op^vmD7IB6P-BeTy)<>*{45R~hAM_ExKU5sWZ zEbP}L-*=*V&c}Qt2kujvxGy<9rNm{_R7By&q+V!!{3H++&D&R5Dv=h%n7e9ReAKY* zDJCTibG{C#!(B^_Rxj6qTyE`^Fa6XMh+3#%bG(RBYB$)}IJkgJZy^q^t**N1gBMz& z@0H+Va?`xBObTj?vYI=+kNveL1_^&`Sp0GPuzpsmC-aF)eSMTlsTzeqUid~bcm7~1 z#gej>RS94GNg*}!>2agq#gRRYmg_b-E}de#dpXei;!bSfXsg`qo}_qEa>ts!f4J=u z7eCQ~KTYm(JapKW<=y!Xw_xHiO$M5aTOBg;anwSJ8~OroF8#pm@ue7pt@sTkpsngt zJ{iC_A~DgFsVrz?1q}_6LbZIMGhWi3qDH2(r$<|`f24hp#D46zXPT}y{~mV)pz=^ie%eJnm6q(JEw4ou?V3k zdJ!C%qd7)n@7$8O(FBC_iJCx?!V*g@Qn-H6&@SWuiKdoGk{bfXH>DR>Lt@u|q@J|< z2M@+cnKroHU|KI$`rlb_Mt3ciP8yvToh|o~UE11FV?hKGeHy-YV zd;3M(PS6+>*bJZe)>l@$zBNNrh6g&Nz86#s=KO-8{$f-vq~(#)L+C}5|m(u z_P1I_38<9F#OKT15!2bKfO%mvocDK18ddwx_H z+-2Q9l{Y`a&t7+&KrgWWro_|To2D1=+G}Ai+lFV3gfo6uJK>W@1hw*kvV`!Ragq`( zUzf9b#Dn|Eu$C<|lySGW0^4jML%Pr|(+}Lq4YQZXKZfKpmrdm`)?Mm+W=Rr!Fqvi8 zy#z6<%2<_*T5%{Z@<9!YrYzR)T}FOYZ$^pHS8Fj!e5xUFek3iD5%Wprwtllj@5S@^ ztuD7~&Z-YsJ`@BpIo69~HM##JjW>jff6~0E>9YnefEQz6cjeOL2XvUrNTp!GY2$%r zEVR_JbnzZBUV3!Tc&7RgyWRt1qEHngK_y)C-$4o7{n1RO7V{IdRk21h5gG~#*3o63 ze^59)AjCBfck3T%=*OjxcGl)OzA?Wzn;u3)!+$=L_{*Nm&L>#htfc!W-&hRxJT<79CTJ&@bm+b`wWAKb5g z_j1WfV>OdUs<9qRWg|eVYc-l#m%U^lZ>0RFSm$;hG{}%cg3qWVIX^{rJ>#R_JM?gH=Q%$Ta7jX3cWt!pVZxKEal@-x{5cX-81LGev&|D5ZtG8j`5imURG+u4lU3{xDo`aw~|V*RS;^IwB`&oy|2`>+;pu;SN?_B(S#HQkfQ z15sm@rI_vcZI_y9z877osc3F!?+f~7(4?qIPua}>OdCs28lzT98qH0w+n<*gN1)kX zeE*vQAs3o~>2~ANZN-CQU(&XVi^>~fIGH2C({;_|nU*Mc8WmMMW%E-K*j2?)vaTLH zzp%hvv=be+)BR1m7WNzf;6tv44?`bJY;A3WV@yg$S9Vs~W7*qoD9-nxr;$FQsSgtw zF+r(A+cB68g-e486ya%0)~03)$1k|~IBkbsLo>Ihk(X$FzF(KFoWx&m!#Kn@gMboxF(wGvvG<$ER; z4h|bWiD33s!qqCLgV}Q$xmC|S4ezeI%xTV*_6`Y^G8ywCg%(29qUF=+@tp;idET@# zo#yV#?}vmLs}d4A1cJh0l6`%;@Tau!C%oe%XUymPitrHz_~w6wCyMXKvz>`FM0BF_ zY4?wXg4b3^UYyS4G@P7#3AZuU$8^`EV}5fwC|@lyC){ndDjXPJ!WLzS(}{Pb6U#;` z{5`lw6FfF5Um_E3r1Cw`*I*8ICZ8umYt1Jjx~i@yM2*&g)#jFDx$hkF5xXW=aO7LVN3Wmck6iD#J^vW?z~=xs_z*H>uXLqah@o=Vh(t56xH&zoQKVAJq&{K8tlQpdU#4SQVdc%lvDcr# z1ZATGElsq#7!q88_0{nfkPRhb6BDO)B0TNLs*HJ?=MGiUf=bOF(@UM$Jmv2~l}-76 zVTdbKQKQl6FY=iVrSj`1d!#XIpRr1)S84JnTnD^@Nfyo3qcQ4TNJM6T5z_9w=g@BS zroipZNZg$&m9;QsZ`N&Kab?KbpQ-e+*_p3a3o$D@n@^dsLNCy&%Cw#_W9e6&%8xqS zLO5+lhqcSybn)vgyeFKE&s9fqZ*VVkL{KHHlh>(wUbkdi|IU}ow(Fa=OLTs)M6#kx zq;L4W%oPnB--07A>7jb%t>z!zqG%X*5J&DKAHQV`SpT@Pj^&@4&ic!oMumV(A5;gM zxBh*Az5{8wj@%qdr-nT?P0?;Bf2-%YqFeRQlKgxWh?@A~ zZjWuFH>W3|Rb4SZ(wdH%BeGwuOfwn#*X6+}Ry>ntR@AhRs z)=f6;W>2yj^BEbNy_xK-e5ds*P(OqQ|6soIB1Ww^tpm&@pDr-gVz@=T)8z3os?6vz z@^yAoQ!}+a%r%YaBdKvoF5AP;VwGn@tLgZ^Q#x3-(-$k>z%C;dn_i(or%|^w>U@gE zh>ZE^LZdW&;fMKOP<%N_gWQGc{djrWPv$G%*|NF@S+1A4%C`n#Z|?K=DyyCOJkPFn z^}SO;p`oE-2X&~|#Vn4yog&CQL=y#S=Q+_SPE%-({aK(jiMa$+yxz-BufW%ntBRgy zh#k8{4`_w<;phpTi6%hBeIl)91F|J)?~1(xl}n!#-eW@Edd`)quN?)-Q|S(Ja)+Xn z>4CzRR@qisF#XQ!Ta75XXhFfjRDo+~f1eo}RHKYjv-h|MgIK_Q>(5Gd)L!9+vEBH` zAL7n<;>;BV9+8%@iJrQVn_-sZh!G-&1%x4{Wrzw!El(A(#mwwJy=%eBo z@4|DqMs&;-o|cL;yKc18;>pIh?Ep4!zA#&a^lfW+TAAUf4TFWLIBGEY@Kigmnfgzk+r^o*Ndv0HnVpPX#os z#M0SSg#^%XbA!W1%m~|s$q+gwDUv8$)Q*oYPO81-3Jvb@(}L0^BGc7V_ah;&Oa1vC z?vJXs_)}}di~NrRRV}@y(lqE3o0GJ*!1ZmDO70}%s>C!=M{Px-^}p>vG8~~T<=fo0 zJ>(6sn7IAJ``UgwiH=K+mtzUqBeBF1HpN@#QFdB62tML^_yM19X7B5xQ(lFTkWDFV zn5mu!^iZtdT^Dl!nQGsg4kab}k|F|@LCaAu0Ja?c{Oy_5#@as^lGyKyyB^p~d1O;g z*wNl|M`ow;+0?PfAL=xD0Z9~oe)8U{aM-pyK8ZhDd6lNu`zMHRJ#V9_*1~yUYuxeH zx|TMpW_KnwsP9Y40=w1TL2;upV+zB8j_L&*AxV-~T}ZoWDcQ;z-`l^G*EP1$m22iN zy=O%^j;vuws$~vVlJi^A7Yb{=_8?8zC~_h;O`kjW=63ho&tsh17`{H;$Q8O5Tv@!V zJ03;>L=yy11Kc{G9$PK*0#U&XulX^VwlWzM?}%=^yN$T9nlRCGsisz`5>j<+H>!z& z`E$rJ?4MVQ1 zR}{2;|Ws#I}wLiBK+tuB5e4^OW4F>{qLMVE; z2&X-wHd;FQ-Y%%T+uoQqYAAXTBM$PpPvBwd^`NQC%b^k6ba- zY=JGcG9L)qMQ1qgqK1AdP~qNB1jkXeCmkC~{B#4NA!fU`GduQ1^e%{(<+6?KF$tVx4Y zRz9CnQ-AkFW~@iSG_t+kk)|-gC*4;B?3VKUO5*3-W46m5fO`AZ+^ds?+VTx{J1oaM zWO|!q9j&o-$iJ>nNqio}TAB3}KQT0x=rkt?>y=XG-F2bk>bCtjqTBY5SilK7oL?09S6XE?yvtsWA zmEO#n4}%^GG}k;I!=2}K;Y_x=c(>>4|7igPTVDA*=v3R0^(X2Rqw6%fABaQm3#Ts} zfrSTnL`3|Nf{x05aQb3o1{Ht9+FOEs}7iZw^w0IwCt{JyR{j&kftoqVoCE zHY@;QP_G?-An{HfzLq4Z&~b=$r6)PtHhk}qcIvv>mnKczPv=@zmuEMd6V>QS1|MAn zOvdqXNJyBYd<2X>3j%ct+LD}oY-?MMy#*6B{P_9!+^)C7uUJC1s>F(}c~`WdS$9NO z#@`RtSC$$5gS^CUJJ9>E?2iwz8JF;(*oqrr0!=WAJIM2Y!7ChjEH`!CGrh$!H`>vu zcjI1Y@Y)io+-qhav`V{2=0c%aFIPicgoFmlt>mod9Fz(73ak^4eARwfEzbC|Wi^%e zawaMWyWW{7eC@J{&t_D`V*bbBJ9~W!a&!`^$6eLF&mXu{a7nmb4D17oYI;yK7uU1Y zl;PZRp-pM>qg!6hT136tr~A#by(Y~QuZ1S(6!L6xO(y??fI3nbGZoDxmx~#ReU^I# zV*n?D^->$fy=cyPG{Y`(LmUBG3eBIC;&zalHA{nUFsPuxhvB|WnVU) zI}ov1seCPjbXR<`sdqWx+2~DA%T73{fVn=BKpPvc^Uk9UGE#i*pb35=7?hr@)_52& z5JeDLmJ7@|8_wtATvf|U{rR3<^q$jJ9&^~0eSi6j@z>{IqO8VuAyTPJD?Jj>N(cLt zPJT)@vq?D{;TS27jUrbY7p(X1>s~!({S~i7Q_s(Ae3};8IZ%qviQOpP?ZPqT+yUR? zQ*_(W;BgK-FuC0Bxe?cUM8zpub1_cQCdI{3TF*4-hDAokGU-Ff(^~Bm!$L!2CT-_` z6S)l?yq+JN(&^b7PHSz;NVLVfg#-DZITwTzfswj(bgq%njREzX;;FKMEne@{9HX84 zp{c^-%OKgNd4HI`Oe;wk7rB_2_;CXP{GHa;IykIjwk%z8`SNQBd5&sq=Ii_R^1^mF zGW36gi(G`}@t0DJXKr-(uXGaj3JnYmDO*ere;DnsjSH2_$J*pO$=oQ)P%pOFkKwgE zWVS5`jSi;NxoHREAMyX;uo=+8e>&5;0Y zmG(7K-w*?#1XDAbxEU5zTKUo{B!bn<;+~TZDsfb04(IN*BSCk?s+lAvvgehQg0D1B zdH>|b$)6i*l_nClue*Am*dbja(f1^wGGt?LtK^2e!um%hMKZrycDd%ih;4z-KnO+S z&j2zphOaJX5m?W~%O+KUX-x-eNu?7_}SeKEa8{`WJ>0y zQmSKu9h*MRxgKhHFGDm=a<-ZOWnLkn$Nvjtvm?>aHes2kf+X8TX4vF$_uCf z<0T9Y4Z#}24`!{X05^hyhvxtVKe?$o7ypEdVo%2As12R(Rhz%FjeSZs&$mi=k+A5L zo2KXL;MJ06vZ7L`GLL>n6laofTOnkBeEhQHfK!vfi~jn^!$tyIYf}rqi4w+91C~PttrQX9Qa4WcuWAyOVlzALQV_# zGE6(mY84$TjR#yjy2nG&x6H?mU*LUD4RJB1)9IGG>i+VwRo!NcULfcdY}WJfWP<+W z@`r42S!zX_)g%APeU<5Oq|#Fq07$R0`s_Bd=crHE*xq?H)O9xU(9!c@r`h%>Kzw%3k0I9G$Y0C2q!f3hC0kS zgLq(;n=n*U`VUDmj0zD?39E?^bTIejK9z?mmQ0Lq;Wyzi&YM_Lqt0aF!tcS2jUu+^ z1L|d)!uBR;TyGdbeSxK5j%$ARa1!FxW{%K^Fu9^_^}o=eN#pSt$$Jt0)i$PdYw`cs z$|DsGJg3l5ktOd&Ni8s!@v#aptuu!W&RYyl6jkuyWOE&Mx3qmj=XJUM$vIq8b0Awzw-MJxUUHR$c6R#@!V>hRxC z?!;|~?5vA!c)h6Ko$tk}Gy>g3My-sPbG6HfUd|{EHRE-=d93$2JCgCREwtK(+cnb&PUK%~o`gfLid zL9n^@H-**VE?Qm632{41_ie24!kOE>F^WMHhKSAkK%XC!tTgiv9Msgc{1QdiUiOY5 zot>gLo=1sBkKPAjtaPAqbks$mwVsG=rb%J`ZYRokVtaONjh;5GVR5hVZ>?UCzdna5^nOkUYZeq4Ka*WM7 zzh5^Vz)T=k8%gCiL&?4&@6qIoK1sxbQsnX&5OisuS~n`?j&Os ziCa853MbhiaSZlZZvABIYvJwpg^C>w>xY{zppug>bXXa=u>uq8krFiM2NeDzA+_E~ zA=}&ApE8PS_KMTep!f}`OOW8Dh>PgmZ;iJ_}!&j4;Vf8eL~5v5El zCA+mo>k!1jVOBaU6&TtxcQ{{)@5Qqm-UW5sYPjgQTymJ$=fE+}yLzU0JhxNTH_OU@ ze(RBJb#e=vZebrVvG4tFg&!EO`mC2^2&*c@zgful_a)`I1qDj{c@!YhsMo?>3eE13 zb-`VAf5FYIUuYFuS2qge$4@_B{01rWq-N_*KF3%uvL8-MuekDm5b2}3uj!CwKUx3B}zBRS6E zbGx8@V!m9bF=4#o zRHD-NBt$gCsioRA*B$4bxz&7Dwn(`Xq|eBFz#MF9!2R)KX!kc_ark|Z3?Kg-g)FTZ z3Ho2RqsAnVLxM5q^%(#q=~Qd#y2ce{E=!f*RR*rG$|Zo+H#Vlclq%D6b#QP9{?nup z8~Y|#Nniq$t2E8|VsSPeQyZd$B@4A zJVN45q)}g}bVAt?ay|&BchtQG*62(O4LLN*5|_o!84<%lI=$Xp8c~v`qI3}z7Y~Z3 z-P+pP*r1c9k>H`YfEnyCP;xB!0*ni+h>OMw;%(uRLn$!r)GR#&i5dd~<8I*jI_hXAAYqkD!3UNSzUZ?s# zAE5A5D(M6uj{3N@X(&IU|)~=bpf-`&^JL|jWzKDZ6XGxCuod)c2qpb;pU&9ki zQ=1QAgXoo-Id){bV|yL^1|MG!;sF5VDAgO!;4eW=K><@O(-TaDKz<2DwqytdKDSU? zBR;ewmDmX`9x;W_WoN6o^hEt*a|7Wn*4nPJ40uA|r^ALbvY>#r5I!Y42uON>cK?)7 zeIpPsYE&z>_EVBdvc419;{7U9zjF+>)_)iq)8Z3WVQ17}-09KGL| zueCo%dL92OPckXk9J`HXSUImKf3EBE@gCT zfh}}O#-aP0PA)Fq3YDJh4)%(3S;-8WdgxAf8x{WL{FCK{HDM&@3gqzW6&U+P@%<9-(=QNTJFif@7>$aPNv3=`Zh$z z(I+iqA1w=C*2}-kk_n8aCaT-x^ES(Xny=l|0$n0qDy?*zUHpM6rLtdzJRqHiTMT|T z4WZQX6oD%52W}^0jUgFnG)$;W5SCo&(NGZ&<5##FFX3@BvcQD1c}6D3yPw&T)YOm5 zhgJ7$w~0GOkU2M#!Xg)G z(}HJ1LqlVK7pN?nd!7n3#SJ`I7%FDd)GhnZg%F{nrjR|N!@QxK7AHj$+?%1=3n!(} zh|b=f-xL(j7_nT3$mX+FxmC)9&lFw-1h^7#SoUDayc#j$DoTou{oNOq#HZEm@jePjOh-&gK9?bMGkAnCv{v$v(=9(`H7_u*XM)8q)WL z5Zp~rxG^k(c%F^H<1B-7nW4^Bk|2%U0{m#{PKmrblA~LJ>4m zWxms4lV;v#nxWw72}kt6g2;s_WE?bMeP{YzLrSuG3iDG-Ocu^N;fdv=5t@$XdlzZz zn+c!jmCob^8^Pe&MVdg)nCVbIf74j3yvH+R zjT01nrcW7Oqv1s=Ws)p%6 z=jo@-_~H3f27V@{#TvQnNrP{cYDaOHbL#jIm{I zfsX#|lFHQHVx`HPD|<(@LY8`J?1E1lPioi+VXS~Vf?h+xdoE?=G_tu~?YE%pk?9K% z?tOKl;znz|QF4#Av06x8w9E_H^dns7o$;?u4V}5dY`1n<9!-q@t{VV7jA!TYQax1# zPIx4i>*NaD2PqgCQSJmH@NjdZH(XSknQ7(Vk{P%E&O6T&|F%2USwRsB84o|N>DshA z<9PM&HottHC?DzF5LOr;{b#syorDNm1fNMK3$Dx>J&Cv6xaV5RuVE~39_*!iX(XEK-}$b?PLMG0(%?pH-zE9O5cj`14$vkiI*|~{i>PY!E;nxX1kk7( z6$+vWVA1(~8NQSLz2039qXK?m{r@~|mKg4ER%nqHu6A_mUQ46LMd?EN2>YQ{d4+CF zY51(0pUUlE7deD0EKCzNm>9hcR|doTmG6{13%B1)TOX(b&Tc30I3IvqVGD^pymcg} zd=q~XBAhir^2Cdy4N?Auvr!NmB6C`a3oADBU+OB2;?69|GT2==g~9@BM?wFTu7KX; z*uI$Gm%8l9T|Tz6QvNM(Wi4u|WIr6Nk6O{hb0}fRClQZgss%gFNt=0kK0iOW$NF~X z@PTUg4HTs%MWa+C%k3#MSn7;UWax8Fy6_;%SWWXsA3z}i}CnfZ~zC!MOhhc-6r z$}O)a%2fT~D8E=sJa9UwygE3zuF3r#@#V{d+~^m<+uIe`Ib&3@?VsJW&f?^As#`hK z+oMQ$V`uBk+hY`n^}Sj#<*^rOpEf;7n&TAtSrhwFcnnUxWjTYtOYHUc^$MLz!bswe z0m+=^lF-F|(B}F&qrp8v1-S7$v1TNzpzH%fjEZG^W6F1ekiuN4++6}}Y!R}|6}Gd1 zk2xxRm#3oF8zI0Yh+1*((eeRYqj9UpfFa@WpFc>i*(|}{(UE@wYRSywvKrUKg+qhM0Yv7dl0At6sn8vwI93pha@X|7c5U@0H2(w+^^^RNF%G+UGNks{c> z<_aUBAoCD+krUO-kSy8fRWR`n_BgcIM=Z);gqk*`r9MXohv`P88K! zpIW^!pDLY+iRmwM0tYclyLQpGb)F`}ws5TKFY4vGkF~~)m!U5iYRnvVGaG6wN8#dg z+K+UF4bhc98O}UyggKZG(H1l6*r8)x7v}eMt5KOMdUv z=Falv#&Du5UB0q#^?!%OBlVXIIK^yg6JDFPk-nvNU8%<2dafon3k9Pk$;>D5X`k&; z&It2~z(Hb-l?5h}-0S_+7CK5Z)H>O7;pgC|d`{P|S3wE<#kC!-SZ%7mZKx>Fy!dHL zF2H`mL77Z@PH)X&ImC3lI>}Kdu~g&W4>V-p>#4uZQgzT6PxIu)lXLQuxHO(?9*9;Q zn&+i0%Uwx>AkA%M=i}b09LyR^dEG?UTq~Ajrpf13G%m$DJCmhJA$REn@?;7Ey8O2Y z235X+LM0$c+$owJCVk{)S69#9fwJjJ+~xbqi6Sk|o-js0-45sHX~PjYe0+AI>Bck( z`ccv^d;n6`wSd2#P~n*pmz(|TSGae(NHGo^RWkMnQN~3szJhQW*HO!K&$aA9+F*<{ zD0cQny?EDKE`(D(U)!VHQPZCFMI;KUqI{)jDBKjH?Dto^5RVDxsrH81_Yh^0F76Fg zx3wSi#GsDN6Y@w?QM7a^KOEmr?JanCCtt1?vPP*^WJDlQH@EwagPta14e}I<)})8~ z9Kop)*8=iQEVm(I!8Rg)1+lyJlRdBX?c)rOb0V_=Xk~X& zV>jH~Cst-rRB`uuuv+u2Q~d1cPrFd=tr1ZQyz~DmI&$b|H?J)jq?Myapdh96%3ymClOA zX%MN~D@ecQhC)klho7WyKjpuzKSD&pqH#>@S1S?{jvy`;-|D3{Iu%T;;FD5@lV8?Q z8R%t0pOKQo85i8h^_2w?&?Kdhiw?F1C959u49@Q&wc?mjrrkU_Ik`M(Q}ik;9uW>! zH6BQ8Y!g#{9OKrOier-F%#_WvUmyv$?7!M=vkcxEYU6(qAr2|kC8METdS4#{H?gwY z_J7}I*5p}x&T|%sc2Hz8Tar2mgWD$p7-e2#kXwrUKW-O^QJm z^2D<<%V4hafdT8xVm!<)JL6vp)%L6*ayBB`O;)NyGf4q&o|sC_Wcao40PaxWtB;DN zYA9Ui2z+&6LshCa2cSB0z%*X8zN|ghsbPw$8-n@eR!z~oxFTW~f;*%1sNqTuK(E3X z2&A+V_CN@N1naCL&2_h`DZs_7A5R7c5`E7vQ&U|;zOEuAiJtgaUTH%-#N zAQkP33O6tBdu~{EO?I@NtpW+!QpZH2B;Nyy4-yh|JdpvGe{ptJEtV$uaP$H$u$4d7 zsucU{S7Ro4`cQVCN zkcp`!mwhYGSVQdQs-x^uF+QE{k0o0&-lCq~WRWwgE2#yX^tgH=>YKQ;Q?Lqmw9ULdSr>2xXZ);APniRFYZT7b^;)jMFo60G^2oYY3_Amk3P+wrdU3)&i zCMKNAMnQBEoM3KHx#Pv8=P7VEFs#uUM5 zt5NX^Y)J|Aa9+N`ZC0FA>d#JZR~Hq6*nh8&o1h|zKdf7CHPG1iX6)WyE+Bm;3BQbk zGf76zTAQ;@oO`49th|+R({&dW5n1|wT7aPcaxn>66|TT99;MqDMv~w>-53-xse zIni`n&No)*d!~`G@w93Yf?4^FlkG-q1hxdPPhc;vgF9;WIJv-&bU0{F%-IIq^<+*X zlVtN=GvwN1PzmnA64rRro_PIJ+fH~<8>byA|nR*`X-A}h}X_HG{suzb}PE9T>41V!+hV-qQ zzN^J~0;SZ2BNYv)HRo*mJ1AVN=Cm$waAXrGy@!Xsq0>KTwT7BXKF4^1G~e+b3c7u^ zZ0)1mcH)ddryDR>UB92Sa5njUMaM_~|14UYQ9+Qg59EQ?n)%X3n(wZ8_$e+&y&*+$ zUAONIGl)ayw%|slwX50}02Y*-7PyQUUs$FoEmbK1GIu{w%9y{XbNc%00HXUP#Endr!JRMp9SO!;1I;LbczYbp@N_2|&(*of3O%Si15 zCjf}EAaI$hMz{By|0C=x!>ah+t}y@s0qF*j?gnWA>5^`c4(VRd(L3VX%Az+u4U2!O7-MR|8FV7xIezt)m7)Ji8aCB_Wk9bwYqgUjSA5uv zUCNvD{lB8bJ3svh(%4E0`KXZ2pJou|W1mJ``rNT0{(mBcKjP+fmfqyyIP{N((m(49ZpUUC0w23jYl0m+jCN_)G6 zkJ$KHhl_cPi|`=!n7|hunvIa!(qvFSs4^` z(_!JEf!x1mP)N9GlflVMP`b}Bw(JPX+mAm|T6MS}Vb_)l2#@>zvj|8+$i=;`*t-0( z)`%(@D^awUus>TvwjdsZe?~!?=c%0*ZxY}DS!YrwN9c;R82{AW0jpWeQMkyvmc4+( z6ca|s%a~G8?^$%(NR})|wIDqwR+RM(%|AOTcOZ+KLAO@8@jOIB@UUWT*uh#-scG$YR)%q<3C4Qg=7Fc zBJ1=;XgvPq^+eP$7ENDgqGIt=ipvw5`nivTJsY6qQha*R-dD;TXr)S1-*GXv zmnop=s2rVAB^%Eti~Yu9DI_E)5*;1gQb}7o$rI(icSw2Xy53h>!*^t@cgo?|sYIuV z@nGhc8?Rf9I-Z_+^N*!^`P1S#k5wl)uSnS+8ogI3a42_?;Yc&T%nLkU9;g*ZHer(W zW0Bx6G1<)5>NLixyydc*rv*iuLpR@%le_%}a*_oY0TZI0jgg!bFM&8vX>6P5OGvpO zBUiNXD&afwz}^YYnr2!^o)In;y*g?1_$rcexdO@!yF!5X1fyhnIvK4jE|onzTPRB< zHN10>LyA$uq*FudLcavNKb4e3PvkM)#W2?Pg_o-&rXa7%5|!TTc2IZuHXL9QFV)jO z+^Pc_(lV_}s2CemRrZ0Ouhn1$o9MEd5_ED`mudG?*L%}az3+7Tai$(d9`4wpbA*=? zqqB1DV=NSpN>$eKwAT`~Md{U?;x3S1$4IH9NpwjabNaS)*~c%>e0FE(%+G%BN3Do^cD=w@j2lr(rHS_AGh4p$;*&u)@xFIX6+{>s(w%Db(5^UCt!UV=fdN% zvo+x}Xp7Hc`ReX^MJ7mkFhYK8T3e3Y<(&Qc^n~fM+T-DfsAjI#$^Ur0uW!QYM9y4~ zRyC&^BNx{PTEbWgD|d6Ux)DKm7-S#smi)s)7=JL40Is4q#}3Cv{(OXnqK53E*y&vkTe{Nl-dj%ShFhPTlFMl^kVts$B+u+W>c=%;*RVf>L;SUzHVWLH} z$NaRDG|SGe%VYnR!tOvnIzGO$qm2k@p^PcbJNR=fr~nAYG08whxzud-haN~=Pv`5b z%(qXcT9YeVPr}f4QjDW-OEX3s>=lSHe9LXHE@+s_Kn1|6eF0heW;&}jRI9AIX8|pH zSdxecBNOw+mTdmrt@OVzSYGsnvTjVWgndWEsu7hMXxwhLrY~w3jJ?xkTFodfQ`~x; zWKbJDzw?4SBseTgF6m~Zq?q6REOTLFKnId0ZK>LzYB<5k0KpKasq>jt+h=#&mXMHf zE*hViX!=5!Z8@8!D+BgveGUAXmd#qouY)@Vfd%X`J7@I1Kb8WNNt#9D-X!*8W+ulq zZ4Sv(^;V`^D0|a~Cq`wC-&q2^j-#n{clQHWFwDkEVd-^_jW{75pV%2sw;lv?e1qeZ zKsl<%gx6c3r)GyC@!=a(bmn3$TExWR__BG_F7ICf0J>D|Eft6t*K`kcR@SBYrH>u`&4dRPLyT= zo=SHD_u=b5W;mOEgoN*uqE&HNU?9=!EW=BZUd>m9p=LCLJD!3v zl90EwxvJd^P&RK#&Y@q%dIOhrJFeHseCev z|65j%>rHR1?>zi%3ZGcYyRn zZyPN=RcJ+J+*#b0WXYyX?=gAMtTOmjdccj_YoD)%3XuiB&x%naaed%MS0aZE;PFJn zQTNkjAyq>^p;37tuxB?~G|f^dutEGn`(ZaZgC0V}MvEmc{I&n}zDS?J&WCLhZd$>nl zuvJsAy(XXAwhTVV7_mp6(64(p#<;$x+;Iw=`FX9H|4w-GMz_wn;Q-@7q9A&8eZ9R8 zeiUkF2ZciIN()tsH_3X8H4p4p^yr+&Y=$enbBjqv4x0Mc2(!2HRJquH>iK^a`Lo+k zF(6Q=SwL#8^nHqSfTpLadYy9Q6a6qi9sXfLO3)W=+wENH&U`L_pv?&a#7bR}@%WJQ~Jd1T| z;xF`~&`>S&#LnGr_THF!-R+D-{7Sni(&Fq<$+T7q+wUuvy5z!W|G~%-(U|g9<%N-; z?t}+$kseoWqoIm{8{?wf(Xb(yOUi=ZaH`*F? zF5dNV0RrGZZI9&-&T1%KWttY8>#T0ynA*L0Q|+BR&0(fC*tl`UYjb>0h4`rwF}t8( zXMi3u9%f+vVngxvGHSz_BS*tcn`Tc*2pd zm%w3&E^VYAHmk$u6kuRrsIjRHn3YsxR-=hY-*+1?es{0~uwK1hOq#?6}$*J*Rt;_b^8mZ`HJzSzMD8#?;t zVXn1k9TXCh;WE=>CG-cREBiPkC7ER%Ev_{rI8%WEURG^O8GKg8?C^Sz#YQhQ5Yc@$C&5mhb>{!v?V$1wvXWR25XwAJxcPy1y1f{oIl zHXU8%>GnqcvR0sRS&At2negT{kg4iF%hU8fi>~z=q|q%H6B8VORV~sLmyUao98Z~$ z|6$b^7_gXC8uQ7%PW)g=L?9QtkD%A1$^||-` zjFxxG*W>!^hf37hFmCQMDYQLh`k6#Lq^(9nbFK#ObM<(Di`0$kuQ2vgdTkw|eO~vo zV_0QC8b-gs|H#Ror}9PETQ|lvH1%S~>eoTd1AXZOS&~Ul$qP}jfoL7=gF2u({Hnu?%9K7Ky1U-e|oX~1R z*&lO^f_}U6tS%>&$;v97KVRi04LICK{DF)3%~+B(W$EnJ;`M8mheWV?qS~U*T>)-k z_*BDT%_^zGeyhbzIWJ>?$nMVbd`P9|j_#|A)x68edGcpa<567P_p&dK$jks-OmRbT z)UxgzmFwQJrW?Pc=q>p#No*d@@Z9UlDl;y-ZyfN^Oh2WSX=3Tcc8CijI^0hL9FFZw zj15nEoHve!3}NCF^O`c3(kJ^vP^}ihA4Lud~ZzqrH}Ek#4|My znT|XTa&n~KbJ#0sS~+7>f>KxNajxp~o_C$HFRg!avYhDNn>#P+2=sy=*kQ_1F`z+w z1}!SCspgu}u){|k&s}jz46TyzD8qX6}1HH{E$v{_k#f5Y%5?Rf}&}?wYuVitvGgAvlY@*S%Sq_ocIV- zlv{)G?FM)*Tq1nYREXGSjPoZ?tWk#+2=Ss8smI{v=bDE1AX)WZmqrsa4#V1{gBkf<&5>~ zDU!Ll**Xu<_l%TuR@nsmM+E!HoDEZwwo|VavqEGEJY|_7210Rq3D%;`odC1Nz4p(K z-m!g&23K^UVq|wvd)co)R1hd$08lg{0EyW!!hO?SMqvtJRG`Ye=!)YCud&Qdlu}a* zopla}{S#@K{GiLuqy%lJWMV?CkxiZds7!*4G+jJq0Wmslu;bv!em_#pGoxB$t&y6; zbmV=G_P(c)Qu?f(*2!_mow3KQ%brMSyXMSwr!m%WOJkyJK5lL>&Af>0rZer%YdV#w zXf1^CU~!On(?V<-Xw519?G z(|X~M5o^y4zw6;U^o>JIrGC)x5%U%P-Sejsa4Ru4?uKaH_|)EV<6Z0`aRd!SPBK|{ z6i44(Jom@v#u(k_|J~l&N-og&8-xp?IE=dM4u_>d7f6DR>H@KGZSFdU_s`l_jU<6d zjXp5mDCVDqDSe^Wb4|zx6xbwpeI#a^TB9xrEx7%GIzs>ptD- zgrQi}6g|Ia?E_Nxvn7AR2l%Dc_dLn_XjDK5wBI4N&%Ti(Ph^95b#2R>C_-wtpj8lb z`v9l*uzE6K_j>C^ptObu{WcEGhhBGi>_IzsKQbb8&CRB_OKQ;ixNRZq(f!MQ;?8CyTT;-ppvL=YjBB--DTd>2YMwHXg~H-_^R~SHf1?UAr%>4 zEcU$2dRZ57wf`*kHssV`+LrbL*8e`Wp$sN`dAsFMBU~D~ykAUOja8N5`zHGX_3%@M z@-?OpvpT`jb}lYd)gE?n)w?EKCkqa21e~PlgKwTRRuP$WnC>@}4RlqBFQ3CMeA;$i zsK|J@8x~!cTuaJ=YY@7RXfbSWw2AKXivt~)Z{Rb$(br!hwNur|Kt>=k9@r6Sx;-W1 zu$lf@#b1Ov&}5-3IQ}G@SkNu=f;=QC(R$xHnn$JEmId~>R?Fq!Log@NsxuW86(X{i zu2t^M!}VYb#Za3+t7-SU^%r;_tTFsF@KI4+@R^O?Ym3ZazIw$hp-olm8D5P|plZqI zz(FSdHZ>bk5FFCZwRslJX@##5tB9Lc>vv`WW!ao-_(bJ?d59K6yCl+Z{c_#QIBx(R zl|&J8KCJFyLZ((YktG$Qh+nkqko`qOOySRUg-CZCgO^47?v-cJDuq|DJ*!u^(4BYg zrwN<)E)tH>)kPL-Qloi0C7zaxTKFi8x&28|=D${9Gm$%c3|L*vW-M0JmQh1xY7l#P zF7os7qG$tWIxL}!zE5GA7l9oN$e?~$Nu1Z_pe!Eh@`EkV_!=A5ktIjOOYL=58_LJl z@VhQ@%-#KrXg7(%1ubDF*FA>G?517Co{lcH5N2AV(w5W7Y(mr9dN_jt$VtSf7IgYb z#~Cx6tkLPcAbgWNjU7BYb+@jwkxd#9aA4&y@kECWO6q z1s}raJX%Q?#`SNnyh1w5UCS$oy=y~MnQh%4-egaZVFv;^y@iO=T-9|oQ$5;JWKJzv zTlQxVwy)+X{&fUvy;ppfULE}nt!oUKeG0y;#=W>@MTQ&u?8ah_97%Xe?FtR;43qD8 z`utW$@f?h|DWTdCSiQ)Qs!E&_%DDbZ2JWpY4+IjnY9FTVAEZR$jY(9Y!d};?IZ52B z@=MW_I<$#*6T+%@Sp&^SBD{b8w6wfzfjNUTnQ`y&+IIR}ZXN;4bLBV`iG>l2!z2|~ ztR338q2p1bP3a>;JYc8`dH^UKpT@$xH?Kc+Kk<6#kX&cFB;u9>bRmyHpTQSEM)il^ zLXgVNWH_s0?*tI=_)-1b?CHjB$?4*Kd6XL+q@ERoLi970T-LijujXAg_!r5vqN{_}$! z0E8!m0^B#P${Wp1L$zm(rU0{8{6O41fzh4-!0VE!KKC_Z^e(S1cq2;4`WIvgSz`y> z78mttm1@Z~=&>gN@X8m_Fe(U#juyGOPpe94E3)x;m}Tu6(F6|VQRVE>fIg?@M3Oi<>u}^K$Z&G;c^nhSE(X-zUMNfh}jJk)g$CghjVr+)%&cZ4%Jif3(Q21oMwM?YnOA zI8_-`L|7>UsB2?uW3nrcw)20HK6CHj>6k=Na$OG_zx_z_>!4Y`P9N_s&acf9NG4_? z!x_$c88bLZ8<8{UvEMYR&-<=F`)9l&hw_HZlKNBMzJB)gyU>yhid1fI6#zq*^?sqV zm?lgRGd-y!^7KS4U-kD-jP}Mhh5Lm;Ox*9CcT%nyD#G6QJx114?wg|mHv9+0bZ?-z z0|x>`rx3XU2HI}h>rLITAn&COr%y&%nRc3y$Z{x*`mm#IQ+RM2@FAN$Nl9?QOWsUN zS|OobsVmh#x>JY#{2>eI2)MNT3^e(L`aNr*pP#SqaGHLmn?i?R0V*M@uv*zPj%@4kOZF}JlMc9n#Fs=YVba#6 zP#Q0nU`)nlHzDqmI+^k&^FH(-^i-dnv2bZO`>&(%``nf%V@#0# zeUsdVV$Q7pd5{uzurd8WTToagoX;}a$i4-Zqda3%FSR(#}P7z7j) zmJ~rZ+vK=7HHPwC_@M*YvUNtDg`S>~oSY_B0GAiJABw25H7A>}3(sx&@qTw_eRuW! zjkERUPf92}%;)D{S`eD4!tl*!cb2zApf6?obtW&P1=HsnJW}zwZa5*#syRP9#?B9I z!zG^{kiUE-k9v`4Hir64U!i~F-q0{At`E&bwU{aTCSzPWR93MJhfuIS%2a9Szjvp` z$^&+1B!kvl2z{&s*+gfUDVMpUE&wH?5b_MG;wC3;dad;L6&UQD-l5J(%)y~^<#<2y z@3>X??ZaMvRSAoX$HHl9D`EDvJqMSdzy4sfE0czvepZX&1oTvxUyj+wnxICj!NS)K9Lxw)Bxd(ctk`5zNmtUX^&EQc3fQCtROl0sOx^~7l;A(Gfnm* z^jEKJIcy?^6LgZ2jUGzT+^#}MjC-``Ne!bOUJXH0H@4SKXk_!FMZZJcUNV4_g_Q={ z`UbDyS`)OnODSgRyohq!hT4?0lA(5I3358#YXkes4g^hJGrQc}T}G@CQC;!GL)(GZ zs7MVy?>?G*6Df6(TRqS!mXaai-R-}lJ%Rf9`E3I(y@BBfK|A2JJeq;775fFUJFo{uWbqAIQ1_%Hop zeDs=x;8Ct4#w>uSs~WA!a9pJ4dLKtck%8dI7Td-f&5AqN4!Vo~VF84Qs|-&p!qg|y z=AD<{yng*rG3;sEOkGWNdzP?foq@oVB_a@ukXWA`HLqwr8)Y-??)0urI(&F}4R~8H zFgAY%M}zaE-+gYf-#kRiwkU#=8dlbb#@s6HaSOI-QtMCQEqM+HM{CfOvwh!y?=>gY z6`h$j+&Cg%Pb|5Jp^-XY=OTYDe_k)z$Cup|t%ZPysK}^YpH*(Pz^zI$aa$U=?6Ue3 zosh8CYl@I#m`Ah)Ad; zuT?7sA_k}s;8Bx#N;h(iJH5>y!Y@E`ocVi797lAIc1%FQ%Y;7cZjI)+?a_zYT)A9n z`=e9+%8nsY_?PD9ck^D%iD)o~HlG1* zAOOc>tNUqNcVvFRRAwB8a8AGeLw}TaX%5fbskA&kzh|0%RTY0o`~s6PEOQQYL=cVM`{ zjf|LK-mgPjwf9_2f`&?`A`inc7N;+f5mp3VKKKg~8r(fW!@_DSMoTgs`BqiBFf1&4(Sn%Db6_9bdRb@3Y_FPP@R`Sx1Jkx3XvDN7Y6N4@h$^ z(i%qHYa%O>yUAAPppZ|G?9w1DQg3{TOfu`@%WSZnNwE+Jb<@R#aBJADrw(%`@R||< z>0wUVy~A1=yy212E<$z3L8cD@;T z28kapri=s!`EO9(JMYaa5v$c2+2OMp{7Ajr{ARRlQ{kg|vCC_F-7Y(mjkvd|MSz7h zrjj{Sj^nkSaXy78s&IX>fW*xD1cn(LYmzK|+K`0Lpv&yW!^=DK9h!M!>yoLXH6d_z zd@L1&?M`R4e}54Q5kiKP2idtTruK3b>&kRRQHj9dz$_+zOCyD8*78-62^EVn=*Uqi zEZmxeK}1AJSH#MvLi3Bja^qR3hMK?e{fh5-7Ao__h>O!J2s;OpCKB~A*l{I!_gKV3 zA`38GP%hMTQGNIEhw|Lyi&D|4YGE`2QTN;Wd$DPagH@xTUY)e(=1x2byeijLn)Ht6 zla09iREeo2eyCq3 zpRZIqE~Gx?&iKMwZ=jtr5`bj>J}kpqGYXwr_AcxJh)`kk5f5i1P;{nI`+|Nu!V}W3 z#>FX%A4y(-M~77q+S1apwSASj>_DC|^aLgl{Wc4r zL=QTfv5~nSTQ9%`8(ujflJ&%rrJ^DebDC&<{FwG8bVR;qa5Z(%rbNABU$y^fBNHx! z66$$XNJ0P!5CfJ;^D#z1hkS8zobIjheMsWeiZyY(4NTtHklUpyn_^W}h-M`5c;kSQ z1h~l?Z`UH^a)Vje_x2Pj>|yaoOD2ehu+1Yz0i^+CFfh6UgWVt_bj$u_u+B64xS4-W`6Sz?>r03&*?MCmFg@)2$)?p~ zu2jmA5h74!Sa02z>-;affU#+RQD9avT?ur0hoF%t1SvdqO9>PXl%NYqNuY1sx;&4% zwPAdQ*U;*C&`c`0K~j59Ini;El%&U|QJVD)OZ1AwTll{Z#$^*dr&VL()qVd>>@BSi z3mjf9tid0LtClIu?Ds^NJu$77zgjKg^AN3BqK2xQ4$_v&ZIA5b7Vp2NQV!5X)5((g zpZn+k3ua&rnl~LMEGmQ;G^=t!hTQSV^;ixK4UOG-^<%zn1v*vC0j;X6EPV}4jqndw zzY|nqzSBb83p&O%nu!imGj}();oox*5M35lS3ms0h5hfX?Y|s&*)mx_UulTL3`65_~LHSzu76GnVnoPYT9qFc%YjzxzBH&hu&Eq_|6LiT1qU<|p{QBh|7!D2E`Fsf{5Qg!wZleM)q4V8SdBp^>@fByX1&S(00 zs9}mvY%9dsTC-2+!?RWcz16Yj|4v7%p=8X`@rlmA>cfjRP^&QHDKNzlK@7KU7RWkj?$ z5y8;58|3oli-QWRul(&~3RcZN^U$U_U*@{j*-$*3_I2lxS&~mzara{|GwU%s?+KnA zOjU-_(amA@)KH_r0~7k_-C!gpFK?xB9nY}oHRYNv@Fc{(3FW9tHB*-lggzWco;$Rv z=Z0BWy#Jn%uTu1WuGTSYG*5B9e997pqSF8KV2dlv0yX#UPeR2UI>*L*+vVbgEx#WR zEbgjZp(3vJ6!p4dDnjXF#q@dr(pw}^>DZRBfefrnf!~7!1D13Yz!dJ@bxM99D*Hrc?yajco zN}G)OuJaftNCwk%l&bF;0%*Z>f&b6doD1_6P~5>KpnrRJ$9?6;*dHwN=AU@5o`ZN4-=qS{~% z(b5rPlN928+v^QzJ2ZUTqIGjeum-ovYd<%?c0b*O7FM;N&`sRuG?gr5Nyn88_G!6v zT2}s$D~RD33BVk-a54zuB&gwpG+>Ges}~JP2G%IU#dQYgnntB^EZ1wWnPw$%mnw|Y zC(tOhpPnXE;Xs=c$OE~ur4k}DTD?^vd!>`9qQi#Ed^2sg6f2|1w`PiQf@P2>JM?su?5j9vzresWQ^7w6dl3Nq z-Ul@`2_hxXKOY}6V^?|!*8tJY&8;Bd9LeV(*lfw}aeTOc1|~Tu!i3P7lzzNIhYkx5 zhzu`K*&Q7C-smf^3kWF}M$Kp3-g1|kf~iEFdERrH!*uL?d@UK&-9pfT0fUJi1H_B- z^GXBdzw7e!d@2paFLAh(_)R2O2+;}!Ww5U##e!;Z=KP)ihb)R?U&CdzTisVzx|F)5lO4aRH`ceM zROr;QmIXwADhDnDc(uWIadSekfvJ_Fw0P?P!)MgBA3uC{pZl!lD&yjw0v|0pLvD}~ zn-Pp{ykg~yrZNwyUeBgeGe241b3DD2lQxfE)cXUL%hpu*6E@-%)G-W=y*cg3$ zg6WCM$>Q`1f*nMY^lJGZa8>BZ7vOPWU=|rN5EFNk6O?3-l9H24@9r*SuQMM$@OZBN zJT-AVH47n|zRUd4^)$T=okpahCzeqNi!M65zQ*B0Y;QtVNA{RS9sPL|{rL$-odY!G z8FTz?d+RNR36r>J_(|@f1m5 zGf4vlVQlWZ)>A>~3`@}YyIV6@ZVo1z;515<4ICxZZ@<$VoSkz3cz1Zaf?#X*Dwy@X zZpld7F^pG&D`8cG$e)&Vb5(sbPWjQ=V_soqD~tw8FMj{|`$AtU{O`>oFCH8m z6c3rTQwJRvsTO4BFf?Tb#}&7J_h&;uusrgO)1t@569x)=Huf$KWgavrI2$*?86xc( zgua94^>=P2ID%6v4q5RVrU$(kx&0po1mTANh==QSK3vgywRm-Q#4xEPQikD)EiEn8 z7gtTTPP|z08bp13OE3qhFTh+ba6LTr@$u=;Oc0XkNs`IArBf}*1$_Y}TM6ndWwbpN z*uJ#IkNF>p*(*MsAjdE&BmwVBZ{VQ^HAnw#c-VA~G4NLOGYC@?vL<$Rfb76D)B#oY z(g9AV#+@NnZLi=IFZbCcpQ!zHjRSnXQXLN{x}wqs4Xaz$hD+`JeSibv|DL2IfY!p^ zE^UVsBFkmmZkfnz?k=pqaTH{zz3EREadVBCjbP~4{mMd1c@$eQTGil02}t^|XKt`|8+Z7a}_r)q}0wX&6sXnDt(yoYa5jX58}sq8)$~F+3Jt`)&2eU z0&K8=m<(9ifRBNhsoeGaWvT@_^w*RFQMvMeQ(180)ZO@2dLR}DpHPf9yn143gfPTV zSC&QP+iF=2MvPC{9#`Hx^Xw_0asuiv-=o1YV^7?ojDmK7c9r>ReBkiOu$*=}U2$BF zKM*(HyP_NWsp|`3^kSMIMHS21C+R!iwtTSp9D-PW^>i5>Yu8(1Aro+f2@AJKa5WRa{<}9!o2y0XR}H1yk>Yx%4Pqdm z5iUci^fe_h%pjHltTRVWR2rw390v#Ie4T(UN3V?%&mKi+=NkzDz3T-)q43vqe)vYY zFjzF>ve%ZnjKxdT;QCEO*laqBMY++EhL|8~42l+F_ty{}F8p(opXKr4k1QZjQC(GI zE`o!kO_?R+7OZ$|S-IRJRAAgBohXeIXt1Qj_r59?*gk5RPv!ucl&k>WM8xaz7}PgL zPIk>VXs4NVtd9}45L3tY1ddU$=>A>VJ^w#HcPN>G{jxi6%tBt!{r3Adr)9r>E4^IT zo}I`b5iBi`KG9@0Ma-6l_*rri;J|B29FE>bcSMxP<<4N>V#*}fI_9oW^&ega@`mZY z>Llwm*&b>@@|rpRRH{zj(3bz(pwxiy@1p97|98K1_eGA0Ek}oNLSCWJL~m(8p|OX2 z+t8tBks=kvmrdra$Q@ts?5n}5k@&zX9KaI5U##7FT81lrXFXdl%AnSO=44T zK~ykC44qP>7&1X~${(E8(r{e0-)1V0%loYM-<}abm>iMI9D0dPQg=bXo}^l+c_B5Q zC>cebj{FH5Xx{vy4vLg3^zNK_ZTZy)*M^d1o--h?r5;w=_{$rQ7arOrayRjY=~2N- zdz0mfr|vodxITHUIUhr~{@x|-KO0KIVe!Jw^xJP{gWk(7cB^&0BLrFWx?f$QM&1u+ zR2Fmj+zEXqj4wvUW@ctW#-Bgf-(mr#q(=&$n@Qn?3KAj;O2iEMF>WPEo!g$GR4jd- zY)Dgx!BHdbH`Vfg@j~#ww=DO{bK)~?f~R} z(TJz=&ze^S;DpJ7(su)W>)Fejz4BR*? z97YYHJ2(`wsIJo%+|aHk1=OpnMi~t=T!-hjP)1l%N05^OZv*$wcwJI|@XgG^4_!Y3 z2#`FfA~?XLA+Mq!x2&zJ8v(6~w+Bl~&`$kkYW(N(Yw^Z$%QkIq!StPV?QKEV=RiKb zf!TyeWFm_EN+x9LYIS$lQAQz})gb0{v$YzeUNFtMFaKM};LjGyx+VstjOfJ1wR}Y* zqpaEU(q*B7xV}tB^ATIt_ZpqBPtjb%4dXjXN`y)lxP69L@%aqs%{da|!j_V_%Z4J| z*xU-4lrghm6+!(2ICv$vf2Ke{LRmj558$6BF7~hk(c_cy%6Zv@{n~t?LBOudKSfPp%Ahlj6=$y5JUK8-_{Ipdr5qAX#$!dg<$Y5$#SK};}wk?$`A^pnYP zGj_7s*;$^7ok8Eqy;%{SWJaN-l!8(c{$I&_{QUcLL6M?`h<`2tEfu_==l{K+4?j~N z6{qfViSu`UgTO(rU0=46F!o2%Yp?=dH8cZPGKnM0PU(LWWhf?_Ee zF5G{F3-3& z*|`&2M@Vm30;v}diulFh`8kRh(pOZ+Sr7AyX{w20ory7<<4{a)qV|T>tLmyCJHgZr zeh&wej_SuOr8)OAHmFa6quq+)VHFfemjy4IAkZ;UWm#U`r3*oM6OPGM^Z7%{EcaF~ z)GJy*XWBU^;}`z(2zbxV=K*#_1Mw_g5ChF}#sV6|2T6WkTox~0PX}wrJK?kE zq9oU4uU?4ObHNfGkNpipJ)@f+izzTLf!Of+InWI1U{8P#mXIz_!Lupu3wWW)?1H~G z0O8dxJjae73R)!dpn7Y0Hw^6VaCC{bKZpW#T}gK5lT6AIP!8s#tgVZ8T5m>hx9}eS z^AP$J_3uX~H_>h_?-qRhQ30@#It{|c=~jZc>8;(}+y}GSyy>mau?qNKTYn9YW)@W# z21T60;cPblJVjsDq_3p9HgZv2?;DK^2E%kbK3TBi`(TT!*qD_+cCujvXcr&TOpsw9 z1hZrfX$#s8GP%v5=ztDWJ1x1<#k7%K?#e}xag1X@U#zBOZO4p)D8A?F0sMgWTdoZd z5hoLP%_Wv2tgf%RWNA++vU`udVyui2DQx_H0Y=7x1Qz4p$Nus27ZO*JplyG>Xl;Zc zB^ZYo&PASlVr4z|>uV(C75#@oIl7#WFSr&lJoHYNbrRN=L3;zqhTm)ZK;4{Qb*X5e zzTweBX@A~vfxZoxSOQg2@Vz@=g#YH9KPC^+mCP<4&W1wqdADHgMu;N;IC*n4f|;;0ZROn8J5pD@cRs) zQsJN{|Mv!be>1%w)F1e{G-gk2CXT3%dEJvlhF2I;mY4P^gLA+8`ae)(cbxD9KtLo| z6YN512Ba}hSLBckCt&a)tS0~B}(ILA}LdX9;xIf~*H*=_~P{5N5hT^#Zj(>Dob(els0&7mL6CHMG zb%K21Ldf{DMc7^i1%)l`q~xk3zEb~F9)9RV&K>;IEBMcs<1;GS_n(hT zS#0=N63dt~$bEt{)H#F^hy>q;6PrRQORHJu`NSgw3n$p$ji^-?Mt6&UXK{U>lf@&& zfMsWSy`o~ulHFz9s5_O5%fBF(Y<2a~jWxr={rjSajm+lkiOCyG+F9vj?c6~S8G1X1 z89yv~>sXKo3%ncv{}?Pu`kQnPWp7HDG(Fv3bk^1>Sx&sDap%2!3g4RTnenZ4#uWHZ zm_yPh{|;)s65;XfUE!FS7$%)g0#H#i#1e)gF#}87pFGL5Ug3R>;T1p#A($lTD^#~WO}`V9X!yq$;7#uCL- z$TFf>w&)Krj4^Gu3c=x>|Bp>NY@g zUQfA1o-z|!q+a;#zdiEwpPjG&H0#7Om!jc-{c7WW#Ed=6jjKyn*=%~1C7S120eEhZ|eQ0r*^(@|2dI9^w{kSlWy=JIj0uYcf0 z!N=Ni^Ub<(hU`u}9U}?EWX_v9S1=|7pT+&DhdUhFvE8HTU3><^{r6}d_Ji{?u(rKz zU;J5KBj`o=IKy5>5I<^Kmr)k~%s7-vgU-h0V9JaGW`2{mlg%Y_2zL~W5bQeWJW@X( z{gXkJ8!%bs#ZPh7>ye&8eapD)|L6okwf#TS=<*d5U({p;c}#9oF^REB!MUTQw=NZ* z+SGqmlW{EswLs8B{#+&etIZ&fe`UZ96C0aRZSusfTkuu6CIqNuFcEN2fx2FRO7@`9 z<3CIE{^!EA+DQHNWKF3|H^2_;s)x{LOkO}Y=6d6}Pywf`B}3{NO0MY6lS31QV3ebd zPyjhF#pz9!QY{!`Au*M4I!jCYn84Eod-WFVs>lB>{O`Z(nsqXV=s(Tf!yg|8 zj7#pm37T`Dr>76eks<6_HsOL^zL13j4YFXAD@-QM`0f}Q8nr`I`r_qoS`s3}OPSHhzZR7Re-;(SkF zhz5{VOBpAs_`I3#F{w(#KH}78cI? zb5W#Wv_*}LmWa}<)lRDHRasXzGm_GDM=vVZ@xkc^6%7m)PFKnuI1a}MZp$DpdNf6! zTjBoO#a2N_g5Kit_VazN4O}~38o`RW*L?3illETM!@$f7=r8kIekie)wReak9z7?y zsz?Iy`D+--_d?3V27KJeaL+<ckP0FqBRkDv zDt!bo&EQ1nj>COZ!}9}Kn0a__0H`+U$qA)qb^e_mPeOi9@>UoW(Dj-6SSQex+_Fc)L$^4@MG9?U^s)ilZZp}~$|MH#J} z0|^$kk|s+w=G{g%b+_?R!p&i1e7|D3y44-iUCz4WXu*UuMNX1|REC`AJq*j7T1gk| z&lYC6`N{ZSKJ>e*tB&Qa3Eh~4gy=mZAlB3Xt%)-v{Mn|sK8p(Xfb)*Llzr|!3_l1+omcKD)!E_%Aj zlqyoJxX3rH1{5p_D~QH`@NLQxT5Wg2Nh0a~?aOektOzHhs9qf!>>{9sCK9JnH zAo%+CO&B^?6pe_xbug>JF~-R4=jJrACr_T(6tNXA)QjSc(;ev<`sHyVlQos6|VS{>9G%llPB+Qj+=Y>Xu@NVap$~ zj8J0eCP<}_^5|0pzm=Nyp;H$p&=ylAZr8k(=JUZ=U{wK)3Q^)eS0YN;w@H=O>Y&NB zUTl!c5_VBgNrI#)l-VwqG3CQR4*2SAI_CC)4;rfmz{#0kWpGC`d@^bD$DF0)DLQWr z;XXMDNo8laZoGQC)_2OVP}gNd4oVKDVS8&E=47e^AGjO@&qjBge0o#re)xspii>3m zAtur@#?o$y7)xC#CXVK<-oeAdkF3%8jOaIII$n0N6c;my%2SzACGuIn#p+EBk8=oi z=6;B@GeMsS`3Nm>sw3H)^_6BFAj_rejN~T6Vo(eyHR&Q3FpX^A29atTN6FCrGykpq zhMVKW*LuZWgfEIwz;>}^>q?V!#I#H>0EwCfe zD*yakJm!*|)p_MLqk1|Lz9)$`Q2MdU9-q^m&ugp@`EKY0XP~ws-~amNrfl0xbztdD zSdGi}sm1^$Lt~V%dPEDX*^u5ySCu6eO)=Ifjky20H4%e#ZASG0(^k#Tb}NT$Q3#6T z^(i+^THmEZ;oHX7IP&&%YBiNF?~H$+P5vg@ji}ZnTxedp#BFsLlx&(aV#mcNKP;ql zvJNXFbRqKTw>>_cLes0Vly+|*-FH(A1Zo8Ut-L+CHnG`1v}HDzFB-k=Fs_qrYR=NQ zA@PY^bSeYD?v?V;+wycEvGrd5lT9thDm$Cu-rw?^>iQL3XQ9St+$_4q(9KQi*E6E* zP;bX8S|@61YW1MZY$@#Anh`1m3A0TlJ3&fF-+KFozECVyzvWcvkKi)4iwz}cQynO^ zsb{N_O;?x-t}!Zq1&zBXhy4)A2!r}kwf*yI)UK33C91Ft^hSXO(V25P&5Y%l$`X>| zxnEsn;sf^?eP^p$^|+56%!OR><$Ljz? z00APyD)a$vAJVb3TW+ox&bY4>4F=AU?06YNl|sblx+@5NZmA)&2Ai_*gjBeq-R->z zJHgqrv79{Bs&(6`#B?9Yl@=jTWzwL$u1=fWSf%q$ecVnk^`kJ4ejVmxB*5~<6g3^l z{Qmu0kq~UYN&+tHouHWOuf9xGX9d^-5-Id}NY0XXcXvRBW{NsY9za0Qk8NGzo(6h- zoAY3^+1DN}7&a;6_Y_I5)L(AYMq2H0aGHqaFsD^5kOqn(X)9E6Ly=c(TLpe+)M{b7 zqZv-{+q@rf!5EQ1Q2WY#VaJ3=!&8;{09v;pcktoS#J+tH&WuzZm$c^QG$~%rqWSTA z|5S5;l2`tvt}$KVBrAKQt=4u{8oWYl!I5|du!&h|i?0AKDtk_ALNQ-C^~P8HJ*J^T zP--0iB4g^A;n9hUr~({?QPh?bj{(~MarTxEQFY(@uw9fQAxKDfm$ZVk4BaK&Idoc} zfOIp2ba%HBlEcv5H8jG|L;N=0pYQVrJiPRU=giq_uejEAtp%abjvYYpo|Y3_?xWd; zs7l|}<>L{My$#tMPZJULi_s6$Iv}9>B640i6F1YZ%Kn@K0rdJiiuqOMv-B7rfSL=^C`C4 zMFHY9$fnMdu3i&P&whhaRnNq7sm;{oZ@tKkq05sMAiN}#P4pvwmo;paCH>;*3+a5f ztRt*BukVvK)%dKcZ#wVLA!qT%!@mR|8@-YJdXwZvLM!+MIPJopHp@0>&UgOIdf^Cd z@ml>!$sSzR_D=oFUp!wc0oSg|Ao2?pq?qc6QPlm{(Y=2557q-@VDU$mEylnUif7SX z-Q9T4A;rU%Sq}+=Bh{>VDB0K)YCyU!IboxugC~*q*6|*}H^q}69CDGMXOpUFUlEp- zdx{NaY6MEIxm)viW{w6#!otD?slvWL^{*&RGx-wjCwnUG(GPm!_)aECVd|@fIISIW z8o&={>0fX8%8(duPnth10$()9t?j`{npF&wKj_WY2z#B_Gig+F%aaHu(aI;h^@G6V zSDSO?jis<<4XT~H9}y5?oU4ZuhJ9xr-pKHpL_?RC=@bfL=ygJbgl6cw&F3niy~G3o z`9ZV1osVtJ?Z=Eka0#c==-+-U@&ZFg^mM3E zLQ>@&3~U;BEH~e8-0wz{0yGZ6Ceeo5(c9~D=KWHG^(S|pvZKq+tdXeeR)IY?aU`2= zR>Qy z(qj`-M=sN#l}bZ6u7?5mjjMu&2bc-g6=HQm+%7{FPcSh27> z`%(>-_#U6kQ*iqw41Oro%2L0(512RHDN*L5DeeyCSCd) z_=)7E>vm&ThDief@;bxw<0ZXE`SgZ_w3-ovlLZVFr##kE?u_AVY?H#JOHW*hL(DGf zP=tbxxixqTDX9pHlLaAH2RaP0@~+MfB@huP8h);^+xR z9CJ><(dO4+FPCENhG%83dea7juM;62sI_LZs!2{L8KikUXtj4B{@Is_f&tfwz1&?i zdA-bjfG~qOT(7IcDwDm@t@FY0FYgt%70rWKTLD=|CY9_Tl~&y(#~=IN4#xa45Tw=+ zk|S_LXlTA#G0)Sep*_0TG54^~Vj2ri+r!!%&DIyL7p~GSN~MeD8cktRow0xF73g%E zqTj8~`8V@Ml{TuEmNWXb${);1BaZnB`8nterO48xl)HPa8zi;r)(M4Lv1%wtWSE38 znbfZ%L0^Hkqvx6U`Th$>Tr^^;+*T^8xaBZ%G>@ogAuN-P~aMl_oR{k2q)kM0JL|D!ZyuDJcJ4ta0DQvE-upFnyeU?J)6V zZ+CI=Sv0e}y4Hvcyp2IZ744;yXQV~UpLuP%U-z>qb^8(uIM-Iw`*a>H*qu{!PTtqn zK)87qedQ|;)ZU6Q|Jn)H_gMf-82sHK4R%>v93&Q>+3dz+foN(LF4#8O7wq}|%o{eZ z2!F;{T~|@MywKDg?RDHIT3n;ucPH3VS3*iDy3Kwot+A=;oB!9ZvGWzSq%nV4Xxj=g z0Gkm|yb525%v)-fK$s*b%n8!Tggu!H+{h=Y0z2UNh>J@uD7}D}IVaeIl(y;e63Qx_ ztWZYjc5I`=R09TTs1s23#PVQ}PBkUm7nwesL`C{d?@FEhFyOg}jAcveSjsM_C1=2+ z{p|gPwh5w8vo{l!lE~crn6;Gt=_Di zNV!Ocb~l$8MWJ2-hkk2NBwP1iuaF5*z^7iB<99Y-sqUi;lg5@<}x$uMdO9HP~Kc&J)h8;d*U+?l**tetEm>_ zyK04s0gz-7sa3}DG)fxAp2NE(TxZe6%wa&9$gP&EUE@`2;l7VembFe!JI7t!B`xO; z;MJ)`!m6>9g6!5T>S1X z|MHZJmrv9G6{vy2)Cqke_~GHpwk`>m zrLQub-)VH8Y0n-XvWQNx26sfBBOIxALlgee!ILUJ=8syw2Q)u9mF(!f!VADj@3x3M zaavrt-4Am|fp2jHI-RV+n5O;FpLmP)#qN9e41$hSMDqI?0K27PI5)mFbnn>otm?%#CE2U=P$K!;PRtx@1K7$ zS~zvG;4JA47b((vRUHT|EYNC_Ez285c8N(ajTh(i;P(<<9m7g2fvD1H+h;PD2%gGg z+VVozw%ujT5yt;j1P2g>M60f@q$b&P0~_8n3+dW6BfrY1WDzpViz3(Yw((WUPRVpJ z=lIRT_7u`Za0oB8=+@MhzN1Qle1!H~UZ61vlX{r@^+qQ<5(02GdsUqFF?mL-7xs_y z(^h5Ln>#?yJF;ICESS=%Rw;{&u~`2&=WnfAa`0}3uV8hJk3JFl=qy8-#%D+nk2uIz zlLv>+3*q#l+1-@$DaJBT6M~H+gF&NPq~b%QO}xt>6b9>?f|2R~>hZhtUw7>V0d+Ax zlQugl1XeR~mxzXV?UAICZyqrOTxgLqD@Y9q%Ri-GCkklq`Nv zPw7VZz`%n}oLx=z97C>pP%x~rX$KtJ8EAy*>al_SzQcM+ehuz(UQD>4*BG-~J1->P5@K>mYEz~edUU>HKCgY$5^J>bwR>1=AXBOB!P9S_5J_CAva!bY z-CZldEk5!&=hpsahL9o%0^l?)`Zc3$8tCOKMzs33c6fN#y}}Pp6lh8bz+8vN4DA>j zc^}(oUFGWJ1cXY|&wJry%C7dV;b372x-b2;Gng+|%ZfAJ6{F!-*gOn04uJR_tmFxe zb6wxEI&@)rg85_Ysi;CklB9pm80eVHin`%l-wPKtAUn5SGa*t& z?A)kPi3O~Lc23o6v_BE>|-ia$RtiKkpU>22Y>dl8K0F zQ%p`ua&9`uPD|ENC**~}iQ3N#*y?nD)G{y`x4guGprPe_Kcy0sn>F}~^b)g;M(a7h zCZXPil8Gn=dHX!Tyy5Lt2r{|sPK0V#*)XD{g4*Dq8-AwFoCrOy(Z4jMNCy&DN7Lh^ z$#OH_e7+aj1g!cHbp{*^j2v;Vn((-s&L@t#%U_)gn-N!L?{uOOi9Dz*fCgmS53Ibr zQ9%>9S&mop9EyM2!*<;r=|5Rmq#CK4-aFLmEH>dJ&ieksvMRE}CY#d#$-vL6CX?Jc z`M;<8&yhi+&C!=u)tW%4cnP4qAr0NlQqS320J#7TOf)B4Os9G`v$Yw2y~a-TocA)H zVrRN+j)06T4JH7^mXGJwtF(8~Dod8IAZY6&;JQ2*4jak$P#M~+RFLqa+2FHqKZwa6 z{}4ys42Ie?8{Lj=qT>(wEO%aMX>q;+8iUP~l_()~0hcqi{yO<~;XhCE2zz;1gWAue zhch7(!d@3i3w5VwrzDSQ)_y3bOaI_#9=l%_k6P+ra=OOrj@ozk%1E1aWm9)l2on+( zO84JHGCVNyO%61xK&ya zd%qrxJ0BR^5j1@p;qK%p(8_;o651?yvfEv{rcC2~&JZ*dr2m^LSb{;#^@*V z5ioG?tBAYPFCFoZ)L9Z`)AH4(AbIIbeHO0^!zG(cqQqS`V*bgI#$S9x*ZPUa~~F-)#*T zB9h8$%onLZw!N>0+FQTqkW;O7zt72^;4Otk`UbxzW(oPYX40nMou69vdQw!>-7%^*wv@*y3+&v_Ew{OjwDe)$6a z?aS<1Ggf5`{lKk4uuJKj%568vzA>NHi~UcL;@+>}fl_w8FKpJsfG}n9`-YFF)ahEp zpf!}aPuBUlME$v+l{dlbI$Sgm**k@j@qwBCBAuV>hF?>+)J&{)>%7n(Kb?hG=mH73 z7QL)F`;SxT9~*|RL+f$V>~Z4mtaVaAfLx(pN&d3B0^9gD9alYsWj7|=Q)p$ zR{&|=Y86~cIQupyu;dXJL$477S_$2tD|W6HOz%@)`LLr}c3;hPjd6G>r6g6*kK=Lh z=cT&Lr|l`8KwE;;>-lcEr;}?(S`g&vovSv&0=g?lY8`6dNaC0}8i~DfuEr`-5ACXg z9rqvWg^H1e#Yp(c$LafjE;b^L8bAsDs8U@b$?4#tvAl4xW+)a&;o9XP-Sf}c9Az9X z{p42~?)lAM+o?-D@7OjBfQu)~jGHr3_Q8OOYVjx4nC00sGaOGcMmyZ$qwn9pM;q{3 z$$&{7v^;xjE%gCSEI@y=3Upy`4iw?sIeYl*7~7N$Sz21^ZPbMK`}x~NmYWdj{pzBrdj7eJG65A5e#Mnjd;QF_so6v56@XxkaFht{YhfaV@<8JN z+!Mm%7rK}yUh=-aj&u8UfDZ3{eAO;MN_m}?XHj|{p9ThCk~1~2sO=THOF#%%-TPDY z85_fR7#SIZnw*y`K7I!eXm?Rlb7RHHxF6&5+vHO?9Yg| ztImT3I(~Xe{P_{ZNAo_H6<*eR-D&n&b~Sw|M?DM4(d-5&?m^j?PVC*yAyTF zD$BIyax*xXL!p1}m(k{3#6QAIBepj8zwas2%FnJdZuhr}70fXC1C(o5s!fn(sNW$u zE-@Y+i6!@o&tPv1_E^5s(csuouj%b)1Pq$(Ki8i+qp3MyRJn+~mQr)VZ=158RJ=tt zE)xhPri?a>5N(?H{*V-r-qZtJU+4R;27dyPg0Rop-f7#t=hI)fJVhE;$3ysMgm!%o z&~M@6dCN zPPgaYf+--Wohp?t+9?)yH_xvFkG9odGroFdp-e#vYD~YTcWMNTTE>j*R1iKN(=nzm zn8(mTXFLS34vydZLf(zXoEMkTfEcLcg(eEudmD)uw34LTAMRi+{ z!!Vu@bd5Ll5aL@Rn(uOKFl&xPPiNo}^LajsVOV9VmKXx=6cv{GT8$vfsU1El;TtF9 zeyZpj_T9(h+bwVTo6EDH_7?w!?Xd7%9RJgdu&~hQ$gFNjz*Y^#4>uO;+DXg0NRa63 z7xh*E3!>6G!^l+)3 zt-68DV_;kvn#Xc5HUMWs4nW$e4E=+wb{2K#@2kKN_u6c+n0i3;jJ)g;J7INXZQk5& zAsFi7cy77zSqm)OQ_sI1<#S$IvGjD>3#x6QQ=O=3Ec^*Sc|l~EC9@o$1h9g|C82)P zmRyOqZ+|=Ks78nU2_X?%?TKAld?mKE9#MTBC&ylMXH8P>B9#_b;n+f(N5^IpGmKm{*McA z`81Kz78_j~iw^Qx-)Jhpd-`HRa+|B^N`u9ef=YyNFG^U4KwHTELEh)8)ZZT__?=f? zYnNIi;H{mC)O8K+vRKm(S?RH)RD>#Qu&sATnLD4HYmuRg@sjHo=`wz^SE_apmk%{* z3AO!TSkC>bFsS6ci$l?uIZvl~!6r?cFUi7;iQf z<$y&bg8=Tf1TxM_*GX>z_wyiQ-p(dTu;i%l?d%krF6=(GNX}{MMQZovR+Xl^N=Hrm zJuiuXYQPq2wi}F%Wl55u!`}0D-t5|)C+tf(_cF-@_cij$o0JFSp!QpH|IUUiV`;uWmmh<|!0SH81q}wi;|EXLz^$o#z-1pfJh-WuV+Mht(-8<~R2x zMOEeupN5cb*2!Dy>?fOvPL(2@%5 zKWo8zrZrPIUrS><*&KD%?2rT@okXDn+Zs3H$N!u4~u?6_Yr)>uu;1O;vLc<&#k zxd4kRe1|QOOU#oiKF*d>I(vyGnMauh75`xk7IplTIWSN<;%6XqCHUP<7X`xSDkS{f#*=cZ-!4ii2$b$|Y z2Ql=_3F1weZ3}mjERO=?dmzZ~1@0p&WJ-l^wbp&^L0!e6Q$q(k~Ri*96Sso z+kAjUD$ZpF&-g(!B$pN;9=0dyElm?dXuKy!;Lh*tvldrn{auC0`FzHs{GH^n-pv@g zvouotfU>2yzbzhGNc_c|S$GuT8!N$gZhRDkD z^*j8a@VeSfK?kO}rAL2@YwypI=#E6ND%dmKIE%XZT&D*V`NB8n1>LzipE zJh|AO@!j^c1@jp4S2s3xlK}%nyUFf(7UA+z-z2JBerKK(PijOpkU^~7LulIXge5g~ z_|ey8CSqVYw@U8*V{I)wZ+rW_Pp3$h=72%{U9kqnqYd2G%&`OApEYudTa-t&u{2GV zPEpnS9v_^1#T0PD;!Q_Yn8tVlLWmU}G&M8xn{B=qnlXEuqxi|&dFvP~Y%>?V5%}me zAMh1T*V1G^3N}*7)gG0tbn4b6Qf8St_<4CxH}IJ?WbkxqF6%y^7R(qw8mxPd<`F z`hZ~@p2zP6Iwf)_z6XJ}e}~21@sTqqGten1DI~irO!^gWJ755f>1iY0ISGD0ePjyk z46J3LILbdi8))XYjLaMx7?=h^oDWi;a|vVC#0xR|wQ2U)DNgQ4BDeZ4*VI4Q&h-MPOd zven1_!ZVshEQpd)6_2GS(jtwl(rPfXAtseeq=`mVdnG5L+kU-zxh0n%w2*>wH_R3mb(Ue?UyfE*mZR!d7jP0}Se% z5)WH!!^s+k`%eA_&hPD=u5eK$Efj-oVA>(fq=HGT7zC_Nv83!JXMY-xQ}{ZsQ%M}( z*_sP@B?bH{o9={%JQ$!$L|gX@HO=Oyt|1~TKrhx-Vb7#FR&IRRM&-$s$G{OEc@lc| z;=+a3_@G3~_QeRYMffOb!~;nIg?m-o&7Mnh6JwFMwdOhPU50(XqR9OIp@JRBwLH4q z#I{SpqVQT@^rS`EGhYu3%zpe9lxc4!W5}NPLp(g%73sQ^9_tOc5jaaOSs&P*Lo2v! zg-QBJ89eYk{A~|Bn+jOheM42S;@R;<{PaYzRK{#4e!8)-enLyamObPWaYwTd zIUs$M8-6=N?i+gsaP`id)p1r-BpnflSMM z+{?3t9PnCCO;|TejyE2OK@Y}m;ScgqR^hrO)CnVddOd>!=9A&$!u1=0gM0K&7gOQ z=|`=|sgA-d9rGb)B2_!x2O($tea*G)NK}ZxQ6H3e1T1oRyF(QgH97A~Cr<7q&B;}f zWTsAB35kC#vB_t}I=aa{WX4mUT0r19GqZoBXsnj&dr8)JNnqf87&^oMvt<%lbm;Y3 zK5SfqFolj-IuY3b8(i5Hw1?`elo(>nhQV?8O85&mDGoY1L7^c+B3ey+XRL5q(`rPx zdcH@^Psmzp>?QK3vCwrkpmV%ft)vVjK3cm(+`k^*58=;Rn7@~7Hh+q~zFhbkEs>{I zQ4b9z3O>B<+nS#Q%cp-z!XZPi#vl7U&leHz@Fqp#fX#LGnTvy1D~k_zhpY}V{5Lj0 zML_d%*QS9Y<-`S>dvXOV4$7}5x8t#|% zTH_%?%`Sp04`$K~1Lx*^w?dqh!cb%Jdl|km+q}sGHo2jbqQZxtT$T9v>}B;=P1?ll z6YM4BP*cOkq&+#(`h2^tWymUPH=aNjg|NXl7NH&p;mGmdx}tuu9y1)rN0q@fb_Mue zmwglHszardgklwsP!AvB9ZWmB*)r@!Pa$!Nt>6S|G_82^+KV@Vto zF|e(^MB=TLIo4z7hGUY+?n$VR-xeH>$<-g`<2U8#?fXnV^w3LW_Q#*HRH>7+-3$jC za%+5(=?U}VA3K6O5Bze8I%R(|^w%q{{1HRK=GL7Za#R}5FlX6RmXI;(B(nP7{X$n< zRK`yfq)*9~4$(H2e`F&0c6`LPt+$ZtOI67Serf&FQs+&L=8_p-jjI`sQCW1pVKj&H zx10DYjXIvZ3>C`GI-AS5Pkd*iDnG5v^&Pp$p%PsqFU+2O9JO2@U?nRnyR_wYz9;Fe zUGF;=SfmiH#D+P1^Z`dfNC6}?$MQdizvi4fvZ zlc^O);$sW^vBt4dwov7Ep|N1$84^+ctP;ld-d-7~EnSko^LE-6*Hvb!hrdYSmsUQfSF{#{PZrn-k z+PDAQpIEm2PH6h){);!_FL!l)X5j+DnR034miZnn#V;pw7nS-0+5;p#hP7u8rq=hB zo4xByx?%NL3%9=WJRBBfJnZl3kMPGJ>?lTFd>qyi)VOA;{o7bv{~!;tDmqf0dA!ay z@08#4ymg@Ub`Huu;0hga@-Rx*V|x+3vW1u%M%biVr*973z6bWBf3SZBUi4$DnIz@2 z0u2O)z7D%vK$4rC`Qr!TyOfLq%UEA1{S?e=lK${V)<_zr^DH`;43XYF7ldo!u9WQ8 z&^!(AOd%;&nWXW_W@%u16CLMpz|zcs5w459ac*u6dzmrb zbfpu;{u-zyKJ57>8v@8nvDz{Y1!RWi&8Jqe7o~rt=rUD3Rno-nTh5l(jpS>ID=SAP z{~g?M3LHnqG(5zK*f8*A+1McJ_u_sr$N@b^Pbt;;XlqaXpllv{zQt=pGI7;cEI``S z#R|VZLr@%adtK+iu=!HU5~=QOk8g>N>VBJ^P8}VcnOA?c@PqGOPhVf;*}Si1@%4(n z8Ooijf8SkbIMjYtzfw!_;=Ck0k&*Cdot00|FT}&Xok+VZ`8j4!Ec|u?zj<+?Uc;Cc zRAYV_b)G4KT3(IjEjqgNfg_t`)qqPlrF#UlCiKg9KD|LnQy*Lg=A`W0!xhX(dna_O zNS9y!T+gRYcM5Hk97|Tl-1}H8GV)@|c|E+cvht9!IaWP@^{l04zUXrOd0Ucg;Hc4l zII1cxHOfprRL`ne`MF+3SjN3=)Rw-z^9~&0r&GN&lG0T29+M9xn6nj};&ZNK>2(l@ zkuhk&)UBg(qKKMGg+ieP)HF2wsYus`mF_gEmE;qV@AtDj;BBrQ-dI`(%Qd)|{@jx@ zvNv$_)#Ez=Rqc75oM;#PUbn@!&4aYz_-Qg@%2R<&Tkj|Jg8M%Ef7?8i=&6r3Nh!ia z+)GG?*DaFA@<%m|jZ}s){F=_~YS1;=MN_LWfkE4f9NB7y2EGFF`Kl1Fsp_5SL;lY= zA5!&CJcsFCJZT!tos?0|6Z5BJ%GZmPTk}CBh`5#4JuvT#EvubHqC{R>AM4gF7eAyf zbtxD&VP@SABTz2g51%{fD1pwhUuL*DZv;PHv(_^r3#jYAee0L#zg&%o5JTXi+7^jP zdfeE^@2jjtVeXg|&c#tWpqObIyllFHQrPmb?Vf4%~Xb8b>+2dlh*hS;Ok#zq#J@2;6{?G;MGBiV+yzh+1iidTAah=WO zs}OS{dO^Kk-+N8<oZEJ~H$8g$p4-UKQx0wj5kM1Bq5qTzWc^%e=T?@WyAhO$R zVdI;3F9KBE9DVe897gMnr_sn=0HU~1O;gh#+i3&4NnDG`t3o?s&({bVRn0%0{T7-V zp&Bk$Z-(kr9(uU{ovmjz@IuY}nAp0gmhKPlOpU#UT@O;V(Ql%<;`2(Zx;(cH@m1l9nTsEk#o-g|4g)@%m%R!8EdeO~uxXZHg1*?kzCKF9 zin|jT)@bLFakK{-8!0f{H;Sz{Tv2Yaj{`Ls&KAvDt`o*kkeFZoFl-4i+ikfzfI4{( z(`r{uP6;IyASw>Q%S;g7ID|K4z#$kzQJ1kSw++TIJY`&6Ay-hZr>^I?Oq}xxrvW4` zBN1}&V`FNzmG_PfdI>m~9?EkbCtvP>bU`ZA$|1AyXpM=ulFW{`WDNO8@}qEb3M|pu z;uG)l=|iM}#MRrkIbk?H+Y~Ydx-#eb)AN>O(Ta<86%6YV>elB`kt=O(w9+w*F;r{w zAE|16!DYGnMGQ!hKQ%#4E}HPtZ?(sA)eLgIFe`yF@2>J;i&A8#PE#yqV|)6TPENnd z%o{J;+F6pDS_T4%g|cmDgnS{6-}z#UFqfblto-dZzgu{nmnJRrYVfawc)Wq{nVOj| zs^|e{{f7@vq#jIgeR}gVa(Y$UVVT7Z51S9eS-!>ijUWF?c#l(e%=iwZc0(7nb}m2W z_t5B?>=cB!8J|wugRNHk)#(xuUk;X{$Qq-LATrcm_vS=m3kk@UOBIxE^vK83ubxWt z@Kvz%3LIB#aG5Op{0-5>P5qOPJANpKhr?<;T1c_iB&`23-U1)VR+i&(iP-7YD0DvA z_A$Let{18M)$6e)oUMLaIytlBfCW5@yw%{+vAu2tPhC8; z8>$ZuFxoN~9gC7BjXU%@_k*_EZC90*S8jatgQKlYXJP_yfa?Z{6{w~@@0R__qwKoa{Zy@&vwcs#r*mbGsbbLMnlAnp?MChu>K1FHzjRdbHWv+mt zx0g+bijLc!cYbDElE&~e-p>i^%E&r`yTH<0wdSh_DxKYgW(u`30^Y+o)#uaUE%gZ} z+=sQZF3fQSLHfNQ_~T;UPZm|rRLi$07Doz<{en7j6YE)u7}tBu7ew-f%x(nry8xTO zroIVcrPFsleN@+MHk>~0ApYTf)uD0li%LOO-7FSjKAVAX5@3QkPNb==PUetDdAe-1 zi!Lj1k%czdq<8M@4xNuwP%|-2Kenj0SBT3BUXv+&j>ZG8++|%AQ77r!T)B62u&f}u z_tb9FntQ><-TAJ^!kpmhal>vL$ju3BrqzBrLETE0omQ1sQr_NODdd{!j4O1n1Kw`j zf%^Y54Obmty&Nq5N01#((L6 zJZ^*$QPHQ;VmDJM)4%TCeCn;g;R>PiSZEfkXj}YC0WPx^3DK)-;!&7gb(bKiKq?)K z@8Oegu>Fr*emn5mrLmdl&sYHm4OxV4qy``jsjIrKqJRo(eAh4oO{#5$d%!1rsG)f; zhvUrytuDE?{gMRf%~$+bo^$Xewtc{KYs~iGlI0O;E-_j)tz5H<`yK717;YSFbkB1+Us*V4Qg${X+FBYODH7EX>`XS4fLPML?S5N;=S6>G7u5NNTjl3Ybx{#JR zK%-I>w#S(7=hW@8(!CE<_%sUH^tqZAe}L7f^*L>z(7;z~Xzh>AUUb-8GQCKP!k2zY zv%(QR+|r*vbia5GcjdmU9rFEtyxyzO^r)>_bqcfGEp&>IT6NhjECZ2+-y3R6{=>r!)RUH`^_Dz5T6g5vdVt0G6De&TexpLao2L6-;rSd1s+e z!qem`nCue(Vn9)3WMq13s%`arLEKLwZ4T14dQdmg-2V4@_M90TR@A<^RNA6jK-T%X zq*KM-%QL{j?a*b5uL}g)okUjavBIeHqfiH5`8;JBc`I^#Ijhma#jh+8(kniw_F%L3 zd{p`zV?Ew;HG1_1+xPMu&(EV2Y#7)?(9!SG2Opaauc{_2zN(E?X72Uu`Qe+~ptqtc z$mq!by`6?MK;$aid3WNidhxlq`bD#HwcRu;YcEZ39CJkCXn|av6N7Tqrr%09V@#G= z$R;G52>V-HqV>*0l#=IcA3GJy8iS=7&v(-6cXlRbt1gW81chm6&Y)P{;D79y zEFQJl->7og8jA?D4;`}Ig12S#N#`73X8k43v+rM=|D%w^j3ayy4HA5Ot*X4yIFVF^ zHSeP`b-5N>-jg2&3jQTrR3r^^6TiVjM*dm(L;p9g2KtdGACJ{4zV61oE2K@ZMpcJ6 zd67Cycp22_vo^fre8x<_v1Ly^iuf3ev|7A`Q}R1&>~fG56@B7LYOwPeQyEV^d&Hw=l#l}{aGQ%Lqtk3n%W91A< zo+9tzv%dw8KPuiqSn5qJ-Vf`9N`R!OyC=pE?{&^{NpMM3LS!T}mq>DUNYfk-4%^QR z{#&=`nf}G5w-V#@m9}0o)Fefd=OfsV3cMK29Ri%M+ZL)K9)9J;Z*$=)*c`C(M*{n7 zsVyEYnL1;4083n);%Nc9s5<60??}_m_zLc+8Tb$?g&HG1@2Bch& zfUp+~WHlDz00X-PHU0GR(ffTB0A7RqeVuG{^Rsk$|ie#I%6rYuPu>p*hK)r4r?|_WIIOj=kp2RU%G-EbOD2{g%KevDvKB- z?N`Gu5h+&Ym(TVSQbP=%tr=SPtAM&X_8(yJMVt9ezVY;N`LD5}T`qx?xD&Yn$QWl| zUr!_*xzC&W+Yr#9)Tx z`elci3I>HDm?ZYaQ>FVyf?dtl1X)vYxIr8t9L8>( zVTWu4A@B6%jW3~(GJ0#yGF|P*SF>B4;}%g^SlFsE?)E6DuPAB0DR@TE;-hPI|97?F zK_AkNWaGTGB<&CVLCM@rRe|pclzNad3~E{ecZrz)&^c}MVx-W#msw3r?eiex;B{poxPid zuG6C?!EUjwK6;j23WeOi!w_paYu}&tDcDbsG48lY|MTyk&r=9pARTQ0Y@iGYv!ync z6fQxI(LzN=KkR4#BD@~eO-K#DBX98F?6Udce8Tak8Ig5g^W=U#HJ458WM5Q09a)nB z#NID|G6kJJDfEhkg(X;6$E=@}rFYw~KZ5T{vq{~qaTTJ~ymXSD_+Y2>;;p)RwGi)$ z$cD#TH!LyoYFqT}8#Lxi4QFAJFHg99-MvK zizk$ow&Cx#(U&d-&nQLSxPn`*lusX7Jl6M%>pdE=?~Us{BQ#*O>y5d-=x>E!l?mC^ zIPZ?U4G?k&Q+M4=OcsW#aOLhYS0Tm9O|>%MXAUV4(U#*s(&Zw3vg!2*rQEB>1>_;EJVnkf;6^w!_Q7x2H_{Vkqk)kHa_ z&Rky3B`Bz)T_f<;uKvo3zf29IyZdo}P|EJo2>RpuG5Q-jU_O#C;z*g zkDuu2T_3;vdXPlnq;GP*hvn|>v$)^%h3}*K#%-8;sGeYDAyC{GH0G_m_@c_;F5k z#0Pdfj%hm%g%&Hx?~Di^-x+5t`5JyZg@kF}o8m+T@gv;vIjvwP+uSQ@e0)thGSQgi zC@KWDk1E7^Ts^FbRZ4N*W==YW79`475;rzgiqk=iNZNC%`(x>L zd<({d)=4<^+v^hC^L<5Z_a`iDD*25{P6|1|vg)93{LD8#DbgSM^Rvz#);b7*lgB3c zck-9?z}#|qJ7$Dg`1qLPj(6zfVp$2XMBVV+1#q7Dr^x2Cj_2vg?bcta^Ix4Vx9>qY zYt*W3=dJCK@nzcc+Odox&$HvV`g4sXjw z*IowKq!w2GMY~(mc6Dz(^#|l(_beaf%V&u2v{@2M+*|;Mg?~mt@~UjJpE1@n#JNsa zPrXEoN&K5I+n&$gz|8Dew!c$i_+JIFgn8VDe*v+!ESz|BC3B2rHJ^z!f_TlB{l$>% zK=@f=8+=O=76_gJhcu-b%J!z? z91I#__;@nP&dxg%lsdPg#D&S+Yz3`)^GB^$!bH`3(+zxM$O*2f4G>8z{J+CNfpEv# zba%Izkp$QJP0~wjx!`4(Z0hxKII2FGYP!aL-sZUN7V7XGgE4*?u!gM1HzDKAlvnFdNl-8Sa}&?WY+iv<(=)BxQ*iV(i|B zheGcRo5>R+d6YQkgLmIcV^5?Ou9;1SfV(+egCw&DhJl}GF+WQEltf=Wi7!sf9rG*$U2d9!hYgx*s8 z+|f`8Q<7?^Y|t%cg8R(pi;i{GKwF~B4csMoZKtTaySs_c@!j`WvyD4z_PGDfBr7@_ zOpK1~>-n@u_@olIudS>|@3dKW^8i3-tVp}-SryK>EZhb)m9|F1mRP11ZwJaJ#r%J^ z7%f(oHz&}c1A8%RHhml;^1EvI#eDk=Bwcp{^KaL9Hf?5Cd8{AIqo8f~Cwqcd>^*SwoL@fz z_xlr5Huu(O+LkXbdq$e6R#BfVPn@Y*jc#!wE5IcJQWLbaaG$KoN}6S>OA5q9P1ocg zuX*#VUF_y#o7?Q;KtX`dm@RO^6JMyC7fD;F3$+37e6I^aQ zp);6$nCufa6$r^$dgSGE(DHUJWU8?~rV7hAyjyZCIxs z8*X6FIo8Wngy?mo?Q~7=9+O75LNGz^0X`E5@I`B`F{j>SbR*6Us3#o4WC~Z~(v1eu z7TlYd_@VFK+32(`exFFMG32kbQp-~>${#6Gk=h(9qLSi!t(>oZ8Abx$Ts1F=7N1cy z{JWvPAfkFF#>|`ABMoT~N$44ndxP}8Az8e+dkkvyeKsE?b$ZJo+!-+2>E^z^_uZh~ zG_O$l@gNv73P*(kP&FhXBO|=QIwOORRy1HVMN@Z%lNXa^}X<(ij<&?!W6H1=4C58B$qbQs{b5xuRw@hea6-T8zERp~A-1iz1L z{m3)PayixStm=oiX=R~S1B8>4Gnr93S-Ciap7_JAq&t!Q@pD3h5~u>+5m9*oq8pBd z4w@>yor8T@=d6d2wTxMrVKwi);b?qQ&7=JNvqA`&WWjy@aYfA~K(pfJ)EA`wJ@`(C zK!Wvv2JnWzV`-3dG&JZ~76Xc?`4rlUmSj2r>_#VjP^^5csAQNuzQs^n;GvYZ+(J|4 z!a6*rrWQf%_nT!A_nG>j>95R%YI_YJsqMcoU2SR);OM5a89$5am z0GJ%M$XCz=zD4t{l{j&fxtDm;32c7%Y}!rr(_$v~;nWkkUSiT}G|8i;qgmxc2TsdK ztl8a9khuRH-Akq#MsVgsNaz|MR+mm>k5-xPvfP10K+IDaVi?s2Zn@WaTxP79KL47x z1)lH_|E9_E(NF8u(}6d`wpwGt^#R!kBuk4?hit;tD6@yzDMn;e6cupTf{i8dJ^zoY zzlw^h>AHsDE4Y*3P6YShPJjTx-QC^Yg9i@~+#$HTy9H?+8Yg&g*G9hG+|T=u@pIHi z?7gdM*_?CLl0iR>K%;fXH5e@Nvu?V)dusn62b*`XGkRF&c7JJsoxieDeVJZJ&nc!C zR*BqNM|8e!81NlZ z0Q;wKJkrrsittE8<+Dm){DtAQHv4MgYF0Y1|IUYU@M(40;i1`EY-} zH&AOilU-}MC4Rq-8EG<$=62QxE(d;GYjl9T zY{Wh-q4)<12qt&!M9t)YyK?xm)5tLO2w_oEvKB{~G{1^Waj}l+pc7kCDwsLOw}RY= zJkd_vg3E7~u4Y-wOobzRd0}P#bAA?K12(K0>2hPi=#l;2$Rj-J&X#mo z>i0Dsdzvw@8i#vEBBan$GA~5p5XJcOy7J-edKqD^hKQ50vFlbCcT$rwf-J1W#n8EC znueJd(lW@d|53qxyG5|w{)k|LOo?h=T3-!bTa8^z4+I6E7j5J>H-?K zHOqEklb_%ca^^K>0Nlawt5sHKQv`bpj@H_787ly^{po$O`0!m5)##wCKOWLyM6vja z;gajd{%&idiJM!@Y_X#3xZou_&;4&Tr7k_)5@!#_qJ(Boza-mbX;6xx-g6uwk&2bW zLsb=5s=_eQDH=JZAaS~H-iNIkyQa1*@K#BafPk)_cB6=&R=tKGWK%ko$2rEsSMMD1 z#OHHTNvDf_YpC}r?bISu2 z!z!|*XiLijVIRmkR8lV`)wep-p{9BUpEz2V3CzYcYIPzn6%SN$BZq+2!`^HnF|q9V zr^W2N<-z^ws;a7u5r=u@V%5%QVuGPOx?>u>=5B{L^X06!2qiT24HtQRuVfTgAuvjx zW!$%Z0l!Tg!i&2ZIk647!mK@MG>$D<_jbKl6*=jIFobnV>g)xjKAF|_5q|&lZQ1m3 zChN@3$dvJ{yqRavafO}e?P|gVKecj^FGXrVX%cFdeW^A>`p(5fPZ* zZ;_-)o1#h>`vb5a-Cf_IsgVKZfCxMKB$I24&L`Ic=a)C`qZ#&l;ow6MCdiF?cFdY- zJ4xHFRc?IWC+TtTC*8v%K2V&RW<3u?xro$t@XE;8qxcm(d3zH1xQ-aU{b>luowSH!Myt1)n9LuR5^?r z!G{%34=Iip3zOyprx0&EXUD|v;kkuw{8f4#X*z3rMlGAudPFH9Hp_lfQIG<(%6!l7 zG1+R1^R*0zP&_zI%~??3QOxu936l~KXnaA0Z3^qT3b6va9_$Wl<|#&c7y? zvu3TO0FXz*{kj)zv_OsCuzL&;0zD1ZV99Ly2Y{-u9X=iDXiH4vuvSSDaQGnh#Rd?d!S#D|DtmeCpO zdn=Zbx}}hQ zS>$*(`C+h(_A?^+ zdc~k<_@SfK++Of!X6Yb=>+2d$lGZ+wy^14K;3J=2KQf1)RXpERvrc(5S?HukA}jv0 zF||ea4u2Ehp_Q4b`RFIiwNJXdZg0ERtLD-=#&%0otdbVCNHKYsZ#?+(fuqJ$73C!= z-pQ+_q@;AA-&FQR8@$P1G_!coTPHsPP>J&kjjL-mdc#^!_Y5I>&89!p{5^}O2XnQqs_Mhw4mTxzmYAo`Bm`HKuRhP>izHpQBAIF5vUB>a=mcXVrZl z$3xEaejDNcJ@!j#@}z-y5U3@|loYZ_Up0!#+)-#)c-cQL!k}wCwc|D%vX@DJyUL*u z*z=dF?w)}S4>i#Xv9Bd}PYl*sFX|TZh)(WxM4QU)Svo`8(cGYpTGi$S=us|?CWn6e zSn*VB3y544med77eJ2)ld1)?<-pnf|nLd^0&Uy+!{v2=|USzM&vAbmY@!MW3cyO!( z`zG|IE+^=M|2*A!n~Ze#4nSFTt;Q1?#4@Sxu|(yLi=Wq)w|0K;HgNoHAFv_%;PSeV z^iXTe8IvkrIIe%(5>>DrgCS4&nlKZxHOgS5^Ec}q_j7@$;^?Fcut4(Fud9kkK1 z8ZTn;24tBAx6qOwcoLqtW%YfB?J|00*F8om-znsAFA|lrf&K=dPe!(ptE^S^LKkNN zPA53+8+R4^aQUWFODBVVr%oRq0wB{~^X)3OJK!ttOHE89aK8_r}NBbWi?y~@nmLRoFqVyzFTeQ8< z1o>l!7&ded^`1fmS>-h%#_PkmIY!+y7kEuP!%} zF<|mIBZhUm$Gbu4PI0-BJV%KDupAF2D1^iPN0oJ}>Ueo3LEg&$hABuEoulk|Pv~MX z%wD>qRpRT|)+c~O*~PNiBww%^&t|Uz^KIX4F@!2vYXm)A6^yN6*Q%2m6`_Oe0fPzO2eQyUs*tffo64~uIcP_$h* zEjMDaO)wjC88O3wJZHJs*e*}f?GLE?vPd?|w@TUn&N?$c_j+{iJGPlZTTY;SbPBc_ z?D#O0+Wt?>SPQt$o111}eqkjgGgG+pq$Ro<3aUPN>N(g$G2f~TwR@p2I z23g4-^<7Tc+wr#QRJtcIXi{}Bb%_^c@)<(L=l}B8%pqTlMD|@ZRH>G#>`UEH03RU? z-RZwMan*x`2EI}pzxF^~F@|WsJjiglx`pR3)6>pTkq&3YKI#=$h zI~-K3pC&`dJY)nPx19l{HhGFHXfXt^lJfjqpiZJ`z$%?j0}c$leM~xyJpWS$f{++O zIuVhj$8T$!&Z`xL%%sYmU5ELF{w^O32tW@D^3g*Ul*jqalXYj=SXoUUiJ3={LFr;+ zJi0v@U7AOd0LZ2GYTZiohMAyaA;t&F`%URer_yB=1_HXbHfbM<>Uku^`7cwx+G?jG z>e^*tvf`4yT=0}D=`exydkk3af4h-3c(I-Hj~BfuLbz%qO#~GAfbPU3+Vfa(w}fHb z7G zyhTq;$@D+5(WtVgYT8W9%y7L0t-DJOUB>SZumONb)1oo+e|r$A;S7yZYJl)Z93X!Y zGFz{IIoRpRX*N$YlEJB#=x7S26{Z$4u;wRE;*wIzPi9nw-T8LPVh?p%jhj~0ea?++ z{ilT5x*aH|yJ?73vP=Fh*0j-F^WE53^Sb1id9;-?;;hi$7cP zhrD&LAmt+IHC8CyYKrihp>WjGF{-7itpX-{56Wn{*io@Nd{uX1*_eB zc{sn&qoXeM{2~EglWTvUkMl{}PTFBAFXPYurvbmEn&!N1xI4gQ>t+Ulo|^0lrH}BQuPf0)T$1o#7~qwJUot>vSF2y z#WU_tf?Z<|7qFR?kdVa{$)fx^YQ=~N|5!P$TZqq4gN<{ciHR96pcQA>Lxcdm-A<4S zt`W)(=IOWffu3}k1whE_?umMpmk|BqO(#!VrgLAtt;V(~%_9ODeKYK%Nefo<8|v#4 zCchvR=yMZAH;y19a9JX{@)0HWJL_T1uU~m}K&$t~P66G%7t{D#2_Sxc55jw0dh{5M zt$JyQ9`kaetve@HU5{M?ZKDGM6Yjjl_)X7dW@br1n?k%A zi;z7h*bo3;zX#!3L$fd}+RphLQ%!mJpq^(y0nD)Bpb<3c5t4?GadJ1ia#U_}|Gdl$ zbaw13Uslr}+HAh>pmGTh4YP?0I37Qu1B#<@=YfhYp6i!ED0~MLSH8bmsA?A?foN$U zx&zJr8AJ0tffcuSdPS zGZ;-`yjV!+bM<-%+BL+z0Z1V3h1dKvzBF=ukMATY;8sfN-RjiVq0NEH^#{zA3Usx> zG|ckD5*)n0uer->fs2N)Q+W6g!TDC{{7ioUcARoFY4n$S z;eG=L(_5t9)i=Placlf<5efmG3-+|d|A)xFGto`1>u-Cd+^x%U<1#BLsp-mS?#hZMCVHoIZS4h03U*P^Avxle z*3=%tif49ZpJ&OUPWUQN)nXvLW@h^M`qneWM$0$2O)Gv)+o2bQ3xh>-r5*;#H6rj+ z?}t2=qR?*MkL2~A01)xMR)-fy3(y--RLT?g?Dz#%j%|BuqVp#@G1oph!Ws)WBOBT> zn^XS@3Y$}g$R+rG_?1o%B-0HuJ3NX$q&)!hvEtIlfrW-3+GuOtOK1juQwv3DyMay| ztZbnw3$|P@HmoYY`Tc$O72mE()8#3C{v_!8O7TGvECnSMrxu;PRWFDDR`f1NM813} zs_K(Qi_|M>)v=ts|L=<+`n^6oSYdG4K6|=BL#4U>V z`SDSWGFYetJ8r7`N~Hh+gO!DIjAzO?8Jt@+jn(qyV6-2tzhzinDHqT+rc)>fQF!@z zR@j1|tm*xlBfM_adZB81K2+~jDB~-1ivJ5ZQLE<-oO5N&7|9M4wJR&S{dTYsIDp^_ zEqj9cSdK^Y%why`?S4mvgbfRc2Z?Q)@a%Uc(LhM7x}pC1BAS-l$xyq9jUbo z|8UiGqOpHhOIjS(-(=awp6WEMu@@A3uUu>!Id)U2!&0nEGcI*RoO2(A$jY@k#Mc19 znwov59ofTT5OhIbna&sBAhNOTTz|$!v1e9j;BmW>CbF>_*tK#aRNzN{0W~;fRw{b? zH8Ejf?BR+GRTX($n>i`PD|hT)dzGbyF)lj)|Na%C4zP|TNv7z2u2}ioOO8DgXW7D6yQHyw z&3U^@lmQ9MiKKENZ**|P!A~-@knQ~;^7)cFX;5Fm5vu_hki7xzd%1wJWTNvvwCoxa z9)5l;>e5TV>G1e=-&w0;cnJ!g%)Yvi7d%^vs|Uc3ZUfBr(#G%|QGf(jF*Bg`D^{Ln z2FUtRqY7DrCfjK7d@enpW$SC6TfpJSJ?5KadLzxG-$g~E+38$|&_Uqr8m@Vlf1#de)7 zWEx2LRdkXP@34yEWxxot95655=kW2F3HiBu5=R1m$)_5)PUU48nS<<3^_!tKz2?%g zaxwh}+~EA+xtp8*YSXXXYiIV{LRjH{%6Tqb=xjFK+98A^%Q45fL zQ@$on+&>?gMh|NKB@b+#Z|~66gi^)zUbYbI@_%0V`xZ{g}*nAS|#A%`Oj6NG? zEwBNC*ipa<&RTyWDbZQ9WLGh;YE`p8aOLqH=Rb#J=+tErlDQEBIm_^?kp;M%FS#C? z_FxL_JbjF3q0}wKfz>`w6zcPUIR`dYX;bfA{7c5?sCXgDo$m0PXOp4Lv`lE+C7mY*7-GuUN z>1Z6hYP}NydLtY;aqJkjuf28>)z>E-l+#gEUu_{i3Tg`^Ko7`-y7xgn=GLL*;Eqr= zL-H$EF)jfBHMI-CcjC_Mo@R9r6XZIi4P#5gyO@Tibp{6=z#?1Fv*=b~B$Rm8pLX(Fs4nRNA z|6b8G9MXMQ=Gq&y`*GjCYGqFHKRbN(Mqg-hd0JW^YTR$M?OJTO zT#S#4BW!!lH~qI!$OEqWo6z?m)kA{GA#?-c*Y zLJ36RAcVDYcm4UWBLRaKK-}J`)nIkvV)Zazu}lfpNfyVv0Wy4=lK<_Uf|w`>(BJ*z zKl2jc3r=pZQb`sqRhgeOZFZA1PksYYRdaK@nNF|lYF#MV&sF&5r{5w)jG9SojRdTZ z!se_0g3Xl{Hw$IBx4p-Z?*}iJtKT9OdCh1Hoxt3*F)TNlv-7qF)KPp5gjwy(BEK({ zQ#>^|p{g4N$|cEHQuT(b%T&`>@cBsEu?^+%AZ}8DMja4AN61C%nv$7SkA8oWZz}|s z_%`1eON;ftO#Xe82pq+ox^@)$46aafAd+1K>h~Oq*Kh>Mv|Y9pygS1__v#2wU#+2{ ziU(lNJ$E6AQ$Z61<>>%eW9Qk%x~lea_l@IwU_k}5%XOQCiwgBiqI-<2{{h9-F9N7r zG4LPlrYx{dHkrGg z9bs7^(_5pMbZ$)_J$u;y<*RR@{%9c^@aGKx1R4UgLH8fuzbWEmC{1_%uKH|03{vs*2cJ2MK4Hftp_Wym%Gy)~5Q08+%OHG82FbhGv zxCD8D`_S)#f)L{w(>Ejp4~QYEU|sJJg!J&`OYrK|eLJ+Nj_=T}whg*ZqEMvjhPndA z`fMB++2wKtv%Ccgu63@3nofh24SO3Z_g@hJZVNftb8(yRXLLE{^%2Zw&}`K?bz|w9 zU;-R0bkW|COFW)_YIRoC^5bKfzi2Uq+ z0WjLaEqhAT>grBwVGY>or|M{wG3Z+jLs>45o;K)7cK1GU*R6yw9fWiO;w?coED>_k zW9Q0`Axtz{5Ap-q43`}}2~S{OUI&s)`O-=EkJznO%3j2qj*7Jv4OOY?%8B%iM@6A& zc6dc|k{y^e#+to4HD1gT3awBOr>QYfsV_%&g5)V~_7@ zeR+DJDlzLAlS2RIuB;YPxn? z(vsat{lPp}p)LT>B##|idR6u(vHXlq=aig#c^pFS+3HI%S>x+osRSda@ZCRZ)okI@ zZupi}Nzpnr2k$TEza&tUNIw4s1a>?A0 zL}2&)M2=2Y^>`W<;-uB4?3DtJOQf?rLTnwYmZw*}E^0bzx&j{FX`_ zA<_apQ0u?{{NA}mCm)Yl(<^ViDS`40qx1oZp7gqVy=VPz2kwM3Ppy(>!@faTzyTcF za358RQt}M1Pqgo%(SH0R?QuE>#K6UYE~a-)ZOw%3Nx`2Cd201mC3nrc`fZBMB#z1b z^&9AFdR?<;CMtbBDr_!0$c)I$D1)`f1=)oz1$J-9nnoF8`S0s}c#M;5RvTq&Yn?M( z6*+Wf|9)=p@ubbxlB;an9YJ_G_I%#Hx{9*h-50F+=`2sjbC^EiJ-TopUSw*cJPvtCuvAM3f(+hIVSYu&sU=f4EC_E$;C#X#?e3J+`ZK`J)0 z5g|-JA3!>~TQp<79cJX%(qc#*;L^e%S*D>V($d0qd*jWef7std)yepBd($@1Dc%)U zC74bHgi605ej77!Mb#87%UeK99pm!Pr?V3A0M2`eomWdRUyrD8V>h=(mKMUO-}f?`m>c{ibokQ%)88G>eQ_t@sSfLu<)mC2DKyG9AGkn8Ve3;v<=`cBKmi z#$lGb+%YUwn>1{V`>$BfxB zXX-Vm$;k;4<7AbNy%R1$#@*y|@6?*nqgivw9{22{%G`0my9m7kz>i!NqvYddSE?Sz zCpKq)9SJY8s~fM5e7xuSZ)7AFzaJk*tIkJe{J*YiRoU4BEyKdor32^d>An>oAXmP3 zwpH`SJ{}cmwQj2qyK+#Seg|d;_2^ z1P7@_hv_gDu zwR4}%6F526C0HvA&XBYXnqPG%rAzxqt1k)9_+`%FvxB)g|N?8W0d5ETxD8 z--fM?gNs|EuG{A7I@e%*YzNjcKE^mY!N6&=K6V>;6A-Zf;=R`5-X8Tmr0w}RD|W)y z%&y}W1o`VO$Dj)jOlMnpcpD-E$GAS}gau#8-}0Da6!HbQHj5_?|p-uAygmCnCr z`8ZgNKN867_8)Sm$+rVD)r(wyPRBcg$|8tNX;xEy2zV?LZa5+!P z?XnGLudkwlb9KN4CzloT{X9SPxp2q`H`OTSy$%2&}^L*pU1B@h^>o5 zKH~nr&3*m8l&Ih}yPv)>8QH!hrpNTxnVeisevcIR{zp|vzic4%*KhXj1us>rN4SAV z+|YgHLHNSk8^02@GQ}UwH>q~jVw+oA6?XH13P!S2!8r6vNFhbmXV;EYQx%O>QUwS6 zmXAnwia%h~Ae@Xjj`xbW5DsZG1(V?KAo z#gT@;n@4DxPqklMWYCJ|6j^+C`7IQh8dnV1WsD~dV_AA9)N-iu!q{XSAYh+p;POPT03p3=9 z%Z}QWNOx*Iw_206nhqa!s(XHjS|Eyq^}i9sq=36SI1)BA;_ugq$w)L>kqtxs2Nd}C z2=~OlDBRZubh%kDf)89LOQh{N{qXMvGTW|01}@EozfAQ~Ym(MhTW3?x z{Q*Y6^&Sx>c&>x(XCqLX*58_Q?lqAMI7XnR(>Q&aD}xtZUCRAQDZM*Erfw?&W3$js zI$zCmw3~$RfI)(yK2D}yQ&WO~NB?K`OW3AsjE&~Tb_rV&CB6J(5Zs`ym|{wW_3gx6 zm-w4`^1X$XWcPz5R2LgvlEp3o{B-A@qZK!=9V|HEw{YhTKbs}r0>6ThP`pvqtF$K= zckNc6i37`C;L4IgVKDcXdM10~rE>?L&%(pMny_jPd&suiq78rDG<){(RQ%ThTarMl zYs{L;t5T)qxzYV0zqy%buWDej)fD^8!Ch!+Ke8l~OSn*EeUiVF=x53Kq{j((9u%ys@3ACfJN>aEanYH%Qg-baiSt`Ir zx$)T|5pe?WKt#C%23LJU@+)Klej|(@t;0gUgkG)DjL!v|Fo4^qy#npU$)kn{lX^8Q zZEu8~#`OM~S0p6NC^eSE-}5=-tr`4GuD}@)6SuK{@@g>bO);b~5QvVIKLds=NzI48 z@8}^2?xm(m@41U3Ft2ls9JB)wfx{kTm%8iBCpIqT4!_$S1G5NEZP|&`gT&q@2CC%^ z$%RUE{}wX4FwfK6Y)y=O?_Np5e^aVgg=sR8aCr4#B_33hwxWj-gCc!t@_xC-;N(in z;+)6hPQy-hxl`GFq0Y90UlifAYw^kQea&B+eG&i#}4BDog*jp&lL zF(~k@gZ2j6f@=8ujVN4EhT%gV@noYl=r$`V!zN`D4QT< z>n5&ex@~@Stkq7kNTphcbYZh0Qga6)A#@G7HUkPCXaC}e*ZQ&?orw=m>-F^7C#$2i zH-LG@ch^6D`+EeEx;fHq-B@@M_|P^^Dx0cOj3&HwC27=;D6mC!xf z{F<%y*$&jnY`z>iv8X}rKG?8OtNBSUDMeDRHB0GDz2Dlu)8r7)lSw?w;_zPtYhr8T zfnQnC=NyiFf0C-Pt0hVxC?IWGe;EB=eCY2&MiBJ5 zBd}ZRL>-qZ;0Q;Gz>-d?LXh!b^SaAf0|wp{tCdYzeHIg*w&85cOG(xlbYQ?2Q*m4E ztEy2i z95BJMH=Qd^$HQv2nhA&QC;4i22iSfA1{oPIXk-y`vV?$x>1EA7F~^mNVGDzvYjftvSPoZAZ_=6_0va zn^b*+0wNz7KKDb|E^0l`CrExON~WIL=r){z7;=RQ~{hZ9r(pyoMf@twIDJw zlE8h&3v1{F&s%7=1Xn9NdIk|y`)%#{P^_R$=G8wT3pksl+Mo$!66Nzur@a#a&e-h* zp%hPFrr%jRv_Rw#ek=6eq~$esz`!w|Z~jS< zJPN51MOUIjtGEI#Sx{*@eaw6${}8A!*ql6K+d`W#EXR<-2Rm6ni2WyuObDKl#n*(j z?GFb%-hZvJ`5udHFK=xyOTTy85QkLuSLwawJCZtZp2XZi>F1{wJ?Ha~j27<)nBZXS2az>aU&ygB{OlEQ#f2<%Jmz5_$Sfo1}2v65ia>Zv{3T6t5KU&4${5%cXakbwTXE<(ihg{S~c+*5`7aVxH+kO(^HD~l=`QwxTO&;{I)R8cpduMwup;OXiIeML9N`-3OX5 z>c;g+#5%|EP_l$trm%J-W}`wJ9uKa^^V2!fWhNo zEIzr&?wE+h@rVUy_TwVcpxYIlZmq{E#<7-2MRwW+92=mL?z#VN2Vq`nv^Ze%-(dX_ zIn$lx8y|H&vaqIr>ijW1z%}!JOzltB!vE(04*$fE03o&9yh2VjE z>WRa)UdS0~U5;aDelp85*1HUB^IhUIhRidj$+^2b2X!oioe$Tl;0MI?In9pP_!AGS z*a*gKl0B7U6FmGnKbZu$X3k{|Qf zV{Fo`A{{cRo$~)*T)ef%X3uh=6Q=v^9xVl2-16cu z$>(r6r<}yx_l>JE72@AkW~TDaC-(iLUXHutjK7CR?=tJ4RHSo>qYkf*;*DW|l$&u} z{w-i^Zf>3>jW8~`ZK^qz=dxIQk*}{6#T_ZrEh3vNHWc``TxX5y?#@LZ;PXC5m1uBI z2fHz@t7l~35o-$En#%V;0u6BFl`kQ!#WaZ>+<|98UPvAeJeQ|MNcNf;@^~bw| zm`?4xJUkv{Q6KRvs0U4Ubhv>I4)r>`7_)iI-(Yf81EU*?32;2}q;?{NxtSfAGLeLW zHqHL}wq=_QswlE-fw^!XyjD(Lj?=0jBf`a^$0PuJ-+} z^}a5)OECXwE1p*35n_J>43KwF@JtVa8OCK-9bLDf~lrY*<{21z3bklwmg6HGRSUn_FYRk2Vv!%B| zIfajGE|HxKpXmNALSgs6`f=d@>PI-Gx2p=a{b-pW_p&+M2np@RZ zgN_~N=*m}hTUwf*o752j>sXkWu`~@@tGTY1h0={StMKm6orn@KncL^=xF`b+`b$kp zgZ=$_X11lVn&XNV!k_K#{`wK5U+_c7ChJZOm}YaXclsq~4DUBvLKa)@s#PO@5hP=Y zfsXlZFZN8oouUI1NOsr3whKtWEY^)-eW_$Rra@AMp@ZK~a)W&TRah}&DFHj7CIGN$U2hc43rs!c+W9QC$ZA38+PR` zx7rs*d58q;Jb%(apwINU0d6$2v0)HWD>itehq2|u>Z&)qJI+p?ef8FvD=D&wfPS|7 zfGNWA-$nHGUF-meps}G!m(8S4=%qbi-+z3omqLp_mWYoqepn~_BS9CN?ovHLnVgK@$&yw#%vBu#%+C&A`MwL&o#|uU!(e% zJo@*vO;Xz~uUheA4vnAKjNmGl&2k!?ZSTyxz6WREmTDU!PU}b*jW=$UpUb=%Wqw{T zQ6-_8thPSF_-V4{6X3EKHx4LZEk_Wy^4l+WqKfet1McJ}V|v$IEBbPs&$$lH@<~g9 zqw3h5vmidYu1a3X(t3M6+3xBlGl|92alk_6ecmjR*i;@UzpVK)z znlH$w$>YG&ndrhNyEh#^qMnt-LDb(FPfVBt!&$kqw|iWptW5t-HR4PsMt!1@B?+pL z=F@L>5&N^k1e+L%YQ}ck;R=bF%bV`&Tjh0E$ho{a`wqZocCO(DL3-{N4U%((ufNBtjUYE``@qK7Q^mLz4fs$s0!l8w*R%KXM#* zkVx$1$L2sp#xrD)M{ti!$a7>jjnpURoJy-suhj_`k3kC=7?Hwaa>xDW=n&OZ3U_^A zL?S>jLF;5+gq&27E;DTj3FLDeX?+VofI6t*coo^K}e8eaA&c53J@UYs3KSoC4SY}gv$t7nr%K$#SsEpiXs#rVKsf5A4P5bLNj6qOAVc4Mb%$(|N?^q8uW zMJ&%&bIwk1C8CTK)O!ufseiFE96d2e{&_GrrRzrpW&K@$qa;>5<(&S!Q}Atc=vpTf z#1!^H|G#h)kT=$l!BhKY!tXNccfV|mMaRAYbJ*PByy&P|^i=Puyazd~!o6C>?m2M+ zjF@~6`~z*Pr~lTCVWwB1qwI{`m-Umgp(~yhBD?vO5CE3e`NCy|!zx;;CSF7723~tA z-J+Iv9_{Q6L2=r!`};ks+Iszs$NdFvuudTeGm;@!x5G zg7QC1=(of86z2aV>`)A9{h2e@y4Ks6MCal!zj)Etfe1Q%5Q!%=b_t9k|PTe1E{AR6`$CoJkrK0oH zS^h78g{Qx6@q2rP|3pUVaZCjR=U}jnPmhHh;Fg*!!zDc?5$_WnqR*wVihgrqx$D-$ z94*x=1}!?jXa%0ku-HFionS@hEjM1%D_VrRI5}OUv0uwGdE^z>8=aHX|KYzn(Us}W zc@|jZbv*`EfRsuW!zMX%#cU~yBb2fH7pzjin4aE?w%r0sU>n47_ zG2X&EZt>=cP^Of|37uz5-*{>z=CXHIBp&KC3USJrvHWai&adSwE+z)Dn5&hH1ptL} zzn2PgA)xU8h>zdqzK`TTuG=j(Qj05UI9t8G!y#HG+vEIiP#`QC*Q{JZ5qrpbv)M2u zm2}k2`chh*DQ~F1Ul=s`HcEMMw6TWfdlC~l%+C>J)`07t&<5$8FP-gg-kY>a)L>Q+ z?2T!|++gUFPqSrR4-fqKWTE=FC+})?Lm+7NQIHTA)Q19aM4(5?MX*pWy-ZGGFm4lW zy_?xFLwDtHu?nvzvtH}8TKUsIOgw`BkE^$gs_OfqhLvuRl5zCjQzkw9dHG<0c}V+t1}oPejxw8n<`#`42YN zw;-JScjKHx2Z^L$*qy;5d04dbH#ZIHOxVP~g7`aJDZKi&w8YnSkE)exu?6=uy@J2m zT1<;fv++)~4#T&<@BM(^_X>jf`AFEy-S$*2dFG~v8y{xdN^Legc}einQi^u1H%DB` z{>cekFZ>G{;$ram5kWNK+sZl1xLBfVF9n69#bw#sUEJe!@H4TmXS?rGM8XEY6k4P! z-OsxRlkPsT`p#bU42o2bHUs@;rNKxXCWM8`wLl;E*q(r1N%AH`*rAaFzx!LkRBjWv zV4Fotoc!v}sU9vta*}~q0;rgSg?`Q)GauCor<)GLc)GXjjtFjgrd*6k{OqAu8(BaU z>?{&1p=;}?C=}=_b2oW`QbbvMLu zQ%TZZmbJPz9!vK5eftiZ%gN^=p~-}>Q{Y0+c8eon82kO{df&)U^$mPbi#?hu{YZ>Gq?wn? zC@8bnOAmQ`A^}n@WYdW>bb=T-&AJC1+=(>ZnQ^mOX7O;9X|N7c#$9Hae&+^jBQAYXPBGmRpyU@yw%Cl_7=IRO@U6v!L^HtCbE0 z^b~)zEtRq_B6%Jtg|=<74mN`TY4W2`F2C!ECZ1*K$oiP@Ju-jfJ!aW>91WJpdENBn zRdspwPZGj^fGPif=_l03*XA+>a95^rMC=h!8GEtxR4~%>n4hcL;*E$Tu(<)zExNY| zih$Gyp}WpyIhkUt&7J)`+ocwKl%oac-@H$EjR&Rv1%q-9-+&R}L{s_uljh_L%L5l| zN>yAkC-+tlz6`2i=hv|$e6Y4_cS{GGf(A#d*>A&qNXdqopJj!ux|+CUh3YgPBi~nL z4a{-aF3i_2uPnz?`*3IS`Mvf%oO%DDKpyVw_it{^?;>Oa$~gUpOmGF{IYB}BtX5tI zW0lW0Yv@hL^(A3^<=SlMyJ#(2RZ^R2EWhDIZ_tjlCQyW&&?qLd!n|%sgp<;*3@)19 zjEsETnJyAw0|?OvuxheS+~q#a#JenAwUjHTRTsjBuBM1tVN+V@gyHbv@?4pHOgc=U0l%ZQ)+LNAxz0&BnzHN9yV=?wdep!5!d;0Q zT#~ffru?SCW|*_QLXeakT-}mHPkIqF#+L7>1FkY=84piS;Va8-b-4t)ba;q*@sGfReFQLlc#EfOV?6NA{ZbGMRRm= zft|NyO_K#n%8~-9$rg>=PK4(fHMW#^n9a#<)ss>$!ERyBvA`*KM$_plZ_?ozJDMie(|?hH`n$|%I|V_y`eDi%(c z#fjNl{FvGJ`0T6Qss|Rw#^=paa$t`4&P-WiX7jsn2~B+9r@fJ zx8Kq5-4{BZ>uQ@pKz9*P=hU9Z|Br$p94!I#r5po+VIf$`=$Lvp-4+(B7pzgvFT_Oo zO$Ltc>(kOFvG#8g1rE_NG_Afb88(kiHX}@yukb~)kgl8YM%#D)^8>Z8yf(rC8uV!I}bM> zgV3*ZTO2;t6Y|2Z*wnDmFN&aMy5OF%sFW)G<-NS+{$?dWhQ-NMqr9Nh0#@%aG27`d)vg)tMD9)nG1=2&)U833o#9fVqhlit{Qi}d6+7CS zw%1Rd_EE!ju=Ar_1#vDUpBEdyWm%~MP5Lb(Nh6~aHqMvw~(IXU5 zItk%bQdCqmO$;T(Wov`ae)oA-mJ0mgorZ(5v(&1{`hUC(Zw;J*&jioRMB2p_bmcWLHy?IADuJ+-TY#IC4;G?*4lZQ6C(DSEXBXE>1oP5NKYP(Fc3+wybZH z@ned!kHn5jG%=;cy4uTG1hA3Ba~3&7;pWSfMbEeQ+1>9BING8j0-DrO8x>rfK0^!Q z&xjUB3(}nkm>d&zpY*!Nq#KV628+xEF{r*Bs{DKvEP^@3_`8Y6LDe1O-hi@9RI?~S zxe<^&B^fVCGUX}@4`w@L*82$hz6_je*JM||qvEN>ESdI4IT9@5e`fBMe|+7onAi0c zEvmysTl3!yit>LSW;;y9wZ-I`FJSXF^vOc$jdQE4B3W$;EhbNX8^1tveOB;|WdsDJ zrpDnm4f*-0P(;ZAHRL-+#%!p3(mq)c$X2 zJhR=ek9QY!rh{$A#%yW@!-c>;;4X!qep=OM&Gq_?7iA;jmyf~IW6UON2&5vRzlkBZ zD7YI_ygA@Yw1X?pG2htlE%lq~gFy>8k<}Vyj{qA$`3VVy$HhsC!-%JT3hC*lZ<1PG;-O1lZSp`~DO(w*nf04j z|47FEsCDy%=kgS27Jm7v(WNIekol$cTg>+jtl)kYk4gz}DAJPKnqJOy&Wkc`q;+(R zl!k32#f}&G%9D{)Jf?;X?>lUT5>+}=e>>Pj>a4#M-(j`adlIA0>@yv-eetItg&>0nNyjI^>_9+O3~`4dEpOBeJ6f=r9UK5Fj8E^^xp3O#6p4^C+{|#CVF`zs~lZuQpiJ?K*6cU}7 zFVPa|8EhYLz&9J-%=q~( z`lUVktf93|bLI&D)xVK_K@EMiAlPVC{oIb=Jv`H4x11l z^Q&>3DxYJi_Sw~Ka(j8bsw5VDD*flYggJjVMT++KgOL&yJv|buMRr=Rt#IKm&#@orRt5f){Rg2e z4T#1{^~IRMKO$IR`3oI(+D3c-u3HRQOL%e_-TmA6doQFdWocM~3?ES>zc6Zgmhapt zBAGqtmETBS)V;^z63GS3J{hhxtinm*-pPM|kUX@Yv^~E_c+*xmDR+LVwGXmh%&`un zI!|l3lKJ7Ap_a z!27+K8UUxCj*X4|tXhs1R5YsA3+Nez_qY3Ux?@4R`|GD(=zlbX&3*Q7|CWImIZ*#y z&_7>+!4PhxxDhDtgcdDR>NPA+}5Q}cJ=DQMbOV+Fyxb=qxM4ns?20n`0 zkZ!^G>L-gHllS@&l;I0oE}&rFrjcu|+NU>Q*9Jh55^(GmeDhvf2Xel0bji&psBlE- zO6q$11t9m9FwdFcTTP1b zoiX?pLVW1KHBv_)s--GA{wk~oL2>gERqlqMq*mBdlig5+t#|WJ7)uS+E#}mIUJXVI zNrS}a&6^&1zD3|W5)sn34!Sj45_vgUA%adg*)bY(EK=!v6O~%@-gpnHN1rou zj2B=LOqLCHpZ)u!>d(?~<2?oO?%@Z)*~BkVKAwnIR+L0|hjBhjq>Q-H?!G7wZRbM2 zZHHoojH}&5;t!KM`P*g&F88bD0|=JrV`vG-{hnkM`NnL`5Wa@|1qaRG!lG#e9R)@wk33I z;hQj;&IG^VZksiInekp@sWD9z|Rtf+KKYOny58!~vs=lc=;pgY) zQ-DmacA3ki`oY*MGbVC!X`Ksln0@rvKUt@x_5fkrvNTgXvE6d6t`t0cSO7pOd=d0~ z{OO6_vS~K5hxMpRyyJR)fm5pVu2k?aXk(#jEzoaOLS!fR!e#pYxND<;tP$n)Y1qY% z^a5al9tgmdy-{ja-Nqk8nrEoHA^pviWs+{L5XKF=#zWxCm6rW(F#;J>yWWP-fyd2! zyie|9G9tn1sEPFW3Q;Qwu#?mV9Dq*0-EnK)2Efia3a>7Lf!rVf1ad?uGlOehKIuve zN7ny99F)eb4+L{*;g@Y>*d6SJH?||crW70aQfzwThy-4H z&S%dQNdux3O!2|iIe;8}08t5@nTOo z$gr7>yd7Iq%Ovj1n>|co(QOO9b!RfZnv6~k>V-5DiRcxZEwqWb9qjG70q76%e%owq z12?+y*8JD38?&6_SRx_B*W$>a=A40)xxB=wMjv%O8ISQrxBUy1p)7XzfkNw%2{Zkz zGr+KFMM0@#j+zh;kMax`z02DeBVyC7CO<@rE=k%zwsSICH#z2Ig!{;}n3$c*1l`HMM~FAtKc1uyJ-E+Np1j3Zvri`K@LfyBXPwWA z+sjQRd`CR?2-mh+=zN@2p%(1FdM@S+w4;R;D-E6&&0|7Tz20-iweBC4qsYoFiv@FM zt*$xfIWP#&(w0p9vf=IS|EyMiE?EYv29<-dpERmkxpNNH-}f0PeT{sSB%8fXU#GHq zz{$L2$F>Yr4VuO(?t(bsZRD7_z3Ok*^??rx3WDxrVP-~?BU(jeW@eshGJ&^W&x0C! z)CMGtA{oiD)0S_T1gCG*YTP08;1(Y|6w+nVoVjovzP0IT#dCnU`O_M}UG0Un=j{1u zf|y{?WumR$p6wCE5AEc1u@;T#f~4#Vy=vI?S6VeWaJvg}?)u_gW5-mZni`;~Z9V{S zI9BVQFwAnJN3Sk+hfxXVnUM{h^kHM2ZUlq6CMGuLk8-Hlt=HOGSTjC%AJu?>fb`Jc zN!M=L$r{aWb=>zB&tB%K1g)T0cV6ah7`giywg)n(`D-ZC(nI)_E7$69aG7-aPkWt` z7?Q)jCk%i&$8mZYexC^S(dQeGHdwB{^}N~J>_2dRnBFRh43*UklB;U`84%MA@E15~ zY4zGD^9UKUZI#*YA5=thv zjbbYg5@@1>r+##wU0hj}5-Fv$(?)B9#m*$L_ZeP^eYWK+J~^>CD}$rLUH^AEkp^KR z{W;hA;)cnEI>!t}NZ(*%mpia41`8k3V>50VZsj^&d7c62%O0eFy7v)MOO`H)F_^HW@K zvk8;ChvUZAjC2Db5^y`dtFl| zEhrd}5{B!*pjIUr@CKHw&R&I^ho=YPwA*~v@N)L1jUPa86x(FahY`i*w=|wWU6mDw zQwO+~k3V6ya_FhH28D`RK0FXG`RcV>lO!^!U{2^X!3@Ucz)Xh_F7aC(z|5<~tWT`n zkUfs^@GmSvG}79A3sjd!Zu;_c>>tjLxv8}Cbb=(S}uQfV0vo^*(D$&5! zM6KiJ#or}#2Wou|x($xR&gLtbDMDrg#@L+ihgG*AOdNg%1aRmV_6M@HE0 zpIiIc#vF8GjIO?6o|vfiTc9b$SHfY|?LbQUp%EspZz55QuoCE&C{jUyEb0V=MyEWk88tK><%il&}; z_W|M}5SzFI)=HSh-81Lpb9QMF*V~P$jV+8Xc|<7qQ}95YH)uSv$DTUZTH*e!Yy=iy znMYQ>isR|PJfNpkd_i*Bb*wpN?~!s z4)zT=e8XqLI$dpMxwac%u^>V!+>4JrSwlQWJUdzO+R}>7Gnd|2{k_jFe26Q{>V&P` z9?Of@*fm$f23W2}p;b`V^AaC{>+vR&+5z}(+3yU&)8zr@%o~u7E&zkFU&SIxf`NbP zDx>Pm?KpaUt?|><&0aq_;Y=cCVHTXl9IU}OHRGSWN3`2U^s+a4=*31uTk!$<$$a7> zEWtOQXlV!0j(A_-(Mb)oKdE=Pqct@bMYt&OX65i3V4K%#Ho5Q9uVO_f=K!r^0oOL^ zqAkwL#6D~Bou(J>KaMJ1Yj8CSzNtu?W+FYk8vaV6bA{afqVV`>KGd7Hy?cIfu|@Db za}@?d3hmFHrjoad>y!If>thj5Z;OT9Hn%OzXYMa)2Qk=-n6IS!W*2h6Zd%Q1O zs0`{hkLVxX>sbWP^h03V_*XWjw`l3=7R|=KW@}ZWk-W#fCgzU5+8?h(#m$K@nX{N8 zl2$220_`%xNI6ozIV#1G`htfgbf?$p5QS{J4`v5nK2&e@vhtvj@cCX~C+~W0{bJHR z%{iFwduRb2rZXhTedSY=0}#;&4n(}b;YKQ_6fGh{qM7E)l&(mXLj~<)Myl9*Jw#ZO z$;HFV$qcTD#drN1PY%;PY{}!3yyPlDfCly+JT%l8Y3l>$xRI%s1J<0KPY2%%0y4vnqH@+ceK`S77gp3_S&-zsni{ij z)h|l6!S#PK!!xsYQTfCvCX*|`?TNhjH*Ec_;<9H z5GPu1f5Pc(izz4hilEQc}j0ThE601 zx8jMmu9~L9TR%9u_UQBS8a#X?HjOMRP@wSGkBWtm=R$uNBq@1q2i-Z=F;y?=2L`g0 zi6qpST|;dpwIqh2?VKmG@<*U6!P^?T+ER+ z#%pG_17Bn0kQvO;wbVC3y3%5RlZZeE)hj9Q4|E!C2!PiF*DgneF}lyodRA9g&nH&A zhIOMVcLVF~qxIiMVcBynJ)*)D{4i~&nNR(}*<%_Xei~vZj&x3n*cJaX;xCZ2nLzIF zPqVLpS+_U@C}F8;X=GkA%Y`!^0BvZ-ecW{?J^G=qhgW(>I>PXaY{bZ|l8x);J+ba^ zJ8^I2TBUX~-eKX9>$Ts9MMc_LEU)+UGvv>az%xBuAA=FJ=Bt9E@qNmV#a9^WJX!H( zua5+VDyYO2Naz*FSmbAd9grZzapk)*G-rT%ObN)-0Vx~*moS?Xx~`QLC%jtY2^euC zoL4~~(U;tgyB)r#YC{7+B$=iNAkz!f5~y`(%og3ig&p~k6r?}X^sStKmTkYCo4xv- z)c6~Dd2~T^00yqQQw6rnwXLm zQa|l)n)M3y%Cna;dN7S$k~7=+o#3;NkP#-C^P9B>2OMYX1*FqsSk4;VgdiP44WNK$ zZYofD2W=FbEXn0KCO}0+7H?$gqJPD2H{7(ENbEE~C6~&hvyuA=+w|k7{8la3&A$WxGGL}u)csxN;{5VJLdw{%J5z#n&m8^BstDRP8m zmdoaMfpgp$>&9B7g78QvV^ZW&pBPP3NLe*5KP_8hiq~>&o(ID)efh5a=9-inX2Ev3 z$H}~XFRHR9^(Pz?Ga;u%FR0>F!2YcrVjWY)N)W!A@2q8g&6Af~P}(d_SGfgN_qopm zS+>HS_wC12Hir*LO$-__o{?7~ii!h*Rod;{{W^Izsvj-qW;~W%Jg%3;&9Bt;j^MCg zOea%eXwgmsk#VL`4I zZ-av~{N!?mD&8#w+w?S)2A^!7lTbfB4%cWZnh&~X(HVBQpJSrueSXMHse0L%w3w~M z*L5nf?}qBiewD##H~18A1lc9w_e61f>4;04PKYKStxOvh96`RCe2a(YX1 zQK#W9^~$@`!33+quQ^Nm>a3>UU5P>=KZG@hdqSGF=A|H5`Q)fYfVNk@ceZ4*yr-CI zz_fN$FS-#QuOy&2hG2c6SvYOxpFZaQ0*KgYGV=|9B4_<{5OuG76PAjlhe{eQutyaD z&d#u^NX@-!)+;?}g}g#5_^J>hrBm$(tvL(0Zv+OYm%~K1Ca(^=hR@gmitQD*=g~Gi z-Uf%PR()9VF>h}g2oE#o!>ImzofIiT&aEW4-3vWW<4~_z;rnzSZLL2smnExP90{KR z{WaE)g6==M#XrPXz{E;#j24@OSmrKnCPk{f`R>URo!|}7QIi@dVhF%Yy@61pp|D9T zgaae#ENRefjIOc-4d*aYo>?T)FxVk#M;cfq6NWawG=}><3|;WAtx(qhK6s3{(Z!Upjr2X^Q_tQ;d^SvyBf-vvdF<> z>!lh#MvV^58jmHp#$+4c9oqMIIAy0FlcZr?EJJ%*P_^_|1F5UsUdY!>D|}yj!F!o6 zA))f*rKqpJ;ly)2UeWvYa~~nPqB(eF&0{FM##c^GE(x7jU}8)8*JK7E%adLN`F{AZ z_br{psBB&JSQa1cb*s6~ez@v)MMcG_jRoEOD~3Yg&e>Lril`t%m!GqTyt7yFdx#q0{gA%m17$eo) z6tww(c4(x+w@#N{GW5awy@TlZV7$c!TQsf4(@=u~8vBoO)$7XC)u(&Eyzj?&!nwUj zNCdruDdN~^lz=U4vj+@IFyfA6o(Hc1)VF{BR9d(bhA$0Neu&HtUE;tX?W+Oza+L!5 zOnw}+8;!K`Dk#?z$YjDxuGMwkik80pi*B2Y%TK;Gl?dH-yS0v;bNbdB5<1O()4oFP z_zFJV=yT!zV5Oea+|oiL8!rLVK7HLV>QUA1C-^uI&MQEuyjT280LxrXY07-MT2D!% z5%^J5vH$}TzMxlz^Dv+oZ+;L0G*1J)E}XY!S3wcVrXr`WMQ?9O`Kp6xbqv=)k`f&u zI95GfqqOj2PgaO9$qdlsD(;WK!+v|ivz9A7)9epe?Rw^)9R1)0Oce2Y>RHLCDbm7S#&#oglKdD>|?}WRlEDuk5>b1D2!T>QO1BQ+5Q{$X|H;w#jIxl zATh_)LD`1kooyo=WdrF#){`o%YLVJe3swpmXHSA?H-cMu)D z9tzYdR}dm&YQhWY)KVCAQ9^cd)H`jzMe~^gtj6X1v2eL$z@tZ1&3%&LV1LKt_{5q> z4H6U9xrWE(w#4~9%tP<_<002Kfs>V1bZT|TL^&xM5iit)v{{4Rhrscoct9`Q&2%kozqH|ME(n`m~7o zbmXw*1RpPbD8I+O_MREmB*o;fSsGV6qxY>1Q-av+Ygw_}gQG(Ue7mx)vWl)T$yxHF zCu_Y281_2{F3e+_w|#wm`fbWbL25luhnYmgqSFF|gAMLAJ#?lLAV>OICptr0VMWcp z@$r}|#YzNK*WuDV^RDuv)LXi0YYRp~EL)tXYBR}8+gcXUkbK;CZB zRV-iYus}7Q{3R5B)&17>>1eNXFE-?}3XD9u+y1?rRAFM&&W2n!)SdouWXP?kF!{Ws z+WxW3U+#HVWRvD^Bz2X}S(V?tI_&ya2=Xt3}U%4gnAue}7tIA0+Nc10AF=?li6cB*;!QRB54;srH* z@%6aCuo;I@qp=1>#_Z{<%}0?HR$W>euOGDhSe>J=$gM$~o22n^S$5>wgaZ?LwLEc9 zdZ@0luU$z7tx(mqXI3CJ6JT9eqSJ2fG_Wt_lH?mq5b2H);lQGHKypUIWsHwIsG`W; zymiVpW(tjef#i^RUe=uU+D*y;B|6?$(2jkrPtxFVbWy!>s)I28QXT$xjUCl@=IQ#44PGbw;8wwD7!mm_N zv2*t;{@<5`kT3BD1o5u1DLJvfyOliF@>H_RXCVa{{f;E5pjGPf0Ge%!tnAB1cfY(1M= zyT2EBO{L>P=b5^xd`H8hSIlnR^E-*7FyC1QBxF-nZd}nj5iHTAry8$l{&KAkA%_1N zyc}d{5{|Vx?9rN9ThE~}Q!cT$^dmP1M^mcSA)wvcdUPtevq1dW#`!9>CC<^hxf#Vg zg|2a}#_5p?MK+BE#K7BY_q_UFQ7J4~6*li6AhTXKXy2F`5GbS8?B!#4ZJ*Z@Huj8L zl+r#-d#hXbP0!l~!p|%J6cj1{MKMOH>d*HCs4a*_p&zZSiG*$=AhS$(Lp!X7jObPB z3%@)W`6yz_7@CS4WbfnN@bPgIJCG0&5l!i+i}!xSctI4Drj=}Rx_O4DEyP_+RghMH zcntv6u#%D?XK2+A=B~~)MD4ohR%(n;e9goI?}_6Ku!b!E7E9qQ|INv{4fy!+BL+?# zTUt31jj+W+aWkF1H=`GCC&G%NVs4w~aj3hVZpPtBnv4XXol8tc+-$$~c>HNGhE@sl zxm+@k>{*9()pRRLtujEh-oVZr7EK%6;G2l@znKDA2g1K4dwvzy&u?ePTU&dS7LW9qmp zlwH*fsdi+l8_f{e#~P}N6xu&i1Ar!A&Kjr7Vd8(XgrENZ8*5|^u$Uf6QBFrEHix$X zaq9M(u&CI)z<{MlKke=QKH>Np_9oK*X#uPhK0Fl|Dv)vW@=)I?I6K4u$&!(q;oZpx z6qxfWB@EHeV&alfhtmfc%#}|{)X>6ZbCIXvY-W=>o9B)Ro_OJ>hybk%y*J z?Gjh0!oyzdZ1BxAW#oT#yu2o!*8CY4>QDB}aTXRX3=a?Qj&;Wgi3%J^5gk4HR2`m* zZ@1c!wOlk`zL(!mgOovwb_|y^0_(>(yt}cHM;-NViiZ;N|JFc3^VU!cdr9{2;KvLx zUo|S*y>a!xXri&Ant#ktM6xy;2(r?^FM-`sh{u>J1Zm0u>VO_#CczYxbE#&9YvD9m zxF0O6mJ<_DV11e&C-O_BQzv6VO4#TjPXg|kdB@p%L5#IGZ-cmEvIUfx6{ov>+N?rS@)ZXO{vJukiPg?>ApMU zQhU#!n4MybNhjs{^+5hkJ#%ny zP;?^@_N--pbNIH&ebkR8SZ3e7;#RkMIpG!YQe$BF)ApWBrn9K6E3(&W529UJF_dLO)zg|%f zK^amdul;iViZw$C+8MB{l1 zi=M-%tYW!XU%d{{Gzwh$FflZOBK*7Mjt#n$x?#+F<~tgt`huyP9*no9zq`HQsvR$D z9NlW<-2g}602>ytS1I(8k9g(5KVlE@KVmN~hGEGyi{C}U<8IL3;MWZQ|w&0)a4V?;g4Va%271_|jC_3&t&=V*~!wSCnNXC|7R@#!QVcCq3Wdl|)o2 zm$f*KHt0mis@}<7%b*z z%Cgu@r&6(l#aCwvD;#NODTu6TW9xgR{?YjCU77d^-7FxMYFJc6O(soC`M$}r1=}v5 z&E?ifjP1cR)KVpotiADur{USDT2zw&?eEJF#QPV%oA85jG(p6zH{IDj@HR##AHks& z%LJeKvmsoRfV>h}IvK&=hEVO?$ZR4ztP__p1P~~SOy`G85g}IyBw%tGp~CfEPFbqd zR;@L~n0>p#cQ4YV_?*MhAAZ13?T1wmKTq z2fIM(FR(3HYZECf@?Fyj8w!o8bboN7$0rcNW+{?ZeHy83eQ&eIT_!V6^07@Le%*<>khl^`0m6t@@ z1I~CISHpc`b+w}f$n{r^v(>ap7VJj#3Q-EB5<*+MA}jabmZ6WD-H6`Sw7-3+LSon@ zi^2R@c;AB8`Kuvi)D8!ME)F;2(H|Jbf|SZ1N~5W4wYjyic!x!&scIJHptDtl`2hPxT0nf@rQYweW_gw|_toYQdV5Fb z%;8F(a@Dd~+Dpa)T{{H3wc?OD9Tk3NP5XR0HkWxKZ0U@^e%NHP@SlTe74@}$CjM>f z&(zbc;7^tC4NUUWw;_KevVIz@@$y0;<#>JYv1wD4p`6dm6 zJ3Z;!`DWKg8s}l*b3J@y!4-F{fMz2RkNFJ@A*bC|!~o-hFPS;by@MFI++<6hkTMLd ztCqCeYa{U=iVXS>MMjWWoP9~*Wa?&;CGZu-CX4T;*9@niB@t8m5+ebq`~xn31!z&TN0}7kV6RpuczYZMQ42MK}V*9KQSIybjRkC7xd& zww^9FYMB%T+KVR{Xdt&5>$RzaTD?9s?Jh z0bvZnzu<)VM@W4nGXRDyV5oOQSFESTYc-i?nba@#oK{v=PW{lq0|R5iP7I~5I5}_j z$4oCr6no)mv{-4lGyt$kGZqJquuLwHtOMmS@8fMvw+c-H$4avq={h>96tnF$$=({C z=w1)<#KTsYwfDdXZ7i(Rio9>+e{*T8|KU6OQ<~D% zsgZ_Dk3s`+FltGWIlV_aJtm}4UKTEDc(8KVLcnCFSHR#x@y6K@%X(gQM}d~&Ny#YI zA|;ClMvR0QYe)k!CMN6Jo4S&36yaa`^@}(a2es~ zgW6?iGF*O*@wi_fHSY+)^q?b!?{S{wP$R#Mk-%oBok(wg#c915Db*p|GO#flEY;zp)10+M91qY zthAJ_?v+=iYS}Stqxy&8qj_NZ89*dS2t|7PUmvqFQJdej_dYs~}%{AdaDm0H9v6-2?OK^W-h z=uG{KfBVRRv1tFGI)v|Do=vJHgzVLN=x3Ls(NHjr+wlmQITUO(nA|(Aj-{F)^5h`t z5xe+9SE~=_3U!~z51q>WauJe^2jzlAt!0Qb<50y65+x$ZI?_Fn;Ncq@l+yQ_ihaT|8m}3 z@tsc92?S-wsrN!^n-Ao&7Sn>fgX^3f0A?tg@`kx22`*P;vs+|3A3K&Rd&wW` z`?LQDNH8`92faMU0W-*D^aRa9O${t7+N1bw<1&30hbQ2^Lo%e<2TXnM>fQM#jv9!_ z*VTA>YRk*bvi-j2`mXyk_>M<3~N zxmSDxcFg%Nr<+q#=fSd}zL(xNvKbl%5=s`~}WQFXz3 z2r-1WW&^zl&#u1kNC33mN#bg^N#a6{j*&-Cu?&tSOPnYfkE|jZkWpfv= zp7&k7oW8P(EmfgLa*B>~hm7YX@jJS3pwpN7m8On8C?D7Ez=wSNH09hVI|+G$PmAK) zkcsJ<4+lf$-({8kTb7eND>eam_eQ{EG0aZ-!PTbGU8Y?Ll=mYr69Yyd@klG()7Qg3!Mz3+3zae6tR8_xo}Wtc?WtzQ$4H6- zWMhFx1tv!L^KyA=A(JglR;7@RwYW4e@%i+T4 zB}*I83%b8vVDgD^%+e<+dNVWu*@0+cS`7{Sc+YWZoY&*V3hZ}-;cGVs@APE6^q2`8 zViQwR;y!@xXSe~w+#^I7F2JNMb_%6DW2|(?QG>lsamdT=NuIaCjv;S~B_>fBI_tY= ziUsQUw9&x+sBZ0!(NTd8^Fqt8U3A&rcIL9gRtXkON0PT6OxWwv8pg&Y0qZfaT0iMz z>MDg5JASV9Qf1Nyt3~xcdpRK~tL>RSZkv?YIit3gZGX0`L?-7V`SFnS#=JSQ#?;qT zPHv(g{d`;v@Q=BM3H;;jGk_WQ{czNfJr=}R=3~3klGE|nGkY=JinVjCW%m^h^`g*x zmIe_n2&bM$*+TVKe9E; zbT7VVx>E9!L`Id9_okU(Mvz__YXbd_2pH=91r)|O}ccD|6I+A?c5 zsr%}-$^jPlrMK{5aI)ziEU3maIFbMXQssM49c1WWyPz!MX(c21SLe>pyxrma{?7~~ zUTS`A#=-b_VlkS(nBv-?mO2Cvn^sP`)?V(aqls_QotUT(z?S~A!Hv}D|t((iE*H`O-HJv+7OEh{Iuwv7yvwc46)^3t4kxHaN4v$Is}?6Zir z5(U#crrR0Ef?P&z_)+zodLzD95J;R$r{opCV$V1G{@q1anT`j?bg}&D>tDwdf$xOt z7fMZS1kEawoY0QvXDv31G%|*H)6?ts6XU|gjAzP>3QeMdk~1Ka8PiMJgB4?*vO3I- zSZmAG1_cQ`I<2k^?(Kp#SG=+P^J$0f0gyp9Pz>&6rj0}d#x}5aueX2Cbfbv%0$0Lm zx!r{(?aI9SQp=Cs5_hH(+G$VYM0aOf@+STAWqrpER;>MyiCBo-*Nd}Coo#SIT%xW( zT=K8+3~3;^;@!6&$w7-C)9ufXHL9IyjRvcauo`ALZr^Xc<@RNFYrsI*r3@e2& z^VzZ9{ki_(Wey{XH>RV|J#)jM}IQBW>4VP?+g5V8LKiqs|9KC!DnKeNFqb9uAJp z!Sdy8fLu^zV!14;J@0tH$QZ}tGJD)`CeP(|M2STI%T|~6AfG3bmCtel{8dWpX}DgA zsh5xO(-$Y7iCuHR*Kj4~?{QZnOm=qE==4j+y*KBDo)8Pw=Lb@7q2P0RqBlyzMGFDZ z^cc{qM>w42*Q|jibfhqjHY=(9kl_#vd1;jwd}`yrJ2E$WT3&9sxEoBk`gRiv_-9)2 z&N#C*MLlXU5pbBiKDa`7+|^L{R=fk*SiBn;0c>{mR;zD_RiqW z@#$!khrUbogVm*g%|JZ`@Ll^~bgD%#p#A8oN5q9{rS>@BFMw zn@Gx#lvK|pBeqLVcvm-Ra=XXl+UpGq590>l>U_=0Vw!AcRh1)Q(?;TiVLSjFpSv9Cf4TdqRS|A)4(3}~`@E?LfNJ~j>Yxn1_w(36GBX0F!u{JGExc0UDA^(OTU^Jz zKhk@+xXp>!^?DYR{pz|Z#LeNL?i#O=>ez{_*1b)wB%3F$uC3E+f)TM+ckiOb6A<$< zm(Gm;cz$#)SE`Lox->}F0ixtRLHa`9@6#w+DC%w*FataH z_Tl4Ml+4gD_iJWgvSv}%@2^%om89&o(xcFX-OoFHJ}e2zwDhA{pOcfSgg#cG{e33) zLeho9yNmq{&qGKn#l}l@Rh|p!Q7j;@m#`z1r%xwN0aI$~pMHDAG2`k%81i@Cf1|p- z%V233$SjKqlM{exN=JR-K85DwMB5%)U7dRBz2UB$Cw95cv=m#~U z1lxd8w@n8|;iZ%35N9|U!!=r&^rXpix%3>GeH-pxbP;WF+gz$z$wQ^X&feSXep~Qk zn}FTl^(C-SLZHM7R4-fTMZNI{U#QEZ_ioM(ul64d)Xg%5W>^GCQ(ATn`=9RbQD#hf zlsn1m3$2Md+G+=Tm3xO)?jtkq`o|KfGz&nd9nrdoK`&q~8`HG_G24=h%r9P_4qoHd z6)nwuuhD)BW;1dQpDy=l#jARzgtw4BU|;NdSp2YiGr#akP$5n>=qQWYz(piihHZ^c zZ2W=i`%1YzbDu$#tkCG8e*n#Nt>prV!Z$^6INZz*1ftt3`1ia1|O0}teXO6O?YR3ZpoKp zzl63(ox{PxOUOEjxa?f!)2drJ(c#^;Aezg0_5Ht15&(e9=}KEP$Ps8+A2I4q+Exs) z*((A6-kZ%@+xiq8o1r^v$1durA0l0Du#$R_lgY@6_D2psPRZuLbE3 zsHy1{y?4|M>0gW&%cn*7t?uPwWOi=zpZGY4Iv{M8#iaql6X^I0PYT4uYGx|5w?lyE z2E7shTv}Ksro-a*EG`ZaFLk25O`#pt1vF}o%FZ16tzL~H=2MUcx+RsAPAuzfi>T&v z4b#&-F&%O#c~Q*_iQ5DMB%=q|omaknGJ#@UJRr(6z$YN!`kE4dWc)*==f_qETqN1Bn62^IW);D?)80Ef1^NT5ruw6bo$6gA9nAw2)dLbs&R@M&? zN0^6Ak?7k1h`kq>sx8A(D5q9u@Kx^=pNV3TjIqEiX-opT5Idwn1cY6x$|(>07=1<* zWbJ@`m8JfzDdHN@*2bnKu9dzqb+&tZ+1<_Uy6dANRx`cUgl39=9j#0C6bo`=cKZFw zT4gd+?Az$!8O#2hl@ac{2!`o*no(pU)&NxJuehsJK zb9@Qc&Ij=w8z{zOJZx2=cG^bd2hy==2C}i`BO@z9c5BQrC~@dz>im#JZ9FSz%mD@? zyD+NOYrFnk>8^_Quoo9Vg6iKVe##KbxzWq3qG=5mms380KdF-hjeUO1*9$~%YHgWL{_J`8s3;*2Da$b1u)yr^7tiv!;-j6J=5PthyTm{}MIKf8)voVy3& zPtQD_oreBJEd4Y}3_moW6MBTwDi}}U=VH#P?9oRxP}8HIyWb|<=st<=1a@I{jUwH! zx*a6`v!~Psc+}0*e{{BsAUwO9mEOD>`2&x61-tN*twT26LvX8gu@jFw5XB{%&jQ}vFiV^jdG4xSzsD>7ejl%=I zBcBhi@Rx%CdPGGze|+fU;t6yc9z7yOu}eM9#H}IitUyD`dq?NkjSUfQIRCD(b7!XJ z`dBkd>>>9?=gSTi(4x+3^uU?IE46ZR*Ktx?4GLMfcQpUB@ApWdTbnyYDeIrEkXl-J z1$*VMiinUXLpcSdr(Yic*PE*J%MX|8I$TakM9c8yZVnkSdNLwl}(=k{s zNVJsY^M0aqQ9^QmYeJSWVso#ze}qpjD`=vpb=WYOfb0e)+MA@6qkr@=1A0a>^9P`f zmHdaYQ`)O;Dt3&nql4|?)7JB?OJWH)&a~!mxH3zS+P>VXIpjcDi*yh8 z`QdQAIZQBGMZ^~gj_VKyF(@Q$w5^1<~jJcb`=h` zQ)f2dXAV~{g*H8#B8b&H4rSaLh#(cVmGe15pMJPo+woG52Vrz=pyzgA+B=%*<8C?1ysFLXBUgiRobC>MF|eDrc?n{QXmbTvk233CbzLtt zUkK9vjnvy6nvSuHpzDv>VltJtS;mvna;nFV!DRp<5&$D_A=+tuZ^AnI@gO_^MpT%AJ^hXo#D><1$kl^O%Z=qvzHND}4%2|Ke zxx~>^Hfcyp$@{6kD+}kOtrz?NTMi=m$qN74^}ncN8;AYK=otEOq+5D#U(R^h7SM~^ zRH}~@^kEwlXVTNt8^9JB?E=+ac4yaTe`BX%;|K2ro4sf?m~^eCAZ=YvpFC0Z*}9@Dobad*A`9w6#KmD2 zq{sE|sl@53WM8X(TsuHOtIxPpjPWH)VY(|qknXjK%ALn|^8VMIqy}8Qq+C$r)9`}v z$I;IFy|+W*jT#(-bgNlPD1bSF-N90e@z026Yfb=;5V6;{x_QVnR>XRN?^9yTUe z@|M=^nVeEKppL>&FwQ>!dK4Z6i?gw_y*5}r!Upt+M!V2g@6_l=@Z(GjjP*GJ_EOoN zHQN~$6eDHC%jA|=1?4Q2EIg5?gFnVVI`tr@TZaJoJtO?fI=;Mo_Vj3Ys>_w?IkO&B7hK7xY3-ifSZJ^|Lt+0S zUv4=px)UJ5u%Cz3oOGeXPNRpWj<|Iw5JEe3E9#iFoq7nwhO82BWdJE?R?9`434;>% zj0>e_u6Qa7f4Ry>t2PFI*Rq~!m}!dGw7z{=!f5fudZLt<;ism|KDXMwBt2GbAVD`a ze#b7Xd1`QSSY3@;tSsp@wHWJ{Z7mw7Na0eJF1u z*%z6RX33)mYCYpU%`eX+`yw=a4m4HC6wCYM74b084pT8)7%%BjF-D^FgVHSGc$G(| zlY)s0?^!N|*p9!fTmNxtd(M=`$pQg~(@*Gl0KX!^q7Fol&V<|0Xc5cD+^a_d1Zq6e z{WmwopIJ!ba&bw#yu9$zcPU&!Skk3?{QSwbkWJCxOT7az?%KhVf_CXyM-yAv5njP4 z^liCR7c|Kn2796I(aAH6_{Ie|y^6BT>s}VEA<246&iSz4Y|*zbUL2-#S=&*F)EL z@q&%ZZcxv<46!mETIv}TuVDOQL7kZz@I38(5|L)spLfO-@BjmJ$2R)KSJl(Wn5_vA zOB5;T42%CG3x8Nmw~Y!kH#XHucNNU{AI+;Vy0+gB;5(o$-8pv>Fcwq>?8h2>$@tZS2f^Cj ziE9b>QZ?X<&NcZ%vjW**Pm?e*5KH%DF{pt0l`|@zi@K23RcQymW`=G$ z=buf4vVViY5xBYF0&dH4R zknWC{@Nf@1h^NBcWTiAA`;nZt;X(6~r6~r_Aj!^6$`7OAWS+~9kKHJIMX-@I`gMGw4~}V;#CV3y3o&4p zI9i1x*6&*e`wV6GLQZ}?axc;M{*AahS;>6c!>+mTfCL|n0I?`~*88N$KH-*9zQx)+ zJia~ZV4D#({!y8euZD+dkA(o(0q}ntp6SDmvdg6wK1*&Jtm7G!P&t@K;gTcgI*pxTk=|0s zIzSqwBY%CL=*d@Kt%&886%B6Na%(pC1O&2;%k!J=Gu3q6CMnVmvvV_#ncDH+C-0%= zr9Mvls0-AZ;~jmRz{yD+DlV84h!*_ppt&MvXd&l0s-Fh(rDfFHU ze3TXGmr8$DYO`KYCty0|k2Vu)cGi8kB{Iqr8ndHv#Gzd(7XB+(U2$&Z;FL7N7b(EZ zC%Sl#0qxxqjU{;r!XVI0j-yK~ZI=JDNOwYsZ(8SP=D}LD%=&l$;FN_(53N5s0q6F$ z@Zm8gwUWkMC}K=ryda22@@V*0k%?O;GIj>+fKFr@-JXN|i9T9pH_ zjO%RH9)97rba+x4YzwCE>e@dO0h=*^Ey-)6XWq8MK9n0oiPjZ9giU{>*tFaW=Dcyf z))tcN7#VbDO!)YB6_0=S12vuKbw6W-s3;I~xW?`hJ)cU@kTa5^LM9PD+HU*nnqQ*j?eLEBd*<;2jz{wM_~n3h9wG0x9l zTQusue;1Yq*9_K@gnbzH?zc>rxshZyoBSM-pXPcQ_}qfupZkvIAFP(plw<-fUT&#I z-3Evn_1lBd}LBSBfV3=BAwxvPZW(UeGvmS{}gcN zdw1;`11{CMN)tlZ^9|D=Eccm+HkSh#FX4%JQig@IdGe-9DHcr-qFILmqo0>de(8tT z6Nmfwk~~@{QO>Ke%|Lhu^K{a!GItSWZp*JkVCey zttF4n(Sv3kR(TiONFqCANbu^#R?Ui$d);!B@Al`**qcGjmvFsCW^4%-9(8r*){#?B zAyo)#00bBL{gU7T)zI-o2*uuNiSpzwhqfHKM&@w(^RirBo^J3n6SNR7uO4-BkM>H< zGUVLbdZvy2o^W3Lq(2LIY^GV$KJCL4q1bP5YR!h<3}bw_dKfZYy;_&>9DhB*k*Gju zD-)%4?lepB-@ju&@ZlBpW0(7-tn8-8;=KI}`TgYO3{FDWjx2jsyO>ovlnuLX9|%MD zNU?SF3R;A#GHY+-geQlex;0Fg+mL6wPL|FULSzKj#+eAu0~=k1*+=}Fy-}_)W2-pS zPLs57;CBwBq+|Jx|L8Kr!5OS5%EeM)dbnCZoS9bOR=a-#l~yK7SOeq4kAr@cUj%sI zv2K+kHW3*!N(zpWiw~09PvkS-O6!)mo6V)5mBmGx)s@`%q2<>3ulsaE9hLz*mbHk# zk6QudYS6Qoj>SxU(t+f|ed9Ywi*zn`uwUL6q3Tj-piFfti_jb= zofP?SzN*1ig_^$VD>al8#lT}#3T0{v?L5H_s!Vg?4WHZ&e*!)D*AhaTr><8J!87NG z<;|#hr;&{Z=RFJ;yb2gmA&INoZlGJ4QM(M+p|Q_EbMaCEmFJ}##JVDMZGl;pa(Z0C+T5Os>?CZI&)-8 z@3c(wjGJt>=Ic@9{wo>jJ?S=1z*5y z0eOorJ%y=`h__+iCtehT_w&Kt;mE*eO0Lhwqyotr4UaB&Cku;2!%(|0?RDSUdAUMy z@vG->S*d|ssetFHOT|8^LxPOV5bD^%W!vXmmPY<|*%3)1Ps~^@w*4&CN+|7MX1g_1 z(YvYv677KdWO6A0X!K?6*<(=pQZ`RFT8}j=@D7NbeY<-;wN<@PBl;ez_6QHUluMy1 zr$h=M;8ypifw$iAog*_v0wHQdv3#JiQ>hDRnGJpP3AJ1K)v3D4Db}UDvntu0VC;!b~nCki(`I?C1@zG2F zvKc!OKtYHDeUdVMuE4y;1-mE*+peXx9oeJNs{g=b!(PR^ip{aIi|zY(F@(K6u-aQ% zgF2;0TMFaI>*>&sz~e8rwzYYbsFYP@L5Yj_A0M*B+QAO*nrkdL)*fU)0t!ak3x{}w zHqjl94w;0FGUCjF)1fFTi}R5>t}Pvd(Qj*O%czmL%c`9$Fcv6nRJXr(^WMd)l8i`; zLhoG2gI<4DgFr!p-Y$Kn@!I{^3pOp;!5MiqW_Aa}{XlP&ee0oqEzECo6 z$7>gF_&B)4D`Q!=VsLcJK*Ts_Ydc5a-`o?#ClY)CL1TK()w{l=D;|W?qVoOp5E;%j z<)7-=S;wZ?<+mkDP_yxH&{3u7iTH6lt9feP$jprIIEJ-G&(->-e=H6o5)>chkD~@}oWU)fto;H<=+BF?i4@v*}tG3M5OF!$+HM@ybT-B{O%YRg)$B?_NdO z8p6JZhd$&#*1rSlUuqbjkrCdW0$8L~ugam!jI69ei&CZ0fFpL~;h+Y%YU#|b{R|J8 zR!&`pr9#iNghv#gq_G^Af=T<<(MEJ3$Lv6DBNwb!LIqa4YQXgNgC%e2TbKv1sUpt9 zDz9f|Y=wv^$d}?XHFx*=PQ{RSK=(37SloUl#0?$KCG;f zTGIsA_#m$`BuHrbJ7sr$B^38gjyM|jGNFd9evT^z@RZfjuOP0Kd`!#S2FIwwk0KhJI0$+vzWS*+0-klk${5Gh7vGjl-t#kqbX8D}GzAB;zmcF6e~ zU32a zq7KB)+vRUx2oqDqM{*u2*tceCHfj|K$5RVA+S-K?>1qGX-0kLIXCFBi-q+S1E9JSs z(O0VesdLVR=2_FTt@C6gFJW;P5<@Lwq+VlacULH*6gV9!o?lMtWtwhgR*T@RZcmZ> zX>S=TA?c=wUV}jU%juhPQJ1n{2!FKe9Y z>DskF|5@eQ+0(ItvXFt${&?%ql?JzK>Ujxf{qe?Q@y6N-%6bUyZ97gxHP3Rr7C6Ps z5G*3Z)8P&TW*)_2Ltq32Ak1>Sij3~S03&+5255m25$!fp?`JA)BK6@)5DyXdk&-+` zyok6EHn^@FY6^556EE7GDvcal_R0zjC-Pmzl^G=JY;(6)ZM7d=5|ZXBPK4vKRgrg+ zv*h*on7T&{IUJPOt_0lb?C*T8-+ykNr0x#{qVmMje&CP9ic<$eHOYE%0w`fk&GQk_ z`+%AqFDoPV|MsNJK_@&?Vk?{pq`@zMn81kMHVqL3!FNI*eb?2;s6K>@LQ1v1HNAviWjz1Zwy`ZfR%6y9 zl+&@l(0l7jDYTfbQwg_U2zVL80u%O?hAQbcu_Ii2J0dA*XwuU!X}j21Ls(ciJ+Rhn z&9@fSYA@H#dFECRepjQgpB*T`pvR603Xtn4e1POkaLPL`NWx>YAlD_3ZVp3=*ORM8b~ z>u9~z0xcQiVYechqzjeP*7n;}L~^c4X8`q8=|DP8SH7Y^#J)>qVRl+2O^GH$GZ&%t zxHEjiLseZJzTp8%vace`+CP3$Iu>7S%r~adk2Eh3?G{~E&*%^hwU6cUmAdvYd-~5M zznliF`SG$6&y7n$rpF7FL1CvrmrD55b8Wpu)502v3DUg+WkWXlAuw~mbIH#ZMpu$& zTR(B)Yz9kMr?cX7k5f1HIt2!IMaR10RceOKTN5Bhov4CEuYUg#{m$ojbND8Hdur6Y zSraao%<<#V$q9I<@ZJ4% z+6z5zI!^9pytgYcmu^k|z1goP{UqxCGih2G%9?C>ZIN8|TyQ~ev0^uF4tjdW z@8+?oP*B#)LEGi)d=v zc&wfY;V~gNZny6TwmN(e)!flAT+uLG?n#^9rf~9t6aiJiivVFtJe>WKw0_ks*F=x` zVbw0e{tF3?7!?ti)>Y*4n2>b|OjbS6zA;5(DP5QQ&z@=7{_goRM@$kj&O}wOOxXG* zBf#w(X51==S)!!-m$y_nm=TZF6I#DNR-dN8E^r)WT`TcA@CDcUMhx1;z{BnP@}K9| z%1Xz?Rn~5LsXv^Jez4rK{jpa(O^WSG=j)Wsh2D6eL`2QPB0%yp zOwXQ}Sq9AKQyRiJ-y0kRYw6laFbfD1|A7)MteVgeant}((3EQ`w&#x|FEy%+0_hB3 zeLW$_2?l{RySdlANVR;p1v{dbGLT66mpGG?A1@Rp294d{Pqi7O-Cgf~e{Egy&&gTBDX#FQ=^vAib> znACG2>~s;2GZZWWvS=tz%`e3x_)R5RlL;shpjud}eVaZ)=>lFZ0lBU@7Le1|&P+9pnT(H8uuJYN&MqvuEa=mw{ za0Z^8+B#IW$O(8-)t+ICe+akou7eFI>kCE&3MZ`$CeI<-bKlPkl9zo>=JYReoZiFt zkjRoTj{@>>vHO9k&mDctpA&^z@pum&C5WA^;S#wYxXjp8tl7!8kJ}vy6Fm;`s2?{X zA0<%%=k4|G{M+yC{^s11dGua^w7ePDYWdf`el81Mp4W@Yc8?CMpIX=toZaT*XEGDWX#vV++nwsX2fd5z9x`-h3^}GbvLVrOa6~O0O7X^;U9m_hHtpY3N1M zN|HJ1EcNc_!8di`bb28;TU8M{I5lkZxGYn*+K?Y4JD~c-DKUYYhG|+ANU}CgxvG}< z%wCTd+4Ril$Z2u|o%imXSWMarFgQGz)FU0~1(J6Bcmp+T^i)Ifsn{QbTg25_$+7y1 zu>irhZ_ze@)6z9F0}PW!HZy9^FDr01a^Mw52Q-DgmHd&5^oR}IjdXBZ&gQ0#eZ{>A z7XvCuF&IpbJDAra(4pxO*|&hvQ8(~<)rq~CJzbwzO<0D;GAOFEv%5rP)#Dao56 zctkTgM-ll0v6gi^Zsj%G-;~z}!@(tx%?`RyrLs+r#=so)fn0^ySutMzOs=VH6kx~b z$-cz|Wi1U)WCwF|dFae7 z`tD0~+LHwJz(U_)>tahf*3AG8rWjHA!gyQxY4yV>obAf~Zpn)Yx_fueCR$&1uft8N zOi>ryndfu=eI#BIBCZxEKByUvw1*NZa?9M=<8k zj9)*an!m)CWm{d|(2mDnPVL}bE1&UdxtO2%`CK9|N6JfZqED^vq$(=c7WY1}lP5DK zpmy>Z8%*4wq`z9)cA>yyX#v@(GO3!XN!b0NF?lY92EQodE`W*9<|j$mSFd-K=mOb5 zcOGx&(Hd~zj%y{K8RpS-0SmSZ*ZE>KO**^tRyTc;yvU;2<0kbB`9zuRa)U}yu#P@l zPZU`JM1Ql51dXITodgf|4lN=VVVEy`38#YK2IiJmk4v%IMfv5TDwg7eB*m*gBb^Zadh; znqg)ARrSM$?^J6tR=C(5O`6-HlPa5hF2Q`gVpkHFuEnj)Jo@<3@~~>8L|(3l%V+~% z*z=73c!;^|c8V~Xfbe-;6pjDuNhD&AQ%%4s(ms3oB5tokvT!6e#(m?W8qR&UL2KLA>RfBM%rpt8Cu%nbCcf} zEs8t6$njc`oObm~LTnS&B>LvtQ*cD7C{ZNHMhPgxOm|7Oa9iqBRy_`h!MeG$YzC7` zOqM+#ei9}rL*h8wwPPiJAHd7y|DcOs@}rr08(t5n`3SLu4;mbp#}yxshzE*yZ%&g1 z>*9cLM%(MRVZ0`KtB)vTXt^A12zy=5>|)195gk2wJ^II`rKOzWS&_`H00mw5R&ME( ztx`{xDgz278grp2&j>aU7iw8vyc-PRQ{R;oQ2;&6z#r`SYo$0w5ayiQlLH|ag-D83 zh7&#R1B;t#_V(HMWO2((e__qKJxC9waYJmJ{lpfm}uF+{I!lGV>)#)!agwDc*yjWJ`MKC~=ah zU?{hM^tlG#L;KgHJV7jCTRw?RPY%iB*bjX%J71aL8)@jRDZyI4>3Jo8!@Xy&N+mGU zuwvPBxKnsP50t+6G2~yvdd+?2F#32&Wn_OYeJcI5{~xUJpNn<*pu3LZdN<=>s|mVg zrQ{7bnECm6;rZp(^|mkPO03rC?v0qu>L2D742`#QI4*dgp=s<_&i$j7$hrzjEG2MBVfZ(y8U!9<-ZimQA#~wVp3L{wwicBW9VcmhFFD4N-@QHw zF59yMS8bfx^;z&hZq7KBLSuYt*UFcAIXzG_A06a;a~E@}PCwV|2}dn9mRsur8Lc1eKaP!wv9K-sY961L9cmk+0)%;S>9Eqw^=kG@ z@b+XWl>|j;byDOqCoix1>u(>x+$CT4FXHH0ZA}bHZ?A!M=tPSX%w1Z~mrIEh>(Qrm zsOrxc?sIylgW7YidZsEE*A!H%tR2pHKa7gR&d-Ax(|;cCP( zdroD~RjvTa2BN--g$Ime)MdGdNc3z%uhlfrOXBD#-UXn)Hl|4aKdMn}mQmhea_y%x zD6;oF0+`-zcZH37OkzJcG&T7y43^j8^A6(}Q&nmPIjp=EAC7b4g|QJp_bTwdtH}AC20uVB z8DjH750NL3Y7oS@-J%N@L^ygNtG?2(RAYB!=R#+#Hs&O!^in;Xep;l}bmxrMN zjZv1U>TF&?W0kuQ%CT#4O{Ky)q_vT~J-$78NFAc|E-+=qE@N=kA=C)V8S@8|Q)vG4 zf%QCPkF^bV76E2`3t-k`jgBK#8YhShTA+5&rjQtYPc(q?zU!-gKbej=suE>Z!YFuV~pd zUlFDl;LLGAuNAj>HS;9q>DF#dD@TzkBnSGVY|}0K37G!#imz6khT*J!K3)IzZTH$s zKOA#_q{-ri^V4bf^k(Ks7SUgu9gzIrg z^P0X!W$>@ZfR*7A+*}3rJZ^t>pZf6c?j86ppS4L;y?`ruH&`A}MqDmPPD$Z%so5;3 z5u4`+1}vpqbsn0=JQ(dghmKKcP^E^tK5>`aj8o{EY8g|dl;>v{dX>K+2$RWp;VE$G z0!OG(9|xFzpmI@W7Z_iL%)@6x`wE5GI~F&OVFJ+iz$xsxM_TWj-nKp1+l)mb!M4Jr z!rDVoOCY6YerbMKL5oG=0X2<`P6?i}Zl$s<)MQ4nCU~GMwr72#UR?cykShKQ5}Iaz z;`c=~5I>E%D4AkAxZP(11zqY63N#XTGOu2{CVfq?tPPTb;&8GrL1^XX)G%Cp+d$fs zG7zQQ8Z!+XtIomz3EemNeV}J(c%N^TGsjWjhq+Dw?LhwaTN~jlE>~}%{;@L1#)fZg zndk0g25x#vJF_*bTMoW^fkAyOlTKBgY=msd?^fG>mro~YAi=x_^|U-o-RQWY09c~f zSEsb10|R`eQ?G<7dF}>4!i91L)R#aH*TsJ8?v~Pjw1PKuS~IIHlTo}9$bwIiFW5FQ zShl5U%Wwjv@&9&^h_>g@sJM8i5DS1`&JTP{zR2S9DXHh^G?0*sD=Bd^Kg z`$S?&bKWNn8IIr+5^n+B_bfa?H)I|RVH`LEvDyjOkgi!^O?pXn`ucBwlz__b)L(6V zBFU&upYH6Ivk=-7+2jOdLPEot4oZMKK=kCqm*Gr4HPeed_V7j`8M}%V{VLb0a+4Ye zDmB-t3bqhPIhRaU)f!H>d&(CFa#wEhfaCR=V`f=g;~9fDEI#u0mC=z-(aP}v*{e7L zCz=ydu$)6D8D#Fb`JpG<+*Cj!=nK3BX@s>{mjl&@W047|XdNX}&p)P-=C5g#pfXUa z(jA0&l<_SBRg->|5t``tzcgvBP|G7{&Oi&JYrtXJE77UO>*T;G2YnkjW6Pk53#N68 z6(!hRO>9ItdFCPo5I)i#vH33p77u|SveVOoc|XD&@K>fbWPhJ51#{?m4qHs#&Hyr< zH5RLel!3wbNuh6C&MC8XRa#5$PBpUIjH@0bcL?<*&d}3sU(X-9*@M)d{1ZcRdG!Yh zzC86LV>-u?A1BqUA^m(4M=Q7YD8(Ow@fY9r%i=FCe_W{GS;McNP?X&(5&^(ME}taBL??J`nv6@^0w8(OkEA!Iy*P|cP=*gU<3}Ag0)Mm&s~3n(>AJJFo`3tW z#CgPb*QzZ`*kMC`ojl}u?CW|D9du*#Rwbo0YggwE)D_3e9PQLsry>!Hg_UXxGku

U5OvMl2=?k*D;O2=#f5bpNSQLH z#nV!@r|{`}R@j;&j#ULP#3m7F$12

X=WmDo$3uj#`2hl8866FF{*Qzv;XqGall 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≶%m8--3O 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 K)6JUcYng=2#-w1&S{^15W$` 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

wVaAW^*&lZdu8!0p1L0 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

  • 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

    4xfE{MldHpp9{h??|9t?3*|J4>T?mY@ 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

    vw;0{Ug1)^T#~~%*taB2Q#K}UG<#LLP z@_7UXx_MtDK6)dMPhRm14?A43VS#$OLMI4-RP%NM{3}*XHsCc)%-Ow!u{tReVELk{ zg;T_=BP>iO11Bu&VTbKDBt=CrGL7qr57g!+={Lmc5;Z02^vg^a&W4xiWh^1mCc%BePeB@ zpair+PzjmG5z0IoeUEWac+*1>`Q+_e5ccP6DW63J(Q3#UMOLlq>aYCWoKXC4JwlXtE$K7E*G1@opA&jgizvIssIdfR-k_F7Xdh@aFnF*ZM z#(ML`dE-GiVKQ>7sf?qy87bJbW1v6t4c#c0R+TzAHuh!iD74$yMg>D?=8!miXMH-f zSunH(w^a6E8Rx$?_2lepBs#UM_#YpdAV4wZ>zWA3JP#*bnI4D|GUCOuv9NUi<)xHG zmuV;M`i=7L!4#L71efab)*rVdQ75bV&Faa$utO!G@w?le+h`<06f{T=0gOLMCX7+H zU>~&a00_usq^?uI24*K*17G~Gf(=*3ft2JSIyK(u>mzW-kH;~<&o@2=Q7H2ZK&3oc zA#@cHJ(#@Jc8QG1Q5BH8iq^)%banMpH^ci75R;GRu}&`DfKmg8c;uv9Vq7ya%ygnj zcnpWj4cY0$q`5AgXI|=PPg+#{Wuh={y^tp&!qyb`K7&WJ$YlEK*S4u*R-Vh70zUkGzh?Ia$r85t6h%1rv&-UbOm<#}+$+rPfV@>!{1R4nCGV1tSH9azC& zs_cP61Iu9YMY{=3LAbihot6RV2IyqietF4I`C;MvB_fDVXwR=gri3c~9A;6%Pav_L zmaUi&c}~S#7$V4`@G$I8Smrsq)ocDX`URNV&?`G3n}cX|JP&u~QQ<1!g`0~m#hZ=X zvQMiMcTzq40NEr!KPwU8tV4Yj^?}Em&)&6vCh8^R#5_1xUVqM!$hBR-F3s zTf$@a3IkwlP}q5dm68k2PRo4{KhijlEGk+#E@{S?$y)5)JH<>+it#a5TBa$;hQkv@ zJSR8Y#tHmTH1lT?GddXB+n{>vWOqu(Q|XSRgGHoyr*Bwck+K7`r2?Whk7Lv8HS!6* zrP*?4XYVl+hw$VAZ`!nV3%C`-mtj#5%=Gybq-Sp$b$7WOzl`c3QiGHNcb3f_ z_LMD+_v>}uy!|8lfs+ywM#$JKh{AkARfRF13`)WX)gxh*uHGK*rsm6<1eGatA_h-Z z`9CfIZGUjYEs$7zVK|GG!PU4pV=avNH(|B?NN<-l+VCY?Qj20e|hyP-}Xim%BFV@eMqjqK(Qb^jTnD@j5R&8;7lO^i}??5 zp^ebzD1w}>ScCADsv4)v&kmDA8)Vu!9`LuFvUq;CW{D!B6!oj8D>a=HOa%KYKEDQL zcB7Oo9-efq*eg}I%;dmNw|;MpIvn_4?D2YQ)ji6BL>>;l37+U*dHeR*N~-rCpLnXT z5>2ia9*O%etQo2t6pYAA=Tp6gc5H8tisxK+yCW$piz+EEfpv}8XDERDc&r7SIapK> z*Fi(M=#@EI9-S|C%_mEqYuNKLP={<7V?ua!+Bxl8C#0N3-1XfI6-&w*m`ove9=Ac+ zB^4`JV8H{&31=0wHM&X3Rnob-eU&oq_3!nRZ9**-9uK)*W#HuD2ig`A-I)XI4)1H>DW_WZ+h@c;$9e`N^D|3j1Y!hzlkF| zJoybGI|tO}sPLxuTO?3SuzB3K;ce>=EbFGdjzi)uvVd0HadfRj!r6G;C9dfgzBA0v zkN^1{$uuZ`3BTxxneRuAe$*!UU;mK3>1-+QfirZNcop7k**y@Nmj|Ez46(OSURhbG zWji~KDr^gZtWPm~{r2tqFxcb9*yqaxvWlb5-%`tncu=ybKNwUPTIh`0N3eMAd|w46 zyPljr7^p)HHM;Ge^Z%phNS~wJdPpg|H$Yapy7QAl1w@p+Vq+N@O=V>QGQIs?7bcl8 zlus)IP%f#>*Unib z3`H^{;ZAzxU)hU{Vw&DM{1nyL)CNV-yIx5AH5SCrPt6V}(2MHatLNB-X)m>97}7@z zvnoB!6qI=Q=5UTIyV`TNe@GvBG8lQ(|EA!?pzEa}7ij?gc&QPLFG4qyA~tr59GWRr8AP_B>GH1UoxbbMbvR6k=Tb` z*Ej^LBHegH`Zq;(Umn3jj6^aEGMm{&Qg*J)u~c&}VDd)m6THA0taUX06lNz&DNUqr zQzi}7kaRqiT@O*3++V&1yfptydQb(CnB3JFS^D?J%YYkiBYv9I=K)Pst2A=6bGCNh z`#y4j($^m}d#pDUd}TtzT0uV4OQSc8&>`nk>0&Tbg7|5HL~IB24X|KdZ^Ar~f2Ko9 zjT5W-5gR@imYWVt&qm9gQknWUhQ>z2H^(6M7P{@K-8Im}i{VBhpK$REDXX`cz1 zg=M|9xAsw}pcUrV*%~B<91}L0$dWY|n+SxIdIg%y`)nN#F8ex0hp|2ovdMi;LlcTO zH4Svn7(h19g$7b>3kqn{+%TSMwH`GIACu%7e3q!duYO^5R^2%#h2RErNPRBNT5@5_bEHUsJ5xE@}MZZav zm?+jtHsfS4ZMm6DW%b6yuf-{1wYwQ?sm@Qn+93YFJec;Nn*`3|@j{&xTb zDqOOlq6l<6!@CmO1h}l|qLr6FWoe$#`$6&KBe#yMkLXNUGm#3A2q_9c;T~rKM z8g&%i=p51Vvj^eZ(ugIDU*Vn)!K6RDpduUt1tW z*xw)Wtg;~lX*>58CE+nA6eLpdnuU9u<%XKWBF3QkX?UB`VJ=b=k+IF z>Z?TA(n^{i(;xc|{;?58rhI&_KB)@LsrG|x*R5WXbFYhjJF0R10{^~H^gbN~i&k z!qn9j!dx)FB9x0_-Fa)uva9Q;5asj1={fIg1$7$-A@9n6%d`6Q8}j!R=Ue5<|8q}o zM`a9^v?p=2Ar#2fq$(@sZE+${@dSi8y z7DR;x@#42*Bn1=t(Mq;Y<=TyCt+ukJ3TT*kt*iOMZii8w7_*Ca_#aa10j;f2v*S{5(B4UtwB)T zJ&;1&?IgEs+k$dv9ZO7(DWy#P=6AaDi@B7r)v%rT3%|fk9TnfvEm{*-oVL*C2nl zHD4FAS#4JjP$qnhCzJ5ET{@-Ej-WacGT{etx;tbqh~|@9ydfp~J10Ao*Aj*s>=;9pA@umGH3W_a zC|WlN6kZSKYu!t`aN)u|75a-Nm5`1!A=|_cgav1W?*||A9bG z;xleH@pW49KVx`L@ZastH_xp|vWtmU4Xm?TZ?EM^z7Zk)IKBM6-J{>g`3s^~Nx4Z0 z?7q)#*{e55+N1A$-rE=+Zg}sFf7?`~f#zbWc6@n|7V)S~gxP`l0`^S(Dp4x~vFAFy zRKV~R({dAe)rrIFowu5Pyq~jllc3FFAQoR5xvfF6QS{c#>wDh6TdP$OJ@@^p&znc~ zk~sSr^vz4NO=^)llhE5+3cCKTE1#70X5pL0V>wj8f9m;w0qsjLTY%Vp`hct{;Tk9Ay27SzHpl znX9C6FKBmJNV57H83%Kc!w-90%t3#imMBg6+L3hr5TjGL|zW^XvT$ zG42hwJ;jE4{e0OI+H`{}DoqreY^&#xPj^~o;22p_ou?cRY^Tee#l?7f^|Zz*XD31G6_HG z3w|g>zqsg@`Zk((0`fEH_Ozqao7?cQ((f&fKUP%IpwpkeZ%@@#e84Ki@(9cjfULJ5 zV*XV)3dZ&uDg!Z~Fsyfs0AQ)i>CqMBgyLXLX^k3>J-@*`h zPXMO6yaq3B$&;SlB;Xw=lPDm)aXs(Z7>Zb5YY5C|Y`Sq4Gz zJ&*(@fd1xtapIv-ub-3rYbo>D)vX|Z&4AXSCWTz{-3E3vlZ&lVM{<8xNZeVMn*f)< zY#LoMbY9Ee=W*!I#=z^{GJgN;=~QTt6r2%qe|v5amy&O;;-&=#16?!KF!@=dCK)*-X0>K~9@dpm{5Ktt9fxlif!*1hu%hZ&4P*9&Hud!ng3qIFvZvCFX^kq*!}e7 zV$X2hatS`;kkF3wJhc-mZ_VcE>til0`1UFojzd>`sd&Hp%C}N+aZ}}}Ve>x*!cA)X zYmd9HNd5@A-heACVrPHT$7Gj)NMoRae1xQpGG}=(YPdW<_YD$K@0Y$3ixf+xyeL{pKcBosD?Q-23Uz6eUi1Bo8 zXA9|`e-QUxQMN>zwCs3sbr=2lr-tXuE_UjxEqlrJ>lg3{y16MKJ;+5Ov&Q8$f%l}+ z7di$Bwg|@A7+Aqbi7`K@ki~$a#c$WnnzsZ0fW*ZFLIADOJ>_6}Y`g0yjUG%3;za%J z2uR$&6({Vbqf}Wr5RwGC#%Ar97Z$yZcsEJXfVN<|ZX^K*kAm$_K4BJKZkh|?UMQ^S zdo+UwT$nFloKR8#1R&$F<>ikwE?Ou1EW=K0K(KD`?)!!I**lEamm@jbefy^>HDyiz z-2vJB{{=Z~_OPX_4lTP=TL7+&$9&OEi%xiWR1lO=Ze74G*U>w1`8&b-+dp+Kt#nF4 zjMr{r4+`7$r^Ef>+s%ueZxg2GN4{?dFqjmyk3_&`ZxJhocTKbj=sse9kb@zY!vy~r ztkpFNR~n&&lw{E{qW)aa_)JCQ7^d;xGFBg#W;uD%x?SSOjzo&^Aa6SS*5}9ciKLdK zZBQ87T_cX|^xjD+_MAlsm0%iYVJ%=kQ(WywNqY8#@AT6IK5vp_Rc*y?f?+KcC)Zx* zO`fh^AlIm0Hnn+@|JJSvtvr&c5KQ^M}G4+R{YTchN#0T0eP{C2 zkM`#uai!jf&}y?Euj07#!KVV{I8M%)u&@6O#zxvm+ zuaT>9Fn5WgULL95$erE(y(n$8#yb81kzXiluN7^_qZ)nWvR;X__E`1}Vz!{$8Y}zR zQ)jn)hZ9?yWGrhU=KMjU%L9Eq)RIEMN8!%Zerqh_GHAh_Uvy`R2gGmyG^MP*e;;Rf# zUVs@#@%6WM5Vd!&C1SM7#BDi5K7VIzFd52LDmVE~9A(i0ZNGaU#zyJ5J!4p0x5TiI z0jwu8Hu}=k#_S`*Q{hGUczM<;1~|1;06X^>IK+hL(__U~5AXcXGV1-$GQLvf;Ah^k z`k}CrqyAZykma#+9NvKqq|(K`QFOLb4nQ|$ko6c!d_*CVEg{Kj7pgo71G%~;Qfb^* z787oVZynu&W^@{1=9|Ub?cDB`_q*MtifbqYK?H7hW<>c~sk2(o^NVlMoR;LjW@{U- z5*1@21IcHz9YCFFJT3sypwgRL71D-J&zNyIK~+kJ=4GW&Fiisy8asHV=pF9a&L z^duMlDVjIz#WP+xo~W=;sl)DdE2VbaE~S?u#+$P&z0P6u%u&`+ZhB|b_frH?7fn~I z(&6?MY7*}JAl)q>U4n%mAs`|#Bu5NJ3QB_@62kx#q+14zkkQ=} z7$M!A+vnoG@AvnI?|%S~$F=i3k5@d8X~EA;ye4wn#o8;M@lFmCDf1A5f_>njS0@r< zQa@H`(wMgiQLN_JMLa~`LNgQxa-C(!d35i7`N9KXHZzJ0GJYdB3x0 zG=&UctVM_?0sEUAtMZ&-A$#n{eew#8^7cFx^5|M&C*2Z}yEb z7eTG%5?VOg?Nzu403hJSDr-x8d9Qp|#XRt53!CN{N@1Tu5W6!Hu60jwhW-|QD>=LU z>U4k{1W=CVPY5YT<~jMF33dLBzGOLzXMjwc1o%6{`{q1q^j;uD(AaYy9Uv%az*9zvyu9?iL}Gj8Codj*&i z)kg0|b%k_1SQ%Flni8SZdtMzlA)rNba79Fzuvzt9jQIO2TPgZ~1cB9d(@76zoWeT% z+144NS}1;YqU=G6I-~uodcMy=!p2!H@Awq9jh+-#7*P{RFO?WQ-#W{gmRo!IBWc(8 z?_-cH)ha_jYurAN0c9H3ukq!Qwiy7Ag=t{093{?2l}lh@BBMf?Mj9+s>1-m!Z50iT zrMX)D`2d_7hBXS(Y=JgbYYu z;A(Q&1MgL0s0)|S5*joMfI}pGKO359wg;_-)-FYnt3EgUB-sHwFIS1@3h@ ztwxj$1OmHn%649CO;#5C$P*$GvW4vqFi5gVdYh{JAjb2ajsc1R^)e*fluNwVjWah{h-ZN0a%d?_=tKT+oum%Fo<`jttZv4sjgHO(VZD%GAVC z)vrQ72I&&*EFBPVW_HG3I%$_MoStOxekGgav#a=me}3)qo!>}7|BRIE%4XX^ap|s| z4j5Q>!mBjiy*90d_hR;Ce)lY@f*55u2-kvx-gGx6RIZ*9POBYbQd6MYvFU+1F$o42 z#YOx|WH;J}eYy^NnVuiw7NvGDN6E5BHIL2|Obg05o5_d*Wun%B2Pa7qFM#dTUo?u; zUh+_LUknd7Sz+gu?v;56P0} zKG5EDVCG_rq_ZGPE~gWnWFaeIvjtUg&j!=!lj$dFp;7@*iv+};B8V<~i7o7etQ$~s zMi;If$Cj!AcO%VDjCHW0n{sc%2m~f6F6O?d7D;~e z=Dc7jh9uM!BYe7hw$%tNa@=i}x{t4YEGGI{Q9tgUnW)C>uccqyeSE!IwKa?D2lpl4 zu@RrkB#iyPPwdmTO}l?Su}AmhP}?qBxpjb=pp1#R&(65o2s6=m3AYe%x-QV9BC~FN zpMww}-@s70dXn|}&!5JM`3alax!7Nm+P+nJa0ZKCV+psm){{iqH0*}*Ve?aUSE}Ff z2JN3D#Tl$*S?W{K`(O(L85=8JF(wx+h3BlD*!+0j2MqMnanDfMfUH{osncrEiTGb- zHNR&MI3ZL|oIOS%Bf<0arYVmq;8Z%zM~5@&35T_gx#`oX-|m6jinMRPB`mPFjK1fi zI5JtgN&o)$YcLYr#fQrx=@{k)eY8J!sczb1?Z*T&wi9X!@MoMoU_cB{_I|F#u z!gugww~0tk?5t7}BFRC{WV_`XxAHPx^iq{z3fOPb?F*`a_IBnm>2S~{jGM4#MG(h= zJ9kivOkqWsc93zDgM=HaD#dZz5KRiUjHKi#6`erGp9&ar_p5{!(?V{hP8Mzn^xxvzJIb zvUYp&dxSn%mE^#ED99gq?OmX{zcOHp?g9?!$A;(xsZGHdsc&ki5<1&t0Z1p$Dn zv_NdF$I^cP2@FpF1bo*?bF+&_qROLtZ4Fk~nWicNAl)g5JCBQ+H3ZbIa8}5Tv7LYy zJzN;1UNnbMw6!;}$nXV0e|LLnwNmf)4zmC*l;X|TnxsAZo%?3?q%{8tV_Kgii4gx9 z4}~97_oX|A<~g?;i(38?3;Dg_7yfNV zDtz#}qv`^!OJqRuUy>Vp@052rFRJk#N3=_t)y@N?jdzH{mf+fdDc?fx|3<9 zNW*iwJyo5&ahIYJp|;3I6d+GMN5}|AN>vf_F~J#I8NlQO!j$Ave&h!4WWG_ z5`42&pZxAepng4Z)xWDs7g%p zmVUh`V08>d?31jHSTa`l2=oPEj}U+Nw*aQuutuUb<2Le@-Fwm3RKB092=^z0aWl*h z&X@?1x%Y$Ts+80QeYArml}k^jM`a3QI#UiPCQ1|q6r>drBjqaBIM%ROl!0-q6LUPH z5yhjmw)*YdXRPm3;;6ADJb06i!&alIm%hW@)HppcV)9y~tNWNB4LIeuUGGQn73uG) z@`rSKnWvA$iE;LS=3V`bl7u|mUWfgA!j%!hZ;II*6jsB9xeusJvUc3B4fxL`hOL6| z@6^N(ddq~NW?N?#ir(OQv>MtEkory?CTS6L0gyls3mm&;9lL_JWdEOL*cyW&3^sVL zua@H@@#O4;YjDoN!z%829az(R4qfZQF-#JIn;?VwDmL$MV8#*gd(z)j=o!Er!N&`k z#5ei-3ZGSqqnWn?PmPYh7r|rBwlrK%p*Fw5 z=SSzKH07-onwPNNpOxEXRFmC589p|)o($O_ha0imYBc%b1kuARrX@6gx#@<($08O3 z7D@qaAOq0FEOTSU+|i(5@3I4JbI?;WL#1gTTtG_BIE4d4dvaX2id$;u?~RQ)aG@Tftm|BRqck0jAe z_aUzj7l9Q6?7(WZ7bwCCqXnH%x}tBHqXbq^BI>XyauI;rNitj)ZPghf(rG57xxX?^ z7&&Zv$`d|ZO~tHd>AxWbIW7#Qpx_NFC~lavfasexiSM>mc2+|3zGOoOM3(E=qgc(AA>69t9jx26V9{fxpxK+{Zl6Crg!|H z`OV9!SL}AvXRj{?UHki9>-9B-i_eD+dI3J@TX?+?ez3?T3i-<(CJF47`Av^b&!5E> z#tMzIeDLa;+xkHD%PX<~k{Tkkwsf*`Ss%MImEv#K>*y}QlJ1CMqicOa&Qyq( zO53tY+r1|Z8eGsCH>B9{^=k*Y0778nC|oFU7< z*Wi~XednFxkH*Kz!ST3m(@QOiS;jS^L&TnB7owUFK3JtJtFn}x!G_!`SMq(yoB%?6 z4<(~Z0obSQOw88C{eVL)aU=_37j;!ybIE)|YppPQ3|`3~EB4K0E_pzwJ+atT-2=i z`k0L3MNY?o*gSOwMiubnjG@CM2QStrTc~!SN&}|$O;Rph-pTL1ztC+fnI=bGr7@^| zTrdTV(#?(jnneGI_;^MU8)0F^R0D_(EyD~K1BOtWJmV5g!5>S8QfM4Y1E3y9W8lwN zL4+uIX)9WGK! zE$?cC(l=6elFD$qas!60haA-5aCMV=wNrxEy#(r3cCHty+xDVLvZEtO?@khbI}}5; z>i(K|B13mnDzf<@e2Aya+XgjJtuQB3CwFcu&Vp`oVYutj%{V3&6QI@_DnS;W(_?1i zI4&uo4!Wb38SB=!6J`0~@*f#olGqahOBvAF&OA@FsoV?4U%SO=iwMQ3^ixGv0tVMK z5PkXS1QthJji+27%HE@H66D?kkEuF?I5`@^daAOOMzAx=M&Rc=>!fy&vyXRJ+erh+ zvK~E-TVODzeYh}=e%0I#@eTF>1t1z}LXEN}BF=$I;uP8g&4#1Z?rvCMv^Kcuujr$L zMqdU=U?f=j6IEa0eS1#U-mC!8F&U4*`4dC-K!6Y{kX&<6Q_Zok-sMweBNvn;%BJdU z6bSeU^XwwNk4#3(XIMUNJD#y_Ai$u3tDp-etA4>_T2#)aqt7XO8ynv#Cq?MhSgmvh zmtgP8jfBagpEjU2*7c!ZUQR=sAS-H-vdC@1S3Wt+S?>M^0B--_6N13RZ-d@ewa0J+ z7#{qg3}is8y~Gw#|5D<^h$hrJx(RIu6j64QkmuhNUqs|hC1(7JjkGo2D{M^O6>Ga* zy8`TTHbar$*=KJn0ZNKk{iJ&{v!51D>kcQKdhkru{bM(8%rMg(w`R9$BC=6T#FtRk zWM%m2LZVDGv!&M%)uwm)KIM~tqXreay#Ly;ACMqI*lW}sWabqLt*RoU_D}a8q#fvJ zJcctTJvV2(@*XE9OcrcirG+3g`{CcdHF7HJ72={l-y11^@r3~sR&OOQaoa=XJ#lJJ zta$N;ItfVwcOp1?i!M_H9?ESs6Jzx|w|?(vobzQIjp3@hD-4R|u(|b`Gya)ZKC*t! zSEZ2uc^_R@h7m7oiat;zdGyA)wHnLla|~~oQBc-8Z@a=(>+&7#u+9`oUIH_JI4TmO zvnS0Uw-!>8G0D$o@QExDyC9&JX}Kv&E24n(Fx3P?M_2w4b)@c@fta^$BbM3A)?+cn zXMFrId@Jxzx0g44NC*!cbb4dp2xn~{(6x9r^!jw@8qr@x`sYAGBh+>CRMgrD2pZa0 z%U~h8J7r|=JlGap$il#lKqHZnQ8?XRnmQ=|iQj!M$Js)f!Z-#rfI;PMJRK?SJgQ6} zdAjv?ECVR_p(<{XW!1uR%T+okVRWtOKw_sGkV4qH{0bqww{DzNa&MZEDK2jL?kzHN zk%JbG!w3RGat9$~qMEeQ74<;Y1=>89L{{||ih3*8i+5NIo8SN$m|H70d9!gsBAus? zwN5MV2Ys=0WTe*k&a0s?U@7F_M;tBlGgYN);%y)~Du>Rbcvx<2`R%aG#aOfNhgy)kPYPzeF9|6q}tk0n-`J zQiew?vr1%h@B@a6u+oGbM4%&vzsRbsJ@Dc*%}E6_BTI_c8&uW!&%F8m;lEq}|A&ZI z3xOTy#i;Km23cAu22OK;;9>DH?rzeDJrLnd)ct^Kp#-~j!WiY+@zz~=-iq0MOKxW6 zLcg(@{JHN!pEy2<2x?M3?vAR8#n?Z+_ZjLYu#GIb_`H{sYCgajRIe!QF*P_Iy4Q9; z*NcUI8e8P>{aH$_%@88P2Yz=Yz;OJo&&1>EbGqUTR)6=S-c}`w#`9S3{j>VAv&0C{ ze))5A_FEGiVr^FhD=BoV_gV(?J+xy*DA{BW)V%>6Z|~V|$eP5!5AdZv^vGjI4-|vY zF08l57*-h;QHOdzF(Pf6MkBMx zm!Oibf7l=pvM+Sw^jnrnEZ?ECV)1w&KrW7TqegX@Y1MXE`L!QA^AJ?;uO_Wf%5wO2 zzm$EDWX~%d|5H%bMbGN%#j6{qp$DA~3a4CfCb~dSz0{)UjW1+V6LEgk{aJRrLdM7n z?(D1$vCWb(;tMti!zr^D^vH{yKnFRI>!xkGdpD1pcZQv2lr9wn!g-dxMQcHyY$14oSib3N;XlY&sg%L}=z{C&oR<@6CTv+|q3s}T%58I80nBv*E< zXd{%&wzmQs9zVtUY;|O+u}&UQq|42lS5Q3mkK43SnRu{0a{hGfRqKgfO~1@d)0+YL zvJ5_dlBw5?t`YxXIXrEVhKAtgh=dR^3Al8ib##hX`5>8__hu6Ib-j0dAYaGdz;bnq_PH}>Ai z&tRgc4eeomQ-=6s*E~583+E3myqkp#lX*V}-zn{ZfmOD!iw5~*>V~MmETc%k=>gD3 zcSQYIL4uyF$+^(*{bV2;6746*xeE8iRzb~Fo$8MYxg({ne_wto{YPcVj4CR8ei-DRvcBJ8yOYK3>ZfLst7N0-3zYb1&K&}5 z*tqEy-j+r-bRKIi(48`vYD9A=O)@bj_;lLm9W4X0wIZ;Fz#Whgmc#==1hLoFx}gTA z{@VZM)dqxP{*B;_G|h#JL2aQ43sj#_6>lEtj}qZA{7pd}RT@_gBgFmB(|y!|DpK7h z-c&wZ#&exBaj5Ps&2h2tB!TFCsyEMCN~<0II8rE!fu`toY~^$LJEt>%2YRFS7UbB6 z@7YUgPW^VJ6YJbM|tsX!Ud~`Axrs$@6UJtep`ljy}Zvk0eq~H=KekjEyLmwREe4l zFJB`Z8O-WrAG?yf>AuabaBDnsuO315>Y>QlS4QPT(1(vJN*m}e!>%JfX94j$W|ZUi zzpriH>MD-6gW=yjH0%EA`5oE8#pTrPLk(I-?Wr0oZh_-=V5kq~S-(1#$~ENr1uc|7 zR7MZ8rRlrW{6Rvh8Ahu_s&A{6=(~DV=!mOld+uDeuI+$ud>hCb==8T8VxI!Pj7_r5f02tA0E`pvP?H6Nb2uatvY=Q96fb zFuj6uE8|8D`&9RdS3gN-Tg~#*oaY!#1XA?p^|?_u|G=&Y%C-SubsELC?a(THl6}Mz zRxj=+6H8iHm3S%5_R$*?DNa#FfDr5%N2%4mvIH3U?H1K#{g*mL_z@GkTo#{kv+J>)LzjyLtv970e=`Zz2`#AoMhCbrx(|Ww3@rgA#{2cbj zwr0$NHe&z!F)|+WLk3u7uOIS|mH={?M(r0;(&k2i3Q|j8_ZW6ruHANf!V z!4_e)o744m!KvihRBlVkU2J2p8X~W|LciCpZU6RGH9P#RP5>OPWWe&A?mp-dGq7KB z1jSE2PNoVaQEUwUJ?epUH?dqxpbOwF182)2jn76b5~zdrgj%mMjLHte^REf;TdiD7 z%^2KWP$0$s;Mm=#;1ZZVWO~<6w_Jb-P*qCcU$%v93>~g(rI$n>po4NF(R!b%c*}?| z6$AXD)Y(R*O3zg)mF|4HgLjL*!RMqHDzuI149vcnJ>$o$42U=Jr}#d?xe>Ft zo%ZQ0(tU`0wRg$^$}u05&vex1H6*IT(!-iC7N>mL4#P`S5js>~$s`5macDlNhm zIBogbtWFh4X_9ZWfbX=awiN;QN#6ozO95N7I*35`%P|->^krp>{l5rQ-GAzIte;$L z3oD7`=|%5lQoj*gzxTyN@fOdW#a6qc*sxX}o(6>W%>dDEL%x}}G2{_{OCM)8ul;&X zpTaQqcuW3Sovd)Vvakd$=%VcD*`QJ{`Yo;}lcjorXg-5@XW&>;R;zf*90q1PDM z>pUg(aPXqpt@3C2yg8}9e4&#z&z*v%+E&uT`xHRuv8z+*VBGh)pLhM2DNXD07mjp?GAIm%jqhoH}n3)f3~`Xn@) zDTN-?nQ0j`C-<@{)!Ps2*)Out;yRc2{gwPr#tVPfX>8 z$iB!aITH3}h)$FX{Ab8@U5nGff3m&zb8i*jVGiAdvbHWAhVD2glg{Dn85$bc2ODDi z7O_t@cx8hKrWdpXP0S>~foZyp>YUzgwlS@)f%L$hiU2M88F-74V;9yxbSN|BnY2Q8 z8IS&HQ9Jn4p}X_|dAp7A6qH2(!dG`>^mQ4>jB>VBfagM^mf|s#hJoqprLBG0@9B`x z10|>9B@@2 z{|L+MzjrMICB}qAL|r?52t7`=u;Q+eTMTB(g175@WUs`5y(oOFz{f`&+tyDbkbk&q zDwcq}Nu?ezXXN8Kp7aqK_-Y&sY3@i3#mMrR4W>(ultm66)?t zLlbd9D}|Nz7iG)2zVo~U&o$5eu`b)x)J+eLR(kYOpQ04{G^aEweTc7Q+YHi{`<$!mjIi zO9#i&<9aBjv(WVGQ7o6n^T@#IpU|eS;TfZuW%oJ-KtRO=t0T^nc&%%7$yc7kHJ_LO z&PRx#>2dXdFr>ciO)5mxwG&NJHR)S)NzF(?M0*=LX5Z-uF{>hpCprKdtn|Gi$5F=5 zeMIX<6Pr~3t>IIAx--0mtu9WhJHL$9UPjt8`iS6ao{(}`5zC2DSy0~-E|qxNV=Cgs zkIoP_LuIPt0^&C=HGw!Y0{()=*?xNaH4l$`clS1R^Ngx5Ygu}pJ+)CMsxNa|z6zT< z>kF+I>+^G1Gf5=IV^Q-%OTHGMB zl2!fMm9Ax(c1i*s&xKJ^zieRe*8rnrv!hOE zikaz!cLn{anHL%|1~Rpp*F`Lyckj(CPn73fg79CSGM>uYXNv>@57S+s`t#}4bx;uN zMwp8zqDdQ6Gp=iH zg~3c#>h_(b-{0)C)UJqGqU~r8IE_AfwS?Ydp5Bed4Jtpm-tPEZZLo&K1NxG5MMX7p z9Gd7Bu-o%QEN$2I$F2Dkubt^LZ-r{o5cm2SD~97GlF!soPc>`UgEQRVW#h~xE}m_u zU4)71;p2vH!C}1q-g0H$Iu9E%m_Fo`f9V+&j-fHs_}kPxiBDNEy4#VO!L##SLfE29 z=I2gSa8zMk_>21DoAF6lvM5z!{CCqS#juw#6N08Qca!YPztD8*{*|ttmH{4?k8Wx<`l2SyqT>iDVnr0ODuXRnG< zwUg)*hd|E3YUKTn+)VVW#Wt!uZd8%&?%9kb6gbLPEI@LWg1_et;uxf(prX_VRu!;j zJTnKPea-WbOoS;SV3$aPY{A1hTj&fcH-2Il1iEpS_#{^SW)L+sqDfVF7vsL$Ef(wz zl8dI=#*=-U6YG+@MYd<1B(wW5PUsu|n{KD#`p26!^R%|~_wWs&4qV?iR;jy!_v%dW zvA$jF?#f{I^!f^e!?&{{Ck@Cx)Dq!#Q_$-5cq76$x_%633itxNngytwgYiJmEA97FJy6H|2 zX{syZJQhi!{){j1Ck7Sw*<^cS-)op)>t2d};(R?eL<*FI5-;Op`u1uwf^-0d zqL`UcjFf9@|II1s{5%jajA;UmQC&1;y>(&szf8T=0x=T0}aqQBNifHUKE2vM?yXdWnB5- zU9aZ){B6z&P<`rsz5q1vIN^UTG72LulTnWfk>=ue+x!W#Ta3jQ*RQS9?k_b^tYggg z$m)6LCUl<$;J8a(131Alpu_o3RD3a#l$NLl^bX{%cEMXk1_Qqb{Y99tK4Xce{6;KJ zqye60q5^S(4V*DMAVUyb@d5ZJNJ90R^}Bh4OFKYX(Qrc%iw5=$pFut&>Yd|2=?hWY z!wdC*v-x-LA>`3SU&Q_D*$J0O@9dP!zE2(x$QEJ_PP*T^o{=uirY)cE^`)A-*8WzN zVGU_`$0De6{44=fDy^tOQPU{)7b>@HR`@ci0jx^)nn-e`d~`1hPeGhFb@HtTaSno> zhDn)#C(Zkf%u9MTbI{{qfoQ?Ap+F`^QBL_YhSLmtCT2I+)3;JQ*;d$-!QdRBYEAG$ zx>K0_&+-Q(H3H7ch?9kI`v8pf@1ptReZ6#}^rwb_LwSSke5cYFlDWtCfOKU8UrWti z9fi@sCyw4s-MVHyLA$z?+Q*_qFMfX65;J_Tv`=%z#dP2paqlWurq~Vu1L^X-V7z6U z{BR01&eE6K5~LCIbp|NLK7QHr$^NwS!xKx#=u%P|7Q5Z|!Hn~3>l5V$C(A9-_1=mV zV{9`~-Ch3j`1?S*R8^+oW8(2y z8j=30cInbC`ZWPnWW(mm6boP`qM&UUNe0mX#VyySc;7|0>fav2eix8aaP~sz26!fe zjEQ8NIBddr9psHuLQq1_4?xnfZyjV#xabxrY{P)21al~;IXwxwR_|P2 z2=-L9RDJY1(1QWZ)Q(Xc&q#NFvl*~iJsO%Wk6sQgnHiSwvJQT6ef9y()mBDMu1JLw zQk{r-5v11HD->bK>eY~8rhJ-ouFLv9<>D8io1)uU%Bof`*x?w>kJijHcUAkELd_&L$he#O@)L;oT=L{*9-r1urS7CqK3`EhO2+(5_1|oxAYT#y_Dt?4asc98e>0 ze$O0(!Q)n#x2FZvh$HwU_&i#pK1l~+BN>^dEwfzI+eE09Kz}Rly2!cyk+pRT8Ayns zbno91tKJgJdLjB7<~M5QU{9Ie=ha(|uK=Dh8ZjrO-+b{&)&IC)q0KNO4q!_l+YodG zh z_~6bu(GM(I@H0_RWly66FihKft2uj;+ef9B~omM~Hur zh;nDq$o?%*d1w&?DX!L_`voDE zGtGO1+cGrW-fV5`Y6JqXz*Tx4?9vU39?+^_IY9ZGSOhh(9-SWqEY% zc=3*wOpi!0(z;^h>oMaYJdIN+Epf?M76EKbP70?CQiXTz#cEiyu zef-+avSGI2a|GLFPFn-76*q}inWj(U%29i(xB1lT* zcAerjGHi~l&tWT=a6`?;_q$_4(A0!VKL7Jx8of-vz~-SRYr3Z!wdSGx*vw6=v;c=2 zfz6qhh0UTZOry)LwbTF-hn(cE`K3M+?^Jv%OSa5^H6+#UVbuyKxrgE&TBc zd#$yJ=kPE4QqD7o`;!_RE)vwBD$axM?dh$t@|qI=X$U8@3bx7QGem&Kl%D!DACDaw zOjig@%UE#H9bdGSm!kso8LYn;%f=>edf6plpNt8;>qty{U~1%GY0QPGY`-(O_t%mq zT3|0U@QZq+ZjL<5Lke`MkE}wrIGH%d$z2pN&T-*xv9`vOrt%N;zwgvv_|;PALSRDM zy+dk&s`M1Eh!nYTRF1+`O1K4=qo3S0y~LBl|b7`v=jI9b)G+G4ORY{r8C!I#I-6e6R4U6sL6(9??Y z2B}K!zEpCQ<20r)df59O48qLGW~7TQdnzsJPb4@1bwc6~pPm>deH9C)4?w%;0`2osoyIEv>Sj)gZsp zF;a#4(l-&+Gln|pYF|j-`;%@XmyUubitO9i(8qu(-Cd(W9?-_4w#0Zk!@_NU#g>C7 zg!uCjvx8~t#mjGYX`6T6l9LwJi(7c1x72+8zzG*e1{#!`WK6bVc+gJAodGHUIQD{? zIZ`e7^XMljr|8)fDU;HZC4~ekVE|k!abGW1^G>o;g?Z7n)2mQb9yh#(vVELylR~w#+{(uN-L|qq-_eZ8p*@c?PVho^92=9I!W!xp1 zaZT-2sFn@#B(OcCO&R*i(#m+{PSWf_+@6Zp>(u^tm%_kFM*Oe~?nV#}SPMf=40pZa zh?Nj3{1x^MjvVhLG3DtCkP|yy1=I-jQ0`hmCgpK@^oVM8A!%UUUFDtB=T(XpOH4Bh zjfOv`8Nj`@RjTrt?6Ez}R?;?ejk@WWZ!&_(nB;0^e0{W3rm7Wea*3bT ziwfwy)L8JW&hoRknxfgW>-UFsHD~P4en`4<5;eo6E4xY#j{vnomi+5}eBjH|b@b%B zem&lh{1hO$e=4~MLoO#(3;Ygp7IAa)@VRVXQ`AHv-SlegH?DZgDM2T=v zwS@V!Mj($ak$3tdFYEQ99Hu2}9`aU}V~Ohu8o**Xs~se1X=KS39|XKqh$j2E^eJpi zVLQsGdA~dsWgU-(U&+?Uk|Qn23^0$(ie9czVRyB;d5>K`Lv~;xO1|d^g_c1xA6%BH zKJ^orLrzt%x`>j{C|yI}YiD`r`EIO_G;B zV=yM@XmhIPIJN3RQU=ba6Z$?s(w`Hs6=W(aZ0Y7@6RbpytrdBZ(FYnHHu5P=p=9YB zOzC0^a}6QEp*D@%{8{~z=;N$gW{Ur_6&{{(>i^>~^45ECb~XdSgK$@*TQy&$}jNt4g2;l74Do#?^QJ^X2fo(voxG#m4o# zmTK%@5!VlgJ*4=r_Ts2}j0Dp>FN(q%TiC^d&`uD+X7_oA-bQ9I!Kb7Bgpuc~^v_5- znux!f*6lOWErAz|Zye4yGsX8(49zzSpU=pYFa0L5cd&YX(^WyY1f9BeLR$w&x(i{C zmF2ct)mHpm?@g?i+9wH|JI(x7XwdPb4gV{$Dd6amdTxlki=A)(;&^EXyMB3^F>r@( zN<=t5!eH+mxm#wcC=slu9xtH1%MX17z&1>Nt^X9fL35UbbQBIyb(fRE6=qi=+EN&8>OgQLkn zr|XbcUz}m>n~ij*oxGrUGK9(P{-uww&L?mEucOz2IY4Z-e1mQ0q?5(QnDfSS&xEM_ z_?CTe-5<#|gQVEU$H+lEXt~g}5#7$Pwbzy?d3++AN0Qy}L~pPqv!CToeZ_$J%aJ=R z4d=PF!v+U*wo>tQ)_4J(kduccMiq&XM}Mk~4%PA6ok!wue8IMi~3BdDtQ2 zA!mtEAak5(XES+l=_HG*nD9>KMjB~Eq|o(kQ`czZ$JgN-$K7uzui^;gGCe~@|2_Ub zv_Lrvi7xNu5#mSIAk}dTRgt|b(+OK*dPlP2Yf0j1D#|ZVxjwGCAwkF+zS~^eoPu<{ zPJnrOB>j4Erhn<3+KPw$=i#EI0#^@bj&J^?&V}{19$(aNt`qclW*?H{r@XG*^@tdA zTIQVoW$w1Z4Bt7X(`%V8sP4fvD7`TgletZmr(w5Q^J?CpU|v0voSs~Om+0FOZ{Hf! zn}?h5Ag=-HjqIX2I%GGw=~|~-(|;7&*stFs=#JI6%m*@aCU>;T=s9goCN9%cpJsVK z@zU#aTCKeD{vB}WCIPm^-)Lp-6PKllZ|8=|rh2q1t zj=<%hB0jKI3^^etRgsGw3P*_+j`2?)qM@k8w4@W@nvDlIrMixejwec=zxan=5I2BE zz<*WqfCpZh18cJ`VOdK>ykBLii>>cMW*XL#@g8LzsoEea4)TP|r7^Nt$9)E2XXW1Q zfPEn>;Ch4#th7vtM_&^0{ye^&^^9>fYlA{2lS5qPVA|*7rcSq&rI3y)Bn*SMA#0FXbMz2jvL7*2!8jCReBq3w6Hrrj$?;{{4?72w;`wX95Z=St4{$OwtE8VI<)`Hji zqe$DG+_Rgi!{D1gUD}Y4=S6e(_1GQ0OtOfs`nG~Is_W(vgHse{vE1n4@7RWfHuF*b z2;!FA?DUJ2w9bT|GG=UX3WQ=ybpopV?bXcrL~0E6Hk9`kN6cHl>3z30vh#7n9W^6%LDQq21uv-5DL}Il;e_ue1kb|!=9noJ zUjmOoF)pTJU2964uMG737a2dYwp9g{cY4XXk-$=9QZC!4pzO;@mL|Rl1bS-30g^*- z;Ck|qfv*>fm+EM&=(4M~IpU1gGCReiNfD2P1W{61=dj}PXl;_qVdn(24ha)gMw4@6 zjQeMD$bY+nRi?||Ku=yn<&3?Gt22meNc!>5%EC^nT&QHvFe-R%pb#%{paVCC*8Wl1 z5PPK%&HGU>y`2*1dywnu+97&FsXXala=_wF$hzzOj6WIIC7+t z5v!l{nmDvQ=RKtu$`mpyYmIJXdMGCRkQC35@D$iA1LZ-8(tcysV5ncCXe;b&OQob{ z>OBawvdZ#9^5}viD5GtdB;Rat(E&e?0;-&(dj>%E} z5Z~rkG+)b*7wZo08>d+juEYwtuvTn28{CjSBUFk*!;BvUX!3p)Ab#LY^Ct zSU;?M)uZy>a+9yKM?>CN-;V(4ui>gHFCB%ulcYJOgc8rjn?hczXZ-Ztb?}*_Z$1fP z#Qiti0ID8KG(nM<{#RW>DtV(K+F+yp?;~a9?GU@!+Sqq^bj`JTz&5@ zHU;t;sP%AQ%w>T-K#lEqUx0~Qks=-21Me5mCu0ncudE#jA)?gFNRm(P;?-%6TI0bMUf04UvXJ0Dlh4+nhjgZ!3VC<_=ICK8bOS^y?=w z)M;~yoi8|o5ZAz_vwsrhixQqhr(E(9eSxF1yS`7;Ze^;jI!X<#M7wNMHeeWe1$_}N z*2Ut$Cxot*8jJ`ZAj z+!{T0c08s>CH*tn>(0&nsT)PtL`9&ti3m|OijV5DwoV!ioH8=B5^$SFW8HYu4l1r@ zr1Botqq?E;f_2F~2<@xQ<|w=vJ^?=Sp$fO}%*u>%l&P8s2>SXmSZB$?oNKE0PP}dU zDZfRRE1|`Rfu8bgAuI{v{x`ESXDdFWtZzmredjmE{sw>=+}CZ*oYC1OnFf0?k{^d3 zLH)h??PeDuf0|!O5)n+%5v&gKX)G~*J+h}Gn(R?4d^Gqi zp*r8$6wC;+(($vamLK*YLKmjW;~?4+0IXsD2gS0{L7ly=0d zgT+i&&)w>B-$@qGP$UK2cvQtr$^&>V4biMJy$FfbyxU_S7b?$|`BY^uV0+JE*&Xhg zU;?M^qUZrI#nmw$W&hmfw7FRY+j(It+Xnju6jSy(#-oED13auA+0wuZKiiKaq7Li# zHS~eL+1gkiVoy^2OEo_UektuJJ9XOKP_(ey99qwR2_iTm+a*751c1;B86Lf2 zLk*%0Z~C}DbpcsYg9?^51%G74$r6;h+3#@OF*l`S=LpO|L%V(cZ=^oQMQ7Z;kJz7!zWti{a5wjd{k4 z_wxHxT@&g~9i^C)0wr|7_MA)8LDvg-OL&9T83fP0D1c1)tI=FwtHn_Ok0$)h%awfQ zDS23V){7l=#w@m4R|j%)ofK*u``Fb%mWU>LJ zctlG$nA27iD06gCQx3A_d>|ZB=fmfBpSKt8Izam5Dg(kPtexqA^(@CXJ=;@B#MxxS zFYt(^qplGkY6|K^=uG?fL-H=e+WG37TQC9ZtOFjI%9MqSaVCY43*lbyI@u)S3-;mw zMKMeqrwG*zVM#YqH*jQ!&-qe~Dy+5PkZFY!GGh-n6A3i;k#<*I-3O)Nl$#MCRmehK zH;7Z&W!Vum1|HCm0TIoP^yOu~#fws9$Gla}4l4C&jDmHg>bm#tJ!I%{nE4#0(zhKj zIlkuOQ}g3V)rB@%6m^hh*d%NeGZ)`g>&SY#Xy%Z~AE$KqF*ryrGJZm&ZbfHROC4SC z@a+M9xR;gDwa^*4GL**}D!wVgWc#MiMjv!4kx7QM*sJr|l8#UzFZrkMd9s9rMkAPz zL&WETSC|+KU(_lG`JYs86ELo)2CMb&S6*HsIf1n~4xM>f+)$=l^bMRwfvnsS{tz4i zpioH8XGuBRDz&*rl8Z96+O&p!enx9rZ(QWS=dvnx0sr4sn*Lw7DZgMHmGAq1T)kC5 z)bH~)yfl&vNY_%*DJ5OfAR#K`z-Sr0Y)rq-YXD8Pa)T--QJcFI`gJS;Joo0BA~hrD_GGAnb-}M zs4Kzhtx;Xgcd4Y)o$fZ@D=Sv^Dy=mdUiVl5IP?vK(=Xm*!6@gpE(QsJXU*U~XSDRj z1vN}J7CLX)H5lt7Tzz}7yGyByAGCD;`yKwo0JS{AmYC*VP$x>O??m=)&Ab5w9>Rznr7YwlcMr|tAOkiZg=jl7NvIVQ^k6(K z-CqQ-r%D3MQZ~#nR(FKQ#KZ2kakV`5kuHDy`SNk#yu}G}YDl9{39U!NO43^MOREeQ z>bS($UK2-LT${s0&lg|ok92(NRU0-?f!z)TJbJM&kziXS9OT-!ZQ5&XimsogM#ym^ zSe~-TBGbHwfbrj0>W%<0#~arni#vJmJxNU?oQn@LR4 z`0GD8(9{5X<%-f{4>)26D5r9DL|JTxIKN&}sx)X(UQROz^>M;2|5%xwMugTCaQP71 zvI6c{1-K^3MC>~6-A?3W?CxY({NevC1V1U3aV-g-y&irFF>Nt`R^ddPTWsyn{+Qsh zO!9Ag)QRb8aAAH1bZ02ITLkcOcg^?P1_MhY zOrHQij-8}pc4I}MuO47V===x(9zIpeW=U@yji&m)W>ZdaFq%d80$}a&BjF{bq1W z42pt>K&v24N`Uv>RpJje3pmecQkef)Rz`~mqI%U-qAcq2o<$4i28zrFI=zW2NU6g< zf?ArIh}cPpJOBCys`fBIG)XO;4K+c%Md~i^^-(F6#=O%s7B@$nN6IL3XU_4kM$70uC!4r%FV{u8k+0%ufWjhV=d5IjE!N2iEatBWKtN z9QIBOPUz_TRSRmNpieAQXBldNePA>;hJN+|h@EdSRR4>6fxOE7* zY2rIbge(RDmO9MOCxhmjn|kkq|HlPb_C`%~ZZj4lnVvfvk~Lk^X~5G5o8FG)N~_4= z6}c^k74WCKxM&1{_{x-JuRwHHrNh6#zJX?r!n)o22QARa-8c)Q9h#W}s~%>5Fg)Np7hSn88w=H? zs;m@cd)v#4CEr_vq~Ri~CUg~RfA3^swi(zTuP!XW7%EFQA}ZEai&O9x`SiieK{6L> zxt4|hK6E-GM{w`5J$N~VSTW<6=FQrsf8!BNkA{Sg_$?+gRHEQ*hQFRSlv2B`mWzLD zX#$scG(2Xmm1eokrP5g!0+H@E1#jUYbc%huv2PHnw$xRg=8POXk*5m;4wK$?87 z^7ADg2%US;F>`bi4OtNQ3dt7N(~IJrIRCo}bAmJzHrOp$HM1a80*26$ME#F<7b@W< z{^D^+?HI+NPm=|XOjF-hUK!!}qjNfo+$tnuo;a>zI#8deODP~dw2c-ce?h!`7e{~E zTjN}l;`aH^yZ8BSC5#H~?pbC5aDF{FpjlN;wcj2sVlO_?1E}lxx$A(P3ExdBmjcE@i@)Kw3Ce**r*&r(Dgz%e#wP%w0SM%T`3f%0{O74d(@)Ib0H zC!=181om1az@HKx;}b(1D_resD)oUgs=q9Dz)Z{Wy_=mQJr&`LkR@_GW1U9$(<;=g z+zZwV6D#lEPk#@s6#LU;bhr3PAjj~SwQNIRZSi#g+(WrO1Y@%jJLWI%1W`nE7AK+`Jn5i$^y~3lgUi(*FMM zP|*;1ZVw30#^GK*Hyd_Os{4M%0o=%zemW8uRv(E!tr0B$s zvNdeQJ{TYtAn%L)D4tVrqHRsT*JA&}zoXo>Fk}1oS9zs{=J#T6m9e>-tAIYWBDxUT zE}EwZ@b`Ky749j_hxmR5W@QH)W$=D6`Mv{yV{ry?Z855J_7Dpg}M!PThAu5dFc>OvWJ3p=<)Ap z8>%fxD2b?LsPvPW{YpVQ@nI z9v(s<4Jn)C%Bri9iRm<3#FGWUEsV0;3E8@&%H1~*6JcX~g8ig?-FC+^-C~n-A;H8( zTzC>j16p#L`5>oQ-)pus(O4@e%4C6qF<6o%J+WEfAKdvSC}XgNcR+=+aZmavge7S} zbNQ6I3Up}L=GUSStc9w>Wx>5-+vqCsV)Z5NVfyx34vQ2g;Ff)ciiiMvC$vYuF%Dh- z%1E{wEBDI$F}qfHOPGs#wQU~oY!6mHV0dAdT5~6#iWmx;lT7Hb$zokdZ4KKIr>X_L zzBdwc_5aB3n{q9BG4xvHG8AYcN8e8k3xys{^cv?>Y-?f-UJ}aSy)-wJ`h=t{4~fI> zOb(Wino!c3F+3@$7~@s=6BLLIKs=e32?ir?T=z@&y;e@1$Q*qFGG6q-Q!b}hd|I2E z^%8ruf0=|h3^B8^5+IAMj{%S6m(})wz}v7vto!hZSGx5!xpZxJ7nA^H&_6WI8!m_L~e_C-0 z(H5LRGLb5&rLorB#$R|Nw@g%I@N$0k*Av-g5q6DiP+u7NU|=hbKma$SXNalODyVcB z9bN*sHNwTJC2tBv=@&-akjHY!D=X{H-f9n=ce0s(xPhIk{z2!^5q&UcHN!0TzMkI5 zz&%t)ZOWRzxYr@m73Sxe&RjCq8w&z|XPHv@`v$}H$hvT_GUj_~08ibC@zf5)%*iyO za+pyXy(;h)kvizi8m$lhqV*!kD?nL(QepX*DVptKqdNE{1QHjIo`<-J*!N*EkiIR| zcwQ{X5@8K-0&RNq>({S|adD8t@0?%>u7DxVu?0Jx>RZQ1Eay+JXC5)Eh8BDeF5Fum zToJoP`=E(wv$bCc%s+pguITLnO|N*Y#L-C0wAi4FNP#kmw-eTC+w0+2J$G_)JUlxa zfh}NF-oCirR^KjcfwAkOg|}U2LoaWTKf~!@8>wiePXI9u(gEjGI^aY^==J2& zvK*}U+gkI?3j9F=)&^t*uM@>0gujgYEp9!{Mk8?{PF1Pjl-vpsP`Jg=$-xK8Gl<<> z;Y1FLWTIZR;L;Ef@PYP$xzFs8p38uXBq|4i4Fvqe>KP4$5Phvaq3vp!lrM#@I~?H zixO7PEIHrM7QWP;{Dzxq9dzryaLD^ZUtsSk6~U?FiL(K6Zvfv}@nDBhSk6te=#s4lRB7FwB(d>*}e+jLd8Ght9KH---PTc1Aut|RBalp*rIQJ1ig zK<#thjzs=rz#B#yqo0+M=%=kz;u<9ZQGb;nL5Uqklep-hiXRXe3@f~#)LXzpF<6w_ zzwE|=@ll1gxAsJCyI}4SFZJrne0vb2b9Sa&m$7dvnOzsd7<33Xe!|W0h@vhBK=4T* zY(gSo_XlKRCMH4shROsK2k*OYqYvMP>{Oo4hql~AdmT)VVOm>RA=88oK@)Si8Z3%? zIsc(j%(cu`R1Hyy`}r`9;DlXX4;R*|kVJ8z^+C@uv7XFzo;62lKt~Zyp^S%m?zoUI;@Q z2_dMGHmHpF-F-kT_C&FIz6{hsBoKr<2WM(PiU+L|trOqt>Fcv+Dix__DSp&PK_&t{casetL}D_Ne#p~_^S z5s`f?Gw&X))30-vjME6eS#px5n&i*YxW$(%yNBG!_zL}C`RUP+zFRS#-5{rEO6f#N z3cm;G^Sw8%v91xmtn!;Q_1EKa;4Ooh|AB9vQmr(%Wd?`S{cP?QUYk^~t!iyae=DP1 zUuR{nzg!qww+U~Vpk;fo#Xu0ctkqa2(fvCzb?km^rz!SEqgd53d*bsv9n&i{bR%cA zh}M$&Z3~u+NT)>c&vvI~-MDoh8Kdgehd|_MIEZV(3jgvfC5kk%eobd3XYKzk;!;vj zBRn#13X&x`CP0t^aRO1rFwLS47F1EvI7sNhZT}?Wqk3^ad*r6&W)e${P+krKsjS%YtM9OAl@91EbOR%B7M9 z0<%x5mD3AOE#eNy#VP)O!cp`D!zkrs@6rRXZQY~r76_2%0iun}XHFg?q_>k5Cp@5vYQ6I5B#s9 z_1@|a;Evq=%N_7E%!9|r$6s!x7)}7GsIPhu&OkkZq1+O2VXXi<8T(2lo!%}eybMGk zO|)+-3P*kJP(Z`F_3S_dJvXjQ+|+J3otYk+-Af!|rdnu4ce5Of+}^N%p~<}+F<4orHh>MJl3H=_g0!J;#O>yFfxh9N*;Yy-HNR)M| zrDhbI!Q;_Pcj)#hV@c}Qz1Y9}Hf1DP=Bc?1kuRjyOEZTnTMA>%mw8K)rlVlQUDLWb zg+p(~LEZtNK9gyXNx0@!x$m#Lo@CqEut5)_GyQ$YKR49|j2>D1ht7+QI1#@lWMt^- zzW&XSAW6~YT#OlaJBBd!#&>l!zaSya$zhoA%I1j#6k zH@*pIQmcnO8>v6=W(^8~OLqD{_IjUcR~dzVYDX3$sLL>>jCMi*BY&r^G7gP)0T{C~ za7ck5+NuhH&k<=$hv^nCW+Mrwc! zd~)*rnn9qAAH~P9kN@7H_WlNf)WSE=Vp<$l?(PpNfj}$UbwN`hlJ6^mVv;WW09_aO zbMD~NjQwJJ5ioD!`MJq|6?+Gr<$12%Gv|)x_EY36q%&xNT4D2%-N2_4yiLa`N9r?9 zQshGM$8fm2x$v;3z4rp*8G7v++L|C=&!-4y!ujU+V0eu5!xa4vb9zavZ64jZ%djg{ zu(XBmL#er27>TD}rHu7*J5ZbP5X}qAubW&$^x_)dHI6?BnA`b#NPqGCDdnxGwQFqC zB{72R{hkQ>57BeBw6RxlXZlR^cn^`4qZPY@ZPAg;f=@CDnEelP7EJHArtA z-~-TK^R*5U^J=kB?HDGd1_>JfVH!561|l<-L8a@GnroXY8_XF>k_Xc6*Gu>PllH0Q zUN^7a>D(*QAj{KYirTu5c{tmEdRXSL(QwdR)yTd>bnz-)zMwn0x9Febt59EXNT_5V zU$EiX_pg3#ndlS9^d$=QhL*;uX}MqczuQ-{r%;`$xw21VB8# zzCok;Jbi_O0(SA2@47xURH6ZG!Z*y&xl$i3p1UQ?bVnI$>n~(xO(zH+RMjWf%ugwe z7;ET(r4BMcqNUKg>~zYc6csR#@nt5!z%@FLdevkVFR-qr=Xrsz-{O0N%|K|*Tz4V9PI zc-(iR|JNZMm;Dz1S8jMOX(r`GccS3=e=)Y~)R`~~&fIXdsAl>~$;=vUYBHyAfs1C6 z?WNTX@*B=OFSHhSYmZTC9++mE+xRhW!-i$Nz?`RIMn$Y`wL%2iIY|YXeG=?2GlqNm zt_5}O{Mh%`?|5ASVUb?<0(rbm`)gU;twL{|4_cNryh&80*5s&CaeWDpc*(qX%QZ_i z1zf$a>8$fJiF0gzG@5zOMmM~zO-ipzE>@yuWjj@JuW%e)s?pMRGK%FH*Uukzkx}5@ z=I7%)pQGSiF16agXwv<2dOj9YzBU*t*sp>Sk4-Gz9Y1QFpiVAGIWZzhf_^~EM~XMiiVFfrz&9c@V>3V~Lu6$cjSuG|D4Zn{vSWOx#Gaz#9j+-@3VA)u)C9=+ zT7TI|T=JoA&r2mA@y+PbEz(IL%eTAUKN32-7;$l+$K65cNX@)j=HOr}8dN%%30zhg zL>lwd-0ES0zgGkXIg;kFQRpI?U@VHo@txqT-MqnxWA}Y(86;i^{*Fb_|MOP`zii&d+fB(fP`taA3n=BC5LHVoE{4 zY8fN%5qnPd#63FYb?6F-Bt$J=Six9a{X|@yAtkw(c|_AC$E=W+|bT{uT+ zQg+gdQ%}ek#lv=X;>+FKd$U#g!*WHn&UDK0gtrC$Zn6bCT6|q2DfWQBW)mU)jXgTT ztNjaJ$5DQBWA&JO54WGfoD{uLFn)W}!d7X9_$`CP{KP}Ojr1mq$m#+?xfXS;T1MJ* z`K;lY4B{s z1*k2vQ(G%u>OJ%|wVV(V3Ne!ZagE zOAjKMAxmpRJPxZ8c$kQKW~)CF))r2t!1tKvP!`fn=+Oz@+&bLq-$B>^Aj}KzYwLsjv0reTYUaP2~ z>94l4+%mqTZ^GeZb@_W;velFkh_I+QnWvsi*mY^`8Y`oDh5I0(Tnlprnb#QY_~yUs zQ;XJ>qswGZEw8KU0$Kn zt2W4jp%(AYk_jg9f6`6U9!vtm&T|2x`}CDXqWE|Wf2ZpVx)+OU$Hu$QKa^fi?6*oE z245`|R!&_aqJO(OBJ_34KA*_-sbspSI%7@Ahb+AAw5w5Wm}mR8zyD)4RO}bpG!O7u zBkqcK%4T`xe8ZW#?2sT0na2!01hpIKP3{o4^g$wNUQv)7UIFqA{uY1*MteclU810o zi79cNpJsaV<7ll|e z;IVCRrrVKF=IJW|qa{E=yPUVK{3=EhlY7_)eVT!)YiJ}m1R;zOho?h6`!gK^=BoG` z+z+vy9o{q)5+(kLi7)>=T`!aXSs}T~2V^UPBThH#9zFlp2G1@6M=PFZK0N$KjyN0! zx(8z&Q}K;kb*;FbDzue0rQ880`y=>1ZL~@$v{c3Ws^#eDywlsSxqwAR4ns@lCWK%k zN=SR3a?fp?S0V3f@_jfor9t^@td!FG)6QSU1;zX5D)mDn^0)j+$Y+M$?Km}D?z0~(fFK8%EBp6l#p z9bR7T8ew3N6he+?dsw^*d!>6!U6DAXuV5W>TrB%f=EF?<$J0A z2cQ}Se?sW}3i0Uuag3N|O@_eHnC0(bN9P z;Qcba1h>>+-O$l{P=o_$lT;JUeqDzQ?xHgyi}g2Y3ss9s87V>`h2D}y6Q$L9P2bq& zzY$eW>fAka$=z0{i(YzU;ArR!l;gSFd7uG6PHs3;kn&k$%lnebkg{khoij&l!V~q4 z@(*4z@Mdo|SD&Ie#>$j!IsUrl@sbq2@=-83gZ{zy7;cM%zBM<5y?-ez%+^6o=ISv* zZxby4h)V4n&dhd~rx4B4vQ_fN*4t2|n*11VkW&w%TGOxlvWGTR>n0hkSN%=}fDM%u zs+G&Eg(Zdpt`MaI`aTowProZ_Rp7yH6$<1ya8sq2G2!8%`KX38r{*IW-+_K`fq8LE z=jHuo_P`k4=5=MI1LV+D8KS8p1d_@4>YKH!(HCIgqfU22n2qekU3S$ZO}dt;(vJH& zujzFCFeDrxO5S{=^tK43d>KJ=6hV@*)1M1Y#O!FmpnUvUZV|Lx2|1p!tfm875>k^u zXG9(`$@4P9w(Qo&b0uS4-_>>m$xHvm9(MmXftHBJ=v57}EtapXd1WN(&f+=UPR2KC zSe2&@YnRnJch`(6NBjHn>SuGHu-|=of4N^xI=$Q$StpvS0Yc(VzVt)^n3Eg&0j_h{ z(A>?{_WA~SkfY?fbl!3{V?M8Z3u7syd+leS6AM!vBBMWG=ndEz|B&%1wl?I8eFxUf z#U|wm&h}V;p^ihpdiDB}-_YKC(&4&I0k-lsv_`f36l8Ar%nj0E9`aN8e_Q|{3006P zZ>W9AeT5y_0ZjEhc9)gsX$}7ZpbCw(!LB&h>=1vY+`Z|0lxyAx4C8ipo>9(jC7SL$ z(bn6L4O8Zv%Gdu_*O}1&%KDMh0U7ZlE!qPI{bR|m9Br-KiDYxT0mUmd7zb_^@)>8= zh#&f6Jns4m?RZ#q^yj*R&+Memy2$!|Nm;ZR9s7nD2Y22s$|W0{jr1c3!w&t z3n|m37%KLjX^CR@AJDMVR=+17F*wN>kz4uwpziTSN2mg>7=OO}g=RA4jL9Wjd0tLX zx(XqtN`aEZVr)LAE#&@i)nB3ES8VN&Jo1(CY}A+d`KEB9)dknw{^b@zI^hnBW;u^a z!y7U%qGhd2y{>`fw2orNg>*)h0h|xug;JjHn>zpdIhuJsF2y%@{GE|K!Q4lGp^JiX zz*}Yt1Hp!OQ^3t?W-Ak2a55!Z=?Wd;Hjp;RQ9Tp--QY3Ei+o}1K!u0;x*NcBdT6Eb zh^`@3*v7eUeK>*96;H z*A_$a+rxd_9`DRYGjgdxUN)CaQig2Va z6@BBimxyR7fO837kXjk)|} zVsF;<6gDp!{nRXU423zO&+A#G)P6Y^Hf?o?xJKCgkTcVLDnxK$o4ECt8OE6z%&a8}E}*^wCtkiU;Z3--$tep@iOy?}GQF+{*K6GHX}2a>QBa_1oBq9`(aUqq~yph0Xmbru^w={#6P z2hp@oeKceb29*OefFYle>tS<*CqzV!6`ziKxEO}XN%V{fm4W9LAvYuBVvS`y)sMD` zD93rhwqYFL#xnEse=vigX=k`5zF+lpmntWw$gMO#o>rc$$D? zEK7*`o!o1tlNZ+n-i{S#&@uhlct^JyORZ%&=x(QTr+}T5;^Dn#!NzHAkWR0CFhWm! zppbi~KFsbse^XloABF0KY{1MvUw>OD8DFNP8kk?rz0^8R2DUm)Gu7;mZq`-HqMnOcCY;S$J>kek)ZSTT+vT*r*lhtx2tq|0pd zL=$Wgs(qkItQ=dQXz`VB4F_@fgI0M~-kcD07-S?RF|fhoDI@VgsTtwn;c=~K&cU8R z56Jt0D~`RCyuSCB^EU!qBT_4mJ{!7F8I`utFtY+*aP;*}C!0TvT5oin_Sr$K%7- zAz!mc`0Yk4?Sr_mu&!Xz_qB^P!P6h&PYUQb64%m9{;geCC|igS<TA~zNhO~d{3=?(3Ex(UMn(Rl>a`#M;iHQ`?$C&J74-iv~$Yn>Ia`Xpg=HCuw49BX<^>O^MCk{HOZADA27svQg#=#cm4G`@PfqMB@7yGI_^rz+&vy`X<# zWxux~8oy6K?-3s@e?gZqQA6pa<4hns{~|B=LrRt>9>*d_D)hcBsn#@!@!m35h*Sy` zNzcJQZIPApbF|}Wcz*0S{u>=(RHd!Oo3fjnxAs|ib%uiZs>xmiW*J*2_w|%|mBljD z`Rg=R^Al3~8)cLBjae1VBa*~*ix2jW|%~xeU>djSPKu}5z^*PSu)r1XYamy;D~{uU_RX< zu!Af^BF_j`0-~QGfY&w<3d}?aMlM2MHC=f$1fvmC-{BJfkSj*$`1{XkkTXx@J_ODgdevv7S8#?e{7OcXbB|rY zo^s!NZLKTp%ho_rAmn7C5EBUVj(ql|W?^G1i^hdLFt0POGp^HyLuYsMDbT|`(9sYb z+D`QNN$z4zw|Flu&U_(P7NglJIezzF%A>_i`1O>=Bvv1T_Z%dPGvPP! z+YC-kyz}*oD#9NcnZz{_Bw53u+Q}ncEsk<=aB5lJUqgszIWFbWX58d+r)$3QUM@CY z-tS5Bb!^9F|9cQ>tvJ5#(cWc0=7TsASGypw4gl^l_y4 zrxUv*^@R0(y-J1suu=3+Fk)?Tv94hnzU-Xkt}Bk!^Z--FcpqQAn*GVHZ4IndF$RVu z`zb4O@`@KH-H1YMX89$Of7!9LcpC)N-Tk@6{MPPuKSWnT(a=HZ9+P(`b>-MB5vBdk zP(%LL;t>&PA?t^-?||VzgpK;^{7I;{NsI*7lG7l2r`I2VzMeZPgT#d95Q@Gkf(fc9 zglvj~oUqKu^uRFS{X-{*3x)qdooQeOH6H&tuml#EK%XFKskjTg#EjH~jBi5L(AT-Z zB$%>+8zWjZ8Ro4O7Aj^6gwF;FhGBw`#qRFzY5{;$$n7w-?|Y>^wYcXweVy&XhfnYo zuY>YHy_*^sT3|dJgskj-=QlXh!}_lrxgHM4fTciSVq(T%Z6HM(EQNv&=JM-4dna}m z43J2rfB*h1)d%_|ab%yEPKGy%*A#b$>rM=>M!;UhI?vho-{uYQZ9>9^G~0nb*d}%x z4nOwFC~5E}yD-q=E<1HEbHO}sgDB;0glS3k%~863>w&Od7)A4f6Dpw&u^hAE-0Ni}Diz5tsa*buwW-dsCVWO0&q>8^1G5JN~ASdH05iD_oiJ zDutN+D@^?_B}$p5KUplRimXPzQQtXvkt^l}%MUAXn%g>PI#x)LT8kzM_NYp~5-e80 zeBxVI<}diAa$WcL-pfrF#iTFm<>8Q}&H=R79w06B{ zeXu1HvVGBri=QW9FWg^T=+}Oexo`vBnyG>xn07C2?>R^Q_Fn~Zd~ngcspWIW^X2{l z%mxnmSKv>8@P{}Jo+|Kdv)5Fl&1#AzKKedm08=GMBeDpIWL#i~f= zjVpbS2&Rq|VgZQ^ZdzKJNfd1J6Ibdq9E|0%KdBIB0f8fhxBl_3dvR{VC-(w%BM^~6 zv*&KzB+RIdQnDgnc>rLHSpvoto$P=2Tp|PmJ`vyQ&bTOc!ST?*#H+|)H6HVd6TLby zU`}j^r@pgKHr1}R#PbDWV5EZmXOSB4x{VrR{U5`YppK5*ly9755?==xA>=jai#u|$FkLS7z*>jy z=rj}`=qDCx+|dNxrr2J^_sHKhG*iwEo%dvr=U;Ss+Bw8`X_c$*NotuHSLFwK>| znxkWnl~17GXU=~6C_QVG%TlT6oL*ZybRxc(E#Oca?S)&fJ_uSDUqlZ{IeDXscH@!% zj^bm^KksXarvvPm^(LmJb8sPYjxwjBgQ1w&6_R}LZ>-EGuXBHDR?Z;$q z0H8-&w~%^T7*hfUN?M&f4&Smw!4XO6o(1OWG5AU1|WE%P!vO#jj} zR#bMW$(=Y>+F|Vulhm~`a6C>JR1zj5F5&x{a)T^I2#WtatWIkLv*Hyd=dG zkerw(M-$G^s2{3u!f9<38t!S*Idf)&ZpP2%*sv5X`G8uT5d(st#`vU;yG0r}= z`8`RceTakGf1@!f-uC$K*myP=KnZ#-xQSN(HR_XxgCiOtv~}vMwHi&)TF3n?KNRNWbUZSZ%>dk>2rhq#u3c$F(P#PL9v>`NCzur~ zn4?XFU~Xr6`3>*z?KvRtice4-Z)l38>DO`i7P4NM{T9%6w0?b+@(#;~b3g;K(YD_x zt4%KQKJ%b3i*-qA*Wpep6fCh~FMTv2V<;VcV$oj(tJtP{5rpSw3GqwiK#0o08QRd` zkx_rR5604)yfgUjRXS#Hm+&C1jI z1(!ji95Mr3a+*eoC=CucL*x=Ls;U7tqk#$Vp5J*Nqgu=dlP60*a!OuyYzqeuK|!11 zHgF{$J8a-n>;&zdRKdd}iY0TryMq9?jfwrK(!VE+X8oo)0x)}r3dw*Ce4!hLt zv6K3jFD2m%MGhVC28aPUDXD^VC>EXxN+K&df^{DlWV3N$^&d>b)tKG+zsETRl?)8R zy3&VO@}5EWgJpl~Mn%B`m6KwquM-FwmZqIBTm)_HvNm1VFS|vcxL8CH7 zWhdX98%xj)*DV*4FMW8`&wF2wzCSrAi&|pf?sm=DupGTG5hTm+*+V8^HH=$PalXu` zko+)Yhk8wXpbL*;01i0MTW#IX z&%?TpR-u52E&Q#fS6bE=ZAWEN|Ac^?cm!XdqCD}5vVwZrH!Vw5_bQak}m7#4t?&B}tI z_5S@>Pc-=+;HZNqBi;=x3~zW8&K{o+DgS^q*g`Tdga02ksIF3cdgE*&$Fo`gGNa^W zpc#Q{ZQIkeuH<<@W0#;*Z5xpp1&?h!-vi*4|8)ooKb%JeysnBO_73SuS z|2&e(9Q<*Y;1D*BhMsP8my?~%L6sjHKKHpSfD3d(qedd^R<^rQW!xo|rV8|}JzJD1 zb^{}{|4|o#!!;(B+cW1nN{JW(I~iZ_jrJr6A0KeyJW~3|WXl{5MIk!ql%o8w4x8uh zT3`8Y#8-Lk_TG8#2uHO1H*h&)x(h|On)yq1{q6En#a#W4biWVDd-8!ceNy_dlq|f5 zN4w}_hK%m^6{!iUWRK%0a+;1idaQH_9EHuMi=el;);&Xtyvrv--6Hchke zz+Ke%;Q0wi#wxy%&Qp+{R45Djk63Zor#MB(k3bOplO0d^Y0iP(i%qI-Y=FH_^z^pp z7>KdpuxXVn4l!DQ%3ibeV8Zev_bfJPv2Pi7tx;+L}>-+Z|%4bE4FvcrVs zjg4u{&CJl1eE&TmS5O0GTFS7rvA%9OS*%VA>tF|QcjP!!B3+q}1UgKUqjtsySKk@m|ueWF&xOw8@NFU&Kj=GM@1ZF%uFr-R#OM};g zpS%Tr{=VFQp3pdo?z}!bc}}+KD^|1pljaYjKkPZ6hiS3Y%LDNY?N3~G(7?*N=bU9XJuLqFt_cXP0mr9v0Q*FeXVvGEx)$17W;wN4o{ZUx( zGUWJIMNU^NC;srZMVw;bqh;4e)%liw>9C8b;B=M~-qNJwQh|&`y6c<}JeA$Q*GuKV zX=MjY?{t9k!AVA^v+u0E{VPvWM77rZ@A?V{GUJIj{7i3h+{+S2MSNRg9Q2fMQf~k$tt&1L_j^2(d!EOvtc^1e zL2>UvYz2~`Psi?U`2byyJ@MFAURIW^k74UakEw5&pd5^VbUhHzp+KW{fDor#VDysv zWY$#&dFf9fgVcf60GhR@QxZhRFOP_tz#P1Co21~Rwg(yq5q#C}Jbk%{_mT>{4*<|u zhyh@Eckp&mNGmB47(Qn7+kXC7?(N&J36SSGog3T<5=b6yXMP}>)kEdRZhrwGEp#0oH(kn|>-rS1QbUA&50EMzcX8Pc#Eyx|yF zDGWb!{3~r%L-2+cv20!Pk-Wi~E?tq+B{C)Q0q56v203Spg4cHPc`?A=D+pxU`r7v@ zq0g!`^7bPkOU;|zsSha%7hc#2O2-enn0ZO};&7tu4I#bn8j_*CF1EW`u2N0CrDFuu zD%3goRO^Q0$p;HJ<0HOhq%Dn*IPwc-mj! z)0!u!wn@W~1HmzMLg_#%ZrKyBh|Nkcafm0If0?IwZ^XTD+ZVn}A(lq|ef!~T{DN`k zSoLa19M}e?wDLviwclYPD9eE&-)8*uWY;{27UwryiQMstTjCJatN$2x#+=jq={K!= zsl{+SBHx@=`S9e-RW~4O$*|ALVVh!VT9p3l{qh-c`lx66V>!t7<x%;6|G$UfNZwSjRH8!M7?dO0Y|VCiUkmUxCngSMD%23 zaA`JjwXz1RmZYadM;?G$h3Ixp(t=X=O7c+ZH-Xs_-E_e1jd(2IS17@&xtP@O89)`Q z(j5x;pxi;rbnQ{zyI+g+K?MnhF8@m7S*$i9F2I4{QO$5L*dh#T?S)^XUVrR}4a@^pXM^X2Kv*M>F5ruofoQUv*p7q}~;ZWbGh>U?lyi3^w zoQVhSuT}RA>J1*`OE-Ym)k@$St;C!Xmp86b85Oh}hAZ?RR`A|4Pjj7^*&cpv^S*XLQn$_BeADji@w%PLwf-XUMq#e#M1V+03H|%% zzr=JFTSdR*>hET4=ljVgdSBMWMh;G5^CV5D1}>A1f4}*1d}kikteN$rHmr<4LO7q- zU#l$%i>6)lte0r_o#=z#hlN82>XpRabT!HPyxj$ptX6CR>iHiyZc~=;7HoK_q(E?6 z^aSdIN0|~?tzOahnWbteVnAb?R|N>X#rguQUo}W_jT0(6reCHN_YIkugaRa39`sjS z|6;!up}>W`thunMf~Pn8zmIxNH+-5-Q7qx z^FEyOJO6ioKtyUt#3zD?iX;7!<$AR2}iOi5LnzI zd+9{3XvD?doo=WP0<^PUNdN!10H6IHkP| zvn+|egz6m3Rpr3i-5y3iU?TixNq%zvMp0vSuoj6P1R4yKOQ!`rb^a)o}=z` z&0Td6xSG}3o%_cZar>HPiHiu&gdx6ZML~;rY2>^nz6T;8#3n#R8{4Y!h3{2ExZ)i3 zUczv*{OJt|MWU|osN(YdJbm-zFAdoGdtsZHKo3UtC(A`l)`fQY{iLSOCup%IS^bbR zev@T0w>uuov{g=v$belU({q)CeTH7LfNacb$AQY0W0;=L5nH*{v1v-$yZhI0J-vbg zcR?UdS`i7of1$a?PW)Ft8uWbX(q2R{5azWv`j)P)MBHgyh!zT+z0sPv?a{JBe!EW zNpS2g(QzMFGxQdHo$dcDA2b#5%6xPXs3W+7xRv^fI2sd(gGT5O9A?qrD$yz3_rb=r zS{NR>s@?!68}st7o&tIdr_KByfZj|=LG4nrB0RomUj&CGTB1>A0nD3JHO~D}qyf3? zqqMDcl7!W2Vv3NnUV@D}V4g#j=0yAs(#Yt3`&r-t1I_3ded8IBd<1B|^3YIGp@Mo( zc2dlF5cP#sWlq7NaPpFNC<-9_q06~^GdpVbo>dTR{ErxGR4MkV73IP0WnMIZqEjqW z8lurm9eR>)kRQR=T8`LXm?&U41Zc*;MH^B=MT&O^G_W&|$_tqtk^6xD7h?e^&+R8@ z;y*!24X`mBA|j%ix;pK>RUgMi1FfVMn686sZ9SAc|MvElgX9fSM`+v6etGDB7i83e z|J67(Hu}8@=51Y;*^P1XswvP?{>eYLIj(O7y>;U&8am0GKlYL(zXCK-ZQjgK z-(L&PF$1MsWQx3vU$P$G0PBM7@rEqA=KG-Q-0ZOo(HH=JquyL)k|QdOH%Wf>ac!|# z30B-}J+^f+Uv+%UfBZx{vpJ<7cg#t~v1eesf(y^9B!-g7ESOXvxJs*`s5CYEv0~VE z3Q#Nk;PRgNI9#tW&VTij!Le4m$vDsJKk_G;*VBWeR>xS7vVJ-LC=kBwkG2w}g~Ssr z{g}K*$5|pByY_W<+K9>rIq{(3TV|7KWAzHjU(LP4;5)T~if;wmcGtQUr#E5Wb-X^3 zuR=vXgg&Q2P3h5NRKKFYHTMm2%C3e8A$ku!aq;6sJmIbcb6lVStBE{*ZZ8{r;P zV|R1|v`~;JMdt=l?gU`wi&$mXuqgHFb98fIp{&UQxv)3Todw`pgYr=fwTuPI$-Bj} zdsV^b2B~z1kh|+ed#N;=REc1VWdpC#?Qczz_$)S!ly-h#3Iw%S7h+S?Od=q!0eU#YbX6+5&e%2D zb7~l+s3`eQW-Y4f`>z+#0A;$!?)RDW(8vg$DI5kVKh1r3^{aed)SmWsQM|v@7wrJd zlFbZvAELRG`!VkG&XL6GhpePT%$L{n?HlRafXO)EZKeM7Il8wU796J8sz4q1XpbxU zxNFW>>r|HlsCf&kb*XzLf)M;f&#`kGXTwRHjwM>U*-O4;mmz3%ep$xCo4IIkOGyD# zyV1MrrLjX58-Az)Cx~FsW+qG_sbzz^?q*=ouqc5kI)?t8y0eLSU8GxsbmDiCC zt!{^v3l|BM6?3A`rj0Iy)b)t4)W}}CH~4((Q_ZN`NGpZ=^Stcn;oD57vC5|Z*1CC-*{#?NDa$rUu$F-oR-Tb}_|R@DilTQKEpxRsn8X zMHd_h!WGsMV$|&WbOg+A%0L>|K44Hnz`Za&K3Iph0A4Q|*R5!iZzh>vbOiYNn) zcYF6bZ;mf?a8KvkH};XF4-)a1qJ;j2QAj3@34dl5xzQZDH~t64V*MYwfnvXAWbM{E zGPRf%3AtE@mom9O)wTx1)cd*48__q~SySA>F#eq(S5L}! z)JNp5nLdtMC7VW9Mz~07A5c6ilXUysm>~5ad z{hrffwoT69Pd}S)ji!4S0)v3isn)*0e9&KLC?{=psEMHaZHC@dGw#F9Bu@gHV69S` zuG5f!>Z+2_pCdP3^0o94#my_1TDKSZTsFzoSt)vYWyAIFlV|z^Ku>S9pR z---Znb00s+tTN|?mklWalGiAL0MI!rn>o1oDlvGBQo8Z=9MQ#e9K`kmA%59@4`J#H zo{b>uHdT;b(9lu{ym>%o3IYS-HwF$4)wzSfTN!Cac11Wr?!jWPwL;)W-*BKMv_dP} zaVBn!oL%HX$M|$gCy7=$y;5TyJy2~MaV63hR8?!gs&6ueLBjjKvdyivpuz-YP|m{x zfX(oIwqWk7r?zPLbk`@#@__WIj#hyPK1dOYN&gBy{Mov^Ng5>`9_5<0Evb3_hIe5$ zgMfkJ!WSUSQ(cg6f25EWjUW_oWnOlkRJa7Z&L;t9ASuDf$Vfc&Ad!2N4}KyaFsrbM z*q>tWL~Q2X6MZlWqJT+&?jPDty=Qw%{`cbj{_l&2qQvV>K$V{9MDZMr%UJ6c8p=NF zVHM_U@)*cjKKyRQS~nb`Q$NWhggk)wahAXEOLpYKP5gkBlt$onxYEG>8_q~UR&4GS z%hhIjx0;sub#X2R5&2($W>OI9OA+(vrr}jWGsq59({ID;>KPAQGqYQN3^4Kq?vSDj z;9h{aZBCzPYWweZp~pU%e0LAb=;`@FZ_{Qm~1~+PEr$sQk2K+*$tZj?_i+@I!bNC#}F@qm49u+gFzVy1yK$E4 z^`OKT>6+Yl@vZfTRCXgkqlSFL7-wBv_ad(38LYU3lXXI&P;21!0Lm*s3&U7ItW#Ox}!pjA|Fse zB=oIVS(qk_J9bq*ByuSiW2fBlr{Nj&MtD{~xvfGPpkZ)ZB1<_tabnM#spB-T zj2w_ZUfTokW84pDtC;@N@eHa#pHW$v2nh){?uLfs#{az?MSz<7izD`YZA2DLasW&b zP_f{KKtX<=*au+SJ=+!kH&(KuRe}Jm>H97=R%)DeEMRp6)2xzfnG}q#8&?2gP}Mwi zsVj`YF)p!vjTqK&XZAS_tBd0^14b)~(q!UuofOZ28;Ql{EbEYhlT5--cNqaC%gIvi zVFWM9<(~GEJ}+_K!xy=vl4PH+qC1Fa0@yhLLdKjOhV~80woLbV#NV-FLSd-KK+GW{2*-TX>CfvUptTj*hk#=2n*zn-y zxwCfxgR18XJPvw`CCNMd%{(h78XA=U@)M9-`2Ja--@R6-R_;R49A4~l{aq*SH@Gd2 zu|xmr&V(PT(DAKscj4fT@jh& z0GmqO3>(#NJYL*(ccTyqpAb5&9~OW;2aa{W^s^C0q@ub-?IJGx<;70zb{m)u!h@*EWS2H^UF+8z^sYC%nw^p$ zii!95Qx_p+JkZ)KiO>+EEcA17$pzsjffrq_525G)0-UH^Suq&5iX#1ObqSqdz!lT~9{vq@p2oj|2*<4rDa7ahN<&GkIiEQ(wn(eZFlnAg}~_ z^Kgpi-DhK&#fb2)&uBI33zY+?juKO6)GLnVR?SL3EVF+t>k|N*B}_=#qr(JBG+Nj;4f@5U#`RC9bo6h!X3Nlv&zM$b zM-jzX&kID{tnW_GIfN?Yf0#B;7oX<9)t@)MDfFm2yKnw8-yor-lA0sfCNL7We1rB2 zDatYEYA!=>uG!={oNo2+d^R)Fs4`vgcW#dCFkGj;C0QaZ+F>=fNNyJx>)%j-g;}v{ zbDrCMYf@N~?wTWilIif1?2V?*Rxm2;0N80ZNgF(5uxhUAo04EXr^|^{bQh;4e zth7^`cnc3oKgpK~_vzm<{@!sR+vvk96QYgB_z+=)fFJ-GRkpHXJYH$liSfE!`CJO? zZOR{}Wq-k{^yPDdHAew;cW4{HZHRacYguw$lt;PNMghh6w*$Vq>mb8E1_@}{bRQ?| z$5)UMv5`Iy!3gH3&B$=5u^8O3~sx-=_RLtQT7EK!_aw_D1s26b(B2c9!*D@i@uAt$Q`rb6ghZzq@=z<)!^c=lwW#oyEFd(EI3|Ci6&ABY%&r*nE z7Tz!@7T7cZ%(sgH%{AG#g+d+bLYM<_>pvIw$o@u(kWV6di6+^diN;R)5`n^y<52X;sRT$8=jfRO5M;;OZ


    m!{O$ZZ2r|TieHPopE`=3 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 ZyjNTVP|tq>)N>H%y5TK@3O(o8{{v{;ExP~! literal 0 HcmV?d00001 diff --git a/asset/img/logo_v3_trans_square.png b/asset/img/logo_v3_trans_square.png new file mode 100644 index 0000000000000000000000000000000000000000..6e38720af265f6cb7f40f6655a63dc59098969c8 GIT binary patch literal 59247 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 z%0A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 literal 0 HcmV?d00001 diff --git a/asset/img/logo_v3_trans_square_icon_small.ico b/asset/img/logo_v3_trans_square_icon_small.ico new file mode 100644 index 0000000000000000000000000000000000000000..b034a07ffca80576a557843637dce609de985391 GIT binary patch literal 165662 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

    emhT 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

    C)C7DN`|dic^)!6|sUTqH^Rz=b6i8}54W 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 CO=pw< literal 0 HcmV?d00001 diff --git a/asset/img/logo_white.png b/asset/img/logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..36c6f32de082c87fc78e67c12cb300ae1d40daff GIT binary patch literal 97184 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

    +Click to see + +```rust +# #[ cfg( all( feature = "enabled", feature = "collection_std" ) ) ] +# #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] +# { + +#[ cfg( feature = "use_alloc" ) ] +use hashbrown::HashSet; // a `no_std` replacement for `HashSet` +#[ cfg( not( feature = "no_std" ) ) ] +use std::collections::HashSet; + +let mut vec : HashSet< i32 > = HashSet::new(); +vec.insert( 1 ); +assert_eq!( vec.contains( &1 ), true ); + +# } +``` + +
    + +### Basic Use Case :: `no_std` `HashSet` / `HashMap` + +The crate has two classes of macros: strict macros (the one we covered), which require that all collection members are of the same type; and more "relaxed" macros, that use under the hood `Into` trait to cast to a certain type. They can be accessed by prepending `into_` to name of a macro (`into_vec`, `into_bmap`, etc). + +While strict macros require you to have all members of the same type, more relaxed macros often require you to specify the desired type. So there's no a clear winner. Choose the right one for each situation separately. + +For example: +```rust +# #[ cfg( all( feature = "enabled", feature = "collection_into_constructors", any( not( feature = "no_std" ), feature = "use_alloc" ) ) ) ] +# { +use std::borrow::Cow; +let vec : Vec< String > = collection_tools::into_vec!( "&str", "String".to_string(), Cow::from( "Cow" ) ); +# } +``` + +Each strict macro has its relaxed counterpart. + +### Collections being used + +So what's the deal with `collection_tools::`? + +Nothing really fancy. We just reuse collections from `alloc` (same as `std`). + +But not all collections are available in `alloc` crate. For now, the exceptions are `HashMap` and `HashSet`. This leads to the fact that we can't use them in `no_std` environment. How did we solve this? By using those collections from `hashbrown` crate whenever `no_std` feature is enabled. You can found more details on origin of a collection on its documentation page. + +### MORE Examples + +If you are feeling confused about the syntax you should use for a macro, you can visit its documentation. It is saturated with different examples, so hopefully you'll not be stuck. + +### To add to your project + +```sh +cargo add collection_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/container_tools_trivial +cargo run +``` diff --git a/module/core/collection_tools/examples/collection_tools_trivial.rs b/module/core/collection_tools/examples/collection_tools_trivial.rs new file mode 100644 index 0000000000..b817a50c84 --- /dev/null +++ b/module/core/collection_tools/examples/collection_tools_trivial.rs @@ -0,0 +1,41 @@ +//! # Collection Tools Crate +//! +//! This module provides utilities and macros to simplify working with Rust's collection types, +//! aiming to enhance ergonomics and reduce boilerplate code. Among other features, it includes +//! the `hmap!` macro for concise `HashMap` creation. +//! +//! ## Features +//! +//! - `hmap!`: A macro to create `HashMap` instances with minimal syntax. +//! +//! ## Example Usage +//! +//! Here's a quick example to demonstrate how you can use the `hmap!` macro provided by this crate +//! to create a `HashMap` similar to how you might initialize a map in other languages. This example +//! also shows that the resulting map is equivalent to one created using the standard `HashMap::new` +//! and `.insert()` methods. +//! +//! The `hmap!` macro significantly simplifies the syntax required to instantiate and populate +//! a `HashMap`, making your code cleaner and more concise. This is particularly useful in cases +//! where you need to define a map with a known set of key-value pairs upfront. + +#[ cfg( not( all +( +// not( feature = "use_alloc" ) ) ], + all( feature = "enabled", feature = "collection_constructors" ), + any( not( feature = "no_std" ), feature = "use_alloc" ) +)))] +fn main(){} + +// zzz : aaa : rid off `#[ cfg( not( feature = "use_alloc" ) ) ]` -- Rid of by not relying on std +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ cfg( all( feature = "enabled", feature = "collection_constructors" ) ) ] +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +fn main() +{ + use collection_tools::*; + let map = hmap! { 3 => 13 }; + let mut expected = collection_tools::HashMap::new(); + expected.insert( 3, 13 ); + assert_eq!( map, expected ); +} diff --git a/module/core/collection_tools/src/collections.rs b/module/core/collection_tools/src/collections.rs new file mode 100644 index 0000000000..090cf82267 --- /dev/null +++ b/module/core/collection_tools/src/collections.rs @@ -0,0 +1,32 @@ +/// Not meant to be called directly. +#[ doc( hidden ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! count +{ + ( @single $( $x : tt )* ) => ( () ); + + ( + @count $( $rest : expr ),* + ) + => + ( + < [ () ] >::len( &[ $( count!( @single $rest ) ),* ] ) + ); +} + +/// [BTreeMap] macros +pub mod bmap; +/// [BTreeSet] macros +pub mod bset; +/// [BinaryHeap] macros +pub mod heap; +/// [HashMap] macros +pub mod hmap; +/// [HashSet] macros +pub mod hset; +/// [LinkedList] macros +pub mod list; +/// [Vec] macros +pub mod vec; +/// [VecDeque] macros +pub mod vecd; diff --git a/module/core/collection_tools/src/collections/bmap.rs b/module/core/collection_tools/src/collections/bmap.rs new file mode 100644 index 0000000000..e96f045e84 --- /dev/null +++ b/module/core/collection_tools/src/collections/bmap.rs @@ -0,0 +1,172 @@ +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use alloc::collections::btree_map::*; + +/// Creates a `BTreeMap` from a list of key-value pairs. +/// +/// The `bmap` macro facilitates the convenient creation of a `BTreeMap` with initial elements. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of key-value pairs. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ BTreeMap, bmap }; +/// // BTreeMap of &str to i32 +/// let map1 = bmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// +/// // BTreeMap of &str to &str +/// let map2 = bmap!{ "name" => "value" }; +/// +/// // With trailing comma +/// let map3 = bmap!( 1 => "one", 2 => "two", 3 => "three", ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr => $value:expr ),* $( , )?`: A comma-separated list of key-value pairs to insert into the `BTreeMap`. +/// Each key and value can be of any type that implements the `Into< K >` and `Into< V >` traits, where `K` and `V` are the +/// types stored in the `BTreeMap` as keys and values, respectively. +/// +/// # Returns +/// +/// Returns a `BTreeMap` containing all the specified key-value pairs. The map's capacity is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices and integer values: +/// +/// ```rust +/// # use collection_tools::{ BTreeMap, bmap }; +/// let map = bmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// assert_eq!( map.get( "one" ), Some( &1 ) ); +/// assert_eq!( map.get( "two" ), Some( &2 ) ); +/// assert_eq!( map.get( "three" ), Some( &3 ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `BTreeMap` of integers to string slices from literals: +/// +/// ```rust +/// # use collection_tools::{ BTreeMap, bmap }; +/// let numbers = bmap!( 1 => "one", 2 => "two", 3 => "three" ); +/// assert_eq!( numbers.get( &1 ), Some( &"one" ) ); +/// assert_eq!( numbers.get( &2 ), Some( &"two" ) ); +/// assert_eq!( numbers.get( &3 ), Some( &"three" ) ); +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! bmap +{ + ( + $( $key : expr => $value : expr ),* $( , )? + ) + => + {{ + let mut _map = $crate::bmap::BTreeMap::new(); + $( + let _ = _map.insert( $key , $value ); + )* + _map + }}; +} + +/// Creates a `BTreeMap` from a list of key-value pairs. +/// +/// The `into_bmap` macro facilitates the convenient creation of a `BTreeMap` with initial elements. +/// Keys and values passed to the macro are automatically converted into the map's key and value types +/// using `.into()`, enabling the use of literals or values of different, but convertible types. +/// +/// Note: The `into_bmap` macro relies on the `.into()` method to convert each key and value into the target types +/// of the `BTreeMap`. This means that the keys and values must be compatible with the `Into< K >` and `Into< V >` traits +/// for the key type `K` and value type `V` used in the `BTreeMap`. Also, this means that sometimes you must specify the type of collection's items. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of key-value pairs. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ BTreeMap, into_bmap }; +/// // BTreeMap of &str to i32 +/// let map1 : BTreeMap< &str, i32 > = into_bmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// +/// // BTreeMap of String to String +/// let map2 : BTreeMap< String, String > = into_bmap!{ "name" => "value" }; +/// +/// // With trailing comma +/// let map3 : BTreeMap< i32, &str > = into_bmap!( 1 => "one", 2 => "two", 3 => "three", ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr => $value:expr ),* $( , )?`: A comma-separated list of key-value pairs to insert into the `BTreeMap`. +/// Each key and value can be of any type that implements the `Into< K >` and `Into< V >` traits, where `K` and `V` are the +/// types stored in the `BTreeMap` as keys and values, respectively. +/// +/// # Returns +/// +/// Returns a `BTreeMap` containing all the specified key-value pairs. The map's capacity is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices and integer values: +/// +/// ```rust +/// # use collection_tools::{ BTreeMap, into_bmap }; +/// let map : BTreeMap< &str, i32 > = into_bmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// assert_eq!( map.get( "one" ), Some( &1 ) ); +/// assert_eq!( map.get( "two" ), Some( &2 ) ); +/// assert_eq!( map.get( "three" ), Some( &3 ) ); +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into< K >` and `Into< V >`: +/// +/// ```rust +/// # use collection_tools::{ BTreeMap, into_bmap }; +/// let months : BTreeMap< String, i32 > = into_bmap!( "January" => 1, "February" => 2, "March" => 3 ); +/// assert_eq!( months.get( &"January".to_string() ), Some( &1 ) ); +/// assert_eq!( months.get( &"February".to_string() ), Some( &2 ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `BTreeMap` of integers to strings from literals: +/// +/// ```rust +/// # use collection_tools::{ BTreeMap, into_bmap }; +/// let numbers : BTreeMap< i32, String > = into_bmap!( 1 => "one", 2 => "two", 3 => "three" ); +/// assert_eq!( numbers.get( &1 ), Some( &"one".to_string() ) ); +/// assert_eq!( numbers.get( &2 ), Some( &"two".to_string() ) ); +/// assert_eq!( numbers.get( &3 ), Some( &"three".to_string() ) ); +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_bmap +{ + ( + $( $key : expr => $value : expr ),* $( , )? + ) + => + {{ + let mut _map = $crate::bmap::BTreeMap::new(); + $( + let _ = _map.insert( Into::into( $key ), Into::into( $value ) ); + )* + _map + }}; +} diff --git a/module/core/collection_tools/src/collections/bset.rs b/module/core/collection_tools/src/collections/bset.rs new file mode 100644 index 0000000000..c0c6d249ed --- /dev/null +++ b/module/core/collection_tools/src/collections/bset.rs @@ -0,0 +1,158 @@ +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use alloc::collections::btree_set::*; + +/// Creates a `BTreeSet` from a list of elements. +/// +/// The `bset` macro allows for convenient creation of a `BTreeSet` with initial elements. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ BTreeSet, bset }; +/// // BTreeSet of &str +/// let set1 = bset!( "a", "b", "c" ); +/// +/// // With trailing comma +/// let set3 = bset!( 1, 2, 3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `BTreeSet`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `BTreeSet`. +/// +/// # Returns +/// +/// Returns a `BTreeSet` containing all the specified elements. The capacity of the set is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices: +/// +/// ```rust +/// # use collection_tools::{ BTreeSet, bset }; +/// let set = bset!( "one", "two", "three" ); +/// assert!( set.contains( "one" ) ); +/// assert!( set.contains( "two" ) ); +/// assert!( set.contains( "three" ) ); +/// assert_eq!( set.len(), 3 ); +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! bset +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let mut _set = $crate::bset::BTreeSet::new(); + $( + _set.insert( $key ); + )* + _set + }}; +} + +/// Creates a `BTreeSet` from a list of elements. +/// +/// The `into_bset` macro allows for convenient creation of a `BTreeSet` with initial elements. +/// Elements passed to the macro are automatically converted into the set's element type +/// using `.into()`, facilitating the use of literals or values of different, but convertible types. +/// +/// Note: The `into_bset` macro relies on the `.into()` method to convert each element into the target type +/// of the `BTreeSet`. This means that the elements must be compatible with the `Into` trait for the +/// type `T` used in the `BTreeSet`. Also, this means that sometimes you must specify the type of collection's items. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ BTreeSet, into_bset }; +/// // BTreeSet of &str +/// let set1 : BTreeSet< &str > = into_bset!( "a", "b", "c" ); +/// +/// // BTreeSet of String +/// let set2 : BTreeSet< String > = into_bset!{ "a".to_string(), "b", "c" }; +/// +/// // With trailing comma +/// let set3 : BTreeSet< i32 > = into_bset!( 1, 2, 3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `BTreeSet`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `BTreeSet`. +/// +/// # Returns +/// +/// Returns a `BTreeSet` containing all the specified elements. The capacity of the set is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices: +/// +/// ```rust +/// # use collection_tools::{ BTreeSet, into_bset }; +/// let set : BTreeSet< &str > = into_bset!( "one", "two", "three" ); +/// assert!( set.contains( "one" ) ); +/// assert!( set.contains( "two" ) ); +/// assert!( set.contains( "three" ) ); +/// assert_eq!( set.len(), 3 ); +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into`: +/// +/// ```rust +/// # use collection_tools::{ BTreeSet, into_bset }; +/// let numbers : BTreeSet< i32 > = into_bset!( 1, 2, 3 ); +/// assert!( numbers.contains( &1 ) ); +/// assert!( numbers.contains( &2 ) ); +/// assert!( numbers.contains( &3 ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `BTreeSet` of `String` from string literals: +/// +/// ```rust +/// # use collection_tools::{ BTreeSet, into_bset }; +/// let s : BTreeSet< String > = into_bset!{ "value" }; +/// assert!( s.contains( "value" ) ); +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_bset +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let mut _set = $crate::bset::BTreeSet::new(); + $( + _set.insert( Into::into( $key ) ); + )* + _set + }}; +} diff --git a/module/core/collection_tools/src/collections/heap.rs b/module/core/collection_tools/src/collections/heap.rs new file mode 100644 index 0000000000..8d38492497 --- /dev/null +++ b/module/core/collection_tools/src/collections/heap.rs @@ -0,0 +1,155 @@ +#[ doc( inline ) ] +#[ allow( unused_imports ) ] + pub use alloc::collections::binary_heap::*; + +/// Creates a `BinaryHeap` from a list of elements. +/// +/// The `into_heap` macro simplifies the creation of a `BinaryHeap` with initial elements. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ BinaryHeap, heap }; +/// // BinaryHeap of i32 +/// let heap1 = heap!( 3, 1, 4, 1, 5, 9 ); +/// +/// // BinaryHeap of &str +/// let heap2 = heap!{ "pear", "apple", "banana" }; +/// +/// // With trailing comma +/// let heap3 = heap!( 2, 7, 1, 8, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `BinaryHeap`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `BinaryHeap`. +/// +/// # Returns +/// +/// Returns a `BinaryHeap` containing all the specified elements. The capacity of the heap is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{ BinaryHeap, heap }; +/// let heap = heap!( 5, 3, 7, 1 ); +/// assert_eq!( heap.peek(), Some( &7 ) ); // The largest value is at the top of the heap +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! heap +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _heap = $crate::heap::BinaryHeap::with_capacity( _cap ); + $( + _heap.push( $key ); + )* + _heap + }}; +} + +/// Creates a `BinaryHeap` from a list of elements. +/// +/// The `into_heap` macro simplifies the creation of a `BinaryHeap` with initial elements. +/// Elements passed to the macro are automatically converted into the heap's element type +/// using `.into()`, allowing for the use of literals or values of different, but convertible types. +/// +/// Note: The `into_heap` macro utilizes the `.into()` method to convert each element into the target type +/// of the `BinaryHeap`. This means that the elements must be compatible with the `Into` trait for the +/// type `T` used in the `BinaryHeap`. Also, this means that sometimes you must specify the type of collection's items. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ BinaryHeap, into_heap }; +/// // BinaryHeap of i32 +/// let heap1 : BinaryHeap< i32 > = into_heap!( 3, 1, 4, 1, 5, 9 ); +/// +/// // BinaryHeap of String +/// let heap2 : BinaryHeap< String > = into_heap!{ "pear".to_string(), "apple", "banana" }; +/// +/// // With trailing comma +/// let heap3 : BinaryHeap< i32 > = into_heap!( 2, 7, 1, 8, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `BinaryHeap`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `BinaryHeap`. +/// +/// # Returns +/// +/// Returns a `BinaryHeap` containing all the specified elements. The capacity of the heap is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{ BinaryHeap, into_heap }; +/// let heap : BinaryHeap< i32 > = into_heap!( 5, 3, 7, 1 ); +/// assert_eq!( heap.peek(), Some( &7 ) ); // The largest value is at the top of the heap +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into`: +/// +/// ```rust +/// # use collection_tools::{ BinaryHeap, into_heap }; +/// let chars : BinaryHeap< char > = into_heap!( 'a', 'b', 'c' ); +/// assert_eq!( chars.peek(), Some( &'c' ) ); // Characters are ordered by their ASCII value +/// ``` +/// +/// # Example +/// +/// Creating a `BinaryHeap` of `String` from string literals: +/// +/// ```rust +/// # use collection_tools::{ BinaryHeap, into_heap }; +/// let fruits : BinaryHeap< String > = into_heap!{ "cherry", "apple", "banana" }; +/// assert_eq!( fruits.peek(), Some( &"cherry".to_string() ) ); // The lexicographically largest value is at the top +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_heap +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _heap = $crate::heap::BinaryHeap::with_capacity( _cap ); + $( + _heap.push( Into::into( $key ) ); + )* + _heap + }}; +} diff --git a/module/core/collection_tools/src/collections/hmap.rs b/module/core/collection_tools/src/collections/hmap.rs new file mode 100644 index 0000000000..eceac4ee9b --- /dev/null +++ b/module/core/collection_tools/src/collections/hmap.rs @@ -0,0 +1,181 @@ +#[ cfg( feature = "use_alloc" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use crate::dependency::hashbrown::hash_map::*; +#[ cfg( not( feature = "no_std" ) ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use std::collections::hash_map::*; + +/// Creates a `HashMap` from a list of key-value pairs. +/// +/// The `hmap` macro allows for convenient creation of a `HashMap` with initial elements. +/// +/// # Origin +/// +/// This collection can be reexported from different crates: +/// - from `std`, if `no_std` flag if off +/// - from `hashbrown`, if `use_alloc` flag if on +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of key-value pairs. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ HashMap, hmap }; +/// // HashMap of &str to i32 +/// let map1 = hmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// +/// // HashMap of &str to &str +/// let map2 = hmap!{ "name" => "value", "type" => "example" }; +/// +/// // With trailing comma +/// let map3 = hmap!( 1 => "one", 2 => "two", 3 => "three", ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr => $value:expr ),* $( , )?`: A comma-separated list of key-value pairs to insert into the `HashMap`. +/// Each key and value can be of any type that implements the `Into` and `Into` traits, where `K` and `V` are the +/// types stored in the `HashMap` as keys and values, respectively. +/// +/// # Returns +/// +/// Returns a `HashMap` containing all the specified key-value pairs. The capacity of the map is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices and integer values: +/// +/// ```rust +/// # use collection_tools::{ HashMap, hmap }; +/// let map : HashMap< &str, i32 > = hmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// assert_eq!( map.get( "one" ), Some( &1 ) ); +/// assert_eq!( map.get( "two" ), Some( &2 ) ); +/// assert_eq!( map.get( "three" ), Some( &3 ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `HashMap` of integers to strings from literals: +/// +/// ```rust +/// # use collection_tools::{ HashMap, hmap }; +/// let pairs = hmap!( 1 => "apple", 2 => "banana" ); +/// assert_eq!( pairs.get( &1 ), Some( &"apple" ) ); +/// assert_eq!( pairs.get( &2 ), Some( &"banana" ) ); +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! hmap +{ + ( + $( $key : expr => $value : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _map = $crate::hmap::HashMap::with_capacity( _cap ); + $( + let _ = _map.insert( $key, $value ); + )* + _map + }}; +} + +/// Creates a `HashMap` from a list of key-value pairs. +/// +/// The `into_hmap` macro allows for convenient creation of a `HashMap` with initial elements. +/// Keys and values passed to the macro are automatically converted into the map's key and value types +/// using `.into()`, enabling the use of literals or values of different, but convertible types. +/// +/// Note: The `into_hmap` macro relies on the `.into()` method to convert each key and value into the target types +/// of the `HashMap`. This means that the keys and values must be compatible with the `Into` and `Into` traits +/// for the key type `K` and value type `V` used in the `HashMap`. Also, this means that sometimes you must specify the type of collection's items. +/// +/// # Origin +/// +/// This collection can be reexported from different crates: +/// - from `std`, if `no_std` flag if off +/// - from `hashbrown`, if `use_alloc` flag if on +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of key-value pairs. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ HashMap, into_hmap }; +/// // HashMap of &str to i32 +/// let map1 : HashMap< &str, i32 > = into_hmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// +/// // HashMap of String to String +/// let map2 : HashMap< String, String > = into_hmap!{ "name".to_string() => "value".to_string(), "type" => "example" }; +/// +/// // With trailing comma +/// let map3 : HashMap< i32, &str > = into_hmap!( 1 => "one", 2 => "two", 3 => "three", ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr => $value:expr ),* $( , )?`: A comma-separated list of key-value pairs to insert into the `HashMap`. +/// Each key and value can be of any type that implements the `Into` and `Into` traits, where `K` and `V` are the +/// types stored in the `HashMap` as keys and values, respectively. +/// +/// # Returns +/// +/// Returns a `HashMap` containing all the specified key-value pairs. The capacity of the map is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices and integer values: +/// +/// ```rust +/// # use collection_tools::{ HashMap, into_hmap }; +/// let map : HashMap< &str, i32 > = into_hmap!( "one" => 1, "two" => 2, "three" => 3 ); +/// assert_eq!( map.get( "one" ), Some( &1 ) ); +/// assert_eq!( map.get( "two" ), Some( &2 ) ); +/// assert_eq!( map.get( "three" ), Some( &3 ) ); +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into` and `Into`: +/// +/// ```rust +/// # use collection_tools::{ HashMap, into_hmap }; +/// let items : HashMap< String, i32 > = into_hmap!( "pen" => 10, "book" => 45, "eraser" => 5 ); +/// assert_eq!( items.get( &"pen".to_string() ), Some(&10 ) ); +/// assert_eq!( items.get( &"book".to_string() ), Some(&45 ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `HashMap` of integers to strings from literals: +/// +/// ```rust +/// # use collection_tools::{ HashMap, into_hmap }; +/// let pairs : HashMap< i32, String > = into_hmap!( 1 => "apple", 2 => "banana" ); +/// assert_eq!( pairs.get( &1 ), Some( &"apple".to_string() ) ); +/// assert_eq!( pairs.get( &2 ), Some( &"banana".to_string() ) ); +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_hmap +{ + ( + $( $key : expr => $value : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _map = $crate::hmap::HashMap::with_capacity( _cap ); + $( + let _ = _map.insert( Into::into( $key ), Into::into( $value ) ); + )* + _map + }}; +} diff --git a/module/core/collection_tools/src/collections/hset.rs b/module/core/collection_tools/src/collections/hset.rs new file mode 100644 index 0000000000..b9b2d682da --- /dev/null +++ b/module/core/collection_tools/src/collections/hset.rs @@ -0,0 +1,182 @@ +#[ cfg( feature = "use_alloc" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use crate::dependency::hashbrown::hash_set::*; +#[ cfg( not( feature = "no_std" ) ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use std::collections::hash_set::*; + +/// Creates a `HashSet` from a list of elements. +/// +/// The `hset` macro allows for convenient creation of a `HashSet` with initial elements. +/// +/// # Origin +/// +/// This collection can be reexported from different crates: +/// - from `std`, if `no_std` flag if off +/// - from `hashbrown`, if `use_alloc` flag if on +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ HashSet, hset }; +/// // HashSet of &str +/// let set1 = hset!( "a", "b", "c" ); +/// +/// // HashSet of &str +/// let set2 = hset!{ "a", "b", "c" }; +/// +/// // With trailing comma +/// let set3 = hset!( 1, 2, 3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `HashSet`. +/// Each element can be of any type that implements the `Into< T >` trait, where `T` is the +/// type stored in the `HashSet`. +/// +/// # Returns +/// +/// Returns a `HashSet` containing all the specified elements. The capacity of the set is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices: +/// +/// ```rust +/// # use collection_tools::{ HashSet, hset }; +/// let set = hset!( "one", "two", "three" ); +/// assert!( set.contains( "one" ) ); +/// assert!( set.contains( "two" ) ); +/// assert!( set.contains( "three" ) ); +/// assert_eq!( set.len(), 3 ); +/// ``` +/// +/// # Example +/// +/// Creating a `HashSet` of `&str` from string literals: +/// +/// ```rust +/// # use collection_tools::{ HashSet, hset }; +/// let s = hset!{ "value" }; +/// assert_eq!( s.get( "value" ), Some( &"value" ) ); +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! hset +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _set = $crate::hset::HashSet::with_capacity( _cap ); + $( + let _ = _set.insert( $key ); + )* + _set + }}; +} + +/// Creates a `HashSet` from a list of elements. +/// +/// The `into_hset` macro allows for convenient creation of a `HashSet` with initial elements. +/// Elements passed to the macro are automatically converted into the set's element type +/// using `.into()`, facilitating the use of literals or values of different, but convertible types. +/// +/// Note: The `into_hset` macro relies on the `.into()` method to convert each element into the target type +/// of the `HashSet`. This means that the elements must be compatible with the `Into< T >` trait for the +/// type `T` used in the `HashSet`. Also, this means that sometimes you must specify the type of collection's items. +/// +/// # Origin +/// +/// This collection can be reexported from different crates: +/// - from `std`, if `no_std` flag if off +/// - from `hashbrown`, if `use_alloc` flag if on +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ HashSet, into_hset }; +/// // HashSet of &str +/// let set1 : HashSet< &str > = into_hset!( "a", "b", "c" ); +/// +/// // HashSet of String +/// let set2 : HashSet< String > = into_hset!{ "a".to_string(), "b", "c" }; +/// +/// // With trailing comma +/// let set3 : HashSet< i32 > = into_hset!( 1, 2, 3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `HashSet`. +/// Each element can be of any type that implements the `Into< T >` trait, where `T` is the +/// type stored in the `HashSet`. +/// +/// # Returns +/// +/// Returns a `HashSet` containing all the specified elements. The capacity of the set is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with string slices: +/// +/// ```rust +/// # use collection_tools::{ HashSet, into_hset }; +/// let set : HashSet< &str > = into_hset!( "one", "two", "three" ); +/// assert!( set.contains( "one" ) ); +/// assert!( set.contains( "two" ) ); +/// assert!( set.contains( "three" ) ); +/// assert_eq!( set.len(), 3 ); +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into< T >`: +/// +/// ```rust +/// # use collection_tools::{ HashSet, into_hset }; +/// let numbers : HashSet< i32 > = into_hset!( 1, 2, 3 ); +/// assert!( numbers.contains( &1 ) ); +/// assert!( numbers.contains( &2 ) ); +/// assert!( numbers.contains( &3 ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `HashSet` of `String` from string literals: +/// +/// ```rust +/// # use collection_tools::{ HashSet, into_hset }; +/// let s : HashSet< String > = into_hset!{ "value" }; +/// assert_eq!( s.get( "value" ), Some( &"value".to_string() ) ); +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_hset +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _set = $crate::hset::HashSet::with_capacity( _cap ); + $( + let _ = _set.insert( Into::into( $key ) ); + )* + _set + }}; +} diff --git a/module/core/collection_tools/src/collections/list.rs b/module/core/collection_tools/src/collections/list.rs new file mode 100644 index 0000000000..d7088ea77f --- /dev/null +++ b/module/core/collection_tools/src/collections/list.rs @@ -0,0 +1,173 @@ +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use alloc::collections::linked_list::*; + +/// Creates a `LinkedList` from a list of elements. +/// +/// The `list` macro facilitates the creation of a `LinkedList` with initial elements. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ LinkedList, list }; +/// // LinkedList of i32 +/// let lst1 = list!( 1, 2, 3, 4, 5 ); +/// +/// // LinkedList of &str +/// let lst2 = list!{ "hello", "world", "rust" }; +/// +/// // With trailing comma +/// let lst3 = list!( 1.1, 2.2, 3.3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `LinkedList`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `LinkedList`. +/// +/// # Returns +/// +/// Returns a `LinkedList` containing all the specified elements. The capacity of the list is +/// dynamically adjusted based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{ LinkedList, list }; +/// let lst = list!( 1, 2, 3 ); +/// assert_eq!( lst.front(), Some( &1 ) ); // The first element is 1 +/// assert_eq!( lst.back(), Some( &3 ) ); // The last element is 3 +/// ``` +/// +/// # Example +/// +/// Creating a `LinkedList` of `&str` from string literals: +/// +/// ```rust +/// # use collection_tools::{ LinkedList, list }; +/// let fruits = list!{ "apple", "banana", "cherry" }; +/// assert_eq!( fruits.front(), Some( &"apple" ) ); // The first element +/// assert_eq!( fruits.back(), Some( &"cherry" ) ); // The last element +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! list +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + // "The LinkedList allows pushing and popping elements at either end in constant time." + // So no `with_capacity` + let mut _lst = $crate::list::LinkedList::new(); + $( + _lst.push_back( $key ); + )* + _lst + }}; +} + +/// Creates a `LinkedList` from a list of elements. +/// +/// The `into_list` macro facilitates the creation of a `LinkedList` with initial elements. +/// Elements passed to the macro are automatically converted into the list's element type +/// using `.into()`, making it convenient to use literals or values of different, but convertible types. +/// +/// Note: The `into_list` macro leverages the `.into()` method to convert each element into the target type +/// of the `LinkedList`. Therefore, the elements must be compatible with the `Into` trait for the +/// type `T` used in the `LinkedList`. Also, this means that sometimes you must specify the type of collection's items. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ LinkedList, into_list }; +/// // LinkedList of i32 +/// let lst1 : LinkedList< i32 > = into_list!( 1, 2, 3, 4, 5 ); +/// +/// // LinkedList of String +/// let lst2 : LinkedList< String > = into_list!{ "hello".to_string(), "world", "rust" }; +/// +/// // With trailing comma +/// let lst3 : LinkedList< f64 > = into_list!( 1.1, 2.2, 3.3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `LinkedList`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `LinkedList`. +/// +/// # Returns +/// +/// Returns a `LinkedList` containing all the specified elements. The capacity of the list is +/// dynamically adjusted based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{ LinkedList, into_list }; +/// let lst: LinkedList< i32 > = into_list!( 1, 2, 3 ); +/// assert_eq!( lst.front(), Some( &1 ) ); // The first element is 1 +/// assert_eq!( lst.back(), Some( &3 ) ); // The last element is 3 +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into`: +/// +/// ```rust +/// # use collection_tools::{ LinkedList, into_list }; +/// let chars : LinkedList< String > = into_list!( "a", "b", "c" ); +/// assert!( chars.contains( &"a".to_string() ) ); +/// assert!( chars.contains( &"b".to_string() ) ); +/// assert!( chars.contains( &"c".to_string() ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `LinkedList` of `String` from string literals: +/// +/// ```rust +/// # use collection_tools::{ LinkedList, into_list }; +/// let fruits : LinkedList< String > = into_list!{ "apple", "banana", "cherry" }; +/// assert_eq!( fruits.front(), Some( &"apple".to_string() ) ); // The first element +/// assert_eq!( fruits.back(), Some( &"cherry".to_string() ) ); // The last element +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_list +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + // "The LinkedList allows pushing and popping elements at either end in constant time." + // So no `with_capacity` + let mut _lst = $crate::list::LinkedList::new(); + $( + _lst.push_back( Into::into( $key ) ); + )* + _lst + }}; +} diff --git a/module/core/collection_tools/src/collections/vec.rs b/module/core/collection_tools/src/collections/vec.rs new file mode 100644 index 0000000000..2c19db388f --- /dev/null +++ b/module/core/collection_tools/src/collections/vec.rs @@ -0,0 +1,176 @@ +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use alloc::vec::*; +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use core::slice::{ Iter, IterMut }; + +/// Creates a `Vec` from a list of elements. +/// +/// The `vec` macro simplifies the creation of a `Vec` with initial elements. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{Vec, vec}; +/// // Vec of i32 +/// let vec1 = vec!( 1, 2, 3, 4, 5 ); +/// +/// // Vec of &str +/// let vec2 = vec!{ "hello", "world", "rust" }; +/// +/// // With trailing comma +/// let vec3 = vec!( 1.1, 2.2, 3.3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key : expr ),* $( , )?`: A comma-separated list of elements to insert into the `Vec`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `Vec`. +/// +/// # Returns +/// +/// Returns a `Vec` containing all the specified elements. The capacity of the vector is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{Vec, vec}; +/// let vec = vec!( 1, 2, 3 ); +/// assert_eq!( vec[ 0 ], 1 ); +/// assert_eq!( vec[ 1 ], 2 ); +/// assert_eq!( vec[ 2 ], 3 ); +/// ``` +/// +/// # Example +/// +/// Creating a `Vec` of `&str` from string literals: +/// +/// ```rust +/// # use collection_tools::{Vec, vec}; +/// let mixed = vec!{ "value", "another value" }; +/// assert_eq!( mixed[ 0 ], "value" ); +/// assert_eq!( mixed[ 1 ], "another value" ); +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! vec +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _vec = $crate::vec::Vec::with_capacity( _cap ); + $( + _vec.push( $key ); + )* + _vec + }}; +} + +/// Creates a `Vec` from a list of elements. +/// +/// The `into_vec!` macro simplifies the creation of a `Vec` with initial elements. +/// Elements passed to the macro are automatically converted into the vector's element type +/// using `.into()`, making it convenient to use literals or values of different, but convertible types. +/// +/// Note: The `into_vec!` macro utilizes the `.into()` method to convert each element into the target type +/// of the `Vec`. Therefore, the elements must be compatible with the `Into` trait for the +/// type `T` used in the `Vec`. Also, this means that sometimes you must specify the type of collection's items. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{Vec, into_vec}; +/// // Vec of i32 +/// let vec1 : Vec< i32 > = into_vec!( 1, 2, 3, 4, 5 ); +/// +/// // Vec of String +/// let vec2 : Vec< String > = into_vec!{ "hello", "world", "rust" }; +/// +/// // With trailing comma +/// let vec3 : Vec< f64 > = into_vec!( 1.1, 2.2, 3.3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key : expr ),* $( , )?`: A comma-separated list of elements to insert into the `Vec`. +/// Each element can be of any type that implements the `Into` trait, where `T` is the +/// type stored in the `Vec`. +/// +/// # Returns +/// +/// Returns a `Vec` containing all the specified elements. The capacity of the vector is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{Vec, into_vec}; +/// let vec : Vec< i32 > = into_vec!( 1, 2, 3 ); +/// assert_eq!( vec[ 0 ], 1 ); +/// assert_eq!( vec[ 1 ], 2 ); +/// assert_eq!( vec[ 2 ], 3 ); +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into`: +/// +/// ```rust +/// # use collection_tools::{Vec, into_vec}; +/// let words : Vec< String > = into_vec!( "alpha", "beta", "gamma" ); +/// assert_eq!( words[ 0 ], "alpha" ); +/// assert_eq!( words[ 1 ], "beta" ); +/// assert_eq!( words[ 2 ], "gamma" ); +/// ``` +/// +/// # Example +/// +/// Creating a `Vec` of `String` from string literals and String objects: +/// +/// ```rust +/// # use collection_tools::{Vec, into_vec}; +/// let mixed : Vec< String > = into_vec!{ "value", "another value".to_string() }; +/// assert_eq!( mixed[ 0 ], "value" ); +/// assert_eq!( mixed[ 1 ], "another value" ); +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_vec +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _vec = $crate::vec::Vec::with_capacity( _cap ); + $( + _vec.push( Into::into( $key ) ); + )* + _vec + }}; +} diff --git a/module/core/collection_tools/src/collections/vecd.rs b/module/core/collection_tools/src/collections/vecd.rs new file mode 100644 index 0000000000..2edff8b433 --- /dev/null +++ b/module/core/collection_tools/src/collections/vecd.rs @@ -0,0 +1,177 @@ +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use alloc::collections::vec_deque::*; + +/// Creates a `VecDeque` from a list of elements. +/// +/// The `vecd` macro allows for the convenient creation of a `VecDeque` with initial elements. +/// Elements passed to the macro are automatically converted into the deque's element type +/// using `.into()`, enabling the use of literals or values of different, but convertible types. +/// +/// Note: The `vecd` macro relies on the `.into()` method to convert each element into the target type +/// of the `VecDeque`. This means that the elements must be compatible with the `Into` trait for the +/// type `T` used in the `VecDeque`. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ VecDeque, vecd }; +/// // VecDeque of i32 +/// let vd1 = vecd!( 1, 2, 3, 4, 5 ); +/// +/// // VecDeque of String +/// let vd2 = vecd!{ "hello", "world", "rust" }; +/// +/// // With trailing comma +/// let vd3 = vecd!( 1.1, 2.2, 3.3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `VecDeque`. +/// Each element can be of any type that implements the `Into< T >` trait, where `T` is the +/// type stored in the `VecDeque`. +/// +/// # Returns +/// +/// Returns a `VecDeque` containing all the specified elements. The capacity of the deque is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{ VecDeque, vecd }; +/// let vd : VecDeque< i32 > = vecd!( 1, 2, 3 ); +/// assert_eq!( vd.front(), Some( &1 ) ); // The first element is 1 +/// assert_eq!( vd.back(), Some( &3 ) ); // The last element is 3 +/// ``` +/// +/// # Example +/// +/// Creating a `VecDeque` of `&str` from string literals: +/// +/// ```rust +/// # use collection_tools::{ VecDeque, vecd }; +/// let fruits = vecd!{ "apple", "banana", "cherry" }; +/// assert_eq!( fruits.front(), Some( &"apple" ) ); // The first element +/// assert_eq!( fruits.back(), Some( &"cherry" ) ); // The last element +/// ``` +/// +#[ cfg( feature = "collection_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! vecd +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _vecd = $crate::vecd::VecDeque::with_capacity( _cap ); + $( + _vecd.push_back( $key ); + )* + _vecd + }}; +} + +/// Creates a `VecDeque` from a list of elements. +/// +/// The `into_vecd` macro allows for the convenient creation of a `VecDeque` with initial elements. +/// Elements passed to the macro are automatically converted into the deque's element type +/// using `.into()`, enabling the use of literals or values of different, but convertible types. +/// +/// Note: The `into_vecd` macro relies on the `.into()` method to convert each element into the target type +/// of the `VecDeque`. This means that the elements must be compatible with the `Into` trait for the +/// type `T` used in the `VecDeque`. +/// +/// # Origin +/// +/// This collection is reexported from `alloc`. +/// +/// # Syntax +/// +/// The macro can be called with a comma-separated list of elements. A trailing comma is optional. +/// +/// ```rust +/// # use collection_tools::{ VecDeque, into_vecd }; +/// // VecDeque of i32 +/// let vd1 : VecDeque< i32 > = into_vecd!( 1, 2, 3, 4, 5 ); +/// +/// // VecDeque of String +/// let vd2 : VecDeque< String > = into_vecd!{ "hello".to_string(), "world", "rust" }; +/// +/// // With trailing comma +/// let vd3 : VecDeque< f64 > = into_vecd!( 1.1, 2.2, 3.3, ); +/// ``` +/// +/// # Parameters +/// +/// - `$( $key:expr ),* $( , )?`: A comma-separated list of elements to insert into the `VecDeque`. +/// Each element can be of any type that implements the `Into< T >` trait, where `T` is the +/// type stored in the `VecDeque`. +/// +/// # Returns +/// +/// Returns a `VecDeque` containing all the specified elements. The capacity of the deque is +/// automatically determined based on the number of elements provided. +/// +/// # Example +/// +/// Basic usage with integers: +/// +/// ```rust +/// # use collection_tools::{ VecDeque, into_vecd }; +/// let vd : VecDeque< i32 > = into_vecd!( 1, 2, 3 ); +/// assert_eq!( vd.front(), Some( &1 ) ); // The first element is 1 +/// assert_eq!( vd.back(), Some( &3 ) ); // The last element is 3 +/// ``` +/// +/// # Example +/// +/// Using with different types that implement `Into< T >`: +/// +/// ```rust +/// # use collection_tools::{ VecDeque, into_vecd }; +/// let chars : VecDeque< char > = into_vecd!( 'a', 'b', 'c' ); +/// assert!( chars.contains( &'a' ) ); +/// assert!( chars.contains( &'b' ) ); +/// assert!( chars.contains( &'c' ) ); +/// ``` +/// +/// # Example +/// +/// Creating a `VecDeque` of `String` from string literals: +/// +/// ```rust +/// # use collection_tools::{ VecDeque, into_vecd }; +/// let fruits : VecDeque< String > = into_vecd!{ "apple", "banana", "cherry" }; +/// assert_eq!( fruits.front(), Some( &"apple".to_string() ) ); // The first element +/// assert_eq!( fruits.back(), Some( &"cherry".to_string() ) ); // The last element +/// ``` +/// +#[ cfg( feature = "collection_into_constructors" ) ] +#[ macro_export( local_inner_macros ) ] +macro_rules! into_vecd +{ + ( + $( $key : expr ),* $( , )? + ) + => + {{ + let _cap = count!( @count $( $key ),* ); + let mut _vecd = $crate::vecd::VecDeque::with_capacity( _cap ); + $( + _vecd.push_back( Into::into( $key ) ); + )* + _vecd + }}; +} diff --git a/module/core/collection_tools/src/lib.rs b/module/core/collection_tools/src/lib.rs new file mode 100644 index 0000000000..6171c0e365 --- /dev/null +++ b/module/core/collection_tools/src/lib.rs @@ -0,0 +1,98 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/collection_tools/latest/collection_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +extern crate alloc; + +/// Module containing all collection macros +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +mod collections; +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +pub use collections::*; + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + + #[ cfg( feature = "use_alloc" ) ] + pub use ::hashbrown; + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + +} + +/// Parented namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + // #[ cfg( feature = "reexports" ) ] + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate:: + { + bmap::BTreeMap, + bset::BTreeSet, + heap::BinaryHeap, + hmap::HashMap, + hset::HashSet, + list::LinkedList, + vec::Vec, + vecd::VecDeque, + }; + + // #[ cfg( feature = "reexports" ) ] + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use + { + HashMap as Map, + HashSet as Set, + Vec as DynArray, + }; + + // qqq : cover by tests presence of all containers immidiately in collection_tools::* and in collection_tools::exposed::* + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ +} diff --git a/module/core/collection_tools/tests/inc/bmap.rs b/module/core/collection_tools/tests/inc/bmap.rs new file mode 100644 index 0000000000..f9034314aa --- /dev/null +++ b/module/core/collection_tools/tests/inc/bmap.rs @@ -0,0 +1,94 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut map : the_module::BTreeMap< i32, i32 > = the_module::BTreeMap::new(); + map.insert( 1, 2 ); + let exp = 2; + let got = *map.get( &1 ).unwrap(); + assert_eq!( exp, got ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::BTreeMap< i32, i32 > = the_module::bmap!{}; + let exp = the_module::BTreeMap::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::bmap!{ 3 => 13, 4 => 1 }; + let mut exp = the_module::BTreeMap::new(); + exp.insert(3, 13); + exp.insert(4, 1); + assert_eq!( got, exp ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::BTreeMap< i32, i32 > = the_module::into_bmap!{}; + let exp = the_module::BTreeMap::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::into_bmap!{ 3 => 13, 4 => 1 }; + let mut exp = the_module::BTreeMap::new(); + exp.insert(3, 13); + exp.insert(4, 1); + assert_eq!( got, exp ); + +} + +#[ test ] +fn iters() +{ + + struct MyContainer + { + entries : the_module::BTreeMap< i32, i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = ( i32, i32 ); + type IntoIter = the_module::bmap::IntoIter< i32, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = ( &'a i32, &'a i32 ); + type IntoIter = the_module::bmap::Iter< 'a, i32, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + let instance = MyContainer { entries : the_module::BTreeMap::from( [ ( 1, 3 ), ( 2, 2 ), ( 3, 1 ) ] ) }; + let got : the_module::BTreeMap< _, _ > = instance.into_iter().collect(); + let exp = the_module::BTreeMap::from( [ ( 1, 3 ), ( 2, 2 ), ( 3, 1 ) ] ); + a_id!( got, exp ); + + let instance = MyContainer { entries : the_module::BTreeMap::from( [ ( 1, 3 ), ( 2, 2 ), ( 3, 1 ) ] ) }; + let got : the_module::BTreeMap< _, _ > = ( &instance ).into_iter().map( | ( k, v ) | ( k.clone(), v.clone() ) ).collect(); + let exp = the_module::BTreeMap::from( [ ( 1, 3 ), ( 2, 2 ), ( 3, 1 ) ] ); + a_id!( got, exp ); + +} diff --git a/module/core/collection_tools/tests/inc/bset.rs b/module/core/collection_tools/tests/inc/bset.rs new file mode 100644 index 0000000000..b08f7593c4 --- /dev/null +++ b/module/core/collection_tools/tests/inc/bset.rs @@ -0,0 +1,93 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut map : the_module::BTreeSet< i32 > = the_module::BTreeSet::new(); + map.insert( 1 ); + assert_eq!( map.contains( &1 ), true ); + assert_eq!( map.contains( &2 ), false ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::BTreeSet< i32 > = the_module::bset!{}; + let exp = the_module::BTreeSet::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::bset!{ 3, 13 }; + let mut exp = the_module::BTreeSet::new(); + exp.insert(3); + exp.insert(13); + assert_eq!( got, exp ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::BTreeSet< i32 > = the_module::into_bset!{}; + let exp = the_module::BTreeSet::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::into_bset!{ 3, 13 }; + let mut exp = the_module::BTreeSet::new(); + exp.insert(3); + exp.insert(13); + assert_eq!( got, exp ); + +} + +#[ test ] +fn iters() +{ + + struct MyContainer + { + entries : the_module::BTreeSet< i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = i32; + type IntoIter = the_module::bset::IntoIter< i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = &'a i32; + type IntoIter = the_module::bset::Iter< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + let instance = MyContainer { entries : the_module::BTreeSet::from( [ 1, 2, 3 ] ) }; + let got : the_module::BTreeSet< _ > = instance.into_iter().collect(); + let exp = the_module::BTreeSet::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let instance = MyContainer { entries : the_module::BTreeSet::from( [ 1, 2, 3 ] ) }; + let got : the_module::BTreeSet< _ > = ( &instance ).into_iter().cloned().collect(); + let exp = the_module::BTreeSet::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + +} diff --git a/module/core/collection_tools/tests/inc/components.rs b/module/core/collection_tools/tests/inc/components.rs new file mode 100644 index 0000000000..e2503addb7 --- /dev/null +++ b/module/core/collection_tools/tests/inc/components.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +// qqq : implement VectorInterface diff --git a/module/core/collection_tools/tests/inc/heap.rs b/module/core/collection_tools/tests/inc/heap.rs new file mode 100644 index 0000000000..a342548cfc --- /dev/null +++ b/module/core/collection_tools/tests/inc/heap.rs @@ -0,0 +1,94 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut map : the_module::BinaryHeap< i32 > = the_module::BinaryHeap::new(); + map.push( 1 ); + let exp = Some(1).as_ref(); + let got = map.peek(); + assert_eq!( exp, got ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::BinaryHeap< i32 > = the_module::heap!{}; + let exp: the_module::BinaryHeap< i32 > = the_module::BinaryHeap::new(); + assert_eq!( got.into_vec(), exp.into_vec() ); + + // test.case( "multiple entry" ); + let got = the_module::heap!{ 3, 13 }; + let mut exp = the_module::BinaryHeap::new(); + exp.push(3); + exp.push(13); + assert_eq!( got.into_sorted_vec(), exp.into_sorted_vec() ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::BinaryHeap< i32 > = the_module::into_heap!{}; + let exp = the_module::BinaryHeap::< i32 >::new(); + assert_eq!( got.into_vec(), exp.into_vec() ); + + // test.case( "multiple entry" ); + let got : the_module::BinaryHeap< i32 > = the_module::into_heap!{ 3, 13 }; + let mut exp = the_module::BinaryHeap::new(); + exp.push(3); + exp.push(13); + assert_eq!( got.into_sorted_vec(), exp.into_sorted_vec() ); + +} + +#[ test ] +fn iters() +{ + + struct MyContainer + { + entries : the_module::BinaryHeap< i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = i32; + type IntoIter = the_module::heap::IntoIter< i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = &'a i32; + type IntoIter = the_module::heap::Iter< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + let instance = MyContainer { entries : the_module::BinaryHeap::from( [ 1, 2, 3 ] ) }; + let got : the_module::BinaryHeap< i32 > = instance.into_iter().collect(); + let exp : the_module::BinaryHeap< i32 > = the_module::BinaryHeap::from( [ 1, 2, 3 ] ); + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + let instance = MyContainer { entries : the_module::BinaryHeap::from( [ 1, 2, 3 ] ) }; + let got : the_module::BinaryHeap< i32 > = ( &instance ).into_iter().cloned().collect(); + let exp : the_module::BinaryHeap< i32 > = the_module::BinaryHeap::from( [ 1, 2, 3 ] ); + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + +} diff --git a/module/core/collection_tools/tests/inc/hmap.rs b/module/core/collection_tools/tests/inc/hmap.rs new file mode 100644 index 0000000000..1d5d0027d1 --- /dev/null +++ b/module/core/collection_tools/tests/inc/hmap.rs @@ -0,0 +1,120 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut map1 : the_module::HashMap< i32, i32 > = the_module::HashMap::new(); + map1.insert( 1, 2 ); + let exp = 2; + let got = *map1.get( &1 ).unwrap(); + assert_eq!( exp, got ); + + let mut map2 : the_module::Map< i32, i32 > = the_module::Map::new(); + map2.insert( 1, 2 ); + let exp = 2; + let got = *map2.get( &1 ).unwrap(); + assert_eq!( exp, got ); + + assert_eq!( map1, map2 ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::HashMap< i32, i32 > = the_module::hmap!{}; + let exp = the_module::HashMap::new(); + assert_eq!( got, exp ); + + + // test.case( "multiple entry" ); + let got = the_module::hmap!{ 3 => 13, 4 => 1 }; + let mut exp = the_module::HashMap::new(); + exp.insert( 3, 13 ); + exp.insert( 4, 1 ); + assert_eq!( got, exp ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::HashMap< i32, i32 > = the_module::into_hmap!{}; + let exp = the_module::HashMap::new(); + assert_eq!( got, exp ); + + + // test.case( "multiple entry" ); + let got = the_module::into_hmap!{ 3 => 13, 4 => 1 }; + let mut exp = the_module::HashMap::new(); + exp.insert( 3, 13 ); + exp.insert( 4, 1 ); + assert_eq!( got, exp ); + +} + +#[ test ] +fn iters() +{ + + struct MyContainer + { + entries : the_module::HashMap< i32, i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = ( i32, i32 ); + type IntoIter = the_module::hmap::IntoIter< i32, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = ( &'a i32, &'a i32 ); + type IntoIter = the_module::hmap::Iter< 'a, i32, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + impl< 'a > IntoIterator for &'a mut MyContainer + { + type Item = ( &'a i32, &'a mut i32 ); + type IntoIter = the_module::hmap::IterMut< 'a, i32, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter_mut() + } + } + + let instance = MyContainer { entries : the_module::HashMap::from( [ ( 1 , 3 ), ( 2, 2 ), ( 3, 1 ) ] ) }; + let got : the_module::HashMap< _, _ > = instance.into_iter().collect(); + let exp = the_module::HashMap::from( [ ( 1 , 3 ), ( 2, 2 ), ( 3, 1 ) ] ); + a_id!( got, exp ); + + let instance = MyContainer { entries : the_module::HashMap::from( [ ( 1 , 3 ), ( 2, 2 ), ( 3, 1 ) ] ) }; + let got : the_module::HashMap< _, _ > = ( &instance ).into_iter().map( | ( k, v ) | ( k.clone(), v.clone() ) ).collect(); + let exp = the_module::HashMap::from( [ ( 1 , 3 ), ( 2, 2 ), ( 3, 1 ) ] ); + a_id!( got, exp ); + + let mut instance = MyContainer { entries : the_module::HashMap::from( [ ( 1 , 3 ), ( 2, 2 ), ( 3, 1 ) ] ) }; + ( &mut instance ).into_iter().for_each( | ( _, v ) | *v *= 2 ); + let exp = the_module::HashMap::from( [ ( 1, 6 ), ( 2 ,4 ), ( 3, 2 ) ] ); + a_id!( instance.entries, exp ); + +} diff --git a/module/core/collection_tools/tests/inc/hset.rs b/module/core/collection_tools/tests/inc/hset.rs new file mode 100644 index 0000000000..d5a0ad5ed9 --- /dev/null +++ b/module/core/collection_tools/tests/inc/hset.rs @@ -0,0 +1,100 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut set1 : the_module::HashSet< i32 > = the_module::HashSet::new(); + set1.insert( 1 ); + assert_eq!( set1.contains( &1 ), true ); + assert_eq!( set1.contains( &2 ), false ); + + let mut set2 : the_module::Set< i32 > = the_module::Set::new(); + set2.insert( 1 ); + assert_eq!( set2.contains( &1 ), true ); + assert_eq!( set2.contains( &2 ), false ); + + assert_eq!( set1, set2 ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::HashSet< i32 > = the_module::hset!{}; + let exp = the_module::HashSet::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::hset!{ 13, 11 }; + let mut exp = the_module::HashSet::new(); + exp.insert( 11 ); + exp.insert( 13 ); + assert_eq!( got, exp ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::HashSet< i32 > = the_module::into_hset!{}; + let exp = the_module::HashSet::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::into_hset!{ 13, 11 }; + let mut exp = the_module::HashSet::new(); + exp.insert( 11 ); + exp.insert( 13 ); + assert_eq!( got, exp ); + +} + +#[ test ] +fn iters() +{ + + struct MyContainer + { + entries : the_module::HashSet< i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = i32; + type IntoIter = the_module::hset::IntoIter< i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = &'a i32; + type IntoIter = the_module::hset::Iter< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + let instance = MyContainer { entries : the_module::HashSet::from( [ 1, 2, 3 ] ) }; + let got : the_module::HashSet< _ > = instance.into_iter().collect(); + let exp = the_module::HashSet::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let instance = MyContainer { entries : the_module::HashSet::from( [ 1, 2, 3 ] ) }; + let got : the_module::HashSet< _ > = ( &instance ).into_iter().cloned().collect(); + let exp = the_module::HashSet::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + +} diff --git a/module/core/collection_tools/tests/inc/list.rs b/module/core/collection_tools/tests/inc/list.rs new file mode 100644 index 0000000000..648cdf8061 --- /dev/null +++ b/module/core/collection_tools/tests/inc/list.rs @@ -0,0 +1,109 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut map : the_module::LinkedList< i32 > = the_module::LinkedList::new(); + map.push_back( 1 ); + assert_eq!( map.contains( &1 ), true ); + assert_eq!( map.contains( &2 ), false ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::LinkedList< i32 > = the_module::list!{}; + let exp = the_module::LinkedList::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::list!{ 13, 15 }; + let mut exp = the_module::LinkedList::new(); + exp.push_front( 15 ); + exp.push_front( 13 ); + assert_eq!( got, exp ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::LinkedList< i32 > = the_module::into_list!{}; + let exp = the_module::LinkedList::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::into_list!{ 13, 15 }; + let mut exp = the_module::LinkedList::new(); + exp.push_front( 15 ); + exp.push_front( 13 ); + assert_eq!( got, exp ); + +} + +#[ test ] +fn iters() +{ + + struct MyContainer + { + entries : the_module::LinkedList< i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = i32; + type IntoIter = the_module::list::IntoIter< i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = &'a i32; + type IntoIter = the_module::list::Iter< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + impl< 'a > IntoIterator for &'a mut MyContainer + { + type Item = &'a mut i32; + type IntoIter = the_module::list::IterMut< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter_mut() + } + } + + let instance = MyContainer { entries : the_module::LinkedList::from( [ 1, 2, 3 ] ) }; + let got : the_module::LinkedList< _ > = instance.into_iter().collect(); + let exp = the_module::LinkedList::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let instance = MyContainer { entries : the_module::LinkedList::from( [ 1, 2, 3 ] ) }; + let got : the_module::LinkedList< _ > = ( &instance ).into_iter().cloned().collect(); + let exp = the_module::LinkedList::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let mut instance = MyContainer { entries : the_module::LinkedList::from( [ 1, 2, 3 ] ) }; + ( &mut instance ).into_iter().for_each( | v | *v *= 2 ); + let exp = the_module::LinkedList::from( [ 2, 4, 6 ] ); + a_id!( instance.entries, exp ); + +} diff --git a/module/core/collection_tools/tests/inc/mod.rs b/module/core/collection_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..aa87ee1867 --- /dev/null +++ b/module/core/collection_tools/tests/inc/mod.rs @@ -0,0 +1,15 @@ +use super::*; + +mod bmap; +mod bset; +mod heap; +mod hmap; +mod hset; +mod list; +mod vec; +mod vecd; + +mod components; + +// qqq : make subdirectory for each container -- done +// qqq : don't put tests otsude of directory `inc` -- done diff --git a/module/core/collection_tools/tests/inc/vec.rs b/module/core/collection_tools/tests/inc/vec.rs new file mode 100644 index 0000000000..ff68b33ec8 --- /dev/null +++ b/module/core/collection_tools/tests/inc/vec.rs @@ -0,0 +1,124 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut vec1 : the_module::Vec< i32 > = the_module::Vec::new(); + vec1.push( 1 ); + vec1.push( 2 ); + let got = vec1.first().unwrap().clone(); + assert_eq!( got, 1 ); + let got = vec1.last().unwrap().clone(); + assert_eq!( got, 2 ); + + let mut vec2 : the_module::DynArray< i32 > = the_module::DynArray::new(); + vec2.push( 1 ); + vec2.push( 2 ); + let got = vec2.first().unwrap().clone(); + assert_eq!( got, 1 ); + let got = vec2.last().unwrap().clone(); + assert_eq!( got, 2 ); + + assert_eq!( vec1, vec2 ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::Vec< i32 > = the_module::vec!{}; + let exp = the_module::Vec::< i32 >::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::vec!{ 3, 13 }; + let mut exp = the_module::Vec::new(); + exp.push( 3 ); + exp.push( 13 ); + assert_eq!( got, exp ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::Vec< i32 > = the_module::into_vec!{}; + let exp = the_module::Vec::< i32 >::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got : the_module::Vec< i32 > = the_module::into_vec!{ 3, 13 }; + let mut exp = the_module::Vec::new(); + exp.push( 3 ); + exp.push( 13 ); + assert_eq!( got, exp ); + +} + +// qqq : implement similar test for all containers -- done +#[ test ] +fn iters() +{ + + struct MyContainer + { + entries : Vec< i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = i32; + type IntoIter = the_module::vec::IntoIter< i32 >; + // qqq : should work -- works + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = &'a i32; + type IntoIter = the_module::vec::Iter< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + impl< 'a > IntoIterator for &'a mut MyContainer + { + type Item = &'a mut i32; + type IntoIter = the_module::vec::IterMut< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter_mut() + } + } + + let instance = MyContainer { entries : the_module::Vec::from( [ 1, 2, 3 ] ) }; + let got : Vec< _ > = instance.into_iter().collect(); + let exp = the_module::Vec::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let instance = MyContainer { entries : the_module::Vec::from( [ 1, 2, 3 ] ) }; + let got : Vec< _ > = ( &instance ).into_iter().cloned().collect(); + let exp = the_module::Vec::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let mut instance = MyContainer { entries : the_module::Vec::from( [ 1, 2, 3 ] ) }; + ( &mut instance ).into_iter().for_each( | v | *v *= 2 ); + let exp = the_module::Vec::from( [ 2, 4, 6 ] ); + a_id!( instance.entries, exp ); + +} diff --git a/module/core/collection_tools/tests/inc/vecd.rs b/module/core/collection_tools/tests/inc/vecd.rs new file mode 100644 index 0000000000..5692b56fa9 --- /dev/null +++ b/module/core/collection_tools/tests/inc/vecd.rs @@ -0,0 +1,108 @@ +use super::*; + +#[ test ] +fn reexport() +{ + + let mut map : the_module::VecDeque< i32 > = the_module::VecDeque::new(); + map.push_back( 1 ); + assert_eq!( map.contains( &1 ), true ); + assert_eq!( map.contains( &2 ), false ); + +} + +#[ cfg( feature = "collection_constructors" ) ] +#[ test ] +fn constructor() +{ + + // test.case( "empty" ); + let got : the_module::VecDeque< i32 > = the_module::vecd!{}; + let exp = the_module::VecDeque::new(); + assert_eq!( got, exp ); + + // test.case( "multiple entry" ); + let got = the_module::vecd!{ 3, 13 }; + let mut exp = the_module::VecDeque::new(); + exp.push_front( 13 ); + exp.push_front( 3 ); + assert_eq!( got, exp ); + +} + +#[ cfg( feature = "collection_into_constructors" ) ] +#[ test ] +fn into_constructor() +{ + + // test.case( "empty" ); + let got : the_module::VecDeque< i32 > = the_module::into_vecd!{}; + let exp = the_module::VecDeque::new(); + assert_eq!( got, exp ); + + // test.case( "single entry" ); + let got = the_module::into_vecd!{ 3, 13 }; + let mut exp = the_module::VecDeque::new(); + exp.push_front( 13 ); + exp.push_front( 3 ); + assert_eq!( got, exp ); + +} + +#[ test ] +fn iters() +{ + struct MyContainer + { + entries : the_module::VecDeque< i32 >, + } + + impl IntoIterator for MyContainer + { + type Item = i32; + type IntoIter = the_module::vecd::IntoIter< i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.into_iter() + } + } + + impl< 'a > IntoIterator for &'a MyContainer + { + type Item = &'a i32; + type IntoIter = the_module::vecd::Iter< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter() + } + } + + impl< 'a > IntoIterator for &'a mut MyContainer + { + type Item = &'a mut i32; + type IntoIter = the_module::vecd::IterMut< 'a, i32 >; + + fn into_iter( self ) -> Self::IntoIter + { + self.entries.iter_mut() + } + } + + let instance = MyContainer { entries : the_module::VecDeque::from( [ 1, 2, 3 ] ) }; + let got : the_module::VecDeque< _ > = instance.into_iter().collect(); + let exp = the_module::VecDeque::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let instance = MyContainer { entries : the_module::VecDeque::from( [ 1, 2, 3 ] ) }; + let got : the_module::VecDeque< _ > = ( &instance ).into_iter().cloned().collect(); + let exp = the_module::VecDeque::from( [ 1, 2, 3 ] ); + a_id!( got, exp ); + + let mut instance = MyContainer { entries : the_module::VecDeque::from( [ 1, 2, 3 ] ) }; + ( &mut instance ).into_iter().for_each( | v | *v *= 2 ); + let exp = the_module::VecDeque::from( [ 2, 4, 6 ] ); + a_id!( instance.entries, exp ); + +} diff --git a/module/core/collection_tools/tests/smoke_test.rs b/module/core/collection_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/collection_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/collection_tools/tests/tests.rs b/module/core/collection_tools/tests/tests.rs new file mode 100644 index 0000000000..a36c5debec --- /dev/null +++ b/module/core/collection_tools/tests/tests.rs @@ -0,0 +1,14 @@ +// usual tests + +#[ path="../../../../module/step/meta/src/module/aggregating.rs" ] +mod aggregating; + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ allow( unused_imports ) ] +use ::collection_tools as the_module; + +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] +mod inc; diff --git a/module/core/data_type/Cargo.toml b/module/core/data_type/Cargo.toml new file mode 100644 index 0000000000..cbb30c67f3 --- /dev/null +++ b/module/core/data_type/Cargo.toml @@ -0,0 +1,98 @@ +[package] +name = "data_type" +version = "0.7.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/data_type" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/data_type" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/data_type" +description = """ +Collection of primal data types. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# = features + +[features] + +default = [ + # "use_std", + "enabled", + "dt_either", + "dt_prelude", + "dt_interval", + "dt_collections", + # "dt_make", + # "dt_vectorized_from", + # "type_constructor/default", +] +full = [ + # "use_std", + "enabled", + "dt_either", + "dt_prelude", + "dt_interval", + "dt_collections", + # "dt_make", + # "dt_vectorized_from", + # "type_constructor/full", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +# dt_prelude = [ "collection_tools/reexports" ] +dt_prelude = [] # rid off maybe? +dt_interval = [ "interval_adapter/enabled" ] +dt_collections = [ "collection_tools/enabled" ] +dt_either = [ "either" ] + +# qqq : for Anton : integrate all features of collection_tools into data_type and reuse tests + +# dt_type_constructor = [ "type_constructor/enabled" ] +# dt_make = [ "type_constructor/make" ] +# dt_vectorized_from = [ "type_constructor/vectorized_from" ] + +# = entries + +# [lib] +# name = "data_type" +# path = "src/dt/data_type_lib.rs" + +# [[test]] +# name = "data_type_test" +# path = "tests/dt/data_type_tests.rs" +# +# [[test]] +# name = "data_type_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" +# +# [[example]] +# name = "data_type_trivial" +# path = "examples/data_type_trivial/src/main.rs" + +[dependencies] + +## external +either = { version = "~1.6", optional = true } + +## internal +# type_constructor = { workspace = true } +interval_adapter = { workspace = true } +collection_tools = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/data_type/License b/module/core/data_type/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/data_type/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/data_type/Readme.md b/module/core/data_type/Readme.md new file mode 100644 index 0000000000..1fccd8d0c7 --- /dev/null +++ b/module/core/data_type/Readme.md @@ -0,0 +1,120 @@ + + +# Module :: data_type + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml) [![docs.rs](https://img.shields.io/docsrs/data_type?color=e3e8f0&logo=docs.rs)](https://docs.rs/data_type) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdata_type%2Fexamples%2Fdata_type_trivial.rs,RUN_POSTFIX=--example%20data_type_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of primal data types. + +### Basic Use Case :: type constructors + +In Rust, you often need to wrap a given type into a new one. +The role of the orphan rules in particular is basically to prevent you from implementing external traits for external types. +To overcome the restriction developer usually wrap the external type into a tuple introducing a new type. +Type constructor does exactly that and auto-implement traits From, Into, Deref and few more for the constructed type. + +Macro [types](https://docs.rs/type_constructor/latest/type_constructor/types/macro.types.html) is responsible for generating code for Single, Pair, Homopair, Many. Each type constructor has its own keyword for that, but Pair and Homopair use the same keyword difference in a number of constituent types. It is possible to define all types at once: + + + +```rust +#[ cfg( feature = "type_constructor" ) ] +{ + use data_type::prelude::*; + + types! + { + pub single MySingle : f32; + pub single SingleWithParametrized : std::sync::Arc< T : Copy >; + pub single SingleWithParameter : < T >; + + pub pair MyPair : f32; + pub pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pub pair PairWithParameter : < T1, T2 >; + + pub pair MyHomoPair : f32; + pub pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pub pair HomoPairWithParameter : < T >; + + pub many MyMany : f32; + pub many ManyWithParametrized : std::sync::Arc< T : Copy >; + pub many ManyWithParameter : < T >; + } +} +``` + +### Basic Use Case :: make - variadic constructor + +Implement traits [From_0], [From1] up to MakeN to provide the interface to construct your structure with a different set of arguments. +In this example structure, Struct1 could be constructed either without arguments, with a single argument, or with two arguments. +- Constructor without arguments fills fields with zero. +- Constructor with a single argument sets both fields to the value of the argument. +- Constructor with 2 arguments set individual values of each field. + + + +```rust +#[ cfg( feature = "make" ) ] +{ + use type_constructor::prelude::*; + + #[ derive( Debug, PartialEq ) ] + struct Struct1 + { + a : i32, + b : i32, + } + + impl From_0 for Struct1 + { + fn from_0() -> Self + { + Self { a : 0, b : 0 } + } + } + + impl From1< i32 > for Struct1 + { + fn from1( val : i32 ) -> Self + { + Self { a : val, b : val } + } + } + + impl From2< i32, i32 > for Struct1 + { + fn from2( val1 : i32, val2 : i32 ) -> Self + { + Self { a : val1, b : val2 } + } + } + + let got : Struct1 = from!(); + let exp = Struct1{ a : 0, b : 0 }; + assert_eq!( got, exp ); + + let got : Struct1 = from!( 13 ); + let exp = Struct1{ a : 13, b : 13 }; + assert_eq!( got, exp ); + + let got : Struct1 = from!( 1, 3 ); + let exp = Struct1{ a : 1, b : 3 }; + assert_eq!( got, exp ); +} +``` + +### To add to your project + +``` shell +cargo add data_type +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/type_constructor_multiple +cargo run +``` diff --git a/module/core/data_type/examples/data_type_trivial.rs b/module/core/data_type/examples/data_type_trivial.rs new file mode 100644 index 0000000000..d3c8b6b8ab --- /dev/null +++ b/module/core/data_type/examples/data_type_trivial.rs @@ -0,0 +1,32 @@ +//! In Rust, you often need to wrap a given type into a new one. +//! The role of the orphan rules in particular is basically to prevent you from implementing external traits for external types. +//! To overcome the restriction developer usually wrap the external type into a tuple introducing a new type. +//! Type constructor does exactly that and auto-implement traits From, Into, Deref and few more for the constructed type. +//! +//! Macro [types](https://docs.rs/type_constructor/latest/type_constructor/types/macro.types.html) is responsible for generating code for Single, Pair, Homopair, Many. Each type constructor has its own keyword for that, but Pair and Homopair use the same keyword difference in a number of constituent types. It is possible to define all types at once. +fn main() +{ + #[ cfg( feature = "type_constructor" ) ] + { + use data_type::prelude::*; + + types! + { + pub single MySingle : f32; + pub single SingleWithParametrized : std::sync::Arc< T : Copy >; + pub single SingleWithParameter : < T >; + + pub pair MyPair : f32; + pub pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pub pair PairWithParameter : < T1, T2 >; + + pub pair MyHomoPair : f32; + pub pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pub pair HomoPairWithParameter : < T >; + + pub many MyMany : f32; + pub many ManyWithParametrized : std::sync::Arc< T : Copy >; + pub many ManyWithParameter : < T >; + } + } +} diff --git a/module/core/data_type/src/dt.rs b/module/core/data_type/src/dt.rs new file mode 100644 index 0000000000..9fb884985f --- /dev/null +++ b/module/core/data_type/src/dt.rs @@ -0,0 +1,77 @@ +/// Internal namespace. +pub( crate ) mod private +{ +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Shared with parent namespace of the module +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ cfg( feature = "either" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::either::Either; + + // #[ cfg( feature = "type_constructor" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use ::type_constructor::exposed::*; + + #[ cfg( feature = "dt_interval" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::interval_adapter::exposed::*; + + #[ cfg( feature = "dt_collection" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::collection_tools::exposed::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + + // #[ cfg( feature = "either" ) ] + // pub use ::either::*; + // #[ cfg( feature = "type_constructor" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use ::type_constructor::prelude::*; + + #[ cfg( feature = "dt_interval" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::interval_adapter::prelude::*; + + #[ cfg( feature = "dt_collection" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::collection_tools::prelude::*; + +} diff --git a/module/core/data_type/src/lib.rs b/module/core/data_type/src/lib.rs new file mode 100644 index 0000000000..2ee15e40a1 --- /dev/null +++ b/module/core/data_type/src/lib.rs @@ -0,0 +1,133 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/data_type/latest/data_type/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// zzz : proc macro for standard lib epilogue +// zzz : expose one_cell + +/// Wrap dependencies under a namespace. +pub mod dt; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ cfg( feature = "either" ) ] + pub use ::either; + // #[ cfg( feature = "type_constructor" ) ] + // pub use ::type_constructor; // xxx : rid off + #[ cfg( feature = "dt_interval" ) ] + pub use ::interval_adapter; + #[ cfg( feature = "dt_collection" ) ] + pub use ::collection_tools; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::dt::orphan::*; +} + +/// Shared with parent namespace of the module +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::dt::exposed::*; + + #[ cfg( feature = "dt_interval" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::interval_adapter::exposed::*; + + #[ cfg( feature = "dt_collection" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::collection_tools::exposed::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::dt::prelude::*; + + // #[ cfg( not( feature = "no_std" ) ) ] + // #[ cfg( feature = "prelude" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use std::collections:: + // { + // HashMap as Map, + // HashSet as Set, + // HashMap, + // HashSet, + // VecDeque, + // BTreeMap, + // BTreeSet, + // BinaryHeap, + // LinkedList, + // }; + + // #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + // #[ cfg( feature = "prelude" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use std::vec:: + // { + // Vec, + // Vec as DynArray, + // }; + + #[ cfg( feature = "dt_interval" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::interval_adapter::prelude::*; + + #[ cfg( feature = "dt_collection" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use crate::dependency::collection_tools::prelude::*; + + // #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + #[ cfg( feature = "dt_prelude" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use core:: + { + fmt, + }; + +} + +// zzz : use maybe +// https://github.com/CAD97/pointer-utils/tree/master/crates/slice-dst +// zzz : add once_cell maybe diff --git a/module/core/data_type/tests/inc/either_test.rs b/module/core/data_type/tests/inc/either_test.rs new file mode 100644 index 0000000000..1074096b79 --- /dev/null +++ b/module/core/data_type/tests/inc/either_test.rs @@ -0,0 +1,21 @@ +use super::*; + +// + +tests_impls! +{ + + fn basic_test() + { + let left : the_module::Either< _, () > = the_module::Either::Left( 13 ); + a_id!( left.flip(), the_module::Either::Right( 13 ) ); + } + +} + +// + +tests_index! +{ + basic_test, +} diff --git a/module/core/data_type/tests/inc/mod.rs b/module/core/data_type/tests/inc/mod.rs new file mode 100644 index 0000000000..ae7aa08f8a --- /dev/null +++ b/module/core/data_type/tests/inc/mod.rs @@ -0,0 +1,14 @@ + +#[ allow( unused_imports ) ] +use super::*; + +#[ cfg( any( feature = "either", feature = "dt_either" ) ) ] +mod either_test; + +// #[ cfg( any( feature = "type_constructor", feature = "dt_type_constructor" ) ) ] +// #[ path = "../../../../core/type_constructor/tests/inc/mod.rs" ] +// mod type_constructor; + +#[ cfg( any( feature = "interval", feature = "dt_interval" ) ) ] +#[ path = "../../../../core/interval_adapter/tests/inc/mod.rs" ] +mod interval_test; diff --git a/module/core/data_type/tests/smoke_test.rs b/module/core/data_type/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/data_type/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/data_type/tests/tests.rs b/module/core/data_type/tests/tests.rs new file mode 100644 index 0000000000..26896b6193 --- /dev/null +++ b/module/core/data_type/tests/tests.rs @@ -0,0 +1,13 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] + +#[ allow( unused_imports ) ] +use data_type as the_module; + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/core/derive_tools/Cargo.toml b/module/core/derive_tools/Cargo.toml new file mode 100644 index 0000000000..3f2b08fe4b --- /dev/null +++ b/module/core/derive_tools/Cargo.toml @@ -0,0 +1,197 @@ +[package] +name = "derive_tools" +version = "0.24.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/derive_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/derive_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/derive_tools" +description = """ +A collection of derive macros designed to enhance STD. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] + +default = [ + "enabled", + + "derive_variadic_from", + "type_variadic_from", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + + "derive_index", + "derive_index_mut", + # "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_use_std", + + "derive_strum", + "strum_phf", + + "derive_from", + "derive_inner_from", + "derive_new", + + # "use_std", +] + +full = [ + "enabled", + + "derive_variadic_from", + "type_variadic_from", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + + "derive_index", + "derive_index_mut", + # "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_use_std", + + "derive_strum", + "strum_phf", + + "derive_from", + "derive_inner_from", + "derive_new", + + # "use_std", +] +no_std = [] +use_alloc = [ "no_std", "clone_dyn/use_alloc" ] +enabled = [ "derive_tools_meta/enabled" ] + +# nightly = [ "derive_more/nightly" ] + +type_variadic_from = [ "variadic_from/enabled", "variadic_from/type_variadic_from" ] +derive_variadic_from = [ "type_variadic_from", "derive_tools_meta/derive_variadic_from", "variadic_from/derive_variadic_from" ] + +# enable_track_caller = [ "derive_more", "derive_more/track-caller" ] + +derive_add_assign = [ "derive_more", "derive_more/std", "derive_more/add_assign" ] +derive_add = [ "derive_more", "derive_more/std", "derive_more/add" ] +derive_as_mut = [ "derive_tools_meta/derive_as_mut" ] +derive_as_ref = [ "derive_tools_meta/derive_as_ref" ] +# derive_as_mut = [ "derive_more", "derive_more/as_mut" ] +# derive_as_ref = [ "derive_more", "derive_more/as_ref" ] +derive_constructor = [ "derive_more", "derive_more/std", "derive_more/constructor" ] +derive_deref = [ "derive_tools_meta/derive_deref" ] +derive_deref_mut = [ "derive_tools_meta/derive_deref_mut" ] +# derive_deref = [ "derive_more", "derive_more/deref" ] +# derive_deref_mut = [ "derive_more", "derive_more/deref_mut" ] +derive_error = [ "derive_more", "derive_more/std", "derive_more/error" ] +# derive_from = [ "derive_more", "derive_more/from" ] +# derive_from = [ "derive_tools_meta/derive_from" ] +# derive_reflect = [ "derive_tools_meta/derive_reflect" ] + +derive_index = [ "derive_more", "derive_more/std", "derive_more/index" ] +derive_index_mut = [ "derive_more", "derive_more/std", "derive_more/index_mut" ] +# derive_inner_from = [ "derive_more", "derive_more/into" ] +derive_into_iterator = [ "derive_more", "derive_more/std", "derive_more/into_iterator" ] +# derive_iterator = [ "derive_more", "derive_more/iterator" ] +derive_mul_assign = [ "derive_more", "derive_more/std", "derive_more/mul_assign" ] +derive_mul = [ "derive_more", "derive_more/std", "derive_more/mul" ] +derive_not = [ "derive_more", "derive_more/std", "derive_more/not" ] +derive_sum = [ "derive_more", "derive_more/std", "derive_more/sum" ] +derive_try_into = [ "derive_more", "derive_more/std", "derive_more/try_into" ] +derive_is_variant = [ "derive_more", "derive_more/is_variant" ] +derive_unwrap = [ "derive_more", "derive_more/std", "derive_more/unwrap" ] +# derive_convert_case = [ "derive_more", "derive_more/convert_case" ] + +derive_display = [ "parse-display" ] +derive_from_str = [ "parse-display", "parse-display/std", "parse-display/regex" ] +# derive_from_str = [ "parse-display", "parse-display/std", "parse-display/regex", "parse-display/once_cell" ] + +derive_strum = [ "strum/std", "strum/derive", "strum/strum_macros" ] +strum_phf = [ "strum/std", "strum/phf", "strum/strum_macros" ] +# zzz : review features + +derive_clone_dyn = [ "clone_dyn/enabled" ] +# derive_clone_dyn_use_std = [ "derive_clone_dyn", "clone_dyn/use_std" ] +# derive_clone_dyn_no_std = [ "derive_clone_dyn", "clone_dyn/no_std" ] +# derive_clone_dyn_use_alloc = [ "derive_clone_dyn", "clone_dyn/use_alloc" ] + +derive_from = [ "derive_tools_meta/derive_from" ] +derive_inner_from = [ "derive_tools_meta/derive_inner_from" ] +derive_new = [ "derive_tools_meta/derive_new" ] + +parse_display = [ "parse-display" ] + +[dependencies] + +## external +derive_more = { version = "~1.0.0-beta.6", optional = true, default-features = false, features = [ "debug" ] } +strum = { version = "~0.25", optional = true, default-features = false } +# strum_macros = { version = "~0.25.3", optional = true, default-features = false } +parse-display = { version = "~0.8.2", optional = true, default-features = false } + + +## internal +derive_tools_meta = { workspace = true, features = [] } +variadic_from = { workspace = true, features = [] } +clone_dyn = { workspace = true, features = [] } + +[dev-dependencies] +test_tools = { workspace = true } + +[build-dependencies] +cfg_aliases = "0.1.1" diff --git a/module/core/derive_tools/License b/module/core/derive_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/derive_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/derive_tools/Readme.md b/module/core/derive_tools/Readme.md new file mode 100644 index 0000000000..746b6e4ec7 --- /dev/null +++ b/module/core/derive_tools/Readme.md @@ -0,0 +1,66 @@ +# Module :: derive_tools + + + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/derive_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/derive_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fderive_tools%2Fexamples%2Fderive_tools_trivial.rs,RUN_POSTFIX=--example%20derive_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +### Basic use-case + + + +```rust +# #[ cfg( all( feature = "derive_from", feature = "derive_inner_from", feature = "derive_display", feature = "derive_from_str" ) ) ] +{ + use derive_tools::*; + + #[ derive( From, InnerFrom, Display, FromStr, PartialEq, Debug ) ] + #[ display( "{a}-{b}" ) ] + struct Struct1 + { + a : i32, + b : i32, + } + + // derived InnerFrom + let src = Struct1 { a : 1, b : 3 }; + let got : ( i32, i32 ) = src.into(); + let exp = ( 1, 3 ); + assert_eq!( got, exp ); + + // derived From + let src : Struct1 = ( 1, 3 ).into(); + let got : ( i32, i32 ) = src.into(); + let exp = ( 1, 3 ); + assert_eq!( got, exp ); + + // derived Display + let src = Struct1 { a : 1, b : 3 }; + let got = format!( "{}", src ); + let exp = "1-3"; + println!( "{}", got ); + assert_eq!( got, exp ); + + // derived FromStr + use std::str::FromStr; + let src = Struct1::from_str( "1-3" ); + let exp = Ok( Struct1 { a : 1, b : 3 } ); + assert_eq!( src, exp ); + +} +``` + +### To add to your project + +```sh +cargo add derive_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/derive_tools_trivial +cargo run +``` diff --git a/module/core/derive_tools/build.rs b/module/core/derive_tools/build.rs new file mode 100644 index 0000000000..bfce7f82f0 --- /dev/null +++ b/module/core/derive_tools/build.rs @@ -0,0 +1,44 @@ +//! To avoid messing up with long logical expressions in the codebase. + +use cfg_aliases::cfg_aliases; + +fn main() +{ + // Setup cfg aliases + cfg_aliases! + { + // Platforms + // wasm : { target_arch = "wasm32" }, + // android : { target_os = "android" }, + // macos : { target_os = "macos" }, + // linux : { target_os = "linux" }, + all_derives: + { + all + ( + feature = "derive_as_mut", + feature = "derive_as_ref", + feature = "derive_deref", + feature = "derive_deref_mut", + feature = "derive_from", + feature = "derive_inner_from", + feature = "derive_variadic_from", + feature = "derive_reflect" + ) + }, + any_derive : + { + any + ( + feature = "derive_as_mut", + feature = "derive_as_ref", + feature = "derive_deref", + feature = "derive_deref_mut", + feature = "derive_from", + feature = "derive_inner_from", + feature = "derive_variadic_from", + feature = "derive_reflect" + ) + }, + } +} diff --git a/module/core/derive_tools/examples/derive_tools_trivial.rs b/module/core/derive_tools/examples/derive_tools_trivial.rs new file mode 100644 index 0000000000..684f554329 --- /dev/null +++ b/module/core/derive_tools/examples/derive_tools_trivial.rs @@ -0,0 +1,43 @@ +//! for Petro : write proper description + +fn main() +{ + #[ cfg( all( feature = "derive_from", feature = "derive_inner_from", feature = "derive_display", feature = "derive_from_str" ) ) ] + { + use derive_tools::*; + + #[ derive( From, InnerFrom, Display, FromStr, PartialEq, Debug ) ] + #[ display( "{a}-{b}" ) ] + struct Struct1 + { + a : i32, + b : i32, + } + + // derived InnerFrom + let src = Struct1 { a : 1, b : 3 }; + let got : ( i32, i32 ) = src.into(); + let exp = ( 1, 3 ); + assert_eq!( got, exp ); + + // derived From + let src : Struct1 = ( 1, 3 ).into(); + let got : ( i32, i32 ) = src.into(); + let exp = ( 1, 3 ); + assert_eq!( got, exp ); + + // derived Display + let src = Struct1 { a : 1, b : 3 }; + let got = format!( "{}", src ); + let exp = "1-3"; + println!( "{}", got ); + assert_eq!( got, exp ); + + // derived FromStr + use std::str::FromStr; + let src = Struct1::from_str( "1-3" ); + let exp = Ok( Struct1 { a : 1, b : 3 } ); + assert_eq!( src, exp ); + + } +} diff --git a/module/core/derive_tools/src/lib.rs b/module/core/derive_tools/src/lib.rs new file mode 100644 index 0000000000..d99c9c9455 --- /dev/null +++ b/module/core/derive_tools/src/lib.rs @@ -0,0 +1,313 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/derive_tools/latest/derive_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// // xxx : implement derive new +// +// #[ derive( Debug, PartialEq, Default ) ] +// pub struct Property< Name > +// { +// name : Name, +// description : String, +// code : isize, +// } +// +// /// generated by new +// impl< Name > Property< Name > +// { +// #[ inline ] +// pub fn new< Description, Code >( name : Name, description : Description, code : Code ) -> Self +// where +// Name : core::convert::Into< Name >, +// Description : core::convert::Into< String >, +// Code : core::convert::Into< isize >, +// { +// Self { name : name.into(), description : description.into(), code : code.into() } +// } +// } + +// #[ cfg( feature = "enabled" ) ] +// pub mod wtools; + +#[ cfg( all( feature = "derive_more" ) ) ] +#[ allow( unused_imports ) ] +mod derive_more +{ + #[ cfg( feature = "derive_add" ) ] + pub use ::derive_more::{ Add, Sub }; + #[ cfg( feature = "derive_add_assign" ) ] + pub use ::derive_more::{ AddAssign, SubAssign }; + #[ cfg( feature = "derive_constructor" ) ] + pub use ::derive_more::Constructor; + #[ cfg( feature = "derive_error" ) ] + pub use ::derive_more::Error; + #[ cfg( feature = "derive_index_mut" ) ] + pub use ::derive_more::IndexMut; + #[ cfg( feature = "derive_index" ) ] + pub use ::derive_more::Index; + #[ cfg( feature = "derive_into" ) ] + pub use ::derive_more::Into; + #[ cfg( feature = "derive_iterator" ) ] + pub use ::derive_more::Iterator; + #[ cfg( feature = "derive_into_iterator" ) ] + pub use ::derive_more::IntoIterator; + #[ cfg( feature = "derive_mul" ) ] + pub use ::derive_more::{ Mul, Div }; + #[ cfg( feature = "derive_mul_assign" ) ] + pub use ::derive_more::{ MulAssign, DivAssign }; + #[ cfg( feature = "derive_not" ) ] + pub use ::derive_more::Not; + #[ cfg( feature = "derive_sum" ) ] + pub use ::derive_more::Sum; + #[ cfg( feature = "derive_try_into" ) ] + pub use ::derive_more::TryInto; + #[ cfg( feature = "derive_is_variant" ) ] + pub use ::derive_more::IsVariant; + #[ cfg( feature = "derive_unwrap" ) ] + pub use ::derive_more::Unwrap; + + // qqq : list all + // qqq : make sure all features of derive_more is reexported +} + +#[ doc( inline ) ] +#[ cfg( any( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] +pub use variadic_from as variadic; + +// #[ cfg( feature = "derive_reflect" ) ] +// pub mod reflect; + +// use derive_tools_meta::Deref; +// use derive_tools_meta::VariadicFrom; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ doc( inline ) ] + #[ cfg( feature = "derive_more" ) ] + pub use ::derive_more; + #[ doc( inline ) ] + #[ cfg( feature = "derive_strum" ) ] + pub use ::strum; + #[ doc( inline ) ] + #[ cfg( feature = "parse_display" ) ] + pub use ::parse_display; + #[ doc( inline ) ] + #[ cfg( feature = "clone_dyn" ) ] + pub use ::clone_dyn; + #[ doc( inline ) ] + #[ cfg( feature = "clone_dyn" ) ] + pub use ::clone_dyn::dependency::*; + #[ doc( inline ) ] + #[ cfg( any_derive ) ] + pub use ::derive_tools_meta; + #[ doc( inline ) ] + #[ cfg( any( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] + pub use ::variadic_from; +} + +#[ doc( inline ) ] +#[ cfg( feature = "enabled" ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ cfg( feature = "derive_clone_dyn" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::clone_dyn::orphan::*; + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use super::wtools::orphan::*; + // #[ cfg( feature = "derive_reflect" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use super::reflect::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ cfg( all( feature = "derive_more" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::derive_more::*; + + #[ cfg( feature = "derive_strum" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::strum::*; + + #[ cfg( any( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] + #[ doc( inline ) ] + pub use ::variadic_from::exposed::*; + + // #[ cfg( all( feature = "derive_more", feature = "derive_add" ) ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use ::derive_more::Add; + + // #[ allow( ambiguous_glob_reexports ) ] + // #[ cfg( feature = "derive_more" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use ::derive_more:: + // { + // Add, + // AddAssign, + // AsMut, + // AsRef, + // Binary, + // BitAnd, + // BitAndAssign, + // BitOr, + // BitOrAssign, + // BitXor, + // BitXorAssign, + // Constructor, + // Debug, + // Deref, + // DerefMut, + // Display, + // Div, + // DivAssign, + // Error, + // From, + // FromStr, + // Index, + // IndexMut, + // Into, + // IntoIterator, + // IsVariant, + // LowerExp, + // LowerHex, + // Mul, + // MulAssign, + // Neg, + // Not, + // Octal, + // Pointer, + // Product, + // Rem, + // RemAssign, + // Shl, + // ShlAssign, + // Shr, + // ShrAssign, + // Sub, + // SubAssign, + // Sum, + // TryFrom, + // TryInto, + // TryUnwrap, + // Unwrap, + // UpperExp, + // UpperHex, + // }; + + #[ cfg( feature = "derive_strum" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::strum::*; + + #[ cfg( feature = "derive_display" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::parse_display::Display; + + #[ cfg( feature = "derive_from_str" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::parse_display::FromStr; + + #[ cfg( feature = "derive_clone_dyn" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::clone_dyn::exposed::*; + + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use super::wtools::exposed::*; + + // #[ cfg( feature = "derive_reflect" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use super::reflect::exposed::*; + + // #[ cfg( any_derive ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::derive_tools_meta::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "derive_from" ) ] + pub use ::derive_tools_meta::From; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "derive_inner_from" ) ] + pub use ::derive_tools_meta::InnerFrom; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ cfg( feature = "derive_clone_dyn" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::clone_dyn; + + #[ cfg( feature = "derive_clone_dyn" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::clone_dyn::prelude::*; + + // it should already be in predlue of clone_dyn + // #[ cfg( feature = "derive_clone_dyn" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use ::clone_dyn::clone_dyn; + + #[ cfg( any( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] + #[ doc( inline ) ] + pub use ::variadic_from::prelude::*; + + // #[ cfg( feature = "derive_reflect" ) ] + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use super::reflect::prelude::*; + + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use super::wtools::prelude::*; + // #[ doc( no_inline ) ] + // pub use super::wtools; + +} diff --git a/module/core/derive_tools/tests/inc/all_manual_test.rs b/module/core/derive_tools/tests/inc/all_manual_test.rs new file mode 100644 index 0000000000..442bffbe2d --- /dev/null +++ b/module/core/derive_tools/tests/inc/all_manual_test.rs @@ -0,0 +1,68 @@ +use super::*; + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct IsTransparent( bool ); + +impl Default for IsTransparent +{ + #[ inline( always ) ] + fn default() -> Self + { + Self( true ) + } +} + +impl From< bool > for IsTransparent +{ + #[ inline( always ) ] + fn from( src : bool ) -> Self + { + Self( src ) + } +} + +impl From< IsTransparent > for bool +{ + #[ inline( always ) ] + fn from( src : IsTransparent ) -> Self + { + src.0 + } +} + +impl core::ops::Deref for IsTransparent +{ + type Target = bool; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +impl core::ops::DerefMut for IsTransparent +{ + #[ inline( always ) ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +impl AsRef< bool > for IsTransparent +{ + fn as_ref( &self ) -> &bool + { + &self.0 + } +} + +impl AsMut< bool > for IsTransparent +{ + fn as_mut( &mut self ) -> &mut bool + { + &mut self.0 + } +} + +include!( "./only_test/all.rs" ); diff --git a/module/core/derive_tools/tests/inc/all_test.rs b/module/core/derive_tools/tests/inc/all_test.rs new file mode 100644 index 0000000000..c716416146 --- /dev/null +++ b/module/core/derive_tools/tests/inc/all_test.rs @@ -0,0 +1,18 @@ +use super::*; + +#[ derive( Debug, Clone, Copy, PartialEq, /* the_module::Default,*/ the_module::From, the_module::InnerFrom, the_module::Deref, the_module::DerefMut, the_module::AsRef, the_module::AsMut ) ] +// #[ default( value = false ) ] +pub struct IsTransparent( bool ); + +// qqq : xxx : make Default derive working + +impl Default for IsTransparent +{ + #[ inline( always ) ] + fn default() -> Self + { + Self( true ) + } +} + +include!( "./only_test/all.rs" ); diff --git a/module/core/derive_tools/tests/inc/as_mut_manual_test.rs b/module/core/derive_tools/tests/inc/as_mut_manual_test.rs new file mode 100644 index 0000000000..e1bf4ead78 --- /dev/null +++ b/module/core/derive_tools/tests/inc/as_mut_manual_test.rs @@ -0,0 +1,17 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct IsTransparent( bool ); + +impl AsMut< bool > for IsTransparent +{ + fn as_mut( &mut self ) -> &mut bool + { + &mut self.0 + } +} + +include!( "./only_test/as_mut.rs" ); diff --git a/module/core/derive_tools/tests/inc/as_mut_test.rs b/module/core/derive_tools/tests/inc/as_mut_test.rs new file mode 100644 index 0000000000..68b8993ed9 --- /dev/null +++ b/module/core/derive_tools/tests/inc/as_mut_test.rs @@ -0,0 +1,9 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::AsMut ) ] +pub struct IsTransparent( bool ); + +include!( "./only_test/as_mut.rs" ); diff --git a/module/core/derive_tools/tests/inc/as_ref_manual_test.rs b/module/core/derive_tools/tests/inc/as_ref_manual_test.rs new file mode 100644 index 0000000000..5c1a89598c --- /dev/null +++ b/module/core/derive_tools/tests/inc/as_ref_manual_test.rs @@ -0,0 +1,17 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct IsTransparent( bool ); + +impl AsRef< bool > for IsTransparent +{ + fn as_ref( &self ) -> &bool + { + &self.0 + } +} + +include!( "./only_test/as_ref.rs" ); diff --git a/module/core/derive_tools/tests/inc/as_ref_test.rs b/module/core/derive_tools/tests/inc/as_ref_test.rs new file mode 100644 index 0000000000..546e80c3a5 --- /dev/null +++ b/module/core/derive_tools/tests/inc/as_ref_test.rs @@ -0,0 +1,9 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::AsRef ) ] +pub struct IsTransparent( bool ); + +include!( "./only_test/as_ref.rs" ); diff --git a/module/core/derive_tools/tests/inc/basic_test.rs b/module/core/derive_tools/tests/inc/basic_test.rs new file mode 100644 index 0000000000..b02ae25e19 --- /dev/null +++ b/module/core/derive_tools/tests/inc/basic_test.rs @@ -0,0 +1,108 @@ + +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + + #[ cfg( all( feature = "derive_from", feature = "derive_inner_from", feature = "derive_display", feature = "derive_from_str" ) ) ] + fn samples() + { + use the_module::*; + + #[ derive( From, InnerFrom, Display, FromStr, PartialEq, Debug ) ] + #[ display( "{a}-{b}" ) ] + struct Struct1 + { + a : i32, + b : i32, + } + + // derived InnerFrom + let src = Struct1 { a : 1, b : 3 }; + let got : ( i32, i32 ) = src.into(); + let exp = ( 1, 3 ); + assert_eq!( got, exp ); + + // derived From + let src : Struct1 = ( 1, 3 ).into(); + let got : ( i32, i32 ) = src.into(); + let exp = ( 1, 3 ); + assert_eq!( got, exp ); + + // derived Display + let src = Struct1 { a : 1, b : 3 }; + let got = format!( "{}", src ); + let exp = "1-3"; + println!( "{}", got ); + assert_eq!( got, exp ); + + // derived FromStr + use std::str::FromStr; + let src = Struct1::from_str( "1-3" ); + let exp = Ok( Struct1 { a : 1, b : 3 } ); + assert_eq!( src, exp ); + } + + // + + #[ cfg( all( feature = "derive_from", feature = "derive_inner_from", feature = "derive_display" ) ) ] + fn basic() + { + use the_module::*; + + #[ derive( From, InnerFrom, Display ) ] + #[ display( "{a}-{b}" ) ] + struct Struct1 + { + a : i32, + b : i32, + } + + let src = Struct1 { a : 1, b : 3 }; + let got : ( i32, i32 ) = src.into(); + let exp = ( 1, 3 ); + a_id!( got, exp ); + + // let src = Struct1 { a : 1, b : 3 }; + // let got : [ i32 ; 2 ] = src.into(); + // let exp = ( 1, 3 ); + // a_id!( got, exp ); + /* zzz : make it working */ + + let src = Struct1 { a : 1, b : 3 }; + let got = format!( "{}", src ); + let exp = "1-3"; + a_id!( got, exp ); + } + + // + + #[ cfg( all( feature = "strum", feature = "strum_derive" ) ) ] + fn enum_with_strum() + { + use the_module::{ EnumIter, IntoEnumIterator }; + + #[ derive( EnumIter, Debug, PartialEq ) ] + enum Foo + { + Bar, + Baz + } + + let mut iter = Foo::iter(); + a_id!( iter.next(), Some( Foo::Bar ) ); + a_id!( iter.next(), Some( Foo::Baz ) ); + } +} + +// + +tests_index! +{ + samples, + basic, + enum_with_strum, +} diff --git a/module/core/derive_tools/tests/inc/deref/bounds_inlined.rs b/module/core/derive_tools/tests/inc/deref/bounds_inlined.rs new file mode 100644 index 0000000000..8d31b2d56d --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/bounds_inlined.rs @@ -0,0 +1,10 @@ +use core::fmt::Debug; + +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct BoundsInlined< T : ToString, U : Debug >( T, U ); + +include!( "./only_tests/bounds_inlined.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/bounds_inlined_manual.rs b/module/core/derive_tools/tests/inc/deref/bounds_inlined_manual.rs new file mode 100644 index 0000000000..a6e4306512 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/bounds_inlined_manual.rs @@ -0,0 +1,17 @@ +use core::fmt::Debug; + +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct BoundsInlined< T : ToString, U : Debug >( T, U ); + +impl< T : ToString, U : Debug > Deref for BoundsInlined< T, U > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/bounds_inlined.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/bounds_mixed.rs b/module/core/derive_tools/tests/inc/deref/bounds_mixed.rs new file mode 100644 index 0000000000..b539d8a862 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/bounds_mixed.rs @@ -0,0 +1,12 @@ +use core::fmt::Debug; + +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct BoundsMixed< T : ToString, U >( T, U ) +where + U : Debug; + +include!( "./only_tests/bounds_mixed.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/bounds_mixed_manual.rs b/module/core/derive_tools/tests/inc/deref/bounds_mixed_manual.rs new file mode 100644 index 0000000000..fbd3ae91e5 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/bounds_mixed_manual.rs @@ -0,0 +1,21 @@ +use core::fmt::Debug; + +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct BoundsMixed< T : ToString, U >( T, U ) +where + U : Debug; + +impl< T : ToString, U > Deref for BoundsMixed< T, U > +where + U : Debug, +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/bounds_mixed.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/bounds_where.rs b/module/core/derive_tools/tests/inc/deref/bounds_where.rs new file mode 100644 index 0000000000..9fb1a3f08a --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/bounds_where.rs @@ -0,0 +1,14 @@ +trait Trait<'a> {} +impl<'a> Trait<'a> for i32 {} + +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct BoundsWhere< T, U >( T, U ) +where + T : ToString, + for< 'a > U : Trait< 'a >; + +include!( "./only_tests/bounds_where.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/bounds_where_manual.rs b/module/core/derive_tools/tests/inc/deref/bounds_where_manual.rs new file mode 100644 index 0000000000..0b440a2c94 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/bounds_where_manual.rs @@ -0,0 +1,24 @@ +trait Trait<'a> {} +impl<'a> Trait<'a> for i32 {} + +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct BoundsWhere< T, U >( T, U ) +where + T : ToString, + for< 'a > U : Trait< 'a >; + +impl< T, U > Deref for BoundsWhere< T, U > +where + T : ToString, + for< 'a > U : Trait< 'a > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/bounds_where.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_named.rs b/module/core/derive_tools/tests/inc/deref/enum_named.rs new file mode 100644 index 0000000000..98f87a8797 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_named.rs @@ -0,0 +1,12 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code) ] +#[ derive( Deref ) ] +enum EnumNamed +{ + A { a : String, b : i32 }, + B { a : String, b : i32 }, +} + +include!( "./only_tests/enum_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_named_empty.rs b/module/core/derive_tools/tests/inc/deref/enum_named_empty.rs new file mode 100644 index 0000000000..22a7c2f8ad --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_named_empty.rs @@ -0,0 +1,12 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code) ] +#[ derive( Deref ) ] +enum EnumNamedEmpty +{ + A {}, + B {}, +} + +include!( "./only_tests/enum_named_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_named_empty_manual.rs b/module/core/derive_tools/tests/inc/deref/enum_named_empty_manual.rs new file mode 100644 index 0000000000..533dc78b0e --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_named_empty_manual.rs @@ -0,0 +1,19 @@ +use core::ops::Deref; + +#[ allow( dead_code) ] +enum EnumNamedEmpty +{ + A {}, + B {}, +} + +impl Deref for EnumNamedEmpty +{ + type Target = (); + fn deref( &self ) -> &Self::Target + { + &() + } +} + +include!( "./only_tests/enum_named_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_named_manual.rs b/module/core/derive_tools/tests/inc/deref/enum_named_manual.rs new file mode 100644 index 0000000000..238192d0b3 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_named_manual.rs @@ -0,0 +1,22 @@ +use core::ops::Deref; + +#[ allow( dead_code) ] +enum EnumNamed +{ + A { a : String, b : i32 }, + B { a : String, b : i32 }, +} + +impl Deref for EnumNamed +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + match self + { + Self::A { a : v, ..} | Self::B { a : v, .. } => v + } + } +} + +include!( "./only_tests/enum_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_tuple.rs b/module/core/derive_tools/tests/inc/deref/enum_tuple.rs new file mode 100644 index 0000000000..2c6701331b --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_tuple.rs @@ -0,0 +1,12 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code) ] +#[ derive( Deref ) ] +enum EnumTuple +{ + A( String, i32 ), + B( String, i32 ), +} + +include!( "./only_tests/enum_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_tuple_empty.rs b/module/core/derive_tools/tests/inc/deref/enum_tuple_empty.rs new file mode 100644 index 0000000000..df423d9893 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_tuple_empty.rs @@ -0,0 +1,12 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code) ] +#[ derive( Deref ) ] +enum EnumTupleEmpty +{ + A(), + B(), +} + +include!( "./only_tests/enum_tuple_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_tuple_empty_manual.rs b/module/core/derive_tools/tests/inc/deref/enum_tuple_empty_manual.rs new file mode 100644 index 0000000000..df54d3101e --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_tuple_empty_manual.rs @@ -0,0 +1,19 @@ +use core::ops::Deref; + +#[ allow( dead_code) ] +enum EnumTupleEmpty +{ + A(), + B(), +} + +impl Deref for EnumTupleEmpty +{ + type Target = (); + fn deref( &self ) -> &Self::Target + { + &() + } +} + +include!( "./only_tests/enum_tuple_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_tuple_manual.rs b/module/core/derive_tools/tests/inc/deref/enum_tuple_manual.rs new file mode 100644 index 0000000000..efd16f833a --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_tuple_manual.rs @@ -0,0 +1,22 @@ +use core::ops::Deref; + +#[ allow( dead_code) ] +enum EnumTuple +{ + A( String, i32 ), + B( String, i32 ), +} + +impl Deref for EnumTuple +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + match self + { + Self::A( v, .. ) | Self::B( v, .. ) => v + } + } +} + +include!( "./only_tests/enum_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_unit.rs b/module/core/derive_tools/tests/inc/deref/enum_unit.rs new file mode 100644 index 0000000000..3ef2b204ce --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_unit.rs @@ -0,0 +1,12 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code) ] +#[ derive( Deref ) ] +enum EnumUnit +{ + A, + B, +} + +include!( "./only_tests/enum_unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/enum_unit_manual.rs b/module/core/derive_tools/tests/inc/deref/enum_unit_manual.rs new file mode 100644 index 0000000000..1cc6fdc94b --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/enum_unit_manual.rs @@ -0,0 +1,19 @@ +use core::ops::Deref; + +#[ allow( dead_code) ] +enum EnumUnit +{ + A, + B, +} + +impl Deref for EnumUnit +{ + type Target = (); + fn deref( &self ) -> &Self::Target + { + &() + } +} + +include!( "./only_tests/enum_unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_constants.rs b/module/core/derive_tools/tests/inc/deref/generics_constants.rs new file mode 100644 index 0000000000..f4198931f3 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_constants.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct GenericsConstants< const N : usize >( i32 ); + +include!( "./only_tests/generics_constants.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_constants_default.rs b/module/core/derive_tools/tests/inc/deref/generics_constants_default.rs new file mode 100644 index 0000000000..b5b03688dc --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_constants_default.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct GenericsConstantsDefault< const N : usize = 0 >( i32 ); + +include!( "./only_tests/generics_constants_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_constants_default_manual.rs b/module/core/derive_tools/tests/inc/deref/generics_constants_default_manual.rs new file mode 100644 index 0000000000..b56469fe34 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_constants_default_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct GenericsConstantsDefault< const N : usize = 0 >( i32 ); + +impl< const N : usize > Deref for GenericsConstantsDefault< N > +{ + type Target = i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/generics_constants_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_constants_manual.rs b/module/core/derive_tools/tests/inc/deref/generics_constants_manual.rs new file mode 100644 index 0000000000..fcc6b6da76 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_constants_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct GenericsConstants< const N : usize >( i32 ); + +impl< const N : usize > Deref for GenericsConstants< N > +{ + type Target = i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/generics_constants.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_lifetimes.rs b/module/core/derive_tools/tests/inc/deref/generics_lifetimes.rs new file mode 100644 index 0000000000..a308db8fee --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_lifetimes.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct GenericsLifetimes< 'a >( &'a i32 ); + +include!( "./only_tests/generics_lifetimes.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_lifetimes_manual.rs b/module/core/derive_tools/tests/inc/deref/generics_lifetimes_manual.rs new file mode 100644 index 0000000000..57f647c9ff --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_lifetimes_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct GenericsLifetimes< 'a >( &'a i32 ); + +impl< 'a > Deref for GenericsLifetimes< 'a > +{ + type Target = &'a i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/generics_lifetimes.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_types.rs b/module/core/derive_tools/tests/inc/deref/generics_types.rs new file mode 100644 index 0000000000..d6acb22702 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_types.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct GenericsTypes< T >( T ); + +include!( "./only_tests/generics_types.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_types_default.rs b/module/core/derive_tools/tests/inc/deref/generics_types_default.rs new file mode 100644 index 0000000000..f89f5d9430 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_types_default.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive ( Deref ) ] +struct GenericsTypesDefault< T = i32 >( T ); + +include!( "./only_tests/generics_types_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_types_default_manual.rs b/module/core/derive_tools/tests/inc/deref/generics_types_default_manual.rs new file mode 100644 index 0000000000..773061023c --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_types_default_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct GenericsTypesDefault< T = i32 >( T ); + +impl< T > Deref for GenericsTypesDefault< T > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/generics_types_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/generics_types_manual.rs b/module/core/derive_tools/tests/inc/deref/generics_types_manual.rs new file mode 100644 index 0000000000..8b9ab74909 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/generics_types_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct GenericsTypes< T >( T ); + +impl< T > Deref for GenericsTypes< T > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/generics_types.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/name_collisions.rs b/module/core/derive_tools/tests/inc/deref/name_collisions.rs new file mode 100644 index 0000000000..3a0fe2a74f --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/name_collisions.rs @@ -0,0 +1,23 @@ +#![ allow( non_snake_case ) ] +#![ allow( unused_imports ) ] + +use ::core::ops::Deref; +use derive_tools::Deref; + +pub mod core {} +pub mod std {} +pub mod marker {} + +pub mod FromString {} +pub mod FromPair {} +pub mod FromBin {} + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct NameCollisions +{ + a : i32, + b : String, +} + +include!( "./only_tests/name_collisions.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/bounds_inlined.rs b/module/core/derive_tools/tests/inc/deref/only_tests/bounds_inlined.rs new file mode 100644 index 0000000000..5fa47b683b --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/bounds_inlined.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = BoundsInlined::< String, i32 >( "boo".into(), 3 ); + let exp = "boo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/bounds_mixed.rs b/module/core/derive_tools/tests/inc/deref/only_tests/bounds_mixed.rs new file mode 100644 index 0000000000..198ddd7019 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/bounds_mixed.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = BoundsMixed::< String, i32 >( "boo".into(), 3 ); + let exp = "boo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/bounds_where.rs b/module/core/derive_tools/tests/inc/deref/only_tests/bounds_where.rs new file mode 100644 index 0000000000..a7733a9b5b --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/bounds_where.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = BoundsWhere::< String, i32 >( "boo".into(), 3 ); + let exp = "boo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/enum_named.rs b/module/core/derive_tools/tests/inc/deref/only_tests/enum_named.rs new file mode 100644 index 0000000000..fc6072f1cd --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/enum_named.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = EnumNamed::A { a : "boo".into(), b : 3 }; + let exp = "boo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/enum_named_empty.rs b/module/core/derive_tools/tests/inc/deref/only_tests/enum_named_empty.rs new file mode 100644 index 0000000000..d0062ce381 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/enum_named_empty.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = EnumNamedEmpty::A {}; + let exp = &(); + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple.rs b/module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple.rs new file mode 100644 index 0000000000..b5a71cc2e1 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = EnumTuple::A( "boo".into(), 3 ); + let exp = "boo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple_empty.rs b/module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple_empty.rs new file mode 100644 index 0000000000..897c714aff --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/enum_tuple_empty.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = EnumTupleEmpty::A(); + let exp = &(); + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/enum_unit.rs b/module/core/derive_tools/tests/inc/deref/only_tests/enum_unit.rs new file mode 100644 index 0000000000..c6af5da907 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/enum_unit.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = EnumUnit::A; + let exp = &(); + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/generics_constants.rs b/module/core/derive_tools/tests/inc/deref/only_tests/generics_constants.rs new file mode 100644 index 0000000000..5a8c8f023e --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/generics_constants.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = GenericsConstants::< 0 >( 5 ); + let exp = &5; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/generics_constants_default.rs b/module/core/derive_tools/tests/inc/deref/only_tests/generics_constants_default.rs new file mode 100644 index 0000000000..c0cee0bd67 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/generics_constants_default.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = GenericsConstantsDefault::< 0 >( 5 ); + let exp = &5; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/generics_lifetimes.rs b/module/core/derive_tools/tests/inc/deref/only_tests/generics_lifetimes.rs new file mode 100644 index 0000000000..cdb4089835 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/generics_lifetimes.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = GenericsLifetimes( &3 ); + let exp = &&3; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/generics_types.rs b/module/core/derive_tools/tests/inc/deref/only_tests/generics_types.rs new file mode 100644 index 0000000000..da3b2c39f6 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/generics_types.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = GenericsTypes::< &str >( "boo" ); + let got = &"boo"; + let exp = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/generics_types_default.rs b/module/core/derive_tools/tests/inc/deref/only_tests/generics_types_default.rs new file mode 100644 index 0000000000..07e25da195 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/generics_types_default.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = GenericsTypesDefault( 2 ); + let got = &2; + let exp = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/name_collisions.rs b/module/core/derive_tools/tests/inc/deref/only_tests/name_collisions.rs new file mode 100644 index 0000000000..862e034763 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/name_collisions.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = NameCollisions { a : 5, b : "boo".into() }; + let exp = &5; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/struct_named.rs b/module/core/derive_tools/tests/inc/deref/only_tests/struct_named.rs new file mode 100644 index 0000000000..48675ce5f0 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/struct_named.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = StructNamed{ a : "boo".into(), b : 3 }; + let exp = "boo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/struct_named_empty.rs b/module/core/derive_tools/tests/inc/deref/only_tests/struct_named_empty.rs new file mode 100644 index 0000000000..9692ed2716 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/struct_named_empty.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = StructNamedEmpty{}; + let exp = &(); + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple.rs b/module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple.rs new file mode 100644 index 0000000000..60bb72d77e --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = StructTuple( "boo".into(), 3 ); + let exp = "boo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple_empty.rs b/module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple_empty.rs new file mode 100644 index 0000000000..e2cc30db26 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/struct_tuple_empty.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = StructTupleEmpty(); + let exp = &(); + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/only_tests/struct_unit.rs b/module/core/derive_tools/tests/inc/deref/only_tests/struct_unit.rs new file mode 100644 index 0000000000..fdb39247cc --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/only_tests/struct_unit.rs @@ -0,0 +1,8 @@ +#[ test ] +fn deref() +{ + let a = StructUnit; + let exp = &(); + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref/struct_named.rs b/module/core/derive_tools/tests/inc/deref/struct_named.rs new file mode 100644 index 0000000000..470670a206 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_named.rs @@ -0,0 +1,12 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref) ] +struct StructNamed +{ + a : String, + b : i32, +} + +include!( "./only_tests/struct_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_named_empty.rs b/module/core/derive_tools/tests/inc/deref/struct_named_empty.rs new file mode 100644 index 0000000000..ebe217835d --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_named_empty.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive( Deref ) ] +struct StructNamedEmpty{} + +include!( "./only_tests/struct_named_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_named_empty_manual.rs b/module/core/derive_tools/tests/inc/deref/struct_named_empty_manual.rs new file mode 100644 index 0000000000..efd92be335 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_named_empty_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct StructNamedEmpty{} + +impl Deref for StructNamedEmpty +{ + type Target = (); + fn deref( &self ) -> &Self::Target + { + &() + } +} + +include!( "./only_tests/struct_named_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_named_manual.rs b/module/core/derive_tools/tests/inc/deref/struct_named_manual.rs new file mode 100644 index 0000000000..88e31246e6 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_named_manual.rs @@ -0,0 +1,19 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct StructNamed +{ + a : String, + b : i32, +} + +impl Deref for StructNamed +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + &self.a + } +} + +include!( "./only_tests/struct_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_tuple.rs b/module/core/derive_tools/tests/inc/deref/struct_tuple.rs new file mode 100644 index 0000000000..29c4b3c4ff --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_tuple.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive ( Deref ) ] +struct StructTuple( String, i32 ); + +include!( "./only_tests/struct_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_tuple_empty.rs b/module/core/derive_tools/tests/inc/deref/struct_tuple_empty.rs new file mode 100644 index 0000000000..57e2ea7257 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_tuple_empty.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive ( Deref ) ] +struct StructTupleEmpty(); + +include!( "./only_tests/struct_tuple_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_tuple_empty_manual.rs b/module/core/derive_tools/tests/inc/deref/struct_tuple_empty_manual.rs new file mode 100644 index 0000000000..b239eccd44 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_tuple_empty_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct StructTupleEmpty(); + +impl Deref for StructTupleEmpty +{ + type Target = (); + fn deref( &self ) -> &Self::Target + { + &() + } +} + +include!( "./only_tests/struct_tuple_empty.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_tuple_manual.rs b/module/core/derive_tools/tests/inc/deref/struct_tuple_manual.rs new file mode 100644 index 0000000000..7a97225d3b --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_tuple_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct StructTuple( String, i32 ); + +impl Deref for StructTuple +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_tests/struct_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_unit.rs b/module/core/derive_tools/tests/inc/deref/struct_unit.rs new file mode 100644 index 0000000000..30c742a68e --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_unit.rs @@ -0,0 +1,8 @@ +use core::ops::Deref; +use derive_tools::Deref; + +#[ allow( dead_code ) ] +#[ derive ( Deref ) ] +struct StructUnit; + +include!( "./only_tests/struct_unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref/struct_unit_manual.rs b/module/core/derive_tools/tests/inc/deref/struct_unit_manual.rs new file mode 100644 index 0000000000..c43a711d50 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref/struct_unit_manual.rs @@ -0,0 +1,15 @@ +use core::ops::Deref; + +#[ allow( dead_code ) ] +struct StructUnit; + +impl Deref for StructUnit +{ + type Target = (); + fn deref( &self ) -> &Self::Target + { + &() + } +} + +include!( "./only_tests/struct_unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_manual_test.rs b/module/core/derive_tools/tests/inc/deref_manual_test.rs new file mode 100644 index 0000000000..3ad2c5c1b4 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_manual_test.rs @@ -0,0 +1,34 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, ) ] +pub struct IsTransparentSimple( bool ); + +impl core::ops::Deref for IsTransparentSimple +{ + type Target = bool; + #[ inline ( always) ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct IsTransparentComplex< 'a, 'b : 'a, T, U : ToString + ?Sized, const N : usize >( &'a T, core::marker::PhantomData< &'b U > ) +where 'a : 'b, T : AsRef< U >; + +impl< 'a, 'b : 'a, T, U : ToString + ?Sized, const N : usize > core::ops::Deref for IsTransparentComplex< 'a, 'b, T, U, N > +where 'a : 'b, T : AsRef< U > +{ + type Target = &'a T; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +include!( "./only_test/deref.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/bounds_inlined.rs b/module/core/derive_tools/tests/inc/deref_mut/bounds_inlined.rs new file mode 100644 index 0000000000..ebb9fe65b6 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/bounds_inlined.rs @@ -0,0 +1,10 @@ +use core::fmt::Debug; + +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct BoundsInlined< T : ToString, U : Debug >( T, U ); + +include!( "./only_tests/bounds_inlined.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/bounds_inlined_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/bounds_inlined_manual.rs new file mode 100644 index 0000000000..84051196bf --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/bounds_inlined_manual.rs @@ -0,0 +1,24 @@ +use core::fmt::Debug; + +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct BoundsInlined< T : ToString, U : Debug >( T, U ); + +impl< T : ToString, U : Debug > Deref for BoundsInlined< T, U > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< T : ToString, U : Debug > DerefMut for BoundsInlined< T, U > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/bounds_inlined.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/bounds_mixed.rs b/module/core/derive_tools/tests/inc/deref_mut/bounds_mixed.rs new file mode 100644 index 0000000000..5b8d13196f --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/bounds_mixed.rs @@ -0,0 +1,12 @@ +use core::fmt::Debug; + +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct BoundsMixed< T : ToString, U >( T, U ) +where + U : Debug; + +include!( "./only_tests/bounds_mixed.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/bounds_mixed_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/bounds_mixed_manual.rs new file mode 100644 index 0000000000..4bbfa33c21 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/bounds_mixed_manual.rs @@ -0,0 +1,31 @@ +use core::fmt::Debug; + +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct BoundsMixed< T : ToString, U >( T, U ) +where + U : Debug; + +impl< T : ToString, U > Deref for BoundsMixed< T, U > +where + U : Debug, +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< T : ToString, U > DerefMut for BoundsMixed< T, U > +where + U : Debug, +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + + +include!( "./only_tests/bounds_mixed.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/bounds_where.rs b/module/core/derive_tools/tests/inc/deref_mut/bounds_where.rs new file mode 100644 index 0000000000..25a61c35d1 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/bounds_where.rs @@ -0,0 +1,14 @@ +trait Trait<'a> {} +impl<'a> Trait<'a> for i32 {} + +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct BoundsWhere< T, U >( T, U ) +where + T : ToString, + for< 'a > U : Trait< 'a >; + +include!( "./only_tests/bounds_where.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/bounds_where_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/bounds_where_manual.rs new file mode 100644 index 0000000000..3a61604a87 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/bounds_where_manual.rs @@ -0,0 +1,34 @@ +trait Trait<'a> {} +impl<'a> Trait<'a> for i32 {} + +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct BoundsWhere< T, U >( T, U ) +where + T : ToString, + for< 'a > U : Trait< 'a >; + +impl< T, U > Deref for BoundsWhere< T, U > +where + T : ToString, + for< 'a > U : Trait< 'a > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< T, U > DerefMut for BoundsWhere< T, U > +where + T : ToString, + for< 'a > U : Trait< 'a > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/bounds_where.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/enum_named.rs b/module/core/derive_tools/tests/inc/deref_mut/enum_named.rs new file mode 100644 index 0000000000..f6ced02179 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/enum_named.rs @@ -0,0 +1,12 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code) ] +#[ derive( Deref, DerefMut ) ] +enum EnumNamed +{ + A { a : String, b : i32 }, + B { a : String, b : i32 }, +} + +include!( "./only_tests/enum_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/enum_named_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/enum_named_manual.rs new file mode 100644 index 0000000000..096c52cf20 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/enum_named_manual.rs @@ -0,0 +1,32 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code) ] +enum EnumNamed +{ + A { a : String, b : i32 }, + B { a : String, b : i32 }, +} + +impl Deref for EnumNamed +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + match self + { + Self::A { a : v, ..} | Self::B { a : v, .. } => v + } + } +} +impl DerefMut for EnumNamed +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + match self + { + Self::A { a : v, ..} | Self::B { a : v, .. } => v + } + } +} + +include!( "./only_tests/enum_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/enum_tuple.rs b/module/core/derive_tools/tests/inc/deref_mut/enum_tuple.rs new file mode 100644 index 0000000000..8957e47e25 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/enum_tuple.rs @@ -0,0 +1,12 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code) ] +#[ derive( Deref, DerefMut ) ] +enum EnumTuple +{ + A( String, i32 ), + B( String, i32 ), +} + +include!( "./only_tests/enum_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/enum_tuple_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/enum_tuple_manual.rs new file mode 100644 index 0000000000..c04408ef45 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/enum_tuple_manual.rs @@ -0,0 +1,32 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code) ] +enum EnumTuple +{ + A( String, i32 ), + B( String, i32 ), +} + +impl Deref for EnumTuple +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + match self + { + Self::A( v, .. ) | Self::B( v, .. ) => v + } + } +} +impl DerefMut for EnumTuple +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + match self + { + Self::A( v, .. ) | Self::B( v, .. ) => v + } + } +} + +include!( "./only_tests/enum_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_constants.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_constants.rs new file mode 100644 index 0000000000..33ff0ff89f --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_constants.rs @@ -0,0 +1,8 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct GenericsConstants< const N : usize >( i32 ); + +include!( "./only_tests/generics_constants.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_constants_default.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_constants_default.rs new file mode 100644 index 0000000000..a5591f7569 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_constants_default.rs @@ -0,0 +1,8 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct GenericsConstantsDefault< const N : usize = 0 >( i32 ); + +include!( "./only_tests/generics_constants_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_constants_default_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_constants_default_manual.rs new file mode 100644 index 0000000000..6348347253 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_constants_default_manual.rs @@ -0,0 +1,22 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct GenericsConstantsDefault< const N : usize = 0 >( i32 ); + +impl< const N : usize > Deref for GenericsConstantsDefault< N > +{ + type Target = i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< const N : usize > DerefMut for GenericsConstantsDefault< N > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/generics_constants_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_constants_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_constants_manual.rs new file mode 100644 index 0000000000..efe320d565 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_constants_manual.rs @@ -0,0 +1,22 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct GenericsConstants< const N : usize >( i32 ); + +impl< const N : usize > Deref for GenericsConstants< N > +{ + type Target = i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< const N : usize > DerefMut for GenericsConstants< N > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/generics_constants.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes.rs new file mode 100644 index 0000000000..3a3ff17bdd --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes.rs @@ -0,0 +1,8 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct GenericsLifetimes< 'a >( &'a i32 ); + +include!( "./only_tests/generics_lifetimes.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes_manual.rs new file mode 100644 index 0000000000..7d16d699c9 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_lifetimes_manual.rs @@ -0,0 +1,22 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct GenericsLifetimes< 'a >( &'a i32 ); + +impl< 'a > Deref for GenericsLifetimes< 'a > +{ + type Target = &'a i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< 'a > DerefMut for GenericsLifetimes< 'a > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/generics_lifetimes.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_types.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_types.rs new file mode 100644 index 0000000000..dc64f4ec43 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_types.rs @@ -0,0 +1,8 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct GenericsTypes< T >( T ); + +include!( "./only_tests/generics_types.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_types_default.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_types_default.rs new file mode 100644 index 0000000000..8680954981 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_types_default.rs @@ -0,0 +1,8 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive ( Deref, DerefMut ) ] +struct GenericsTypesDefault< T = i32 >( T ); + +include!( "./only_tests/generics_types_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_types_default_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_types_default_manual.rs new file mode 100644 index 0000000000..00b41e2ece --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_types_default_manual.rs @@ -0,0 +1,22 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct GenericsTypesDefault< T = i32 >( T ); + +impl< T > Deref for GenericsTypesDefault< T > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< T > DerefMut for GenericsTypesDefault< T > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/generics_types_default.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/generics_types_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/generics_types_manual.rs new file mode 100644 index 0000000000..2bdeb3183f --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/generics_types_manual.rs @@ -0,0 +1,22 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct GenericsTypes< T >( T ); + +impl< T > Deref for GenericsTypes< T > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< T > DerefMut for GenericsTypes< T > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/generics_types.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/name_collisions.rs b/module/core/derive_tools/tests/inc/deref_mut/name_collisions.rs new file mode 100644 index 0000000000..66f82b0fb1 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/name_collisions.rs @@ -0,0 +1,23 @@ +#![ allow( non_snake_case ) ] +#![ allow( unused_imports ) ] + +use ::core::ops::Deref; +use derive_tools::{ Deref, DerefMut }; + +pub mod core {} +pub mod std {} +pub mod marker {} + +pub mod FromString {} +pub mod FromPair {} +pub mod FromBin {} + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct NameCollisions +{ + a : i32, + b : String, +} + +include!( "./only_tests/name_collisions.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_inlined.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_inlined.rs new file mode 100644 index 0000000000..c70dca1ce0 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_inlined.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = BoundsInlined::< String, i32 >( "boo".into(), 3 ); + *a = "foo".into(); + let exp = "foo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_mixed.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_mixed.rs new file mode 100644 index 0000000000..d511bc31cf --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_mixed.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = BoundsMixed::< String, i32 >( "boo".into(), 3 ); + *a = "foo".into(); + let exp = "foo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_where.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_where.rs new file mode 100644 index 0000000000..4606689250 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/bounds_where.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = BoundsWhere::< String, i32 >( "boo".into(), 3 ); + *a = "foo".into(); + let exp = "foo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_named.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_named.rs new file mode 100644 index 0000000000..a659c7aaeb --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_named.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = EnumNamed::A { a : "boo".into(), b : 3 }; + *a = "foo".into(); + let exp = "foo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_tuple.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_tuple.rs new file mode 100644 index 0000000000..5228288f0a --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/enum_tuple.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = EnumTuple::A( "boo".into(), 3 ); + *a = "foo".into(); + let exp = "foo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants.rs new file mode 100644 index 0000000000..54b9f97fd0 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = GenericsConstants::< 0 >( 5 ); + *a = -5; + let exp = &-5; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants_default.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants_default.rs new file mode 100644 index 0000000000..3430c4e252 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_constants_default.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = GenericsConstantsDefault::< 0 >( 5 ); + *a = -5; + let exp = &-5; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_lifetimes.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_lifetimes.rs new file mode 100644 index 0000000000..9428644f06 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_lifetimes.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = GenericsLifetimes( &3 ); + *a = &-3; + let exp = &&-3; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types.rs new file mode 100644 index 0000000000..336a59148a --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = GenericsTypes::< &str >( "boo" ); + *a = "foo"; + let got = &"foo"; + let exp = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types_default.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types_default.rs new file mode 100644 index 0000000000..efc09bda56 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/generics_types_default.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = GenericsTypesDefault( 2 ); + *a = -2; + let got = &-2; + let exp = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/name_collisions.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/name_collisions.rs new file mode 100644 index 0000000000..f2a24e90a7 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/name_collisions.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = NameCollisions { a : 5, b : "boo".into() }; + *a = -5; + let exp = &-5; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_named.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_named.rs new file mode 100644 index 0000000000..edcacf11f1 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_named.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = StructNamed{ a : "boo".into(), b : 3 }; + *a = "foo".into(); + let exp = "foo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_tuple.rs b/module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_tuple.rs new file mode 100644 index 0000000000..a36de0ea6f --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/only_tests/struct_tuple.rs @@ -0,0 +1,9 @@ +#[ test ] +fn deref_mut() +{ + let mut a = StructTuple( "boo".into(), 3 ); + *a = "foo".into(); + let exp = "foo"; + let got = a.deref(); + assert_eq!(got, exp); +} diff --git a/module/core/derive_tools/tests/inc/deref_mut/struct_named.rs b/module/core/derive_tools/tests/inc/deref_mut/struct_named.rs new file mode 100644 index 0000000000..4cf35f59df --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/struct_named.rs @@ -0,0 +1,12 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive( Deref, DerefMut ) ] +struct StructNamed +{ + a : String, + b : i32, +} + +include!( "./only_tests/struct_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/struct_named_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/struct_named_manual.rs new file mode 100644 index 0000000000..24cff7f14a --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/struct_named_manual.rs @@ -0,0 +1,26 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct StructNamed +{ + a : String, + b : i32, +} + +impl Deref for StructNamed +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + &self.a + } +} +impl DerefMut for StructNamed +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.a + } +} + +include!( "./only_tests/struct_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/struct_tuple.rs b/module/core/derive_tools/tests/inc/deref_mut/struct_tuple.rs new file mode 100644 index 0000000000..5d5d439859 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/struct_tuple.rs @@ -0,0 +1,8 @@ +use core::ops::{ Deref }; +use derive_tools::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +#[ derive ( Deref, DerefMut ) ] +struct StructTuple( String, i32 ); + +include!( "./only_tests/struct_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut/struct_tuple_manual.rs b/module/core/derive_tools/tests/inc/deref_mut/struct_tuple_manual.rs new file mode 100644 index 0000000000..de82ac329c --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut/struct_tuple_manual.rs @@ -0,0 +1,22 @@ +use core::ops::{ Deref, DerefMut }; + +#[ allow( dead_code ) ] +struct StructTuple( String, i32 ); + +impl Deref for StructTuple +{ + type Target = String; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl DerefMut for StructTuple +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_tests/struct_tuple.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut_manual_test.rs b/module/core/derive_tools/tests/inc/deref_mut_manual_test.rs new file mode 100644 index 0000000000..a5541fbc52 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut_manual_test.rs @@ -0,0 +1,53 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, ) ] +pub struct IsTransparentSimple( bool ); + +impl core::ops::Deref for IsTransparentSimple +{ + type Target = bool; + #[ inline ( always) ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +impl core::ops::DerefMut for IsTransparentSimple +{ + #[ inline( always ) ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct IsTransparentComplex< 'a, 'b : 'a, T, U : ToString + ?Sized, const N : usize >( &'a T, core::marker::PhantomData< &'b U > ) +where 'a : 'b, T : AsRef< U >; + +impl< 'a, 'b : 'a, T, U : ToString + ?Sized, const N : usize > core::ops::Deref for IsTransparentComplex< 'a, 'b, T, U, N > +where 'a : 'b, T : AsRef< U > +{ + type Target = &'a T; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +impl< 'a, 'b : 'a, T, U : ToString + ?Sized, const N : usize > core::ops::DerefMut for IsTransparentComplex< 'a, 'b, T, U, N > +where 'a : 'b, T : AsRef< U > +{ + #[ inline( always ) ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +include!( "./only_test/deref_mut.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_mut_test.rs b/module/core/derive_tools/tests/inc/deref_mut_test.rs new file mode 100644 index 0000000000..aae9db0775 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_mut_test.rs @@ -0,0 +1,15 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::Deref, the_module::DerefMut ) ] +pub struct IsTransparentSimple( bool ); + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::Deref, the_module::DerefMut ) ] +pub struct IsTransparentComplex< 'a, 'b : 'a, T, U : ToString + ?Sized, const N : usize >( &'a T, core::marker::PhantomData< &'b U > ) +where + 'a : 'b, + T : AsRef< U >; + +include!( "./only_test/deref_mut.rs" ); diff --git a/module/core/derive_tools/tests/inc/deref_test.rs b/module/core/derive_tools/tests/inc/deref_test.rs new file mode 100644 index 0000000000..df445ac9b4 --- /dev/null +++ b/module/core/derive_tools/tests/inc/deref_test.rs @@ -0,0 +1,15 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::Deref ) ] +pub struct IsTransparentSimple( bool ); + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::Deref ) ] +pub struct IsTransparentComplex< 'a, 'b : 'a, T, U : ToString + ?Sized, const N : usize >( &'a T, core::marker::PhantomData< &'b U > ) +where + 'a : 'b, + T : AsRef< U >; + +include!( "./only_test/deref.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/manual_test.rs b/module/core/derive_tools/tests/inc/from/manual_test.rs new file mode 100644 index 0000000000..4add4ff66b --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/manual_test.rs @@ -0,0 +1,18 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct IsTransparent( bool ); + +impl From< bool > for IsTransparent +{ + #[ inline( always ) ] + fn from( src : bool ) -> Self + { + Self( src ) + } +} + +include!( "./only_test/basic.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/multiple_manual_test.rs b/module/core/derive_tools/tests/inc/from/multiple_manual_test.rs new file mode 100644 index 0000000000..b44fc6b651 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/multiple_manual_test.rs @@ -0,0 +1,15 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq ) ] +struct StructWithManyFields( i32, bool ); + +impl From< ( i32, bool ) > for StructWithManyFields +{ + #[ inline( always ) ] + fn from( src : ( i32, bool ) ) -> Self + { + Self( src.0, src.1 ) + } +} + +include!( "./only_test/multiple.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/multiple_named_manual_test.rs b/module/core/derive_tools/tests/inc/from/multiple_named_manual_test.rs new file mode 100644 index 0000000000..02b756b5f5 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/multiple_named_manual_test.rs @@ -0,0 +1,19 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq ) ] +struct StructNamedFields +{ + a: i32, + b: bool, +} + +impl From< ( i32, bool ) > for StructNamedFields +{ + #[ inline( always ) ] + fn from( src : ( i32, bool ) ) -> Self + { + Self{ a: src.0, b: src.1 } + } +} + +include!( "./only_test/multiple_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/multiple_named_test.rs b/module/core/derive_tools/tests/inc/from/multiple_named_test.rs new file mode 100644 index 0000000000..ddb088c624 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/multiple_named_test.rs @@ -0,0 +1,10 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq, the_module::From ) ] +struct StructNamedFields +{ + a: i32, + b: bool, +} + +include!( "./only_test/multiple_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/multiple_test.rs b/module/core/derive_tools/tests/inc/from/multiple_test.rs new file mode 100644 index 0000000000..925cd66ca0 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/multiple_test.rs @@ -0,0 +1,6 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq, the_module::From ) ] +struct StructWithManyFields( i32, bool ); + +include!( "./only_test/multiple.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/named_manual_test.rs b/module/core/derive_tools/tests/inc/from/named_manual_test.rs new file mode 100644 index 0000000000..6118d32e69 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/named_manual_test.rs @@ -0,0 +1,18 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq ) ] +struct MyStruct +{ + a: i32, +} + +impl From< i32 > for MyStruct +{ + #[ inline( always ) ] + fn from( src : i32 ) -> Self + { + Self{ a: src } + } +} + +include!( "./only_test/named.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/named_test.rs b/module/core/derive_tools/tests/inc/from/named_test.rs new file mode 100644 index 0000000000..49a1e564d1 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/named_test.rs @@ -0,0 +1,9 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq, the_module::From ) ] +struct MyStruct +{ + a : i32, +} + +include!( "./only_test/named.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/only_test/basic.rs b/module/core/derive_tools/tests/inc/from/only_test/basic.rs new file mode 100644 index 0000000000..f7f591e3c0 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/basic.rs @@ -0,0 +1,33 @@ + +#[ test ] +fn from_test() +{ + + // let got = IsTransparent::default(); + // let exp = IsTransparent( true ); + // a_id!( got, exp ); + + let got = IsTransparent::from( true ); + let exp = IsTransparent( true ); + a_id!( got, exp ); + let got = IsTransparent::from( false ); + let exp = IsTransparent( false ); + a_id!( got, exp ); + + // let got : bool = IsTransparent::from( true ).into(); + // let exp = true; + // a_id!( got, exp ); + // let got : bool = IsTransparent::from( false ).into(); + // let exp = false; + // a_id!( got, exp ); + +// let got = IsTransparent::default(); +// let exp = true; +// a_id!( *got, exp ); +// +// let mut got = IsTransparent::default(); +// *got = false; +// let exp = false; +// a_id!( *got, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/from/only_test/multiple.rs b/module/core/derive_tools/tests/inc/from/only_test/multiple.rs new file mode 100644 index 0000000000..0386486e7c --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/multiple.rs @@ -0,0 +1,7 @@ +#[ test ] +fn from_named() +{ + let got : StructWithManyFields = StructWithManyFields::from((10, true)); + let exp = StructWithManyFields( 10 , true ); + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/from/only_test/multiple_named.rs b/module/core/derive_tools/tests/inc/from/only_test/multiple_named.rs new file mode 100644 index 0000000000..b88a4f3872 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/multiple_named.rs @@ -0,0 +1,7 @@ +#[ test ] +fn from_named() +{ + let got : StructNamedFields = StructNamedFields::from((10, true)); + let exp = StructNamedFields{ a : 10 , b : true }; + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/from/only_test/named.rs b/module/core/derive_tools/tests/inc/from/only_test/named.rs new file mode 100644 index 0000000000..d749625ce6 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/named.rs @@ -0,0 +1,7 @@ +#[ test ] +fn from_named() +{ + let got : MyStruct = MyStruct::from( 13 ); + let exp = MyStruct { a : 13 }; + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/from/only_test/unit.rs b/module/core/derive_tools/tests/inc/from/only_test/unit.rs new file mode 100644 index 0000000000..7e5b22ad51 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/unit.rs @@ -0,0 +1,7 @@ +#[ test ] +fn from_named() +{ + let got : UnitStruct = UnitStruct::from( () ); + let exp = UnitStruct; + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/from/only_test/variants.rs b/module/core/derive_tools/tests/inc/from/only_test/variants.rs new file mode 100644 index 0000000000..7ec89b1315 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/variants.rs @@ -0,0 +1,20 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn variant_from() +{ + + let got : GetData = From::from( "abc".to_string() ); + let exp = GetData::FromString( "abc".to_string() ); + a_id!( got, exp ); + + let got : GetData = From::from( ( "a".to_string(), "b".to_string() ) ); + let exp = GetData::FromPair( "a".to_string(), "b".to_string() ); + a_id!( got, exp ); + + let got : GetData = From::from( &b"abc"[ .. ] ); + let exp = GetData::FromBin( b"abc" ); + a_id!( got, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/from/only_test/variants_duplicates.rs b/module/core/derive_tools/tests/inc/from/only_test/variants_duplicates.rs new file mode 100644 index 0000000000..9b126ff42e --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/variants_duplicates.rs @@ -0,0 +1,20 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn variant_from_duplicates() +{ + + let got : GetData = From::from( &b"abc"[ .. ] ); + let exp = GetData::FromBin( b"abc" ); + a_id!( got, exp ); + + let got : GetData = From::from( "abc".to_string() ); + let exp = GetData::FromString2( "abc".to_string() ); + a_id!( got, exp ); + + let got : GetData = From::from( ( "a".to_string(), "b".to_string() ) ); + let exp = GetData::FromPair2( "a".to_string(), "b".to_string() ); + a_id!( got, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/from/only_test/variants_generics.rs b/module/core/derive_tools/tests/inc/from/only_test/variants_generics.rs new file mode 100644 index 0000000000..be2731277e --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/only_test/variants_generics.rs @@ -0,0 +1,12 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn variant_from() +{ + + let got : GetData< '_, str > = From::from( "abc" ); + let exp = GetData::< '_, str >::FromT( "abc" ); + a_id!( got, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/from/test.rs b/module/core/derive_tools/tests/inc/from/test.rs new file mode 100644 index 0000000000..1214ad5a43 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/test.rs @@ -0,0 +1,10 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::From ) ] +pub struct IsTransparent( bool ); + +// include!( "./manual/basic.rs" ); +include!( "./only_test/basic.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/unit_manual_test.rs b/module/core/derive_tools/tests/inc/from/unit_manual_test.rs new file mode 100644 index 0000000000..dc767e9fbb --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/unit_manual_test.rs @@ -0,0 +1,15 @@ +use super::*; + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +struct UnitStruct; + +impl From< () > for UnitStruct +{ + #[ inline( always ) ] + fn from( _src : () ) -> Self + { + Self + } +} + +include!( "./only_test/unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/unit_test.rs b/module/core/derive_tools/tests/inc/from/unit_test.rs new file mode 100644 index 0000000000..82690e5190 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/unit_test.rs @@ -0,0 +1,6 @@ +use super::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::From ) ] +struct UnitStruct; + +include!( "./only_test/unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_collisions.rs b/module/core/derive_tools/tests/inc/from/variants_collisions.rs new file mode 100644 index 0000000000..aefa3be96f --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_collisions.rs @@ -0,0 +1,27 @@ +#![ allow( non_snake_case ) ] +#![ allow( unused_imports ) ] +use super::*; + +pub mod core {} +pub mod std {} +pub mod marker {} + +pub mod FromString {} +pub mod FromPair {} +pub mod FromBin {} + +#[ derive( Debug, PartialEq, the_module::From ) ] +// #[ debug ] +pub enum GetData +{ + #[ allow( dead_code ) ] + Nothing, + FromString( String ), + FromPair( String, String ), + FromBin( &'static [ u8 ] ), +} + +// == begin of generated +// == end of generated + +include!( "./only_test/variants.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_derive.rs b/module/core/derive_tools/tests/inc/from/variants_derive.rs new file mode 100644 index 0000000000..27792afbdc --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_derive.rs @@ -0,0 +1,18 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::From ) ] +// #[ debug ] +pub enum GetData +{ + #[ allow( dead_code ) ] + Nothing, + FromString( String ), + FromPair( String, String ), + FromBin( &'static [ u8 ] ), +} + +// == begin of generated +// == end of generated + +include!( "./only_test/variants.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_duplicates_all_off.rs b/module/core/derive_tools/tests/inc/from/variants_duplicates_all_off.rs new file mode 100644 index 0000000000..1eb00d2920 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_duplicates_all_off.rs @@ -0,0 +1,45 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::From ) ] +// #[ debug ] +pub enum GetData +{ + Nothing, + Nothing2, + #[ from( off ) ] + FromString( String ), + #[ from( off ) ] + FromString2( String ), + #[ from( off ) ] + FromPair( String, String ), + #[ from( off ) ] + FromPair2( String, String ), + FromBin( &'static [ u8 ] ), + Nothing3, +} + +impl From< String > for GetData +{ + #[ inline ] + fn from( src : String ) -> Self + { + Self::FromString2( src ) + } +} + +impl From< ( String, String ) > for GetData +{ + #[ inline ] + fn from( src : ( String, String ) ) -> Self + { + Self::FromPair2( src.0, src.1 ) + } +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/variants_duplicates.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_duplicates_some_off.rs b/module/core/derive_tools/tests/inc/from/variants_duplicates_some_off.rs new file mode 100644 index 0000000000..094d57a5f1 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_duplicates_some_off.rs @@ -0,0 +1,25 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::From ) ] +// #[ debug ] +pub enum GetData +{ + Nothing, + Nothing2, + #[ from( off ) ] + FromString( String ), + FromString2( String ), + #[ from( off ) ] + FromPair( String, String ), + FromPair2( String, String ), + FromBin( &'static [ u8 ] ), + Nothing3, +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/variants_duplicates.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_duplicates_some_off_default_off.rs b/module/core/derive_tools/tests/inc/from/variants_duplicates_some_off_default_off.rs new file mode 100644 index 0000000000..282b327e23 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_duplicates_some_off_default_off.rs @@ -0,0 +1,27 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::From ) ] +#[ from( off ) ] +// #[ debug ] +pub enum GetData +{ + Nothing, + Nothing2, + FromString( String ), + #[ from( on ) ] + // #[ from( debug ) ] + FromString2( String ), + FromPair( String, String ), + #[ from( on ) ] + FromPair2( String, String ), + #[ from( on ) ] + FromBin( &'static [ u8 ] ), + Nothing3, +} + +// == begin of generated +// == end of generated + +include!( "./only_test/variants_duplicates.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_generics.rs b/module/core/derive_tools/tests/inc/from/variants_generics.rs new file mode 100644 index 0000000000..c163e39b7f --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_generics.rs @@ -0,0 +1,17 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; +use derive_tools::From; + +#[ derive( Debug, PartialEq, From ) ] +// #[ debug ] +pub enum GetData< 'a, T : ToString + ?Sized = str > +{ + Nothing, + FromT( &'a T ), +} + +// == begin of generated +// == end of generated + +include!( "./only_test/variants_generics.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_generics_where.rs b/module/core/derive_tools/tests/inc/from/variants_generics_where.rs new file mode 100644 index 0000000000..ec96c5313b --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_generics_where.rs @@ -0,0 +1,19 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; +use derive_tools::From; + +#[ derive( Debug, PartialEq, From ) ] +// #[ debug ] +pub enum GetData< 'a, T = str > +where + T : ToString + ?Sized, +{ + Nothing, + FromT( &'a T ), +} + +// == begin of generated +// == end of generated + +include!( "./only_test/variants_generics.rs" ); diff --git a/module/core/derive_tools/tests/inc/from/variants_manual.rs b/module/core/derive_tools/tests/inc/from/variants_manual.rs new file mode 100644 index 0000000000..9cd6e1e723 --- /dev/null +++ b/module/core/derive_tools/tests/inc/from/variants_manual.rs @@ -0,0 +1,41 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq ) ] +pub enum GetData +{ + #[ allow( dead_code ) ] + Nothing, + FromString( String ), + FromPair( String, String ), + FromBin( &'static [ u8 ] ), +} + +impl From< String > for GetData +{ + #[ inline ] + fn from( src : String ) -> Self + { + Self::FromString( src ) + } +} + +impl From< ( String, String ) > for GetData +{ + #[ inline ] + fn from( src : ( String, String ) ) -> Self + { + Self::FromPair( src.0, src.1 ) + } +} + +impl From< &'static [ u8 ] > for GetData +{ + #[ inline ] + fn from( src : &'static [ u8 ] ) -> Self + { + Self::FromBin( src ) + } +} + +include!( "./only_test/variants.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/manual_test.rs b/module/core/derive_tools/tests/inc/inner_from/manual_test.rs new file mode 100644 index 0000000000..4313f84564 --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/manual_test.rs @@ -0,0 +1,18 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct IsTransparent( bool ); + +impl From< IsTransparent > for bool +{ + #[ inline( always ) ] + fn from( src : IsTransparent ) -> Self + { + src.0 + } +} + +include!( "./only_test/basic.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/multiple_manual_test.rs b/module/core/derive_tools/tests/inc/inner_from/multiple_manual_test.rs new file mode 100644 index 0000000000..2bc7587221 --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/multiple_manual_test.rs @@ -0,0 +1,15 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq ) ] +struct StructWithManyFields( i32, bool ); + +impl From< StructWithManyFields > for ( i32, bool ) +{ + #[ inline( always ) ] + fn from( src : StructWithManyFields ) -> Self + { + ( src.0, src.1 ) + } +} + +include!( "./only_test/multiple.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/multiple_named_manual_test.rs b/module/core/derive_tools/tests/inc/inner_from/multiple_named_manual_test.rs new file mode 100644 index 0000000000..0a934e454f --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/multiple_named_manual_test.rs @@ -0,0 +1,19 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq ) ] +struct StructNamedFields +{ + a: i32, + b: bool, +} + +impl From< StructNamedFields > for ( i32, bool ) +{ + #[ inline( always ) ] + fn from( src : StructNamedFields ) -> Self + { + ( src.a, src.b ) + } +} + +include!( "./only_test/multiple_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/multiple_named_test.rs b/module/core/derive_tools/tests/inc/inner_from/multiple_named_test.rs new file mode 100644 index 0000000000..6177841adf --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/multiple_named_test.rs @@ -0,0 +1,10 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq, the_module::InnerFrom ) ] +struct StructNamedFields +{ + a: i32, + b: bool, +} + +include!( "./only_test/multiple_named.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/multiple_test.rs b/module/core/derive_tools/tests/inc/inner_from/multiple_test.rs new file mode 100644 index 0000000000..c99e112ca4 --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/multiple_test.rs @@ -0,0 +1,6 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq, the_module::InnerFrom ) ] +struct StructWithManyFields( i32, bool ); + +include!( "./only_test/multiple.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/named_manual_test.rs b/module/core/derive_tools/tests/inc/inner_from/named_manual_test.rs new file mode 100644 index 0000000000..4d7805644d --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/named_manual_test.rs @@ -0,0 +1,18 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq ) ] +struct MyStruct +{ + a: i32, +} + +impl From< MyStruct > for i32 +{ + #[ inline( always ) ] + fn from( src : MyStruct ) -> Self + { + src.a + } +} + +include!( "./only_test/named.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/named_test.rs b/module/core/derive_tools/tests/inc/inner_from/named_test.rs new file mode 100644 index 0000000000..2f6d3ccccc --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/named_test.rs @@ -0,0 +1,9 @@ +use super::*; + +#[ derive( Debug, PartialEq, Eq, the_module::InnerFrom ) ] +struct MyStruct +{ + a: i32, +} + +include!( "./only_test/named.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/only_test/basic.rs b/module/core/derive_tools/tests/inc/inner_from/only_test/basic.rs new file mode 100644 index 0000000000..c791f1e60e --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/only_test/basic.rs @@ -0,0 +1,12 @@ +#[ test ] +fn from_outer_test() +{ + + let got : bool = IsTransparent( true ).into(); + let exp = true; + a_id!( got, exp ); + let got : bool = IsTransparent( false ).into(); + let exp = false; + a_id!( got, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/inner_from/only_test/multiple.rs b/module/core/derive_tools/tests/inc/inner_from/only_test/multiple.rs new file mode 100644 index 0000000000..776347fd66 --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/only_test/multiple.rs @@ -0,0 +1,7 @@ +#[ test ] +fn from_named() +{ + let got : ( i32, bool ) = StructWithManyFields( 10, true ).into(); + let exp = ( 10 , true ); + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/inner_from/only_test/multiple_named.rs b/module/core/derive_tools/tests/inc/inner_from/only_test/multiple_named.rs new file mode 100644 index 0000000000..05b9a66e9d --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/only_test/multiple_named.rs @@ -0,0 +1,7 @@ +#[ test ] +fn from_named() +{ + let got : ( i32, bool ) = StructNamedFields{ a: 10, b: true }.into(); + let exp = ( 10 , true ); + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/inner_from/only_test/named.rs b/module/core/derive_tools/tests/inc/inner_from/only_test/named.rs new file mode 100644 index 0000000000..a733f46367 --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/only_test/named.rs @@ -0,0 +1,7 @@ +#[ test ] +fn inner_from_named() +{ + let got : i32 = MyStruct{ a: 10 }.into(); + let exp = 10; + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/inner_from/only_test/unit.rs b/module/core/derive_tools/tests/inc/inner_from/only_test/unit.rs new file mode 100644 index 0000000000..15f71b4688 --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/only_test/unit.rs @@ -0,0 +1,8 @@ +#[ test ] +fn inner_from_named() +{ + let s = UnitStruct; + let got : () = s.into(); + let exp = (); + a_id!( got, exp ); +} diff --git a/module/core/derive_tools/tests/inc/inner_from/test.rs b/module/core/derive_tools/tests/inc/inner_from/test.rs new file mode 100644 index 0000000000..25ff2921e0 --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/test.rs @@ -0,0 +1,9 @@ +use super::*; + +// use diagnostics_tools::prelude::*; +// use derives::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::InnerFrom ) ] +pub struct IsTransparent( bool ); + +include!( "./only_test/basic.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/unit_manual_test.rs b/module/core/derive_tools/tests/inc/inner_from/unit_manual_test.rs new file mode 100644 index 0000000000..351db13dbb --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/unit_manual_test.rs @@ -0,0 +1,16 @@ +use super::*; + +#[ derive( Debug, Clone, Copy, PartialEq ) ] +pub struct UnitStruct; + +impl From< UnitStruct > for () +{ + #[ inline( always ) ] + fn from( _src : UnitStruct ) -> Self + { + () + } +} + +// include!( "./manual/basic.rs" ); +include!( "./only_test/unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/inner_from/unit_test.rs b/module/core/derive_tools/tests/inc/inner_from/unit_test.rs new file mode 100644 index 0000000000..6d60f9cc6a --- /dev/null +++ b/module/core/derive_tools/tests/inc/inner_from/unit_test.rs @@ -0,0 +1,7 @@ +use super::*; + +#[ derive( Debug, Clone, Copy, PartialEq, the_module::InnerFrom ) ] +pub struct UnitStruct; + + +include!( "./only_test/unit.rs" ); diff --git a/module/core/derive_tools/tests/inc/mod.rs b/module/core/derive_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..518d8757d4 --- /dev/null +++ b/module/core/derive_tools/tests/inc/mod.rs @@ -0,0 +1,199 @@ +use super::*; + +// = import tests of clone_dyn + +#[ cfg( feature = "derive_clone_dyn" ) ] +#[ path = "../../../../core/clone_dyn/tests/inc/mod.rs" ] +mod clone_dyn_test; + +// = import tests of variadic_from + +#[ cfg( any( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] +#[ path = "../../../../../module/core/variadic_from/tests/inc/mod.rs" ] +mod variadic_from_test; + +// = own tests + +mod all_manual_test; +#[ cfg +( + all + ( + feature = "derive_as_mut", + feature = "derive_as_ref", + feature = "derive_deref", + feature = "derive_deref_mut", + feature = "derive_from", + feature = "derive_inner_from", + ) +)] +mod all_test; + +mod basic_test; + +mod as_mut_manual_test; +#[ cfg( feature = "derive_as_mut" ) ] +mod as_mut_test; + +mod as_ref_manual_test; +#[ cfg( feature = "derive_as_ref" ) ] +mod as_ref_test; + +#[ cfg( feature = "derive_deref" ) ] +#[ path = "deref" ] +mod deref_tests +{ + #[ allow( unused_imports ) ] + use super::*; + + // + + mod struct_unit; + mod struct_unit_manual; + mod struct_tuple; + mod struct_tuple_manual; + mod struct_tuple_empty; + mod struct_tuple_empty_manual; + mod struct_named; + mod struct_named_manual; + mod struct_named_empty; + mod struct_named_empty_manual; + + mod enum_unit; + mod enum_unit_manual; + mod enum_tuple; + mod enum_tuple_manual; + mod enum_tuple_empty; + mod enum_tuple_empty_manual; + mod enum_named; + mod enum_named_manual; + mod enum_named_empty; + mod enum_named_empty_manual; + + // + + mod generics_lifetimes; + mod generics_lifetimes_manual; + + mod generics_types; + mod generics_types_manual; + mod generics_types_default; + mod generics_types_default_manual; + + mod generics_constants; + mod generics_constants_manual; + mod generics_constants_default; + mod generics_constants_default_manual; + + // + + mod bounds_inlined; + mod bounds_inlined_manual; + mod bounds_where; + mod bounds_where_manual; + mod bounds_mixed; + mod bounds_mixed_manual; + + // + + mod name_collisions; +} + +#[ cfg( feature = "derive_deref_mut" ) ] +#[ path = "deref_mut" ] +mod deref_mut_tests +{ + #[ allow( unused_imports ) ] + use super::*; + + // + + mod struct_tuple; + mod struct_tuple_manual; + mod struct_named; + mod struct_named_manual; + + mod enum_tuple; + mod enum_tuple_manual; + mod enum_named; + mod enum_named_manual; + + // + + mod generics_lifetimes; + mod generics_lifetimes_manual; + + mod generics_types; + mod generics_types_manual; + mod generics_types_default; + mod generics_types_default_manual; + + mod generics_constants; + mod generics_constants_manual; + mod generics_constants_default; + mod generics_constants_default_manual; + + // + + mod bounds_inlined; + mod bounds_inlined_manual; + mod bounds_where; + mod bounds_where_manual; + mod bounds_mixed; + mod bounds_mixed_manual; + + // + + mod name_collisions; +} + +#[ cfg( feature = "derive_from" ) ] +#[ path = "from" ] +mod from +{ + #[ allow( unused_imports ) ] + use super::*; + + mod named_test; + mod named_manual_test; + + mod manual_test; + mod multiple_named_manual_test; + mod multiple_manual_test; + mod unit_manual_test; + mod test; + mod multiple_named_test; + mod unit_test; + mod multiple_test; + + mod variants_manual; + mod variants_derive; + + mod variants_duplicates_all_off; + mod variants_duplicates_some_off; + mod variants_duplicates_some_off_default_off; + + mod variants_generics; + mod variants_generics_where; + mod variants_collisions; +} + +#[ cfg( feature = "derive_inner_from" ) ] +#[ path = "inner_from" ] +mod inner_from_tests +{ + #[ allow( unused_imports ) ] + use super::*; + + mod manual_test; + mod named_manual_test; + mod multiple_named_manual_test; + mod multiple_manual_test; + mod unit_manual_test; + mod test; + mod named_test; + mod multiple_named_test; + mod unit_test; + mod multiple_test; + +} diff --git a/module/core/derive_tools/tests/inc/only_test/all.rs b/module/core/derive_tools/tests/inc/only_test/all.rs new file mode 100644 index 0000000000..5fe5831993 --- /dev/null +++ b/module/core/derive_tools/tests/inc/only_test/all.rs @@ -0,0 +1,54 @@ + +#[ test ] +fn basic_test() +{ + + let got = IsTransparent::default(); + let exp = IsTransparent( true ); + a_id!( got, exp ); + + // From + + let got = IsTransparent::from( true ); + let exp = IsTransparent( true ); + a_id!( got, exp ); + let got = IsTransparent::from( false ); + let exp = IsTransparent( false ); + a_id!( got, exp ); + + // InnerFrom + + let got : bool = IsTransparent::from( true ).into(); + let exp = true; + a_id!( got, exp ); + let got : bool = IsTransparent::from( false ).into(); + let exp = false; + a_id!( got, exp ); + + // Deref + + let got = IsTransparent( true ); + let exp = true; + a_id!( *got, exp ); + + // DerefMut + + let mut got = IsTransparent( true ); + *got = false; + let exp = false; + a_id!( *got, exp ); + + // AsRef + + let got = IsTransparent( true ); + let exp = true; + a_id!( got.as_ref(), &exp ); + + // AsMut + + let mut got = IsTransparent( true ); + *got.as_mut() = false; + let exp = false; + a_id!( got.0, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/only_test/as_mut.rs b/module/core/derive_tools/tests/inc/only_test/as_mut.rs new file mode 100644 index 0000000000..cd92a419f6 --- /dev/null +++ b/module/core/derive_tools/tests/inc/only_test/as_mut.rs @@ -0,0 +1,13 @@ + +#[ test ] +fn as_mut_test() +{ + + // AsMut + + let mut got = IsTransparent( true ); + *got.as_mut() = false; + let exp = false; + a_id!( got.0, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/only_test/as_ref.rs b/module/core/derive_tools/tests/inc/only_test/as_ref.rs new file mode 100644 index 0000000000..586ea41948 --- /dev/null +++ b/module/core/derive_tools/tests/inc/only_test/as_ref.rs @@ -0,0 +1,12 @@ + +#[ test ] +fn as_ref_test() +{ + + // AsRef + + let got = IsTransparent( true ); + let exp = true; + a_id!( got.as_ref(), &exp ); + +} diff --git a/module/core/derive_tools/tests/inc/only_test/deref.rs b/module/core/derive_tools/tests/inc/only_test/deref.rs new file mode 100644 index 0000000000..2c5447dc84 --- /dev/null +++ b/module/core/derive_tools/tests/inc/only_test/deref.rs @@ -0,0 +1,26 @@ + +#[ test ] +fn simple() +{ + + // Deref + + let got = IsTransparentSimple( true ); + let exp = true; + a_id!( *got, exp ); + +} + +#[ test ] +fn complex() +{ + + // Deref + + let got_tmp = "start".to_string(); + let got = IsTransparentComplex::< '_, '_, String, str, 0 >( &got_tmp, core::marker::PhantomData ); + let exp_tmp = "start".to_string(); + let exp = &exp_tmp; + assert_eq!( *got, exp ); + +} diff --git a/module/core/derive_tools/tests/inc/only_test/deref_mut.rs b/module/core/derive_tools/tests/inc/only_test/deref_mut.rs new file mode 100644 index 0000000000..ab36833c71 --- /dev/null +++ b/module/core/derive_tools/tests/inc/only_test/deref_mut.rs @@ -0,0 +1,43 @@ + +#[ test ] +fn simple() +{ + + // Deref + + let got = IsTransparentSimple( true ); + let exp = true; + a_id!( *got, exp ); + + // DerefMut + + let mut got = IsTransparentSimple( true ); + *got = false; + let exp = false; + a_id!( *got, exp ); + +} + +#[ test ] +fn complex() +{ + + // Deref + + let got_tmp = "start".to_string(); + let got = IsTransparentComplex::< '_, '_, String, str, 0 >( &got_tmp, core::marker::PhantomData ); + let exp_tmp = "start".to_string(); + let exp = &exp_tmp; + assert_eq!( *got, exp ); + + // DerefMut + + let got_tmp = "start".to_string(); + let mut got = IsTransparentComplex::< '_, '_, String, str, 0 >( &got_tmp, core::marker::PhantomData ); + let got_tmp = "end".to_string(); + *got = &got_tmp; + let exp_tmp = "end".to_string(); + let exp = &exp_tmp; + assert_eq!( *got, exp ); + +} diff --git a/module/core/derive_tools/tests/smoke_test.rs b/module/core/derive_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/derive_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/derive_tools/tests/tests.rs b/module/core/derive_tools/tests/tests.rs new file mode 100644 index 0000000000..766eadcfe7 --- /dev/null +++ b/module/core/derive_tools/tests/tests.rs @@ -0,0 +1,9 @@ + +#[ allow( unused_imports ) ] +use derive_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; + diff --git a/module/core/derive_tools_meta/Cargo.toml b/module/core/derive_tools_meta/Cargo.toml new file mode 100644 index 0000000000..eade555900 --- /dev/null +++ b/module/core/derive_tools_meta/Cargo.toml @@ -0,0 +1,74 @@ +[package] +name = "derive_tools_meta" +version = "0.23.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/derive_tools_meta" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/derive_tools_meta" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/derive_tools_meta" +description = """ +Collection of derives which extend STD. Its meta module. Don't use directly. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[lib] +proc-macro = true + +[features] +default = [ + "enabled", + "derive_deref_mut", + "derive_deref", + "derive_from", + "derive_new", + "derive_inner_from", + "derive_as_ref", + "derive_as_mut", + "derive_variadic_from", +] +full = [ + "enabled", + "derive_deref_mut", + "derive_deref", + "derive_from", + "derive_new", + "derive_inner_from", + "derive_as_ref", + "derive_as_mut", + "derive_variadic_from", +] +enabled = [ "macro_tools/enabled", "iter_tools/enabled", "former_types/enabled" ] + +derive_as_mut = [] +derive_as_ref = [] +derive_deref = [] +derive_deref_mut = [] +derive_from = [] +derive_new = [] +derive_inner_from = [] +derive_variadic_from = [] + +[dependencies] +# xxx : qqq : optimize features set +macro_tools = { workspace = true, features = [ "full" ] } +iter_tools = { workspace = true, features = [ "full" ] } +former_types = { workspace = true, features = [ "types_component_assign" ] } +const_format = { version = "0.2.32" } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/derive_tools_meta/License b/module/core/derive_tools_meta/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/derive_tools_meta/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/derive_tools_meta/Readme.md b/module/core/derive_tools_meta/Readme.md new file mode 100644 index 0000000000..53f7fba9f0 --- /dev/null +++ b/module/core/derive_tools_meta/Readme.md @@ -0,0 +1,9 @@ + +# Module :: derive_tools_meta + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_meta_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_meta_push.yml) [![docs.rs](https://img.shields.io/docsrs/derive_tools_meta?color=e3e8f0&logo=docs.rs)](https://docs.rs/derive_tools_meta) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of derives which extend STD. Its meta module. + +Don't use it directly. Instead use `derive_tools` which is front-end for `derive_tools_meta`. diff --git a/module/core/derive_tools_meta/src/derive.rs b/module/core/derive_tools_meta/src/derive.rs new file mode 100644 index 0000000000..5008fe2fab --- /dev/null +++ b/module/core/derive_tools_meta/src/derive.rs @@ -0,0 +1,28 @@ + +//! +//! Implement couple of derives of general-purpose. +//! + +#[ allow( unused_imports ) ] +use macro_tools::prelude::*; +// pub use macro_tools::{ Result, Many }; +pub use iter_tools as iter; + +#[ cfg( feature = "derive_as_mut" ) ] +pub mod as_mut; +#[ cfg( feature = "derive_as_ref" ) ] +pub mod as_ref; +#[ cfg( feature = "derive_deref" ) ] +pub mod deref; +#[ cfg( feature = "derive_deref_mut" ) ] +pub mod deref_mut; +#[ cfg( feature = "derive_from" ) ] +pub mod from; +#[ cfg( feature = "derive_inner_from" ) ] +pub mod inner_from; +#[ cfg( feature = "derive_new" ) ] +pub mod new; +#[ cfg( feature = "derive_variadic_from" ) ] +pub mod variadic_from; +#[ cfg( feature = "derive_reflect" ) ] +pub mod reflect; diff --git a/module/core/derive_tools_meta/src/derive/as_mut.rs b/module/core/derive_tools_meta/src/derive/as_mut.rs new file mode 100644 index 0000000000..5b51d648ae --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/as_mut.rs @@ -0,0 +1,31 @@ + +use super::*; +use macro_tools::{ attr, diag, item_struct, Result }; + +pub fn as_mut( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + let item_name = &parsed.ident; + let field_type = item_struct::first_field_type( &parsed )?; + + let result = qt! + { + impl AsMut< #field_type > for #item_name + { + fn as_mut( &mut self ) -> &mut #field_type + { + &mut self.0 + } + } + }; + + if has_debug + { + let about = format!( "derive : AsMut\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} diff --git a/module/core/derive_tools_meta/src/derive/as_ref.rs b/module/core/derive_tools_meta/src/derive/as_ref.rs new file mode 100644 index 0000000000..dba4eacacf --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/as_ref.rs @@ -0,0 +1,33 @@ + +use super::*; +use macro_tools::{ attr, diag, item_struct, Result }; + +// + +pub fn as_ref( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + let field_type = item_struct::first_field_type( &parsed )?; + let item_name = &parsed.ident; + + let result = qt! + { + impl AsRef< #field_type > for #item_name + { + fn as_ref( &self ) -> &#field_type + { + &self.0 + } + } + }; + + if has_debug + { + let about = format!( "derive : AsRef\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} diff --git a/module/core/derive_tools_meta/src/derive/deref.rs b/module/core/derive_tools_meta/src/derive/deref.rs new file mode 100644 index 0000000000..ac2217c1c8 --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/deref.rs @@ -0,0 +1,546 @@ +use super::*; +use macro_tools::{ attr, diag, generic_params, Result, struct_like::StructLike }; + +// + +pub fn deref( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< StructLike >( input )?; + let has_debug = attr::has_debug( parsed.attrs().iter() )?; + let item_name = &parsed.ident(); + + let ( _generics_with_defaults, generics_impl, generics_ty, generics_where ) + = generic_params::decompose( &parsed.generics() ); + + let result = match parsed + { + StructLike::Unit( _ ) => + { + generate_unit + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + ) + } + StructLike::Struct( ref item ) => + { + generate_struct + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &item.fields, + ) + } + StructLike::Enum( ref item ) => + { + generate_enum + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &item.variants, + ) + } + }?; + + if has_debug + { + let about = format!( "derive : Deref\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} + +/// Generates `Deref` implementation for unit structs and enums +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::Deref; +/// #[ derive( Deref ) ] +/// pub struct Struct; +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct; +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for Struct +/// { +/// type Target = (); +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// &() +/// } +/// } +/// ``` +/// +fn generate_unit +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, +) +-> Result< proc_macro2::TokenStream > +{ + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::Deref for #item_name< #generics_ty > + where + #generics_where + { + type Target = (); + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + &() + } + } + } + ) +} + +/// An aggregator function to generate `Deref` implementation for unit, tuple structs and the ones with named fields +fn generate_struct +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + fields : &syn::Fields, +) +-> Result< proc_macro2::TokenStream > +{ + match fields + { + + syn::Fields::Unit => + generate_unit + ( + item_name, + generics_impl, + generics_ty, + generics_where, + ), + + syn::Fields::Unnamed( fields ) => + generate_struct_tuple_fields + ( + item_name, + generics_impl, + generics_ty, + generics_where, + fields, + ), + + syn::Fields::Named( fields ) => + generate_struct_named_fields + ( + item_name, + generics_impl, + generics_ty, + generics_where, + fields, + ), + + } +} + +/// Generates `Deref` implementation for structs with tuple fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::Deref; +/// #[ derive( Deref ) ] +/// pub struct Struct( i32, Vec< String > ); +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct( i32, Vec< String > ); +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for Struct +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// &self.0 +/// } +/// } +/// ``` +/// +fn generate_struct_tuple_fields +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + fields : &syn::FieldsUnnamed, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = &fields.unnamed; + let field_type = match fields.first() + { + Some( field ) => &field.ty, + None => return generate_unit + ( + item_name, + generics_impl, + generics_ty, + generics_where, + ), + }; + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::Deref for #item_name< #generics_ty > + where + #generics_where + { + type Target = #field_type; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + } + ) +} + +/// Generates `Deref` implementation for structs with named fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::Deref; +/// #[ derive( Deref ) ] +/// pub struct Struct +/// { +/// a : i32, +/// b : Vec< String >, +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct +/// { +/// a : i32, +/// b : Vec< String >, +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for Struct +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// &self.a +/// } +/// } +/// ``` +/// +fn generate_struct_named_fields +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + fields : &syn::FieldsNamed, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = &fields.named; + let ( field_name, field_type ) = match fields.first() + { + Some( field ) => ( field.ident.as_ref().unwrap(), &field.ty ), + None => return generate_unit + ( + item_name, + generics_impl, + generics_ty, + generics_where, + ), + }; + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::Deref for #item_name< #generics_ty > + where + #generics_where + { + type Target = #field_type; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + &self.#field_name + } + } + } + ) +} + +/// An aggregator function to generate `Deref` implementation for unit, tuple enums and the ones with named fields +fn generate_enum +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variants : &syn::punctuated::Punctuated, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = match variants.first() + { + Some( variant ) => &variant.fields, + None => return generate_unit + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + ), + }; + + // error if fields have different types + if !variants.iter().skip(1).all(|v| &v.fields == fields) + { + return Err( syn::Error::new( variants.span(), "Variants must have the same type" ) ); + } + + let idents = variants.iter().map( | v | v.ident.clone() ).collect::< Vec< _ > >(); + + match fields + { + + syn::Fields::Unit => + generate_unit + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + ), + + syn::Fields::Unnamed( ref item ) => + generate_enum_tuple_variants + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &idents, + item, + ), + + syn::Fields::Named( ref item ) => + generate_enum_named_variants + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &idents, + item, + ), + + } +} + +/// Generates `Deref` implementation for enums with tuple fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::Deref; +/// #[ derive( Deref ) ] +/// pub enum E +/// { +/// A ( i32, Vec< String > ), +/// B ( i32, Vec< String > ), +/// C ( i32, Vec< String > ), +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub enum E +/// { +/// A ( i32, Vec< String > ), +/// B ( i32, Vec< String > ), +/// C ( i32, Vec< String > ), +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for E +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// match self +/// { +/// E::A( v, .. ) | E::B( v, .. ) | E::C( v, .. ) => v, +/// } +/// } +/// } +/// ``` +/// +fn generate_enum_tuple_variants +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variant_idents : &[ syn::Ident ], + fields : &syn::FieldsUnnamed, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = &fields.unnamed; + let field_ty = match fields.first() + { + Some( field ) => &field.ty, + None => return generate_unit + ( + item_name, + generics_impl, + generics_ty, + generics_where, + ), + }; + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::Deref for #item_name< #generics_ty > + where + #generics_where + { + type Target = #field_ty; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + match self + { + #( #item_name::#variant_idents( v, .. ) )|* => v + } + } + } + } + ) +} + +/// Generates `Deref` implementation for enums with named fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::Deref; +/// #[ derive( Deref ) ] +/// pub enum E +/// { +/// A { a : i32, b : Vec< String > }, +/// B { a : i32, b : Vec< String > }, +/// C { a : i32, b : Vec< String > }, +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub enum E +/// { +/// A { a : i32, b : Vec< String > }, +/// B { a : i32, b : Vec< String > }, +/// C { a : i32, b : Vec< String > }, +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for E +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// match self +/// { +/// E::A { a : v, .. } | E::B { a : v, .. } | E::C { a : v, .. } => v, +/// } +/// } +/// } +/// ``` +/// +fn generate_enum_named_variants +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variant_idents : &[ syn::Ident ], + fields : &syn::FieldsNamed, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = &fields.named; + let ( field_name, field_ty ) = match fields.first() + { + Some( field ) => ( field.ident.as_ref().unwrap(), &field.ty ), + None => return generate_unit + ( + item_name, + generics_impl, + generics_ty, + generics_where, + ), + }; + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::Deref for #item_name< #generics_ty > + where + #generics_where + { + type Target = #field_ty; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + match self + { + #( #item_name::#variant_idents{ #field_name : v, ..} )|* => v + } + } + } + } + ) +} diff --git a/module/core/derive_tools_meta/src/derive/deref_mut.rs b/module/core/derive_tools_meta/src/derive/deref_mut.rs new file mode 100644 index 0000000000..46d7a273f6 --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/deref_mut.rs @@ -0,0 +1,458 @@ +use super::*; +use macro_tools::{ attr, diag, generic_params, Result, struct_like::StructLike }; + +// + +pub fn deref_mut( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< StructLike >( input )?; + let has_debug = attr::has_debug( parsed.attrs().iter() )?; + let item_name = &parsed.ident(); + + let ( _generics_with_defaults, generics_impl, generics_ty, generics_where ) + = generic_params::decompose( &parsed.generics() ); + + let result = match parsed + { + + StructLike::Unit( _ ) => generate_unit(), + + StructLike::Struct( ref item ) => + generate_struct + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &item.fields, + ), + + StructLike::Enum( ref item ) => + generate_enum + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &item.variants, + ), + + }?; + + if has_debug + { + let about = format!( "derive : DerefMut\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} + +/// Placeholder for unit structs and enums. Does not generate any `DerefMut` implementation +fn generate_unit() -> Result< proc_macro2::TokenStream > +{ + Ok( qt!{} ) +} + +/// An aggregator function to generate `DerefMut` implementation for unit, tuple structs and the ones with named fields +fn generate_struct +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + fields : &syn::Fields, +) +-> Result< proc_macro2::TokenStream > +{ + match fields + { + + syn::Fields::Unit => generate_unit(), + + syn::Fields::Unnamed( _ ) => + generate_struct_tuple_fields + ( + item_name, + generics_impl, + generics_ty, + generics_where, + ), + + syn::Fields::Named( fields ) => + generate_struct_named_fields + ( + item_name, + generics_impl, + generics_ty, + generics_where, + fields, + ), + + } +} + +/// Generates `DerefMut` implementation for structs with tuple fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::{ Deref, DerefMut }; +/// #[ derive( Deref, DerefMut ) ] +/// pub struct Struct( i32, Vec< String > ); +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct( i32, Vec< String > ); +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for Struct +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// &self.0 +/// } +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::DerefMut for Struct +/// { +/// #[ inline( always ) ] +/// fn deref_mut( &mut self ) -> &mut Self::Target +/// { +/// &mut self.0 +/// } +/// } +/// ``` +/// +fn generate_struct_tuple_fields +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, +) +-> Result< proc_macro2::TokenStream > +{ + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::DerefMut for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + } + ) +} + +/// Generates `DerefMut` implementation for structs with named fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::{ Deref, DerefMut }; +/// #[ derive( Deref, DerefMut ) ] +/// pub struct Struct +/// { +/// a : i32, +/// b : Vec< String >, +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct +/// { +/// a : i32, +/// b : Vec< String >, +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for Struct +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// &self.a +/// } +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::DerefMut for Struct +/// { +/// #[ inline( always ) ] +/// fn deref_mut( &mut self ) -> &mut Self::Target +/// { +/// &mut self.a +/// } +/// } +/// ``` +/// +fn generate_struct_named_fields +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + fields : &syn::FieldsNamed, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = &fields.named; + let field_name = match fields.first() + { + Some( field ) => field.ident.as_ref().unwrap(), + None => return generate_unit(), + }; + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::DerefMut for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.#field_name + } + } + } + ) +} + +/// An aggregator function to generate `DerefMut` implementation for unit, tuple enums and the ones with named fields +fn generate_enum +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variants : &syn::punctuated::Punctuated, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = match variants.first() + { + Some( variant ) => &variant.fields, + None => return generate_unit(), + }; + + let idents = variants.iter().map( | v | v.ident.clone() ).collect::< Vec< _ > >(); + + match fields + { + + syn::Fields::Unit => generate_unit(), + + syn::Fields::Unnamed( _ ) => + generate_enum_tuple_variants + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &idents, + ), + + syn::Fields::Named( ref item ) => + generate_enum_named_variants + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &idents, + item, + ), + + } +} + +/// Generates `DerefMut` implementation for enums with tuple fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::{ Deref, DerefMut }; +/// #[ derive( Deref, DerefMut ) ] +/// pub enum E +/// { +/// A ( i32, Vec< String > ), +/// B ( i32, Vec< String > ), +/// C ( i32, Vec< String > ), +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub enum E +/// { +/// A ( i32, Vec< String > ), +/// B ( i32, Vec< String > ), +/// C ( i32, Vec< String > ), +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for E +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// match self +/// { +/// E::A( v, .. ) | E::B( v, .. ) | E::C( v, .. ) => v, +/// } +/// } +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::DerefMut for E +/// { +/// #[ inline( always ) ] +/// fn deref_mut( &mut self ) -> &mut Self::Target +/// { +/// match self +/// { +/// E::A( v, .. ) | E::B( v, .. ) | E::C( v, .. ) => v, +/// } +/// } +/// } +/// ``` +/// +fn generate_enum_tuple_variants +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variant_idents : &[ syn::Ident ], +) +-> Result< proc_macro2::TokenStream > +{ + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::DerefMut for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + match self + { + #( #item_name::#variant_idents( v, .. ) )|* => v + } + } + } + } + ) +} + +/// Generates `DerefMut` implementation for enums with named fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::{ Deref, DerefMut }; +/// #[ derive( Deref, DerefMut ) ] +/// pub enum E +/// { +/// A { a : i32, b : Vec< String > }, +/// B { a : i32, b : Vec< String > }, +/// C { a : i32, b : Vec< String > }, +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub enum E +/// { +/// A { a : i32, b : Vec< String > }, +/// B { a : i32, b : Vec< String > }, +/// C { a : i32, b : Vec< String > }, +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::Deref for E +/// { +/// type Target = i32; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// match self +/// { +/// E::A { a : v, .. } | E::B { a : v, .. } | E::C { a : v, .. } => v, +/// } +/// } +/// } +/// #[ automatically_derived ] +/// impl ::core::ops::DerefMut for E +/// { +/// #[ inline( always ) ] +/// fn deref_mut( &mut self ) -> &mut Self::Target +/// { +/// match self +/// { +/// E::A { a : v, .. } | E::B { a : v, .. } | E::C { a : v, .. } => v, +/// } +/// } +/// } +/// ``` +/// +fn generate_enum_named_variants +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variant_idents : &[ syn::Ident ], + fields : &syn::FieldsNamed, +) +-> Result< proc_macro2::TokenStream > +{ + let fields = &fields.named; + let field_name = match fields.first() + { + Some( field ) => field.ident.as_ref().unwrap(), + None => return generate_unit(), + }; + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > ::core::ops::DerefMut for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + match self + { + #( #item_name::#variant_idents{ #field_name : v, ..} )|* => v + } + } + } + } + ) +} diff --git a/module/core/derive_tools_meta/src/derive/from.rs b/module/core/derive_tools_meta/src/derive/from.rs new file mode 100644 index 0000000000..65334d453d --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/from.rs @@ -0,0 +1,544 @@ +use super::*; +use macro_tools:: +{ + attr, + diag, + generic_params, + item_struct, + struct_like::StructLike, + Result, +}; + +mod field_attributes; +use field_attributes::*; +mod item_attributes; +use item_attributes::*; + +// + +pub fn from( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + // use macro_tools::quote::ToTokens; + + let original_input = input.clone(); + let parsed = syn::parse::< StructLike >( input )?; + let has_debug = attr::has_debug( parsed.attrs().iter() )?; + let item_attrs = ItemAttributes::from_attrs( parsed.attrs().iter() )?; + let item_name = &parsed.ident(); + + let ( _generics_with_defaults, generics_impl, generics_ty, generics_where ) + = generic_params::decompose( &parsed.generics() ); + + let result = match parsed + { + StructLike::Unit( ref item ) | StructLike::Struct( ref item ) => + { + + let mut field_types = item_struct::field_types( &item ); + let field_names = item_struct::field_names( &item ); + + match ( field_types.len(), field_names ) + { + ( 0, _ ) => + generate_unit + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + ), + ( 1, Some( mut field_names ) ) => + generate_single_field_named + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + field_names.next().unwrap(), + &field_types.next().unwrap(), + ), + ( 1, None ) => + generate_single_field + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &field_types.next().unwrap(), + ), + ( _, Some( field_names ) ) => + generate_multiple_fields_named + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + field_names, + field_types, + ), + ( _, None ) => + generate_multiple_fields + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + field_types, + ), + } + + }, + StructLike::Enum( ref item ) => + { + + // let mut map = std::collections::HashMap::new(); + // item.variants.iter().for_each( | variant | + // { + // map + // .entry( variant.fields.to_token_stream().to_string() ) + // .and_modify( | e | *e += 1 ) + // .or_insert( 1 ); + // }); + + let variants_result : Result< Vec< proc_macro2::TokenStream > > = item.variants.iter().map( | variant | + { + // don't do automatic off + // if map[ & variant.fields.to_token_stream().to_string() ] <= 1 + if true + { + variant_generate + ( + item_name, + &item_attrs, + &generics_impl, + &generics_ty, + &generics_where, + variant, + &original_input, + ) + } + else + { + Ok( qt!{} ) + } + }).collect(); + + let variants = variants_result?; + + qt! + { + #( #variants )* + } + }, + }; + + if has_debug + { + let about = format!( "derive : From\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} + +// qqq : document, add example of generated code -- done +/// Generates `From` implementation for unit structs +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::From; +/// #[ derive( From ) ] +/// pub struct IsTransparent; +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct IsTransparent; +/// impl From< () > for IsTransparent +/// { +/// #[ inline( always ) ] +/// fn from( src : () ) -> Self +/// { +/// Self +/// } +/// } +/// ``` +/// +fn generate_unit +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, +) +-> proc_macro2::TokenStream +{ + qt! + { + // impl From< () > for UnitStruct + impl< #generics_impl > From< () > for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + fn from( src : () ) -> Self + { + Self + } + } + } +} + +// qqq : document, add example of generated code -- done +/// Generates `From` implementation for tuple structs with a single field +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::From; +/// #[ derive( From ) ] +/// pub struct IsTransparent +/// { +/// value : bool, +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct IsTransparent +/// { +/// value : bool, +/// } +/// #[ automatically_derived ] +/// impl From< bool > for IsTransparent +/// { +/// #[ inline( always ) ] +/// fn from( src : bool ) -> Self +/// { +/// Self { value : src } +/// } +/// } +/// ``` +/// +fn generate_single_field_named +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_name : &syn::Ident, + field_type : &syn::Type, +) +-> proc_macro2::TokenStream +{ + qt! + { + #[ automatically_derived ] + impl< #generics_impl > From< #field_type > for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn from( src : i32 ) -> Self + fn from( src : #field_type ) -> Self + { + Self { #field_name : src } + } + } + } +} + +// qqq : document, add example of generated code -- done +/// Generates `From`` implementation for structs with a single named field +/// +/// # Example of generated code +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::From; +/// #[ derive( From ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct IsTransparent( bool ); +/// #[ automatically_derived ] +/// impl From< bool > for IsTransparent +/// { +/// #[ inline( always ) ] +/// fn from( src : bool ) -> Self +/// { +/// Self( src ) +/// } +/// } +/// ``` +/// +fn generate_single_field +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_type : &syn::Type, +) +-> proc_macro2::TokenStream +{ + + qt! + { + #[automatically_derived] + impl< #generics_impl > From< #field_type > for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn from( src : bool ) -> Self + fn from( src : #field_type ) -> Self + { + // Self( src ) + Self( src ) + } + } + } +} + +// qqq : document, add example of generated code -- done +/// Generates `From` implementation for structs with multiple named fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::From; +/// #[ derive( From ) ] +/// pub struct Struct +/// { +/// value1 : bool, +/// value2 : i32, +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct +/// { +/// value1 : bool, +/// value2 : i32, +/// } +/// impl From< ( bool, i32 ) > for Struct +/// { +/// #[ inline( always ) ] +/// fn from( src : ( bool, i32 ) ) -> Self +/// { +/// Struct +/// { +/// value1 : src.0, +/// value2 : src.1, +/// } +/// } +/// } +/// ``` +fn generate_multiple_fields_named< 'a > +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_names : Box< dyn macro_tools::IterTrait< 'a, &'a syn::Ident > + '_ >, + field_types : impl macro_tools::IterTrait< 'a, &'a syn::Type >, +) +-> proc_macro2::TokenStream +{ + + let params : Vec< proc_macro2::TokenStream > = field_names + .enumerate() + .map(| ( index, field_name ) | + { + let index = index.to_string().parse::< proc_macro2::TokenStream >().unwrap(); + qt! { #field_name : src.#index } + }) + .collect(); + + let field_types : Vec< _ > = field_types.collect(); + qt! + { + impl< #generics_impl > From< (# ( #field_types ),* ) > for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn from( src : (i32, bool) ) -> Self + fn from( src : ( #( #field_types ),* ) ) -> Self + { + #item_name { #(#params),* } + } + } + } + +} + +// qqq : document, add example of generated code -- done +/// Generates `From` implementation for tuple structs with multiple fields +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::From; +/// #[ derive( From ) ] +/// pub struct Struct( bool, i32 ); +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct( bool, i32 ); +/// impl From< ( bool, i32 ) > for Struct +/// { +/// #[ inline( always ) ] +/// fn from( src : ( bool, i32 ) ) -> Self +/// { +/// Struct( src.0, src.1 ) +/// } +/// } +/// ``` +/// +fn generate_multiple_fields< 'a > +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_types : impl macro_tools::IterTrait< 'a, &'a macro_tools::syn::Type >, +) +-> proc_macro2::TokenStream +{ + + let params : Vec< proc_macro2::TokenStream > = ( 0..field_types.len() ) + .map( | index | + { + let index = index.to_string().parse::< proc_macro2::TokenStream >().unwrap(); + qt!( src.#index ) + }) + .collect(); + + let field_types : Vec< _ > = field_types.collect(); + + qt! + { + impl< #generics_impl > From< (# ( #field_types ),* ) > for #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn from( src : (i32, bool) ) -> Self + fn from( src : ( #( #field_types ),* ) ) -> Self + { + #item_name( #( #params ),* ) + } + } + } +} + +// qqq : document, add example of generated code +fn variant_generate +( + item_name : &syn::Ident, + item_attrs : &ItemAttributes, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variant : &syn::Variant, + original_input : &proc_macro::TokenStream, +) +-> Result< proc_macro2::TokenStream > +{ + let variant_name = &variant.ident; + let fields = &variant.fields; + let attrs = FieldAttributes::from_attrs( variant.attrs.iter() )?; + + if !attrs.config.enabled.value( item_attrs.config.enabled.value( true ) ) + { + return Ok( qt!{} ) + } + + if fields.len() <= 0 + { + return Ok( qt!{} ) + } + + let ( args, use_src ) = if fields.len() == 1 + { + let field = fields.iter().next().unwrap(); + ( + qt!{ #field }, + qt!{ src }, + ) + } + else + { + let src_i = ( 0..fields.len() ).map( | e | + { + let i = syn::Index::from( e ); + qt!{ src.#i, } + }); + ( + qt!{ #fields }, + qt!{ #( #src_i )* }, + // qt!{ src.0, src.1 }, + ) + }; + + // qqq : make `debug` working for all branches + if attrs.config.debug.value( false ) + { + let debug = format! + ( + r#" +#[ automatically_derived ] +impl< {0} > From< {args} > for {item_name}< {1} > +where + {2} +{{ + #[ inline ] + fn from( src : {args} ) -> Self + {{ + Self::{variant_name}( {use_src} ) + }} +}} + "#, + format!( "{}", qt!{ #generics_impl } ), + format!( "{}", qt!{ #generics_ty } ), + format!( "{}", qt!{ #generics_where } ), + ); + let about = format! + ( +r#"derive : From +item : {item_name} +field : {variant_name}"#, + ); + diag::report_print( about, original_input, debug ); + } + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > From< #args > for #item_name< #generics_ty > + where + #generics_where + { + #[ inline ] + fn from( src : #args ) -> Self + { + Self::#variant_name( #use_src ) + } + } + } + ) + +} \ No newline at end of file diff --git a/module/core/derive_tools_meta/src/derive/from/field_attributes.rs b/module/core/derive_tools_meta/src/derive/from/field_attributes.rs new file mode 100644 index 0000000000..8ff1e9f56f --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/from/field_attributes.rs @@ -0,0 +1,252 @@ +use super::*; +use macro_tools:: +{ + Result, + AttributeComponent, + AttributePropertyComponent, + AttributePropertyOptionalSingletone, +}; + +use former_types::Assign; + +/// +/// Attributes of a field / variant +/// + +/// Represents the attributes of a struct. Aggregates all its attributes. +#[ derive( Debug, Default ) ] +pub struct FieldAttributes +{ + /// Attribute for customizing generated code. + pub config : FieldAttributeConfig, +} + +impl FieldAttributes +{ + + pub fn from_attrs< 'a >( attrs : impl Iterator< Item = &'a syn::Attribute > ) -> Result< Self > + { + let mut result = Self::default(); + + let error = | attr : &syn::Attribute | -> syn::Error + { + let known_attributes = const_format::concatcp! + ( + "Known attirbutes are : ", + "debug", + ", ", FieldAttributeConfig::KEYWORD, + ".", + ); + syn_err! + ( + attr, + "Expects an attribute of format '#[ attribute( key1 = val1, key2 = val2 ) ]'\n {known_attributes}\n But got: '{}'", + qt!{ #attr } + ) + }; + + for attr in attrs + { + + let key_ident = attr.path().get_ident().ok_or_else( || error( attr ) )?; + let key_str = format!( "{}", key_ident ); + + // attributes does not have to be known + // if attr::is_standard( &key_str ) + // { + // continue; + // } + + match key_str.as_ref() + { + FieldAttributeConfig::KEYWORD => result.assign( FieldAttributeConfig::from_meta( attr )? ), + "debug" => {}, + _ => {}, + // _ => return Err( error( attr ) ), + } + } + + Ok( result ) + } + +} + +/// +/// Attribute to hold parameters of forming for a specific field or variant. +/// For example to avoid code From generation for it. +/// +/// `#[ from( on ) ]` +/// + +#[ derive( Debug, Default ) ] +pub struct FieldAttributeConfig +{ + /// Specifies whether we should generate From implementation for the field. + /// Can be altered using `on` and `off` attributes + pub enabled : AttributePropertyEnabled, + /// Specifies whether to print a sketch of generated `From` or not. + /// Defaults to `false`, which means no code is printed unless explicitly requested. + pub debug : AttributePropertyDebug, + // qqq : apply debug properties to all brenches, not only enums +} + +impl AttributeComponent for FieldAttributeConfig +{ + const KEYWORD : &'static str = "from"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + return syn::parse2::< FieldAttributeConfig >( meta_list.tokens.clone() ); + }, + syn::Meta::Path( ref _path ) => + { + return Ok( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format `#[ from( on ) ]`. \nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< FieldAttributeConfig, IntoT > for FieldAttributes +where + IntoT : Into< FieldAttributeConfig >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.config.assign( component.into() ); + } +} + +impl< IntoT > Assign< FieldAttributeConfig, IntoT > for FieldAttributeConfig +where + IntoT : Into< FieldAttributeConfig >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.enabled.assign( component.enabled ); + self.debug.assign( component.debug ); + } +} + +impl< IntoT > Assign< AttributePropertyEnabled, IntoT > for FieldAttributeConfig +where + IntoT : Into< AttributePropertyEnabled >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.enabled = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertyDebug, IntoT > for FieldAttributeConfig +where + IntoT : Into< AttributePropertyDebug >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.debug = component.into(); + } +} + +impl syn::parse::Parse for FieldAttributeConfig +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", FieldAttributeConfig::KEYWORD, " are : ", + AttributePropertyDebug::KEYWORD, + ", ", EnabledMarker::KEYWORD_ON, + ", ", EnabledMarker::KEYWORD_OFF, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ from( on ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + EnabledMarker::KEYWORD_ON => result.assign( AttributePropertyEnabled::from( true ) ), + EnabledMarker::KEYWORD_OFF => result.assign( AttributePropertyEnabled::from( false ) ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +// == attribute properties + +/// Marker type for attribute property to specify whether to provide a generated code as a hint. +/// Defaults to `false`, which means no debug is provided unless explicitly requested. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyDebugMarker; + +impl AttributePropertyComponent for AttributePropertyDebugMarker +{ + const KEYWORD : &'static str = "debug"; +} + +/// Specifies whether to provide a generated code as a hint. +/// Defaults to `false`, which means no debug is provided unless explicitly requested. +pub type AttributePropertyDebug = AttributePropertyOptionalSingletone< AttributePropertyDebugMarker >; + +// = + +/// Marker type for attribute property to indicates whether `From` implementation for fields/variants should be generated. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct EnabledMarker; + +impl EnabledMarker +{ + /// Keywords for parsing this attribute property. + pub const KEYWORD_OFF : &'static str = "off"; + /// Keywords for parsing this attribute property. + pub const KEYWORD_ON : &'static str = "on"; +} + +/// Specifies whether `From` implementation for fields/variants should be generated. +/// Can be altered using `on` and `off` attributes. But default it's `on`. +pub type AttributePropertyEnabled = AttributePropertyOptionalSingletone< EnabledMarker >; + +// == diff --git a/module/core/derive_tools_meta/src/derive/from/item_attributes.rs b/module/core/derive_tools_meta/src/derive/from/item_attributes.rs new file mode 100644 index 0000000000..78cc32f2d4 --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/from/item_attributes.rs @@ -0,0 +1,201 @@ +use super::*; +use macro_tools:: +{ + Result, + AttributeComponent, +}; + +use former_types::Assign; + +/// +/// Attributes of the whole tiem +/// + +/// Represents the attributes of a struct. Aggregates all its attributes. +#[ derive( Debug, Default ) ] +pub struct ItemAttributes +{ + /// Attribute for customizing generated code. + pub config : ItemAttributeConfig, +} + +impl ItemAttributes +{ + + pub fn from_attrs< 'a >( attrs : impl Iterator< Item = &'a syn::Attribute > ) -> Result< Self > + { + let mut result = Self::default(); + + let error = | attr : &syn::Attribute | -> syn::Error + { + let known_attributes = const_format::concatcp! + ( + "Known attirbutes are : ", + "debug", + ", ", ItemAttributeConfig::KEYWORD, + ".", + ); + syn_err! + ( + attr, + "Expects an attribute of format '#[ attribute( key1 = val1, key2 = val2 ) ]'\n {known_attributes}\n But got: '{}'", + qt!{ #attr } + ) + }; + + for attr in attrs + { + + let key_ident = attr.path().get_ident().ok_or_else( || error( attr ) )?; + let key_str = format!( "{}", key_ident ); + + // attributes does not have to be known + // if attr::is_standard( &key_str ) + // { + // continue; + // } + + match key_str.as_ref() + { + ItemAttributeConfig::KEYWORD => result.assign( ItemAttributeConfig::from_meta( attr )? ), + "debug" => {} + _ => {}, + // _ => return Err( error( attr ) ), + // attributes does not have to be known + } + } + + Ok( result ) + } + +} + +/// +/// Attribute to hold parameters of forming for a specific field or variant. +/// For example to avoid code From generation for it. +/// +/// `#[ from( on ) ]` +/// + +#[ derive( Debug, Default ) ] +pub struct ItemAttributeConfig +{ + /// Specifies whether `From` implementation for fields/variants should be generated by default. + /// Can be altered using `on` and `off` attributes. But default it's `on`. + /// `#[ from( on ) ]` - `From` is generated unless `off` for the field/variant is explicitly specified. + /// `#[ from( off ) ]` - `From` is not generated unless `on` for the field/variant is explicitly specified. + pub enabled : AttributePropertyEnabled, +} + +impl AttributeComponent for ItemAttributeConfig +{ + const KEYWORD : &'static str = "from"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + return syn::parse2::< ItemAttributeConfig >( meta_list.tokens.clone() ); + }, + syn::Meta::Path( ref _path ) => + { + return Ok( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format `#[ from( on ) ]`. \nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< ItemAttributeConfig, IntoT > for ItemAttributes +where + IntoT : Into< ItemAttributeConfig >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.config.assign( component.into() ); + } +} + +impl< IntoT > Assign< ItemAttributeConfig, IntoT > for ItemAttributeConfig +where + IntoT : Into< ItemAttributeConfig >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.enabled.assign( component.enabled ); + } +} + +impl< IntoT > Assign< AttributePropertyEnabled, IntoT > for ItemAttributeConfig +where + IntoT : Into< AttributePropertyEnabled >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.enabled = component.into(); + } +} + +impl syn::parse::Parse for ItemAttributeConfig +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", ItemAttributeConfig::KEYWORD, " are : ", + EnabledMarker::KEYWORD_ON, + ", ", EnabledMarker::KEYWORD_OFF, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ from( off ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + EnabledMarker::KEYWORD_ON => result.assign( AttributePropertyEnabled::from( true ) ), + EnabledMarker::KEYWORD_OFF => result.assign( AttributePropertyEnabled::from( false ) ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +// == diff --git a/module/core/derive_tools_meta/src/derive/inner_from.rs b/module/core/derive_tools_meta/src/derive/inner_from.rs new file mode 100644 index 0000000000..427f447087 --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/inner_from.rs @@ -0,0 +1,262 @@ + +use super::*; +use macro_tools::{ attr, diag, item_struct, Result }; + +// + +pub fn inner_from( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + let item_name = &parsed.ident; + + let mut field_types = item_struct::field_types( &parsed ); + let field_names = item_struct::field_names( &parsed ); + let result = + match ( field_types.len(), field_names ) + { + ( 0, _ ) => unit( item_name ), + ( 1, Some( mut field_names ) ) => + { + let field_name = field_names.next().unwrap(); + let field_type = field_types.next().unwrap(); + from_impl_named( item_name, field_type, field_name ) + } + ( 1, None ) => + { + let field_type = field_types.next().unwrap(); + from_impl( item_name, field_type ) + } + ( _, Some( field_names ) ) => + { + let params : Vec< proc_macro2::TokenStream > = field_names + .map( | field_name | qt! { src.#field_name } ) + .collect(); + from_impl_multiple_fields( item_name, field_types, ¶ms ) + } + ( _, None ) => + { + let params : Vec< proc_macro2::TokenStream > = ( 0..field_types.len() ) + .map( | index | + { + let index : proc_macro2::TokenStream = index.to_string().parse().unwrap(); + qt! { src.#index } + }) + .collect(); + from_impl_multiple_fields( item_name, field_types, ¶ms ) + } + }; + + if has_debug + { + let about = format!( "derive : InnerFrom\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} + +// qqq : document, add example of generated code +/// Generates `From` implementation for the inner type regarding bounded type +/// Works with structs with a single named field +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::InnerFrom; +/// #[ derive( InnerFrom ) ] +/// pub struct Struct +/// { +/// value : bool, +/// } +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct +/// { +/// value : bool, +/// } +/// #[ allow( non_local_definitions ) ] +/// #[ automatically_derived ] +/// impl From< Struct > for bool +/// { +/// #[ inline( always ) ] +/// fn from( src : Struct ) -> Self +/// { +/// src.value +/// } +/// } +/// ``` +/// +fn from_impl_named +( + item_name : &syn::Ident, + field_type : &syn::Type, + field_name : &syn::Ident, +) -> proc_macro2::TokenStream +{ + qt! + { + #[ allow( non_local_definitions ) ] + #[ automatically_derived ] + impl From< #item_name > for #field_type + { + #[ inline( always ) ] + // fm from( src : MyStruct ) -> Self + fn from( src : #item_name ) -> Self + { + src.#field_name + } + } + } +} + +// qqq : document, add example of generated code -- done +/// Generates `From` implementation for the only contained type regarding the bounded type +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::InnerFrom; +/// #[ derive( InnerFrom ) ] +/// pub struct Struct( bool ); +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct( bool ); +/// #[ allow( non_local_definitions ) ] +/// #[ automatically_derived ] +/// impl From< Struct > for bool +/// { +/// #[ inline( always ) ] +/// fn from( src : Struct ) -> Self +/// { +/// src.0 +/// } +/// } +/// ``` +/// +fn from_impl +( + item_name : &syn::Ident, + field_type : &syn::Type, +) -> proc_macro2::TokenStream +{ + qt! + { + #[ allow( non_local_definitions ) ] + #[ automatically_derived ] + impl From< #item_name > for #field_type + { + #[ inline( always ) ] + // fn from( src : IsTransparent ) -> Self + fn from( src : #item_name ) -> Self + { + src.0 + } + } + } +} + +// qqq : document, add example of generated code -- done +/// Generates `From` implementation for the tuple type containing all the inner types regarding the bounded type +/// Can generate implementations both for structs with named fields and tuple structs. +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::InnerFrom; +/// #[ derive( InnerFrom ) ] +/// pub struct Struct( bool, i32 ); +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct( bool, i32 ); +/// #[ allow( non_local_definitions ) ] +/// #[ automatically_derived ] +/// impl From< Struct > for ( bool, i32 ) +/// { +/// #[ inline( always ) ] +/// fn from( src : Struct ) -> Self +/// { +/// ( src.0, src.1 ) +/// } +/// } +/// ``` +/// +fn from_impl_multiple_fields< 'a > +( + item_name : &syn::Ident, + field_types : impl macro_tools::IterTrait< 'a, &'a macro_tools::syn::Type >, + params : &Vec< proc_macro2::TokenStream >, +) -> proc_macro2::TokenStream +{ + qt! + { + #[ allow( non_local_definitions ) ] + #[ automatically_derived ] + impl From< #item_name > for ( #( #field_types ), *) + { + #[ inline( always ) ] + // fn from( src : StructWithManyFields ) -> Self + fn from( src : #item_name ) -> Self + { + ( #( #params ), * ) + } + } + } +} + +// qqq : document, add example of generated code -- done +/// Generates `From` implementation for the unit type regarding the bound type +/// +/// # Example +/// +/// ## Input +/// ```rust +/// # use derive_tools_meta::InnerFrom; +/// #[ derive( InnerFrom ) ] +/// pub struct Struct; +/// ``` +/// +/// ## Output +/// ```rust +/// pub struct Struct; +/// #[ allow( non_local_definitions ) ] +/// #[ allow( clippy::unused_imports ) ] +/// #[ automatically_derived] +/// impl From< Struct > for () +/// { +/// #[ inline( always ) ] +/// fn from( src : Struct ) -> () +/// { +/// () +/// } +/// } +/// ``` +/// +fn unit( item_name : &syn::Ident ) -> proc_macro2::TokenStream +{ + qt! + { + #[ allow( non_local_definitions ) ] + #[ allow( clippy::unused_imports ) ] + #[ automatically_derived ] + impl From< #item_name > for () + { + #[ inline( always ) ] + // fn from( src : UnitStruct ) -> () + fn from( src : #item_name ) -> () + { + () + } + } + } +} diff --git a/module/core/derive_tools_meta/src/derive/new.rs b/module/core/derive_tools_meta/src/derive/new.rs new file mode 100644 index 0000000000..4bfb0761bb --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/new.rs @@ -0,0 +1,403 @@ +use super::*; +use macro_tools:: +{ + attr, + diag, + generic_params, + item_struct, + struct_like::StructLike, + Result, +}; + +#[ path = "from/field_attributes.rs" ] +mod field_attributes; +use field_attributes::*; +#[ path = "from/item_attributes.rs" ] +mod item_attributes; +use item_attributes::*; + +// + +// xxx : qqq : implement +pub fn new( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + // use macro_tools::quote::ToTokens; + + let original_input = input.clone(); + let parsed = syn::parse::< StructLike >( input )?; + let has_debug = attr::has_debug( parsed.attrs().iter() )?; + let item_attrs = ItemAttributes::from_attrs( parsed.attrs().iter() )?; + let item_name = &parsed.ident(); + + let ( _generics_with_defaults, generics_impl, generics_ty, generics_where ) + = generic_params::decompose( &parsed.generics() ); + + let result = match parsed + { + StructLike::Unit( ref item ) | StructLike::Struct( ref item ) => + { + + let mut field_types = item_struct::field_types( &item ); + let field_names = item_struct::field_names( &item ); + + match ( field_types.len(), field_names ) + { + ( 0, _ ) => + generate_unit + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + ), + ( 1, Some( mut field_names ) ) => + generate_single_field_named + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + field_names.next().unwrap(), + &field_types.next().unwrap(), + ), + ( 1, None ) => + generate_single_field + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + &field_types.next().unwrap(), + ), + ( _, Some( field_names ) ) => + generate_multiple_fields_named + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + field_names, + field_types, + ), + ( _, None ) => + generate_multiple_fields + ( + item_name, + &generics_impl, + &generics_ty, + &generics_where, + field_types, + ), + } + + }, + StructLike::Enum( ref item ) => + { + + let variants_result : Result< Vec< proc_macro2::TokenStream > > = item.variants.iter().map( | variant | + { + variant_generate + ( + item_name, + &item_attrs, + &generics_impl, + &generics_ty, + &generics_where, + variant, + &original_input, + ) + }).collect(); + + let variants = variants_result?; + + qt! + { + #( #variants )* + } + }, + }; + + if has_debug + { + let about = format!( "derive : New\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} + +// xxx : qqq : implement +// qqq : document, add example of generated code +fn generate_unit +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, +) +-> proc_macro2::TokenStream +{ + qt! + { + // impl UnitStruct + impl< #generics_impl > #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + fn new() -> Self + { + Self + } + } + } +} + +// xxx : qqq : implement +// qqq : document, add example of generated code +fn generate_single_field_named +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_name : &syn::Ident, + field_type : &syn::Type, +) +-> proc_macro2::TokenStream +{ + qt! + { + #[ automatically_derived ] + // impl MyStruct + impl< #generics_impl > #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn new( src : i32 ) -> Self + fn new( src : #field_type ) -> Self + { + // Self { a: src } + Self { #field_name: src } + } + } + } +} + +// xxx : qqq : implement +// qqq : document, add example of generated code +fn generate_single_field +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_type : &syn::Type, +) +-> proc_macro2::TokenStream +{ + + qt! + { + #[automatically_derived] + // impl IsTransparent + impl< #generics_impl > #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn new( src : bool ) -> Self + fn new( src : #field_type ) -> Self + { + // Self( src ) + Self( src ) + } + } + } +} + +// xxx : qqq : implement +// qqq : document, add example of generated code +fn generate_multiple_fields_named< 'a > +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_names : Box< dyn macro_tools::IterTrait< 'a, &'a syn::Ident > + '_ >, + field_types : impl macro_tools::IterTrait< 'a, &'a syn::Type >, +) +-> proc_macro2::TokenStream +{ + + let params : Vec< proc_macro2::TokenStream > = field_names + .enumerate() + .map(| ( index, field_name ) | + { + let index = index.to_string().parse::< proc_macro2::TokenStream >().unwrap(); + qt! { #field_name : src.#index } + }) + .collect(); + + let field_types : Vec< _ > = field_types.collect(); + qt! + { + // impl StructNamedFields + impl< #generics_impl > #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn new( src : ( i32, bool ) ) -> Self + fn new( src : ( #( #field_types ),* ) ) -> Self + { + // StructNamedFields{ a : src.0, b : src.1 } + #item_name { #(#params),* } + } + } + } + +} + +// xxx : qqq : implement +// qqq : document, add example of generated code +fn generate_multiple_fields< 'a > +( + item_name : &syn::Ident, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + field_types : impl macro_tools::IterTrait< 'a, &'a macro_tools::syn::Type >, +) +-> proc_macro2::TokenStream +{ + + let params : Vec< proc_macro2::TokenStream > = ( 0..field_types.len() ) + .map( | index | + { + let index = index.to_string().parse::< proc_macro2::TokenStream >().unwrap(); + qt!( src.#index ) + }) + .collect(); + + let field_types : Vec< _ > = field_types.collect(); + + qt! + { + // impl StructWithManyFields + impl< #generics_impl > #item_name< #generics_ty > + where + #generics_where + { + #[ inline( always ) ] + // fn new( src : (i32, bool) ) -> Self + fn new( src : ( #( #field_types ),* ) ) -> Self + { + // StructWithManyFields( src.0, src.1 ) + #item_name( #( #params ),* ) + } + } + } +} + +// xxx : qqq : implement +// qqq : document, add example of generated code +fn variant_generate +( + item_name : &syn::Ident, + item_attrs : &ItemAttributes, + generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + generics_where: &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + variant : &syn::Variant, + original_input : &proc_macro::TokenStream, +) +-> Result< proc_macro2::TokenStream > +{ + let variant_name = &variant.ident; + let fields = &variant.fields; + let attrs = FieldAttributes::from_attrs( variant.attrs.iter() )?; + + if !attrs.config.enabled.value( item_attrs.config.enabled.value( true ) ) + { + return Ok( qt!{} ) + } + + if fields.len() <= 0 + { + return Ok( qt!{} ) + } + + let ( args, use_src ) = if fields.len() == 1 + { + let field = fields.iter().next().unwrap(); + ( + qt!{ #field }, + qt!{ src }, + ) + } + else + { + let src_i = ( 0..fields.len() ).map( | e | + { + let i = syn::Index::from( e ); + qt!{ src.#i, } + }); + ( + qt!{ #fields }, + qt!{ #( #src_i )* }, + // qt!{ src.0, src.1 }, + ) + }; + + // qqq : make `debug` working for all branches + if attrs.config.debug.value( false ) + { + let debug = format! + ( + r#" +#[ automatically_derived ] +impl< {0} > {item_name}< {1} > +where + {2} +{{ + #[ inline ] + fn new( src : {args} ) -> Self + {{ + Self::{variant_name}( {use_src} ) + }} +}} + "#, + format!( "{}", qt!{ #generics_impl } ), + format!( "{}", qt!{ #generics_ty } ), + format!( "{}", qt!{ #generics_where } ), + ); + let about = format! + ( +r#"derive : New +item : {item_name} +field : {variant_name}"#, + ); + diag::report_print( about, original_input, debug ); + } + + Ok + ( + qt! + { + #[ automatically_derived ] + impl< #generics_impl > #item_name< #generics_ty > + where + #generics_where + { + #[ inline ] + fn new( src : #args ) -> Self + { + Self::#variant_name( #use_src ) + } + } + } + ) + +} diff --git a/module/core/derive_tools_meta/src/derive/variadic_from.rs b/module/core/derive_tools_meta/src/derive/variadic_from.rs new file mode 100644 index 0000000000..9c917dc025 --- /dev/null +++ b/module/core/derive_tools_meta/src/derive/variadic_from.rs @@ -0,0 +1,160 @@ + +use super::*; +use macro_tools::{ Result, format_ident, attr, diag }; +use iter::{ IterExt, Itertools }; + +/// This function generates an implementation of a variadic `From` trait for a given struct. +/// It handles both named and unnamed fields within the struct, generating appropriate code +/// for converting a tuple of fields into an instance of the struct. + +pub fn variadic_from( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + let item_name = &parsed.ident; + + let len = parsed.fields.len(); + let from_trait = format_ident!( "From{len}", ); + let from_method = format_ident!( "from{len}" ); + + let + ( + types, + fn_params, + src_into_vars, + vars + ) + : + ( Vec< _ >, Vec< _ >, Vec< _ >, Vec< _ > ) + = parsed.fields.iter().enumerate().map_result( | ( i, field ) | + { + let ident = field.ident.clone().map_or_else( || format_ident!( "_{i}" ), | e | e ); + let ty = field.ty.clone(); + Result::Ok + (( + qt!{ #ty, }, + qt!{ #ident : #ty, }, + qt!{ let #ident = ::core::convert::Into::into( #ident ); }, + qt!{ #ident, }, + )) + })? + .into_iter() + .multiunzip(); + + let result = match &parsed.fields + { + syn::Fields::Named( _ ) => + { + + if 1 <= len && len <= 3 + { + qt! + { + + #[ automatically_derived ] + // impl variadic_from::From2< i32 > for StructNamedFields + impl variadic_from::#from_trait< #( #types )* > for #item_name + { + // fn from1( a : i32, b : i32 ) -> Self + fn #from_method + ( + #( #fn_params )* + ) -> Self + { + #( #src_into_vars )* + // let a = ::core::convert::Into::into( a ); + // let b = ::core::convert::Into::into( b ); + Self + { + #( #vars )* + // a, + // b, + } + } + } + + impl From< ( #( #types )* ) > for #item_name + { + /// Reuse From1. + #[ inline( always ) ] + fn from( src : ( #( #types )* ) ) -> Self + { + Self::from1( src ) + } + } + + } + } + else + { + qt!{} + } + + } + syn::Fields::Unnamed( _ ) => + { + + if 1 <= len && len <= 3 + { + qt! + { + + #[ automatically_derived ] + // impl variadic_from::From2< i32 > for StructNamedFields + impl variadic_from::#from_trait< #( #types )* > for #item_name + { + // fn from1( a : i32, b : i32 ) -> Self + fn #from_method + ( + #( #fn_params )* + ) -> Self + { + #( #src_into_vars )* + // let a = ::core::convert::Into::into( a ); + // let b = ::core::convert::Into::into( b ); + Self + ( + #( #vars )* + // a, + // b, + ) + } + } + + impl From< ( #( #types )* ) > for #item_name + { + /// Reuse From1. + #[ inline( always ) ] + fn from( src : ( #( #types )* ) ) -> Self + { + Self::from1( src ) + } + } + + } + } + else + { + qt!{} + } + + } + syn::Fields::Unit => + { + + qt!{} + + } + // _ => return Err( syn_err!( parsed.fields.span(), "Expects fields" ) ), + }; + + if has_debug + { + let about = format!( "derive : VariadicForm\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} diff --git a/module/core/derive_tools_meta/src/lib.rs b/module/core/derive_tools_meta/src/lib.rs new file mode 100644 index 0000000000..b2ea174a1f --- /dev/null +++ b/module/core/derive_tools_meta/src/lib.rs @@ -0,0 +1,509 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/clone_dyn_meta/latest/clone_dyn_meta/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg +( + any + ( + feature = "derive_as_mut", + feature = "derive_as_ref", + feature = "derive_deref", + feature = "derive_deref_mut", + feature = "derive_from", + feature = "derive_inner_from", + feature = "derive_variadic_from", + ) +)] +#[ cfg( feature = "enabled" ) ] +mod derive; +// #[ cfg +// ( +// any +// ( +// feature = "derive_as_mut", +// feature = "derive_as_ref", +// feature = "derive_deref", +// feature = "derive_deref_mut", +// feature = "derive_from", +// feature = "derive_inner_from", +// feature = "derive_variadic_from", +// ) +// )] +// #[ cfg( feature = "enabled" ) ] +// use derive::*; + + +/// +/// Provides an automatic `From` implementation for struct wrapping a single value. +/// +/// This macro simplifies the conversion of an inner type to an outer struct type +/// when the outer type is a simple wrapper around the inner type. +/// +/// ## Example Usage +/// +/// Instead of manually implementing `From< bool >` for `IsTransparent`: +/// +/// ```rust +/// pub struct IsTransparent( bool ); +/// +/// impl From< bool > for IsTransparent +/// { +/// #[ inline( always ) ] +/// fn from( src : bool ) -> Self +/// { +/// Self( src ) +/// } +/// } +/// ``` +/// +/// Use `#[ derive( From ) ]` to automatically generate the implementation: +/// +/// ```rust +/// # use derive_tools_meta::*; +/// #[ derive( From ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// The macro facilitates the conversion without additional boilerplate code. +/// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_from" ) ] +#[ proc_macro_derive +( + From, + attributes + ( + debug, // struct + from, // field + ) +)] +pub fn from( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::from::from( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// Provides an automatic `new` implementation for struct wrapping a single value. +/// +/// This macro simplifies the conversion of an inner type to an outer struct type +/// when the outer type is a simple wrapper around the inner type. +/// +/// ## Example Usage +/// +/// Instead of manually implementing `new` for `IsTransparent`: +/// +/// ```rust +/// pub struct IsTransparent( bool ); +/// +/// impl IsTransparent +/// { +/// #[ inline( always ) ] +/// fn new( src : bool ) -> Self +/// { +/// Self( src ) +/// } +/// } +/// ``` +/// +/// Use `#[ derive( New ) ]` to automatically generate the implementation: +/// +/// ```rust +/// # use derive_tools_meta::*; +/// #[ derive( New ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// The macro facilitates the conversion without additional boilerplate code. +/// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_new" ) ] +#[ proc_macro_derive +( + New, + attributes + ( + debug, // struct + new, // field + ) +)] +pub fn new( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::new::new( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +// /// +// /// Alias for derive `From`. Provides an automatic `From` implementation for struct wrapping a single value. +// /// +// /// This macro simplifies the conversion of an inner type to an outer struct type +// /// when the outer type is a simple wrapper around the inner type. +// /// +// /// ## Example Usage +// /// +// /// Instead of manually implementing `From< bool >` for `IsTransparent`: +// /// +// /// ```rust +// /// pub struct IsTransparent( bool ); +// /// +// /// impl From< bool > for IsTransparent +// /// { +// /// #[ inline( always ) ] +// /// fn from( src : bool ) -> Self +// /// { +// /// Self( src ) +// /// } +// /// } +// /// ``` +// /// +// /// Use `#[ derive( FromInner ) ]` to automatically generate the implementation: +// /// +// /// ```rust +// /// # use derive_tools_meta::*; +// /// #[ derive( FromInner ) ] +// /// pub struct IsTransparent( bool ); +// /// ``` +// /// +// /// The macro facilitates the conversion without additional boilerplate code. +// /// +// +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( feature = "derive_from" ) ] +// #[ proc_macro_derive( FromInner, attributes( debug ) ) ] +// pub fn from( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +// { +// let result = derive::from::from( input ); +// match result +// { +// Ok( stream ) => stream.into(), +// Err( err ) => err.to_compile_error().into(), +// } +// } + +/// +/// Derive macro to implement From converting outer type into inner when-ever it's possible to do automatically. +/// +/// ### Sample :: struct instead of macro. +/// +/// Write this +/// +/// ```rust +/// # use derive_tools_meta::*; +/// #[ derive( InnerFrom ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// Instead of this +/// +/// ```rust +/// pub struct IsTransparent( bool ); +/// impl From< IsTransparent > for bool +/// { +/// #[ inline( always ) ] +/// fn from( src : IsTransparent ) -> Self +/// { +/// src.0 +/// } +/// } +/// ``` + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_inner_from" ) ] +#[ proc_macro_derive( InnerFrom, attributes( debug ) ) ] +pub fn inner_from( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::inner_from::inner_from( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// Derive macro to implement Deref when-ever it's possible to do automatically. +/// +/// ### Sample :: struct instead of macro. +/// +/// Write this +/// +/// ```rust +/// # use derive_tools_meta::*; +/// #[ derive( Deref ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// Instead of this +/// +/// ```rust +/// pub struct IsTransparent( bool ); +/// impl core::ops::Deref for IsTransparent +/// { +/// type Target = bool; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// &self.0 +/// } +/// } +/// ``` + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_deref" ) ] +#[ proc_macro_derive( Deref, attributes( debug ) ) ] +pub fn deref( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::deref::deref( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// Derive macro to implement Deref when-ever it's possible to do automatically. +/// +/// ### Sample :: struct instead of macro. +/// +/// Write this +/// +/// ```rust +/// # use derive_tools_meta::*; +/// #[ derive( Deref, DerefMut ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// Instead of this +/// +/// ```rust +/// pub struct IsTransparent( bool ); +/// impl core::ops::Deref for IsTransparent +/// { +/// type Target = bool; +/// #[ inline( always ) ] +/// fn deref( &self ) -> &Self::Target +/// { +/// &self.0 +/// } +/// } +/// impl core::ops::DerefMut for IsTransparent +/// { +/// #[ inline( always ) ] +/// fn deref_mut( &mut self ) -> &mut Self::Target +/// { +/// &mut self.0 +/// } +/// } +/// +/// ``` + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_deref_mut" ) ] +#[ proc_macro_derive( DerefMut, attributes( debug ) ) ] +pub fn deref_mut( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::deref_mut::deref_mut( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// Derive macro to implement AsRef when-ever it's possible to do automatically. +/// +/// ### Sample :: struct instead of macro. +/// +/// Write this +/// +/// ```rust +/// # use derive_tools_meta::*; +/// #[ derive( AsRef ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// Instead of this +/// +/// ```rust +/// pub struct IsTransparent( bool ); +/// impl AsRef< bool > for IsTransparent +/// { +/// fn as_ref( &self ) -> &bool +/// { +/// &self.0 +/// } +/// } +/// ``` + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_as_ref" ) ] +#[ proc_macro_derive( AsRef, attributes( debug ) ) ] +pub fn as_ref( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::as_ref::as_ref( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// Derive macro to implement AsMut when-ever it's possible to do automatically. +/// +/// ### Sample :: struct instead of macro. +/// +/// Write this +/// +/// ```rust +/// # use derive_tools_meta::*; +/// #[ derive( AsMut ) ] +/// pub struct IsTransparent( bool ); +/// ``` +/// +/// Instead of this +/// +/// ```rust +/// pub struct IsTransparent( bool ); +/// impl AsMut< bool > for IsTransparent +/// { +/// fn as_mut( &mut self ) -> &mut bool +/// { +/// &mut self.0 +/// } +/// } +/// +/// ``` + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_as_mut" ) ] +#[ proc_macro_derive( AsMut, attributes( debug ) ) ] +pub fn as_mut( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::as_mut::as_mut( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// The `derive_variadic_from` macro is designed to provide a way to implement the `From`-like +/// traits for structs with a variable number of fields, allowing them to be constructed from +/// tuples of different lengths or from individual arguments. This functionality is particularly +/// useful for creating flexible constructors that enable different methods of instantiation for +/// a struct. By automating the implementation of traits, this macro reduces boilerplate code +/// and enhances code readability and maintainability. +/// +/// ### Key Features +/// +/// - **Flexible Construction**: Allows a struct to be constructed from different numbers of +/// arguments, converting each to the appropriate type. +/// - **Tuple Conversion**: Enables the struct to be constructed from tuples, leveraging the +/// `From` and `Into` traits for seamless conversion. +/// - **Code Generation**: Automates the implementation of these traits, reducing the need for +/// manual coding and ensuring consistent constructors. +/// +/// ### Limitations +/// +/// Currently, the macro supports up to 3 arguments. If your struct has more than 3 fields, the +/// derive macro will generate no implementation. It supports tuple conversion, allowing structs +/// to be instantiated from tuples by leveraging the `From` and `Into` traits for seamless conversion. +/// +/// ### Example Usage +/// +/// This example demonstrates the use of the `variadic_from` macro to implement flexible +/// constructors for a struct, allowing it to be instantiated from different numbers of +/// arguments or tuples. It also showcases how to derive common traits like `Debug`, +/// `PartialEq`, `Default`, and `VariadicFrom` for the struct. +/// +/// ```rust +/// #[ cfg( not( all(feature = "enabled", feature = "type_variadic_from", feature = "derive_variadic_from" ) ) ) ] +/// fn main(){} +/// #[ cfg( all( feature = "enabled", feature = "type_variadic_from", feature = "derive_variadic_from" ) )] +/// fn main() +/// { +/// use variadic_from::exposed::*; +/// +/// // Define a struct `MyStruct` with fields `a` and `b`. +/// // The struct derives common traits like `Debug`, `PartialEq`, `Default`, and `VariadicFrom`. +/// #[ derive( Debug, PartialEq, Default, VariadicFrom ) ] +/// // Use `#[ debug ]` to expand and debug generate code. +/// // #[ debug ] +/// struct MyStruct +/// { +/// a : i32, +/// b : i32, +/// } +/// +/// // Implement the `From1` trait for `MyStruct`, which allows constructing a `MyStruct` instance +/// // from a single `i32` value by assigning it to both `a` and `b` fields. +/// impl From1< i32 > for MyStruct +/// { +/// fn from1( a : i32 ) -> Self { Self { a, b : a } } +/// } +/// +/// let got : MyStruct = from!(); +/// let exp = MyStruct { a : 0, b : 0 }; +/// assert_eq!( got, exp ); +/// +/// let got : MyStruct = from!( 13 ); +/// let exp = MyStruct { a : 13, b : 13 }; +/// assert_eq!( got, exp ); +/// +/// let got : MyStruct = from!( 13, 14 ); +/// let exp = MyStruct { a : 13, b : 14 }; +/// assert_eq!( got, exp ); +/// +/// dbg!( exp ); +/// //> MyStruct { +/// //> a: 13, +/// //> b: 14, +/// //> } +/// } +/// ``` +/// +/// ### Debugging +/// +/// If your struct has a `debug` attribute, the macro will print information about the generated code for diagnostic purposes. +/// +/// ```rust, ignore +/// #[ derive( Debug, PartialEq, Default, VariadicFrom ) ] +/// // Use `#[ debug ]` to expand and debug generate code. +/// // #[ debug ] +/// struct MyStruct +/// { +/// a: i32, +/// b: i32, +/// } +/// ``` +/// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_variadic_from" ) ] +#[ proc_macro_derive( VariadicFrom, attributes( debug ) ) ] +pub fn derive_variadic_from( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::variadic_from::variadic_from( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} diff --git a/module/core/derive_tools_meta/tests/smoke_test.rs b/module/core/derive_tools_meta/tests/smoke_test.rs new file mode 100644 index 0000000000..663dd6fb9f --- /dev/null +++ b/module/core/derive_tools_meta/tests/smoke_test.rs @@ -0,0 +1,12 @@ + +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/diagnostics_tools/Cargo.toml b/module/core/diagnostics_tools/Cargo.toml new file mode 100644 index 0000000000..5053a7402c --- /dev/null +++ b/module/core/diagnostics_tools/Cargo.toml @@ -0,0 +1,54 @@ +[package] +name = "diagnostics_tools" +version = "0.8.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/diagnostics_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/diagnostics_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/diagnostics_tools" +description = """ +Diagnostics tools. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ + "enabled", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", + "diagnostics_memory_layout", +] +full = [ + "enabled", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", + "diagnostics_memory_layout", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +diagnostics_runtime_assertions = [ "pretty_assertions" ] # run-time assertions +diagnostics_compiletime_assertions = [] # compile-time assertions +diagnostics_memory_layout = [] # + +[dependencies] +pretty_assertions = { version = "~1.4.0", optional = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/diagnostics_tools/License b/module/core/diagnostics_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/diagnostics_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/diagnostics_tools/Readme.md b/module/core/diagnostics_tools/Readme.md new file mode 100644 index 0000000000..d41d9b75a5 --- /dev/null +++ b/module/core/diagnostics_tools/Readme.md @@ -0,0 +1,48 @@ + + +# Module :: diagnostics_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/diagnostics_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/diagnostics_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdiagnostics_tools%2Fexamples%2Fdiagnostics_tools_trivial.rs,RUN_POSTFIX=--example%20diagnostics_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Diagnostics tools. + +### Basic use-case + + + +```rust +#[ test ] +#[ should_panic ] +fn a_id_panic_test() +{ + a_id!( 1, 2 ); + /* + print : + ... + +thread 'a_id_panic_test' panicked at 'assertion failed: `(left == right)` + +Diff < left / right > : +<1 +>2 +... + */ +} +``` + + +### To add to your project + +```sh +cargo add diagnostics_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/diagnostics_tools_trivial +cargo run +``` diff --git a/module/core/diagnostics_tools/examples/diagnostics_tools_trivial.rs b/module/core/diagnostics_tools/examples/diagnostics_tools_trivial.rs new file mode 100644 index 0000000000..54087bc59e --- /dev/null +++ b/module/core/diagnostics_tools/examples/diagnostics_tools_trivial.rs @@ -0,0 +1,20 @@ +//! qqq : write proper description +use diagnostics_tools::prelude::*; + +fn main() +{ + + a_id!( 1, 2 ); + /* + print : + ... + +thread 'a_id_panic_test' panicked at 'assertion failed: `(left == right)` + +Diff < left / right > : +<1 +>2 +... + */ + +} diff --git a/module/core/diagnostics_tools/src/diag/cta.rs b/module/core/diagnostics_tools/src/diag/cta.rs new file mode 100644 index 0000000000..60fc685938 --- /dev/null +++ b/module/core/diagnostics_tools/src/diag/cta.rs @@ -0,0 +1,84 @@ + +pub( crate ) mod private +{ + + /// + /// Macro to compare meta condition is true at compile-time. + /// + /// ### Basic use-case. + /// + /// ``` rust + /// use diagnostics_tools::prelude::*; + /// cta_true!( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ); + /// ``` + /// + + #[ macro_export ] + macro_rules! cta_true + { + () => {}; + ( + $( $Cond : meta )+, $Msg : expr $(,)? + ) => + { + #[ cfg( not( $( $Cond )+ ) ) ] + core::compile_error!( $Msg ); + }; + ( + $( $Cond : tt )* + ) + => + { + #[ cfg( not( $( $Cond )* ) ) ] + core::compile_error! + ( + concat! + ( + "Does not hold :\n ", + stringify!( $( $Cond )* ), + ) + ); + }; + } + + pub use cta_true; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + cta_true, + }; +} diff --git a/module/core/diagnostics_tools/src/diag/layout.rs b/module/core/diagnostics_tools/src/diag/layout.rs new file mode 100644 index 0000000000..174ed9bc0e --- /dev/null +++ b/module/core/diagnostics_tools/src/diag/layout.rs @@ -0,0 +1,128 @@ + +#[ cfg( feature = "diagnostics_compiletime_assertions" ) ] +pub( crate ) mod private +{ + + /// + /// Compile-time assertion that two types have the same size. + /// + + + #[ macro_export ] + macro_rules! cta_type_same_size + { + ( $Type1:ty, $Type2:ty $(,)? ) => + {{ + const _ : fn() = || + { + let _ : [ () ; core::mem::size_of::< $Type1 >() ] = [ () ; core::mem::size_of::< $Type2 >() ]; + }; + // let _ = core::mem::transmute::< $Type1, $Type2 >; + true + }} + } + + /// + /// Compile-time assertion of having the same align. + /// + + + #[ macro_export ] + macro_rules! cta_type_same_align + { + ( $Type1:ty, $Type2:ty $(,)? ) => + {{ + const _ : fn() = || + { + let _ : [ () ; core::mem::align_of::< $Type1 >() ] = [ () ; core::mem::align_of::< $Type2 >() ]; + }; + true + }}; + } + + /// + /// Compile-time assertion that memory behind two references have the same size. + /// + + + #[ macro_export ] + macro_rules! cta_ptr_same_size + { + ( $Ins1:expr, $Ins2:expr $(,)? ) => + {{ + #[ allow( unsafe_code, unknown_lints, forget_copy, useless_transmute ) ] + let _ = || unsafe + { + let mut ins1 = core::ptr::read( $Ins1 ); + core::ptr::write( &mut ins1, core::mem::transmute( core::ptr::read( $Ins2 ) ) ); + core::mem::forget( ins1 ); + }; + true + }} + } + + /// + /// Compile-time assertion that two values have the same size. + /// + /// Does not consume values. + /// + + + #[ macro_export ] + macro_rules! cta_mem_same_size + { + ( $Ins1:expr, $Ins2:expr $(,)? ) => + {{ + $crate::cta_ptr_same_size!( &$Ins1, &$Ins2 ) + }} + } + + pub use cta_type_same_size; + pub use cta_type_same_align; + + pub use cta_ptr_same_size; + pub use cta_mem_same_size; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ cfg( feature = "diagnostics_compiletime_assertions" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + cta_type_same_size, + cta_type_same_align, + cta_ptr_same_size, + cta_mem_same_size, + }; +} diff --git a/module/core/diagnostics_tools/src/diag/mod.rs b/module/core/diagnostics_tools/src/diag/mod.rs new file mode 100644 index 0000000000..821b020beb --- /dev/null +++ b/module/core/diagnostics_tools/src/diag/mod.rs @@ -0,0 +1,83 @@ + +pub( crate ) mod private +{ +} + +#[ cfg( feature = "diagnostics_runtime_assertions" ) ] +/// Run-time assertions. +pub mod rta; +#[ cfg( feature = "diagnostics_compiletime_assertions" ) ] +/// Compile-time assertions. +pub mod cta; +/// Compile-time asserting of memory layout. +#[ cfg( feature = "diagnostics_memory_layout" ) ] +pub mod layout; + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ cfg( feature = "diagnostics_runtime_assertions" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::rta::orphan::*; + #[ cfg( feature = "diagnostics_compiletime_assertions" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::cta::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "diagnostics_memory_layout" ) ] + pub use super::layout::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ cfg( feature = "diagnostics_runtime_assertions" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::rta::exposed::*; + #[ cfg( feature = "diagnostics_compiletime_assertions" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::cta::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "diagnostics_memory_layout" ) ] + pub use super::layout::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ cfg( feature = "diagnostics_runtime_assertions" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::rta::prelude::*; + #[ cfg( feature = "diagnostics_compiletime_assertions" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::cta::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "diagnostics_memory_layout" ) ] + pub use super::layout::prelude::*; +} diff --git a/module/core/diagnostics_tools/src/diag/rta.rs b/module/core/diagnostics_tools/src/diag/rta.rs new file mode 100644 index 0000000000..38b9b5a0f3 --- /dev/null +++ b/module/core/diagnostics_tools/src/diag/rta.rs @@ -0,0 +1,289 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Asserts that a boolean expression is true at runtime. + /// + /// This will invoke the panic! macro if the provided expression cannot be evaluated to true at runtime. + /// + /// ### Basic use-case. + /// + /// ``` rust + /// use diagnostics_tools::prelude::*; + /// a_true!( 1 == 1, "something wrong" ); + /// ``` + /// + + #[ macro_export ] + macro_rules! a_true + { + () => {}; + ( + $( $Rest : tt )* + ) + => + { + assert!( $( $Rest )* ); + }; + } + + /// + /// Asserts that a boolean expression is false at runtime. + /// + /// This will invoke the panic! macro if the provided expression cannot be evaluated to false at runtime. + /// + /// ### Basic use-case. + /// + /// ``` should_panic + /// use diagnostics_tools::prelude::*; + /// a_true!( 1 == 2, "something wrong" ); + /// ``` + /// + + #[ macro_export ] + macro_rules! a_false + { + () => {}; + ( + $( $Rest : tt )* + ) + => + { + assert!( ! $( $Rest )* ); + }; + } + + /// + /// Asserts that a boolean expression is true at runtime. + /// + /// This will invoke the panic! macro if the provided expression cannot be evaluated to true at runtime. + /// Like [a_true!], this macro also has a second version, where a custom panic message can be provided. + /// + /// ### Basic use-case. + /// + /// ``` rust + /// use diagnostics_tools::prelude::*; + /// a_dbg_true!( 1 == 1, "something wrong" ); + /// ``` + /// + + #[ macro_export ] + macro_rules! a_dbg_true + { + () => {}; + ( + $( $Rest : tt )* + ) + => + { + debug_assert!( $( $Rest )* ); + }; + } + + /// + /// Asserts that a boolean expression is false at runtime. + /// + /// This will invoke the panic! macro if the provided expression cannot be evaluated to false at runtime. + /// Like [a_false!], this macro also has a second version, where a custom panic message can be provided. + /// + /// ### Basic use-case. + /// + /// ``` should_panic + /// use diagnostics_tools::prelude::*; + /// a_dbg_true!( 1 == 2, "something wrong" ); + /// ``` + /// + + #[ macro_export ] + macro_rules! a_dbg_false + { + () => {}; + ( + $( $Rest : tt )* + ) + => + { + debug_assert!( ! $( $Rest )* ); + }; + } + + /// + /// Asserts that two expressions are identical. + /// + /// This macro will invoke the panic! macro if the two expressions have different values at runtime. + /// Like [a_id!], this macro also has a second version where a custom panic message can be provided. + /// + /// ### Basic use-case. + /// + /// ``` rust + /// use diagnostics_tools::prelude::*; + /// a_dbg_id!( 1, 1, "something wrong" ); + /// ``` + /// + + #[ macro_export ] + macro_rules! a_dbg_id + { + ( + $( $arg:tt )* + ) + => + { + if cfg!( debug_assertions ) + { + $crate::a_id!( $( $arg )* ); + } + }; + + } + + /// + /// Asserts that two expressions are not identical with each other. + /// + /// This will invoke the panic! macro if two experessions have the same value at runtime. + /// Like [a_id!], this macro also has a second version, where a custom panic message can be provided. + /// + /// ### Basic use-case. + /// + /// ``` rust + /// use diagnostics_tools::prelude::*; + /// a_dbg_not_id!( 1, 2, "something wrong" ); + /// ``` + /// + + #[ macro_export ] + macro_rules! a_dbg_not_id + { + ( + $( $arg:tt )* + ) + => + { + if cfg!( debug_assertions ) + { + $crate::a_not_id!( $( $arg )* ); + } + }; + + } + + // xxx : qqq : improve a_id and other similar macroses, make sure message is visible int console + // a_id!( exp, got, "Failed: path_with_trailing_dot_or_dotdot_segments. Expected: '{}', got: '{}'", exp, got ); + + /// + /// Asserts that two expressions are identical to each other (using [`PartialEq`]). Prints nice diff. + /// + + #[macro_export] + macro_rules! a_id + { + ( $left:expr , $right:expr $(,)? ) + => + ({ + $crate::dependency::pretty_assertions::assert_eq!( $left, $right ); + }); + ($left:expr, $right:expr, $($arg:tt)*) + => + ({ + $crate::dependency::pretty_assertions::assert_eq!( $left, $right, $($arg)+ ); + }); + } + + /// + /// Asserts that two expressions are not identical to each other (using [`PartialEq`]). Prints nice diff. + /// + + #[macro_export] + macro_rules! a_not_id + { + ( $left:expr , $right:expr $(,)? ) + => + ({ + $crate::dependency::pretty_assertions::assert_ne!( $left, $right ); + }); + ($left:expr, $right:expr, $($arg:tt)*) + => + ({ + $crate::dependency::pretty_assertions::assert_ne!( $left, $right, $($arg)+ ); + }); + } + + pub use a_id; + pub use a_not_id; + pub use a_true; + pub use a_false; + pub use a_dbg_true; + pub use a_dbg_false; + pub use a_dbg_id; + pub use a_dbg_not_id; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::a_id as assert_eq; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::a_not_id as assert_ne; + +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use ::pretty_assertions::assert_eq as a_id; + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use ::pretty_assertions::assert_ne as a_not_id; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::a_id; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::a_not_id; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + a_true, + a_false, + a_dbg_true, + a_dbg_false, + a_dbg_id, + a_dbg_not_id, + }; + +} + diff --git a/module/core/diagnostics_tools/src/lib.rs b/module/core/diagnostics_tools/src/lib.rs new file mode 100644 index 0000000000..cce36f97b7 --- /dev/null +++ b/module/core/diagnostics_tools/src/lib.rs @@ -0,0 +1,65 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/diagnostics_tools/latest/diagnostics_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +/// Compile-time asserting. +pub mod diag; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ cfg( feature = "diagnostics_runtime_assertions" ) ] + pub use ::pretty_assertions; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::diag::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::diag::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::diag::prelude::*; +} diff --git a/module/core/diagnostics_tools/tests/diagnostics_tests.rs b/module/core/diagnostics_tools/tests/diagnostics_tests.rs new file mode 100644 index 0000000000..46138a3acb --- /dev/null +++ b/module/core/diagnostics_tools/tests/diagnostics_tests.rs @@ -0,0 +1,15 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ cfg_attr( feature = "type_name_of_val", feature( type_name_of_val ) ) ] +// #![ feature( trace_macros ) ] + +#[ allow( unused_imports ) ] +use diagnostics_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +// #[ path="../../../../module/step/meta/src/module/terminal.rs" ] +// mod terminal; + +mod inc; diff --git a/module/core/diagnostics_tools/tests/inc/cta_test.rs b/module/core/diagnostics_tools/tests/inc/cta_test.rs new file mode 100644 index 0000000000..79e408503c --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/cta_test.rs @@ -0,0 +1,40 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use the_module::prelude::*; + +tests_impls! +{ + + #[ cfg( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ) ] + fn cta_true_pass() + { + // test.case( "check feature, true" ); + cta_true!( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ); + // zzz : try ( 1 + 2 == 3 ) + } + +} + +// only_for_terminal_module! +// { + +// #[ cfg( feature = "diagnostics_compiletime_assertions" ) ] +// #[ test_tools::nightly ] +// #[ test ] +// fn cta_trybuild_tests() +// { +// let t = test_tools::compiletime::TestCases::new(); +// t.compile_fail( "tests/inc/snipet/cta_true_fail.rs" ); +// // a_id!( 1, 2 ); +// } + +// } + +// + +tests_index! +{ + cta_true_pass, + // cta_trybuild_tests, +} diff --git a/module/core/diagnostics_tools/tests/inc/layout_test.rs b/module/core/diagnostics_tools/tests/inc/layout_test.rs new file mode 100644 index 0000000000..37cd393f46 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/layout_test.rs @@ -0,0 +1,110 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use the_module::prelude::*; + +// qqq : do negative testing /* aaa : Dmytro : done */ +// zzz : continue here + +tests_impls! +{ + + #[ cfg( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ) ] + fn cta_type_same_size_pass() + { + struct Int( i16 ); + let got = cta_type_same_size!( Int, i16 ); + assert!( got ); + // cta_type_same_size!( Int, i32 ); + } + + // + + #[ cfg( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ) ] + fn cta_type_same_align_pass() + { + struct Int1( i16 ); + #[ repr( align( 128 ) ) ] + struct Int2( i16 ); + let got = cta_type_same_align!( Int1, i16 ); + assert!( got ); + // cta_type_same_align!( Int1, Int2 ); + // cta_type_same_align!( Int1, i32 ); + } + + #[ cfg( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ) ] + fn cta_ptr_same_size_pass() + { + struct Int( i16 ); + let ins1 = Int( 31 ); + let ins2 = 13_i16; + let got = cta_ptr_same_size!( &ins1, &ins2 ); + assert!( got ); + let got = cta_ptr_same_size!( &ins1, &ins2 ); + assert!( got ); + let got = cta_ptr_same_size!( &ins1, &31_i16 ); + assert!( got ); + // cta_ptr_same_size!( &ins1, &13_i32 ); + } + + #[ cfg( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ) ] + fn cta_mem_same_size_pass() + { + struct Int( i16 ); + let ins1 = Int( 31 ); + let ins2 = 13_i16; + let got = cta_mem_same_size!( ins1, ins2 ); + assert!( got ); + let got = cta_mem_same_size!( ins1, ins2 ); + assert!( got ); + let got = cta_mem_same_size!( ins1, 31_i16 ); + assert!( got ); + // cta_mem_same_size!( ins1, 13_i32 ); + } + +} + +#[ path = "../../../../step/meta/src/module/aggregating.rs" ] +mod aggregating; + +use crate::only_for_terminal_module; + +only_for_terminal_module! +{ + #[ cfg( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ) ] + #[ test_tools::nightly ] + #[ test ] + fn cta_trybuild_tests() + { + let t = test_tools::compiletime::TestCases::new(); + + let current_exe_path = std::env::current_exe().expect( "No such file or directory" ); + + let exe_directory = current_exe_path.parent().expect( "No such file or directory" ); + fn find_workspace_root( start_path : &std::path::Path ) -> Option< &std::path::Path > + { + start_path + .ancestors() + .find( |path| path.join( "Cargo.toml" ).exists() ) + } + + let workspace_root = find_workspace_root( exe_directory ).expect( "No such file or directory" ); + let current_dir = workspace_root.join( "module/core/diagnostics_tools" ); + + t.compile_fail( current_dir.join("tests/inc/snipet/cta_type_same_size_fail.rs") ); + t.compile_fail( current_dir.join("tests/inc/snipet/cta_type_same_align_fail.rs") ); + t.compile_fail( current_dir.join("tests/inc/snipet/cta_ptr_same_size_fail.rs") ); + t.compile_fail( current_dir.join("tests/inc/snipet/cta_mem_same_size_fail.rs") ); + } +} + +// + +tests_index! +{ + cta_type_same_size_pass, + cta_type_same_align_pass, + cta_ptr_same_size_pass, + cta_mem_same_size_pass, + // cta_trybuild_tests, +} diff --git a/module/core/diagnostics_tools/tests/inc/mod.rs b/module/core/diagnostics_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..68dc070886 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/mod.rs @@ -0,0 +1,7 @@ +use super::*; + +#[ cfg( any( feature = "diagnostics_runtime_assertions", feature = "diagnostics_runtime_assertions" ) ) ] +mod cta_test; +#[ cfg( any( feature = "diagnostics_compiletime_assertions", feature = "diagnostics_compiletime_assertions" ) ) ] +mod rta_test; +mod layout_test; diff --git a/module/core/diagnostics_tools/tests/inc/rta_test.rs b/module/core/diagnostics_tools/tests/inc/rta_test.rs new file mode 100644 index 0000000000..31bcfe1f3c --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/rta_test.rs @@ -0,0 +1,555 @@ +#[ allow( unused_imports ) ] +use super::*; +// use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use the_module::prelude::*; + +// qqq : do negative testing, don't forget about optional arguments /* aaa : Dmytro : done */ +#[ cfg( not( target_os = "windows" ) ) ] +tests_impls! +{ + fn a_true_pass() + { + a_true!( 1 == 1 ); + } + + #[ should_panic ] + fn a_true_fail_simple() + { + a_true!( 1 == 2 ); + } + + #[ should_panic ] + fn a_true_fail_with_msg() + { + a_true!( 1 == 2, "not equal" ); + } + + #[ should_panic ] + fn a_true_fail_with_msg_template() + { + let v = 2; + a_true!( 1 == v, "not equal 1 == {}", v ); + } + + // + + fn a_id_pass() + { + a_id!( "abc", "abc" ); + } + + #[ should_panic ] + fn a_id_fail_simple() + { + a_id!( 1, 2 ); + } + + #[ should_panic ] + fn a_id_fail_with_msg() + { + a_id!( 1, 2, "not equal" ); + } + + #[ should_panic ] + fn a_id_fail_with_msg_template() + { + let v = 2; + a_id!( 1, v, "not equal 1 == {}", v ); + } + + #[ allow( unused_macros ) ] + fn a_id_run() + { + use std::path::PathBuf; + let t = test_tools::compiletime::TestCases::new(); + let relative_path = "diagnostics_tools/tests/inc/snipet/rta_id.rs"; + let absolute_path = std::env::current_dir().unwrap(); + let current_dir_str = absolute_path.to_string_lossy(); + + let trimmed_path = if let Some( index ) = current_dir_str.find( "core/" ) + { + ¤t_dir_str[ 0..index + "core/".len() ] + } + else + { + relative_path + }; + + let res = trimmed_path.to_string() + relative_path; + + t.pass( res ); + // t.pass( "tests/inc/snipet/rta_id_fail.rs" ); + // zzz : make testing utility to check output and use + + // let ins1 = ( 13, 15, 16 ); + // let ins2 = ( 13, 15, 17 ); + // a_id!( ins1, ins2 ); + + } + + // + + fn a_not_id_pass() + { + a_not_id!( "abc", "abd" ); + } + + #[ should_panic ] + fn a_not_id_fail_simple() + { + a_not_id!( 1, 1 ); + } + + #[ should_panic ] + fn a_not_id_fail_with_msg() + { + a_not_id!( 1, 1, "equal" ); + } + + #[ should_panic ] + fn a_not_id_fail_with_msg_template() + { + let v = 1; + a_not_id!( 1, v, "equal 1 == {}", v ); + } + + #[ allow( unused_macros ) ] + fn a_not_id_run() + { + use std::path::PathBuf; + let t = test_tools::compiletime::TestCases::new(); + let relative_path = "diagnostics_tools/tests/inc/snipet/rta_id.rs"; + let absolute_path = std::env::current_dir().unwrap(); + let current_dir_str = absolute_path.to_string_lossy(); + + let trimmed_path = if let Some( index ) = current_dir_str.find( "core/" ) + { + ¤t_dir_str[ 0..index + "core/".len() ] + } + else + { + relative_path + }; + + let res = trimmed_path.to_string() + relative_path; + + t.pass( res ); + // t.pass( "tests/inc/snipet/rta_not_id_fail.rs" ); + // zzz : make testing utility to check output and use + + // let ins1 = ( 13, 15, 16 ); + // let ins2 = ( 13, 15, 16 ); + // a_not_id!( ins1, ins2 ); + } + + // + + fn a_dbg_true_pass() + { + a_dbg_true!( 1 == 1 ); + + let mut x = 0; + let mut f1 = ||-> i32 + { + x += 1; + x + }; + a_dbg_true!( f1() == 1 ); + + #[ cfg( debug_assertions ) ] + assert_eq!( x, 1 ); + #[ cfg( not( debug_assertions ) ) ] + assert_eq!( x, 0 ); + + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_true_fail_simple() + { + a_dbg_true!( 1 == 2 ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_true_fail_with_msg() + { + a_dbg_true!( 1 == 2, "not equal" ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_true_fail_with_msg_template() + { + let v = 2; + a_dbg_true!( 1 == v, "not equal 1 == {}", v ); + } + + // + + fn a_dbg_id_pass() + { + a_dbg_id!( "abc", "abc" ); + + let mut x = 0; + let mut f1 = ||-> i32 + { + x += 1; + x + }; + a_dbg_id!( f1(), 1 ); + + #[ cfg( debug_assertions ) ] + assert_eq!( x, 1 ); + #[ cfg( not( debug_assertions ) ) ] + assert_eq!( x, 0 ); + + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_id_fail_simple() + { + a_dbg_id!( 1, 2 ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_id_fail_with_msg() + { + a_dbg_id!( 1, 2, "not equal" ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_id_fail_with_msg_template() + { + let v = 2; + a_dbg_id!( 1, v, "not equal 1 == {}", v ); + } + + // + + fn a_dbg_not_id_pass() + { + a_dbg_not_id!( "abc", "bdc" ); + + let mut x = 0; + let mut f1 = ||-> i32 + { + x += 1; + x + }; + a_dbg_not_id!( f1(), 0 ); + + #[ cfg( debug_assertions ) ] + assert_eq!( x, 1 ); + #[ cfg( not( debug_assertions ) ) ] + assert_eq!( x, 0 ); + + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_not_id_fail_simple() + { + a_dbg_not_id!( 1, 1 ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_not_id_fail_with_msg() + { + a_dbg_not_id!( 1, 1, "equal" ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_not_id_fail_with_msg_template() + { + let v = 1; + a_dbg_not_id!( 1, v, "equal 1 == {}", v ); + } +} + +// +#[ cfg( target_os = "windows" ) ] +tests_impls! +{ + fn a_true_pass() + { + a_true!( 1 == 1 ); + } + + #[ should_panic ] + fn a_true_fail_simple() + { + a_true!( 1 == 2 ); + } + + #[ should_panic ] + fn a_true_fail_with_msg() + { + a_true!( 1 == 2, "not equal" ); + } + + #[ should_panic ] + fn a_true_fail_with_msg_template() + { + let v = 2; + a_true!( 1 == v, "not equal 1 == {}", v ); + } + + // + + fn a_id_pass() + { + a_id!( "abc", "abc" ); + } + + #[ should_panic ] + fn a_id_fail_simple() + { + a_id!( 1, 2 ); + } + + #[ should_panic ] + fn a_id_fail_with_msg() + { + a_id!( 1, 2, "not equal" ); + } + + #[ should_panic ] + fn a_id_fail_with_msg_template() + { + let v = 2; + a_id!( 1, v, "not equal 1 == {}", v ); + } + + // + + fn a_not_id_pass() + { + a_not_id!( "abc", "abd" ); + } + + #[ should_panic ] + fn a_not_id_fail_simple() + { + a_not_id!( 1, 1 ); + } + + #[ should_panic ] + fn a_not_id_fail_with_msg() + { + a_not_id!( 1, 1, "equal" ); + } + + #[ should_panic ] + fn a_not_id_fail_with_msg_template() + { + let v = 1; + a_not_id!( 1, v, "equal 1 == {}", v ); + } + + // + + fn a_dbg_true_pass() + { + a_dbg_true!( 1 == 1 ); + + let mut x = 0; + let mut f1 = ||-> i32 + { + x += 1; + x + }; + a_dbg_true!( f1() == 1 ); + + #[ cfg( debug_assertions ) ] + assert_eq!( x, 1 ); + #[ cfg( not( debug_assertions ) ) ] + assert_eq!( x, 0 ); + + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_true_fail_simple() + { + a_dbg_true!( 1 == 2 ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_true_fail_with_msg() + { + a_dbg_true!( 1 == 2, "not equal" ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_true_fail_with_msg_template() + { + let v = 2; + a_dbg_true!( 1 == v, "not equal 1 == {}", v ); + } + + // + + fn a_dbg_id_pass() + { + a_dbg_id!( "abc", "abc" ); + + let mut x = 0; + let mut f1 = ||-> i32 + { + x += 1; + x + }; + a_dbg_id!( f1(), 1 ); + + #[ cfg( debug_assertions ) ] + assert_eq!( x, 1 ); + #[ cfg( not( debug_assertions ) ) ] + assert_eq!( x, 0 ); + + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_id_fail_simple() + { + a_dbg_id!( 1, 2 ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_id_fail_with_msg() + { + a_dbg_id!( 1, 2, "not equal" ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_id_fail_with_msg_template() + { + let v = 2; + a_dbg_id!( 1, v, "not equal 1 == {}", v ); + } + + // + + fn a_dbg_not_id_pass() + { + a_dbg_not_id!( "abc", "bdc" ); + + let mut x = 0; + let mut f1 = ||-> i32 + { + x += 1; + x + }; + a_dbg_not_id!( f1(), 0 ); + + #[ cfg( debug_assertions ) ] + assert_eq!( x, 1 ); + #[ cfg( not( debug_assertions ) ) ] + assert_eq!( x, 0 ); + + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_not_id_fail_simple() + { + a_dbg_not_id!( 1, 1 ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_not_id_fail_with_msg() + { + a_dbg_not_id!( 1, 1, "equal" ); + } + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn a_dbg_not_id_fail_with_msg_template() + { + let v = 1; + a_dbg_not_id!( 1, v, "equal 1 == {}", v ); + } +} + + +#[ cfg( target_os = "windows" ) ] +tests_index! +{ + a_true_pass, + a_true_fail_simple, + a_true_fail_with_msg, + a_true_fail_with_msg_template, + + a_id_pass, + a_id_fail_simple, + a_id_fail_with_msg, + a_id_fail_with_msg_template, + + a_not_id_pass, + a_not_id_fail_simple, + a_not_id_fail_with_msg, + a_not_id_fail_with_msg_template, + + a_dbg_true_pass, + a_dbg_true_fail_simple, + a_dbg_true_fail_with_msg, + a_dbg_true_fail_with_msg_template, + + a_dbg_id_pass, + a_dbg_id_fail_simple, + a_dbg_id_fail_with_msg, + a_dbg_id_fail_with_msg_template, + + a_dbg_not_id_pass, + a_dbg_not_id_fail_simple, + a_dbg_not_id_fail_with_msg, + a_dbg_not_id_fail_with_msg_template, +} + +#[ cfg( not( target_os = "windows" ) ) ] +tests_index! +{ + a_true_pass, + a_true_fail_simple, + a_true_fail_with_msg, + a_true_fail_with_msg_template, + + a_id_pass, + a_id_fail_simple, + a_id_fail_with_msg, + a_id_fail_with_msg_template, + a_id_run, + + a_not_id_pass, + a_not_id_fail_simple, + a_not_id_fail_with_msg, + a_not_id_fail_with_msg_template, + a_not_id_run, + + a_dbg_true_pass, + a_dbg_true_fail_simple, + a_dbg_true_fail_with_msg, + a_dbg_true_fail_with_msg_template, + + a_dbg_id_pass, + a_dbg_id_fail_simple, + a_dbg_id_fail_with_msg, + a_dbg_id_fail_with_msg_template, + + a_dbg_not_id_pass, + a_dbg_not_id_fail_simple, + a_dbg_not_id_fail_with_msg, + a_dbg_not_id_fail_with_msg_template, +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.rs b/module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.rs new file mode 100644 index 0000000000..be7b47b741 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.rs @@ -0,0 +1,9 @@ +use test_tools::diagnostics_tools::*; + +fn main() +{ + struct Int( i16 ); + let ins1 = Int( 31 ); + let ins2 = 13_i32; + cta_mem_same_size!( ins1, ins2 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.stderr b/module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.stderr new file mode 100644 index 0000000000..e3d8200778 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.stderr @@ -0,0 +1,9 @@ +error[E0512]: cannot transmute between types of different sizes, or dependently-sized types + --> $WORKSPACE/module/core/diagnostics_tools/tests/inc/snipet/cta_mem_same_size_fail.rs + | + | cta_mem_same_size!( ins1, ins2 ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: source type: `i32` (32 bits) + = note: target type: `Int` (16 bits) + = note: this error originates in the macro `$crate::cta_ptr_same_size` which comes from the expansion of the macro `cta_mem_same_size` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.rs b/module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.rs new file mode 100644 index 0000000000..083f2a11c6 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.rs @@ -0,0 +1,9 @@ +use test_tools::diagnostics_tools::*; + +fn main() +{ + struct Int( i16 ); + let ins1 = Int( 31 ); + let ins2 = 13_i32; + cta_ptr_same_size!( &ins1, &ins2 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.stderr b/module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.stderr new file mode 100644 index 0000000000..4c356ff323 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.stderr @@ -0,0 +1,9 @@ +error[E0512]: cannot transmute between types of different sizes, or dependently-sized types + --> $WORKSPACE/module/core/diagnostics_tools/tests/inc/snipet/cta_ptr_same_size_fail.rs + | + | cta_ptr_same_size!( &ins1, &ins2 ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: source type: `i32` (32 bits) + = note: target type: `Int` (16 bits) + = note: this error originates in the macro `cta_ptr_same_size` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.rs b/module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.rs new file mode 100644 index 0000000000..e5abfb2974 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.rs @@ -0,0 +1,6 @@ +use test_tools::diagnostics_tools::*; + +fn main() +{ + cta_true!( feature = "unknown" ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.stderr b/module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.stderr new file mode 100644 index 0000000000..0d83bbe46c --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_true_fail.stderr @@ -0,0 +1,8 @@ +error: Does not hold : + feature = "unknown" + --> tests/inc/snipet/cta_true_fail.rs:5:3 + | +5 | cta_true!( feature = "unknown" ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in the macro `cta_true` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.rs b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.rs new file mode 100644 index 0000000000..b94f6e6193 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.rs @@ -0,0 +1,8 @@ +use test_tools::diagnostics_tools::*; + +fn main() +{ + #[ repr( align( 128 ) ) ] + struct Int( i16 ); + cta_type_same_align!( Int, i16 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.stderr b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.stderr new file mode 100644 index 0000000000..6318966d6f --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.stderr @@ -0,0 +1,10 @@ +error[E0308]: mismatched types + --> $WORKSPACE/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_align_fail.rs + | + | cta_type_same_align!( Int, i16 ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | expected an array with a fixed size of 128 elements, found one with 2 elements + | expected due to this + | + = note: this error originates in the macro `cta_type_same_align` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.rs b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.rs new file mode 100644 index 0000000000..dd26815ac0 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.rs @@ -0,0 +1,7 @@ +use test_tools::diagnostics_tools::*; + +fn main() +{ + struct Int( i16 ); + cta_type_same_size!( Int, u32 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.stderr b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.stderr new file mode 100644 index 0000000000..b328eb1df0 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.stderr @@ -0,0 +1,10 @@ +error[E0308]: mismatched types + --> $WORKSPACE/module/core/diagnostics_tools/tests/inc/snipet/cta_type_same_size_fail.rs + | + | cta_type_same_size!( Int, u32 ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | expected an array with a fixed size of 2 elements, found one with 4 elements + | expected due to this + | + = note: this error originates in the macro `cta_type_same_size` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/core/diagnostics_tools/tests/inc/snipet/rta_id.rs b/module/core/diagnostics_tools/tests/inc/snipet/rta_id.rs new file mode 100644 index 0000000000..c40cb57c0a --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/rta_id.rs @@ -0,0 +1,8 @@ +use test_tools::diagnostics_tools::*; + +fn main() +{ + let ins1 = ( 13, 15, 16 ); + let ins2 = ( 13, 15, 16 ); + a_id!( ins1, ins2 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.rs b/module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.rs new file mode 100644 index 0000000000..6a2676fd00 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.rs @@ -0,0 +1,8 @@ +use diagnostics_tools::*; + +fn main() +{ + let ins1 = ( 13, 15, 16 ); + let ins2 = ( 13, 15, 17 ); + a_id!( ins1, ins2 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.stderr b/module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.stderr new file mode 100644 index 0000000000..c3ecd0e14c --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/rta_id_fail.stderr @@ -0,0 +1,11 @@ +<**> +assertion failed: `(left == right)` + +Diff < left / right > : + ( + 13, + 15, +< 16, +> 17, + ) +<**> \ No newline at end of file diff --git a/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id.rs b/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id.rs new file mode 100644 index 0000000000..d0a859b7fe --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id.rs @@ -0,0 +1,8 @@ +use diagnostics_tools::*; + +fn main() +{ + let ins1 = ( 13, 15, 16 ); + let ins2 = ( 13, 15, 17 ); + a_not_id!( ins1, ins2 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.rs b/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.rs new file mode 100644 index 0000000000..b852bf4f82 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.rs @@ -0,0 +1,8 @@ +use diagnostics_tools::*; + +fn main() +{ + let ins1 = ( 13, 15, 16 ); + let ins2 = ( 13, 15, 16 ); + a_not_id!( ins1, ins2 ); +} diff --git a/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.stderr b/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.stderr new file mode 100644 index 0000000000..a4ae25a343 --- /dev/null +++ b/module/core/diagnostics_tools/tests/inc/snipet/rta_not_id_fail.stderr @@ -0,0 +1,13 @@ +<**> +assertion failed: `(left != right)` + +Both sides: +( + 13, + 15, + 16, +) + + +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +<**> \ No newline at end of file diff --git a/module/core/diagnostics_tools/tests/smoke_test.rs b/module/core/diagnostics_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/diagnostics_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/error_tools/Cargo.toml b/module/core/error_tools/Cargo.toml new file mode 100644 index 0000000000..1ef5cccee8 --- /dev/null +++ b/module/core/error_tools/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "error_tools" +version = "0.14.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/error_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/error_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/error_tools" +description = """ +Basic exceptions handling mechanism +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +# = features + +[features] +default = [ + "enabled", + "error_for_lib", + "error_for_app", +] +full = [ + "enabled", + "error_for_lib", + "error_for_app", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +error_for_lib = [ "thiserror" ] +error_for_app = [ "anyhow" ] + +# = entry + +[dependencies] +anyhow = { version = "~1.0", optional = true } +thiserror = { version = "~1.0", optional = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/error_tools/License b/module/core/error_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/error_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/error_tools/Readme.md b/module/core/error_tools/Readme.md new file mode 100644 index 0000000000..cf2613a5ba --- /dev/null +++ b/module/core/error_tools/Readme.md @@ -0,0 +1,50 @@ + + +# Module :: error_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/error_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/error_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ferror_tools%2Fexamples%2Ferror_tools_trivial.rs,RUN_POSTFIX=--example%20error_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Basic exceptions handling mechanism. + +### Basic use-case + + + +```rust ignore +#[ cfg( feature = "enabled" ) ] +fn main() +{ + let err = f1(); + println!( "{err:#?}" ); + // < Err( + // < BasicError { + // < msg: "Some error", + // < }, + // < ) +} + +#[ cfg( feature = "enabled" ) ] +fn f1() -> error_tools::Result< () > +{ + let _read = std::fs::read_to_string( "Cargo.toml" )?; + Err( error_tools::BasicError::new( "Some error" ).into() ) +} +``` + + + + +### To add to your project + +```sh +cargo add error_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example error_tools_trivial +``` diff --git a/module/core/error_tools/examples/error_tools_trivial.rs b/module/core/error_tools/examples/error_tools_trivial.rs new file mode 100644 index 0000000000..f20df26c12 --- /dev/null +++ b/module/core/error_tools/examples/error_tools_trivial.rs @@ -0,0 +1,21 @@ +//! qqq : write proper description +fn main() +{ + #[ cfg( not( feature = "no_std" ) ) ] + { + let err = f1(); + println!( "{err:#?}" ); + // < Err( + // < BasicError { + // < msg: "Some error", + // < }, + // < ) + } +} + +#[ cfg( not( feature = "no_std" ) ) ] +fn f1() -> error_tools::Result< () > +{ + let _read = std::fs::read_to_string( "Cargo.toml" )?; + Err( error_tools::BasicError::new( "Some error" ).into() ) +} diff --git a/module/core/error_tools/src/assert.rs b/module/core/error_tools/src/assert.rs new file mode 100644 index 0000000000..0fe7bcf1f6 --- /dev/null +++ b/module/core/error_tools/src/assert.rs @@ -0,0 +1,152 @@ +/// Internal namespace. +pub( crate ) mod private +{ + /// + /// Macro asserts that two expressions are identical to each other. Unlike std::assert_eq it is removed from a release build. + /// + + #[ macro_export ] + macro_rules! debug_assert_id + { + ( $( $arg : tt )+ ) => + { + #[cfg(debug_assertions)] + // $crate::assert_eq!( $( $arg )+ ); + std::assert_eq!( $( $arg )+ ); + }; + // ( $left : expr, $right : expr $(,)? ) => + // {{ + // match( &$left, &$right ) + // { + // #[cfg(debug_assertions)] + // ( left_val, right_val ) => + // { + // if !( *left_val == *right_val ) + // { + // let kind = core::panicking::AssertKind::Eq; + // core::panicking::assert_failed + // ( + // kind, + // &*left_val, + // &*right_val, + // core::option::Option::None, + // ); + // } + // } + // } + // }}; + // ( $left : expr, $right:expr, $( $arg : tt )+ ) => + // {{ + // match( &$left, &$right ) + // { + // #[cfg(debug_assertions)] + // ( left_val, right_val ) => + // { + // if !(*left_val == *right_val) + // { + // let kind = core::panicking::AssertKind::Eq; + // core::panicking::assert_failed + // ( + // kind, + // &*left_val, + // &*right_val, + // core::option::Option::Some( $crate::format_args!( $( $arg )+ ) ), + // ); + // } + // } + // } + // }}; + } + + /// Macro asserts that two expressions are identical to each other. Unlike std::assert_eq it is removed from a release build. Alias of debug_assert_id. + + #[ macro_export ] + macro_rules! debug_assert_identical + { + ( $( $arg : tt )+ ) => + { + #[cfg(debug_assertions)] + $crate::debug_assert_id!( $( $arg )+ ); + }; + } + + /// Macro asserts that two expressions are not identical to each other. Unlike std::assert_eq it is removed from a release build. + + #[ macro_export ] + macro_rules! debug_assert_ni + { + ( $( $arg : tt )+ ) => + { + #[cfg(debug_assertions)] + // $crate::assert_ne!( $( $arg )+ ); + std::assert_ne!( $( $arg )+ ); + }; + } + + /// Macro asserts that two expressions are not identical to each other. Unlike std::assert_eq it is removed from a release build. + + #[ macro_export ] + macro_rules! debug_assert_not_identical + { + ( $( $arg : tt )+ ) => + { + #[cfg(debug_assertions)] + // $crate::assert_ne!( $( $arg )+ ); + $crate::debug_assert_ni!( $( $arg )+ ); + }; + } + + // /// Macro asserts that expression is ture. Unlike std::assert it is removed from a release build. + // + // #[ macro_export ] + // macro_rules! debug_assert + // { + // ( $( $arg : tt )+ ) => + // { + // #[cfg(debug_assertions)] + // $crate::assert!( $( $arg )+ ); + // }; + // } + + pub use debug_assert_id; + pub use debug_assert_identical; + pub use debug_assert_ni; + pub use debug_assert_not_identical; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Shared with parent namespace of the module +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + pub use super::private::debug_assert_id; + pub use super::private::debug_assert_identical; + pub use super::private::debug_assert_ni; + pub use super::private::debug_assert_not_identical; +} diff --git a/module/core/error_tools/src/error.rs b/module/core/error_tools/src/error.rs new file mode 100644 index 0000000000..0b8fa734ba --- /dev/null +++ b/module/core/error_tools/src/error.rs @@ -0,0 +1,152 @@ +/// Internal namespace. +pub( crate ) mod private +{ + pub use std::error::Error as ErrorInterface; + + /// + /// Macro to generate an error descriptor. + /// + /// ### Basic use-case. + /// ```rust + /// # use error_tools::{ BasicError, err }; + /// fn f1() -> BasicError + /// { + /// return err!( "No attr" ); + /// } + /// ``` + /// + + #[ macro_export ] + macro_rules! err + { + + ( $msg : expr ) => + { + $crate::BasicError::new( $msg ).into() + }; + ( $msg : expr, $( $arg : expr ),+ $(,)? ) => + { + $crate::BasicError::new( format!( $msg, $( $arg ),+ ) ).into() + }; + + } + + /// + /// Macro to return an Err( error ) generating error descriptor. + /// + /// ### Basic use-case. + /// ```rust + /// # use error_tools::{ BasicError, return_err }; + /// fn f1() -> Result< (), BasicError > + /// { + /// return_err!( "No attr" ); + /// } + /// ``` + /// + + #[ macro_export ] + macro_rules! return_err + { + + ( $msg : expr ) => + { + return Result::Err( $crate::err!( $msg ) ) + }; + ( $msg : expr, $( $arg : expr ),+ $(,)? ) => + { + return Result::Err( $crate::err!( $msg, $( $arg ),+ ) ) + }; + + } + + // xxx : deprecate maybe? + /// baic implementation of generic BasicError + + #[ derive( core::fmt::Debug, core::clone::Clone, core::cmp::PartialEq, core::cmp::Eq ) ] + pub struct BasicError + { + msg : String, + } + + impl BasicError + { + /// Constructor expecting message with description. + pub fn new< Msg : Into< String > >( msg : Msg ) -> BasicError + { + BasicError { msg : msg.into() } + } + /// Message with description getter. + pub fn msg( &self ) -> &String + { + &self.msg + } + } + + impl core::fmt::Display for BasicError + { + fn fmt(&self, f: &mut core::fmt::Formatter< '_ >) -> core::fmt::Result + { + write!( f, "{}", self.msg ) + } + } + + impl ErrorInterface for BasicError + { + fn description( &self ) -> &str + { + &self.msg + } + } + + impl< T > From< BasicError > for Result< T, BasicError > + { + /// Returns the argument unchanged. + #[ inline( always ) ] + fn from( src : BasicError ) -> Self + { + Result::Err( src ) + } + } + + pub use err; + pub use return_err; + + // qqq : write standard mod interface without using mod_interface /* aaa : Dmytro : added to each library file */ +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Shared with parent namespace of the module +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + pub use super::private::err; + pub use super::private::return_err; + pub use super::private::ErrorInterface; + pub use super::private::BasicError; +} diff --git a/module/core/error_tools/src/lib.rs b/module/core/error_tools/src/lib.rs new file mode 100644 index 0000000000..b672032358 --- /dev/null +++ b/module/core/error_tools/src/lib.rs @@ -0,0 +1,105 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/error_tools/latest/error_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Assertions. +#[ cfg( feature = "enabled" ) ] +pub mod assert; + +/// Alias for std::error::BasicError. +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +pub mod error; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "error_for_lib" ) ] + pub use ::thiserror; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "error_for_app" ) ] + pub use ::anyhow; + +} + +#[ cfg( feature = "enabled" ) ] +/// Exceptions handling mechanism for libs. +pub mod for_lib +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "error_for_lib" ) ] + pub use ::thiserror::*; +} + +#[ cfg( feature = "enabled" ) ] +// qqq : cover by simple test /* aaa : Dmytro : added trivial test routine `basic` */ +/// Exceptions handling mechanism for apps. +pub mod for_app +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "error_for_app" ) ] + pub use ::anyhow::*; +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Shared with parent namespace of the module +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + + #[ cfg( feature = "error_for_app" ) ] + pub use super::for_app::Result; + +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::assert::exposed::*; + + #[ cfg( not( feature = "no_std" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::error::exposed::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ +} diff --git a/module/core/error_tools/src/result.rs b/module/core/error_tools/src/result.rs new file mode 100644 index 0000000000..55717118bc --- /dev/null +++ b/module/core/error_tools/src/result.rs @@ -0,0 +1,43 @@ +// /// Internal namespace. +// pub( crate ) mod private +// { +// use crate::error::BasicError; +// +// /// Type alias for Result with BasicError. +// pub type Result< T, E = BasicError > = std::result::Result< T, E >; +// } +// +// /// Protected namespace of the module. +// pub mod protected +// { +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use super::orphan::*; +// } +// +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use protected::*; +// +// /// Shared with parent namespace of the module +// pub mod orphan +// { +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use super::exposed::*; +// } +// +// /// Exposed namespace of the module. +// pub mod exposed +// { +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use super::prelude::*; +// } +// +// /// Prelude to use essentials: `use my_module::prelude::*`. +// pub mod prelude +// { +// pub use super::private::Result; +// } +// diff --git a/module/core/error_tools/tests/error_tools_tests.rs b/module/core/error_tools/tests/error_tools_tests.rs new file mode 100644 index 0000000000..0374c10521 --- /dev/null +++ b/module/core/error_tools/tests/error_tools_tests.rs @@ -0,0 +1,7 @@ + +#[ allow( unused_imports ) ] +use error_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/core/error_tools/tests/inc/assert_test.rs b/module/core/error_tools/tests/inc/assert_test.rs new file mode 100644 index 0000000000..d9fa4f1aa1 --- /dev/null +++ b/module/core/error_tools/tests/inc/assert_test.rs @@ -0,0 +1,92 @@ +#![ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + fn debug_assert_id_pass() + { + // test.case( "identical" ); + the_module::debug_assert_id!( 1, 1 ); + } + + // + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn debug_assert_id_fail() + { + // test.case( "not identical" ); + the_module::debug_assert_id!( 1, 2 ); + } + + // + + fn debug_assert_identical_pass() + { + // test.case( "identical" ); + the_module::debug_assert_identical!( 1, 1 ); + } + + // + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn debug_assert_identical_fail() + { + // test.case( "not identical" ); + the_module::debug_assert_identical!( 1, 2 ); + } + + // + + fn debug_assert_ni_pass() + { + // test.case( "not identical" ); + the_module::debug_assert_ni!( 1, 2 ); + } + + // + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn debug_assert_ni_fail() + { + // test.case( "identical" ); + the_module::debug_assert_ni!( 1, 1 ); + } + + // + + fn debug_assert_not_identical_pass() + { + // test.case( "not identical" ); + the_module::debug_assert_not_identical!( 1, 2 ); + } + + // + + #[ cfg( debug_assertions ) ] + #[ should_panic ] + fn debug_assert_not_identical_fail() + { + // test.case( "identical" ); + the_module::debug_assert_not_identical!( 1, 1 ); + } +} + +// + +tests_index! +{ + debug_assert_id_pass, + debug_assert_id_fail, + debug_assert_identical_pass, + debug_assert_identical_fail, + + debug_assert_ni_pass, + debug_assert_ni_fail, + debug_assert_not_identical_pass, + debug_assert_not_identical_fail, +} diff --git a/module/core/error_tools/tests/inc/basic_test.rs b/module/core/error_tools/tests/inc/basic_test.rs new file mode 100644 index 0000000000..2cdd891518 --- /dev/null +++ b/module/core/error_tools/tests/inc/basic_test.rs @@ -0,0 +1,135 @@ +#![ allow( deprecated ) ] +#![ allow( unused_imports ) ] +use super::*; + +// + +#[ cfg( not( feature = "no_std" ) ) ] +tests_impls! +{ + fn basic() + { + use std::error::Error; + + // test.case( "basic" ); + + let err1 = the_module::BasicError::new( "Some error" ); + a_id!( err1.to_string(), "Some error" ); + a_id!( err1.description(), "Some error" ); + a_id!( err1.msg(), "Some error" ); + a_id!( format!( "err1 : {}", err1 ), "err1 : Some error" ); + + // test.case( "compare" ); + + let err1 = the_module::BasicError::new( "Some error" ); + let err2 = the_module::BasicError::new( "Some error" ); + a_id!( err1, err2 ); + a_id!( err1.description(), err2.description() ); + + // test.case( "clone" ); + + let err1 = the_module::BasicError::new( "Some error" ); + let err2 = err1.clone(); + a_id!( err1, err2 ); + a_id!( err1.description(), err2.description() ); + } + + // + + fn use1() + { + use std::error::Error as ErrorInterface; + use the_module::BasicError as Error; + + // test.case( "basic" ); + + let err1 = Error::new( "Some error" ); + a_id!( err1.to_string(), "Some error" ); + a_id!( err1.description(), "Some error" ); + a_id!( err1.msg(), "Some error" ); + a_id!( format!( "err1 : {}", err1 ), "err1 : Some error" ); + } + + // + + fn use2() + { + use the_module::{ BasicError, ErrorInterface }; + + // test.case( "basic" ); + + let err1 = BasicError::new( "Some error" ); + a_id!( err1.to_string(), "Some error" ); + a_id!( err1.description(), "Some error" ); + a_id!( err1.msg(), "Some error" ); + a_id!( format!( "err1 : {}", err1 ), "err1 : Some error" ); + } + + // + + fn use3() + { + use std::error::Error; + + // test.case( "basic" ); + + let err1 = the_module::BasicError::new( "Some error" ); + a_id!( err1.to_string(), "Some error" ); + a_id!( err1.description(), "Some error" ); + a_id!( err1.msg(), "Some error" ); + a_id!( format!( "err1 : {}", err1 ), "err1 : Some error" ); + } + + // + + fn err_basic() + { + // test.case( "basic" ); + let err : the_module::BasicError = the_module::err!( "abc" ); + a_id!( err.to_string(), "abc" ); + + // test.case( "with args" ); + let err : the_module::BasicError = the_module::err!( "abc{}{}", "def", "ghi" ); + a_id!( err.to_string(), "abcdefghi" ); + } + + // + + fn sample() + { + #[ cfg( not( feature = "no_std" ) ) ] + fn f1() -> the_module::Result< () > + { + let _read = std::fs::read_to_string( "Cargo.toml" )?; + Err( the_module::BasicError::new( "Some error" ).into() ) + // the_module::BasicError::new( "Some error" ).into() + // zzz : make it working maybe + } + + #[ cfg( not( feature = "no_std" ) ) ] + { + let err = f1(); + println!( "{err:#?}" ); + // < Err( + // < BasicError { + // < msg: "Some error", + // < }, + // < ) + } + } + + +} + +// + +#[ cfg( not( feature = "no_std" ) ) ] +tests_index! +{ + basic, + use1, + use2, + use3, + err_basic, + sample, +} diff --git a/module/core/error_tools/tests/inc/for_app_test.rs b/module/core/error_tools/tests/inc/for_app_test.rs new file mode 100644 index 0000000000..e2eb7601f6 --- /dev/null +++ b/module/core/error_tools/tests/inc/for_app_test.rs @@ -0,0 +1,26 @@ +#![ allow( unused_imports ) ] +use super::*; + +// + +#[ cfg( feature = "error_for_app" ) ] +tests_impls! +{ + fn basic() + { + // test.case( "from parse usize error" ); + + let err = the_module::for_app::anyhow!( "err" ); + a_id!( the_module::for_app::Error::is::< &str >( &err ), true ); + a_id!( err.is::< &str >(), true ); + a_id!( err.to_string(), "err" ); + } +} + +// + +#[ cfg( feature = "error_for_app" ) ] +tests_index! +{ + basic, +} diff --git a/module/core/error_tools/tests/inc/mod.rs b/module/core/error_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..6d99a71ca5 --- /dev/null +++ b/module/core/error_tools/tests/inc/mod.rs @@ -0,0 +1,6 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic_test; +mod for_app_test; +mod assert_test; diff --git a/module/core/error_tools/tests/smoke_test.rs b/module/core/error_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/error_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/for_each/Cargo.toml b/module/core/for_each/Cargo.toml new file mode 100644 index 0000000000..4632085ca1 --- /dev/null +++ b/module/core/for_each/Cargo.toml @@ -0,0 +1,65 @@ +[package] +name = "for_each" +version = "0.8.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/for_each" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/for_each" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/for_each" +description = """ +Apply macro for each element of a list. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] +# include = [ +# "/rust/impl/meta/for_each", +# "/Cargo.toml", +# "/Readme.md", +# "/License", +# ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +# [lib] +# name = "for_each" +# path = "src/meta/for_each/for_each_lib.rs" +# +# [[test]] +# name = "for_each_test" +# path = "tests/meta/for_each_tests.rs" +# +# [[test]] +# name = "for_each_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" +# +# [[example]] +# name = "for_each_trivial" +# path = "examples/for_each_trivial/src/main.rs" +# +# [[example]] +# name = "for_each_map_style" +# path = "examples/for_each_map_style/src/main.rs" + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/for_each/License b/module/core/for_each/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/for_each/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/for_each/Readme.md b/module/core/for_each/Readme.md new file mode 100644 index 0000000000..eb0d2e3d5e --- /dev/null +++ b/module/core/for_each/Readme.md @@ -0,0 +1,126 @@ + + +# Module :: for_each + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml) [![docs.rs](https://img.shields.io/docsrs/for_each?color=e3e8f0&logo=docs.rs)](https://docs.rs/for_each) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ffor_each%2Fexamples%2Ffor_each_trivial.rs,RUN_POSTFIX=--example%20for_each_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Apply a macro for each element of a list. + +Macros `$Callback` is called for each element of the passed list, optionally passing prefix `$Prefix` as the first argument(s) and postfix `$Postfix` as the last argument(s). +Macros could be invoked in either function call style or map call style. Prefix and postfix could be passed only in map call style. +In map call style after passing path to macro pass keyword `where` and options in format : `@KEY Value`. + +In some cases, the same code may be generated without callback macro, just using prefix and postfix. +That's why `$Callback` is also optional. +To invoke `for_each` without callback use map call style omitting path to callback and keyword `where`. + +### Basic Use Case :: function-style call + +Apply a macro for each element of a list. + +Macro `for_each` may be called either in function-style way or in map-style way. +Pass name of macro to apply to elements as the first arguments and elements after the macro name. +Use comma as delimiter. + + + +```rust +use for_each::for_each; +for_each!( dbg, "a", "b", "c" ); + +// generates +dbg!( "a" ); +dbg!( "b" ); +dbg!( "c" ); +``` + +### Basic Use Case :: map-style call + +Macro `for_each` may be called either in function-style way or in map-style way. +Use keys @Prefix @Postfix @Each to pass options as entries of a map. +Options @Prefix and @Postfix are optional and their entries could be omitted, but entry @Each is mandatory. +Order of options should always be @Prefix, @Postfix, @Each. + + + +```rust +use for_each::for_each; + +for_each! +{ + dbg where + @Prefix { "prefix".to_string() + } + @Postfix { + "postfix" } + @Each "a" "b" "c" +}; +``` + +It generates: + +```rust +// generated +dbg!( "prefix".to_string() + "a" + "postfix" ); +dbg!( "prefix".to_string() + "b" + "postfix" ); +dbg!( "prefix".to_string() + "c" + "postfix" ); +``` + +### Basic Use Case :: more than single token + +Both prefix and postfix have to be token tree ( `tt` ). But if you need something more complex put it into braces `{ ... }`. +Macros `for_each` will remove outermost braces. Braces are optional in case of prefix/postfix is a single token. + + + +```rust +use for_each::for_each; + +for_each! +{ + dbg where + @Prefix { "prefix".to_string() + } + @Postfix { + "postfix" } + @Each { "a" + "1" } { "b" + "2" } { "c" + "3" } +}; + +// generates +dbg!( "prefix".to_string() + "a" + "1" + "postfix" ); +dbg!( "prefix".to_string() + "b" + "2" + "postfix" ); +dbg!( "prefix".to_string() + "c" + "3" + "postfix" ); +``` + +### Basic Use Case :: callbackless + +Callback macro is optional. +Use map call style and omit path to callback macro with keyword `where` to invoke `for_each` without a callback. + + + +```rust +use for_each::for_each; +for_each! +{ + @Prefix { dbg! } + @Each ( "a" ) ( "b" ) ( "c" ) +}; +// generates +dbg!( "a" ); +dbg!( "b" ); +dbg!( "c" ); +``` + +### To add to your project + +``` shell +cargo add for_each +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/for_each_trivial +cargo run +``` +> \ No newline at end of file diff --git a/module/core/for_each/examples/for_each_map_style_sample.rs b/module/core/for_each/examples/for_each_map_style_sample.rs new file mode 100644 index 0000000000..a53cc06197 --- /dev/null +++ b/module/core/for_each/examples/for_each_map_style_sample.rs @@ -0,0 +1,20 @@ +//! qqq : write proper description +use for_each::for_each; + +fn main() +{ + + for_each! + { + dbg where + @Prefix { "prefix".to_string() + } + @Postfix { + "postfix" } + @Each "a" "b" "c" + }; + + // generates + dbg!( "prefix".to_string() + "a" + "postfix" ); + dbg!( "prefix".to_string() + "b" + "postfix" ); + dbg!( "prefix".to_string() + "c" + "postfix" ); + +} \ No newline at end of file diff --git a/module/core/for_each/examples/for_each_trivial.rs b/module/core/for_each/examples/for_each_trivial.rs new file mode 100644 index 0000000000..ee8c5f89d1 --- /dev/null +++ b/module/core/for_each/examples/for_each_trivial.rs @@ -0,0 +1,14 @@ +//! qqq : write proper description +use for_each::for_each; + +fn main() +{ + + for_each!( dbg, "a", "b", "c" ); + + // generates + dbg!( "a" ); + dbg!( "b" ); + dbg!( "c" ); + +} \ No newline at end of file diff --git a/module/core/for_each/src/lib.rs b/module/core/for_each/src/lib.rs new file mode 100644 index 0000000000..c12e9a7513 --- /dev/null +++ b/module/core/for_each/src/lib.rs @@ -0,0 +1,517 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/for_each/latest/for_each/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Internal namespace. +#[ cfg( feature = "enabled" ) ] +pub( crate ) mod private +{ + + #[ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/Readme.md" ) ) ] + #[ macro_export ] + macro_rules! for_each + { + + // -- function-style + + ( + $Callback : path, $( $Each : tt ),* $(,)? + ) => + { + $( + $crate::braces_unwrap!( $Callback, $Each ); + )* + }; + + // -- callback-less + + ( + @Prefix $Prefix : tt + @Postfix $Postfix : tt + @Each $( $Each : tt )* + ) => + { + $crate::for_each! + { + $crate::identity where + @Prefix $Prefix + @Postfix $Postfix + @Each $( $Each )* + } + }; + + ( + @Prefix $Prefix : tt + @Each $( $Each : tt )* + ) => + { + $crate::for_each! + { + $crate::identity where + @Prefix $Prefix + @Each $( $Each )* + } + }; + + ( + @Postfix $Postfix : tt + @Each $( $Each : tt )* + ) => + { + $crate::for_each! + { + $crate::identity where + @Postfix $Postfix + @Each $( $Each )* + } + }; + + // -- map-style + + ( + $Callback : path where + @Each $( $Each : tt )* + ) => + { + $( + $crate::braces_unwrap!( $Callback, $Each ); + )* + }; + + ( + $Callback : path + where + @Prefix $Prefix : tt + @Postfix $Postfix : tt + @Each $( $Each : tt )* + ) => + { + $( + $crate::braces_unwrap! + ( + $Callback where + @Prefix{ $Prefix } + @Postfix{ $Postfix } + @SRC{ $Each } + ); + )* + }; + + ( + $Callback : path where + @Prefix $Prefix : tt + @Each $( $Each : tt )* + ) => + { + $( + $crate::braces_unwrap! + ( + $Callback where + @Prefix{ $Prefix } + @SRC{ $Each } + ); + )* + }; + + ( + $Callback : path where + @Postfix $Postfix : tt + @Each $( $Each : tt )* + ) => + { + $( + $crate::braces_unwrap! + ( + $Callback where + @Postfix{ $Postfix } + @SRC{ $Each } + ); + )* + }; + + } + + /// + /// Unwrap braces of token tree and pass its content to the passed callback. If token tree in not braced then it passed to callback as is. + /// + /// # Function-style sample + /// ```rust + /// use for_each::*; + /// let ( a, b, c ) = ( 1, 2, 3 ); + /// braces_unwrap!( dbg, { a, b, c } ); + /// // generates : + /// // dbg!( a, b, c ); + /// braces_unwrap!( dbg, a, b, c ); + /// // generates : + /// // dbg!( a, b, c ); + /// ``` + /// + /// # Map-style sample + /// ```rust + /// use for_each::*; + /// let ( prefix, a, b, c, postfix ) = ( "prefix", 1, 2, 3, "postfix" ); + /// braces_unwrap! + /// ( + /// dbg where + /// @Prefix{ prefix, } + /// @Postfix{ postfix } + /// @SRC{ { a, b, c, } } + /// ); + /// // generates : + /// // dbg!( prefix, a, b, c, psotfix ); + /// braces_unwrap! + /// ( + /// dbg where + /// @Prefix{ prefix, } + /// @Postfix{ postfix } + /// @SRC{ a, b, c, } + /// ); + /// // generates : + /// // dbg!( prefix, a, b, c, psotfix ); + /// ``` + /// + + #[macro_export] + macro_rules! braces_unwrap + { + + // function-style + + ( $Callback : path, { $( $Src : tt )* } ) + => + { + $Callback! + ( + $( $Src )* + ); + }; + ( $Callback : path, $( $Src : tt )* ) + => + { + $Callback! + ( + $( $Src )* + ); + }; + + // map-style + + ( + $Callback : path where + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Src )* + ); + }; + ( + $Callback : path where + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Src )* + ); + }; + + // with prefix and psotfix + + /* 0 */ + ( + $Callback : path where + @Prefix{ { $( $Prefix : tt )* } } + @Postfix{ { $( $Postfix : tt )* } } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + /* 1 */ + ( + $Callback : path where + @Prefix{ { $( $Prefix : tt )* } } + @Postfix{ { $( $Postfix : tt )* } } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + /* 2 */ + ( + $Callback : path where + @Prefix{ { $( $Prefix : tt )* } } + @Postfix{ $( $Postfix : tt )* } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + /* 3 */ + ( + $Callback : path where + @Prefix{ { $( $Prefix : tt )* } } + @Postfix{ $( $Postfix : tt )* } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + /* 4 */ + ( + $Callback : path where + @Prefix{ $( $Prefix : tt )* } + @Postfix{ { $( $Postfix : tt )* } } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + /* 5 */ + ( + $Callback : path where + @Prefix{ $( $Prefix : tt )* } + @Postfix{ { $( $Postfix : tt )* } } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + /* 6 */ + ( + $Callback : path where + @Prefix{ $( $Prefix : tt )* } + @Postfix{ $( $Postfix : tt )* } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + /* 7 */ + ( + $Callback : path where + @Prefix{ $( $Prefix : tt )* } + @Postfix{ $( $Postfix : tt )* } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* $( $Postfix )* + ); + }; + + // with prefix + + /* 0 */ + ( + $Callback : path where + @Prefix{ { $( $Prefix : tt )* } } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* + ); + }; + /* 1 */ + ( + $Callback : path where + @Prefix{ { $( $Prefix : tt )* } } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* + ); + }; + /* 2 */ + ( + $Callback : path where + @Prefix{ $( $Prefix : tt )* } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* + ); + }; + /* 3 */ + ( + $Callback : path where + @Prefix{ $( $Prefix : tt )* } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Prefix )* $( $Src )* + ); + }; + + // with postfix + + /* 0 */ + ( + $Callback : path where + @Postfix{ { $( $Postfix : tt )* } } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Src )* $( $Postfix )* + ); + }; + /* 1 */ + ( + $Callback : path where + @Postfix{ { $( $Postfix : tt )* } } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Src )* $( $Postfix )* + ); + }; + /* 2 */ + ( + $Callback : path where + @Postfix{ $( $Postfix : tt )* } + @SRC{ { $( $Src : tt )* } } + ) + => + { + $Callback! + ( + $( $Src )* $( $Postfix )* + ); + }; + /* 3 */ + ( + $Callback : path where + @Postfix{ $( $Postfix : tt )* } + @SRC{ $( $Src : tt )* } + ) + => + { + $Callback! + ( + $( $Src )* $( $Postfix )* + ); + }; + + } + + /// Macro which returns its input as is. + #[macro_export] + macro_rules! identity + { + ( + $( $Src : tt )* + ) + => + { + $( $Src )* + }; + } + + // + + pub use for_each; + pub use braces_unwrap; + pub use identity; + +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::for_each; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::braces_unwrap; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::identity; +} diff --git a/module/core/for_each/tests/for_each_tests.rs b/module/core/for_each/tests/for_each_tests.rs new file mode 100644 index 0000000000..88aec9e66e --- /dev/null +++ b/module/core/for_each/tests/for_each_tests.rs @@ -0,0 +1,6 @@ + +use for_each as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +pub mod inc; diff --git a/module/core/for_each/tests/inc/for_each_test.rs b/module/core/for_each/tests/inc/for_each_test.rs new file mode 100644 index 0000000000..6180d743a9 --- /dev/null +++ b/module/core/for_each/tests/inc/for_each_test.rs @@ -0,0 +1,930 @@ +use super::*; + +tests_impls! +{ + + // + + fn braces_unwrap_test() + { + // let mut GOT : String = String::new(); + let mut GOT : String = String::new(); + macro_rules! test_with + { + ( + $( $Arg : tt )* + ) => + {{ + GOT += stringify!( $( $Arg )* ); + GOT += ";"; + }}; + } + + /* test.case( "sample1" ) */ + { + let ( a, b, c ) = ( 1, 2, 3 ); + the_module::braces_unwrap!( dbg, { a, b, c } ); + // generates : + // dbg!( a, b, c ); + the_module::braces_unwrap!( dbg, a, b, c ); + // generates : + // dbg!( a, b, c ); + } + + /* test.case( "sample2" ) */ + { + let ( prefix, a, b, c, postfix ) = ( "prefix", 1, 2, 3, "postfix" ); + the_module::braces_unwrap! + ( + dbg where + @Prefix{ prefix, } + @Postfix{ postfix } + @SRC{ { a, b, c, } } + ); + // generates : + // dbg!( prefix, a, b, c, psotfix ); + the_module::braces_unwrap! + ( + dbg where + @Prefix{ prefix, } + @Postfix{ postfix } + @SRC{ a, b, c, } + ); + // generates : + // dbg!( prefix, a, b, c, psotfix ); + } + + /* test.case( "function-style" ) */ + + { + GOT = "".to_string(); + the_module::braces_unwrap!( test_with, a, b, c ); + let exp = "a, b, c;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap!( test_with, { a, b, c } ); + let exp = "a, b, c;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap!( test_with, { { a, b, c } } ); + let exp = "{ a, b, c };"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap!( test_with, ( a, b, c ) ); + let exp = "(a, b, c);"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap!( test_with, ( ( a, b, c ) ) ); + let exp = "((a, b, c));"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap!( test_with, [ a, b, c ] ); + let exp = "[a, b, c];"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap!( test_with, [ [ a, b, c ] ] ); + let exp = "[[a, b, c]];"; + a_id!( GOT, exp ); + + } + + /* test.case( "map-style" ) */ + + { + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @SRC{ a, b, c } + ); + let exp = "a, b, c;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @SRC{ { a, b, c } } + ); + let exp = "a, b, c;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @SRC{ { { a, b, c } } } + ); + let exp = "{ a, b, c };"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @SRC{ ( a, b, c ) } + ); + let exp = "(a, b, c);"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @SRC{ ( ( a, b, c ) ) } + ); + let exp = "((a, b, c));"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @SRC{ [ a, b, c ] } + ); + let exp = "[a, b, c];"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @SRC{ [ [ a, b, c ] ] } + ); + let exp = "[[a, b, c]];"; + a_id!( GOT, exp ); + } + + /* test.case( "prefix and postfix" ) */ + + { + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ a, b, c } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ { { a, b, c } } } + ); + let exp = "prefix { a, b, c } postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ ( a, b, c ) } + ); + let exp = "prefix(a, b, c) postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ ( ( a, b, c ) ) } + ); + let exp = "prefix((a, b, c)) postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ [ a, b, c ] } + ); + let exp = "prefix [a, b, c] postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ [ [ a, b, c ] ] } + ); + let exp = "prefix [[a, b, c]] postfix;"; + a_id!( GOT, exp ); + + } + + /* test.case( "prefix and postfix unwrapping" ) */ + + { + /* 0 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ { prefix } } + @Postfix{ { postfix } } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + /* 1 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ { prefix } } + @Postfix{ { postfix } } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + /* 2 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ { prefix } } + @Postfix{ { postfix } } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + /* 3 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ { prefix } } + @Postfix{ { postfix } } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + /* 4 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ { postfix } } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + /* 5 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ { postfix } } + @SRC{ a, b, c } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + /* 6 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + /* 7 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @Postfix{ postfix } + @SRC{ a, b, c } + ); + let exp = "prefix a, b, c postfix;"; + a_id!( GOT, exp ); + } + + /* test.case( "prefix" ) */ + + { + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ a, b, c } + ); + let exp = "prefix a, b, c;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ { { a, b, c } } } + ); + let exp = "prefix { a, b, c };"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ ( a, b, c ) } + ); + let exp = "prefix(a, b, c);"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ ( ( a, b, c ) ) } + ); + let exp = "prefix((a, b, c));"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ [ a, b, c ] } + ); + let exp = "prefix [a, b, c];"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ [ [ a, b, c ] ] } + ); + let exp = "prefix [[a, b, c]];"; + a_id!( GOT, exp ); + + } + + /* test.case( "prefix unwrapping" ) */ + + { + /* 0 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ { prefix } } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c;"; + a_id!( GOT, exp ); + /* 1 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ { prefix } } + @SRC{ a, b, c } + ); + let exp = "prefix a, b, c;"; + a_id!( GOT, exp ); + /* 2 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ { a, b, c } } + ); + let exp = "prefix a, b, c;"; + a_id!( GOT, exp ); + /* 3 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Prefix{ prefix } + @SRC{ a, b, c } + ); + let exp = "prefix a, b, c;"; + a_id!( GOT, exp ); + } + + /* test.case( "postfix" ) */ + + { + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ a, b, c } + ); + let exp = "a, b, c postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ { a, b, c } } + ); + let exp = "a, b, c postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ { { a, b, c } } } + ); + let exp = "{ a, b, c } postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ ( a, b, c ) } + ); + let exp = "(a, b, c) postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ ( ( a, b, c ) ) } + ); + let exp = "((a, b, c)) postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ [ a, b, c ] } + ); + let exp = "[a, b, c] postfix;"; + a_id!( GOT, exp ); + + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ [ [ a, b, c ] ] } + ); + let exp = "[[a, b, c]] postfix;"; + a_id!( GOT, exp ); + + } + + /* test.case( "postfix unwrapping" ) */ + + { + /* 0 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ { postfix } } + @SRC{ { a, b, c } } + ); + let exp = "a, b, c postfix;"; + a_id!( GOT, exp ); + /* 1 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ { postfix } } + @SRC{ a, b, c } + ); + let exp = "a, b, c postfix;"; + a_id!( GOT, exp ); + /* 2 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ { a, b, c } } + ); + let exp = "a, b, c postfix;"; + a_id!( GOT, exp ); + /* 3 */ + GOT = "".to_string(); + the_module::braces_unwrap! + ( + test_with where + @Postfix{ postfix } + @SRC{ a, b, c } + ); + let exp = "a, b, c postfix;"; + a_id!( GOT, exp ); + } + + } + + /// + /// Tests macro crate::for_each!(). + /// + + + fn for_each_test() + { + let mut GOT : String = String::new(); + + macro_rules! test_with + { + ( + $( $Arg:tt )* + ) => + {{ + GOT += stringify!( $( $Arg )* ); + GOT += "+"; + }}; + } + + /* test.case( "sample : function-style" ) */ + { + the_module::for_each!( dbg, "a", "b", "c" ); + // generates + dbg!( "a" ); + dbg!( "b" ); + dbg!( "c" ); + } + + /* test.case( "sample : map-style" ) */ + { + the_module::for_each! + { + dbg where + @Prefix { "prefix".to_string() + } + @Postfix { + "postfix" } + @Each "a" "b" "c" + }; + // generates + dbg!( "prefix".to_string() + "a" + "postfix" ); + dbg!( "prefix".to_string() + "b" + "postfix" ); + dbg!( "prefix".to_string() + "c" + "postfix" ); + } + + /* test.case( "sample : more than single token" ) */ + { + the_module::for_each! + { + dbg where + @Prefix { "prefix".to_string() + } + @Postfix { + "postfix" } + @Each { "a" + "1" } { "b" + "2" } { "c" + "3" } + }; + // generates + dbg!( "prefix".to_string() + "a" + "1" + "postfix" ); + dbg!( "prefix".to_string() + "b" + "2" + "postfix" ); + dbg!( "prefix".to_string() + "c" + "3" + "postfix" ); + } + + /* test.case( "sample : callbackless" ) */ + { + the_module::for_each! + { + @Prefix { dbg! } + @Each ( "a" ) ( "b" ) ( "c" ) + }; + // generates + dbg!( "a" ); + dbg!( "b" ); + dbg!( "c" ); + } + + // function-style + + /* test.case( "function-style" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with, a, b, c ); + let exp = "a+b+c+"; + a_id!( GOT, exp ); + } + + /* test.case( "function-style, paths, unwrapping" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with, { std :: collections :: HashMap }, { std :: collections :: BTreeMap } ); + let exp = "std :: collections :: HashMap+std :: collections :: BTreeMap+"; + a_id!( GOT, exp ); + } + + /* test.case( "function-style, complex, unwrapping" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with, { a _ a }, { b _ b } ); + let exp = "a _ a+b _ b+"; + a_id!( GOT, exp ); + } + + /* test.case( "function-style, complex, unwrapping, trailing comma" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with, { a _ a }, { b _ b }, ); + let exp = "a _ a+b _ b+"; + a_id!( GOT, exp ); + } + + /* test.case( "function-style, paths, parentheses" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with, ( std :: collections :: HashMap ), ( std :: collections :: BTreeMap ) ); + let exp = "(std :: collections :: HashMap)+(std :: collections :: BTreeMap)+"; + a_id!( GOT, exp ); + } + + // callbackless + + /* test.case( "callbackless, prefix, postfix" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + @Prefix { test_with! } + @Postfix { ; test_with!( postfix ); } + @Each ( a ) ( b ) ( c ) + }; + let exp = "a+postfix+b+postfix+c+postfix+"; + a_id!( GOT, exp ); + } + + /* test.case( "callbackless, prefix" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + @Prefix { test_with! } + @Each ( a ) ( b ) ( c ) + }; + let exp = "a+b+c+"; + a_id!( GOT, exp ); + } + + /* test.case( "callbackless, postfix" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + @Postfix { ; test_with!( postfix ); } + @Each { test_with!( a ) } { test_with!( b ) } { test_with!( c ) } + }; + let exp = "a+postfix+b+postfix+c+postfix+"; + a_id!( GOT, exp ); + } + + // map-style + + /* test.case( "map-style" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with where @Each a b c ); + let exp = "a+b+c+"; + a_id!( GOT, exp ); + } + + /* test.case( "map-style, prefix + postfix" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with where @Prefix prefix @Postfix postfix @Each a b c ); + let exp = "prefix a postfix+prefix b postfix+prefix c postfix+"; + a_id!( GOT, exp ); + } + + /* test.case( "map-style, prefix" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with where @Prefix prefix @Each a b c ); + let exp = "prefix a+prefix b+prefix c+"; + a_id!( GOT, exp ); + } + + /* test.case( "map-style, postfix" ) */ + + { + GOT = "".to_string(); + the_module::for_each!( test_with where @Postfix postfix @Each a b c ); + let exp = "a postfix+b postfix+c postfix+"; + a_id!( GOT, exp ); + } + + // map-style, complex + + /* test.case( "map-style" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + test_with where + @Each { a _ a } { b _ b } { c _ c } + }; + let exp = "a _ a+b _ b+c _ c+"; + a_id!( GOT, exp ); + } + + /* test.case( "map-style, prefix + postfix" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + test_with where + @Prefix { pre fix } + @Postfix { post fix } + @Each { a _ a } { b _ b } { c _ c } + }; + let exp = "pre fix a _ a post fix+pre fix b _ b post fix+pre fix c _ c post fix+"; + a_id!( GOT, exp ); + } + + /* test.case( "map-style, prefix" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + test_with where + @Prefix { pre fix } + @Each { a _ a } { b _ b } { c _ c } + }; + let exp = "pre fix a _ a+pre fix b _ b+pre fix c _ c+"; + a_id!( GOT, exp ); + } + + /* test.case( "map-style, postfix" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + test_with where + @Postfix { post fix } + @Each { a _ a } { b _ b } { c _ c } + }; + let exp = "a _ a post fix+b _ b post fix+c _ c post fix+"; + a_id!( GOT, exp ); + } + + } + + /// + /// Higher order cases + /// + + + fn for_each_higher_order_test() + { + let mut GOT : String = String::new(); + macro_rules! test_with + { + ( + $( $Arg : tt )* + ) => + {{ + GOT += stringify!( $( $Arg )* ); + GOT += ";"; + }}; + } + + macro_rules! for_each_float + { + + ( + $Callback : path + $( where $( $Args : tt )* )? + ) => + { + the_module::for_each! + ( + $Callback where + $( $( $Args )* )? + @Each f32 f64 + ); + }; + + } + + /* test.case( "manual" ) */ + + { + GOT = "".to_string(); + for_each_float!( test_with where @Prefix { pre fix 1 } @Postfix { post fix } ); + for_each_float!( test_with where @Prefix { pre fix 2 } @Postfix { post fix } ); + let exp = "pre fix 1 f32 post fix;pre fix 1 f64 post fix;pre fix 2 f32 post fix;pre fix 2 f64 post fix;"; + a_id!( GOT, exp ); + } + + /* test.case( "without fixes" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + for_each_float where + @Each + { test_with where @Prefix { pre fix 1 } @Postfix { post fix } } + { test_with where @Prefix { pre fix 2 } @Postfix { post fix } } + } + let exp = "pre fix 1 f32 post fix;pre fix 1 f64 post fix;pre fix 2 f32 post fix;pre fix 2 f64 post fix;"; + a_id!( GOT, exp ); + } + + /* test.case( "without fixes" ) */ + + { + GOT = "".to_string(); + the_module::for_each! + { + for_each_float where + @Prefix { test_with where @Prefix } + @Postfix { @Postfix { post fix } } + @Each + { { pre fix 1 } } + { { pre fix 2 } } + } + let exp = "pre fix 1 f32 post fix;pre fix 1 f64 post fix;pre fix 2 f32 post fix;pre fix 2 f64 post fix;"; + a_id!( GOT, exp ); + } + + } + +} + +// + +tests_index! +{ + braces_unwrap_test, + for_each_test, + for_each_higher_order_test, +} diff --git a/module/core/for_each/tests/inc/mod.rs b/module/core/for_each/tests/inc/mod.rs new file mode 100644 index 0000000000..3848961cff --- /dev/null +++ b/module/core/for_each/tests/inc/mod.rs @@ -0,0 +1,4 @@ + +use super::*; +// #[ path = "./impl/for_each_test.rs" ] +pub mod for_each_test; diff --git a/module/core/for_each/tests/smoke_test.rs b/module/core/for_each/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/for_each/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/former/Cargo.toml b/module/core/former/Cargo.toml new file mode 100644 index 0000000000..746331fb21 --- /dev/null +++ b/module/core/former/Cargo.toml @@ -0,0 +1,72 @@ +[package] +name = "former" +version = "2.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/former" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/former" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/former" +description = """ +A flexible and extensible implementation of the builder pattern. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] + +no_std = [ "former_types/no_std", "collection_tools/no_std" ] +use_alloc = [ "no_std", "former_types/use_alloc", "collection_tools/use_alloc" ] + + +# no_std = [ "collection_tools/no_std" ] +# use_alloc = [ "no_std", "collection_tools/use_alloc" ] + +default = [ + "enabled", + "derive_former", + "derive_components", + "derive_component_from", + "derive_component_assign", + "derive_components_assign", + "derive_from_components", +] +full = [ + "enabled", + "derive_former", + "derive_components", + "derive_component_from", + "derive_component_assign", + "derive_components_assign", + "derive_from_components", +] +enabled = [ "former_meta/enabled", "former_types/enabled" ] + +derive_former = [ "former_meta/derive_former", "former_types/derive_former" ] +derive_components = [ "former_meta/derive_components", "former_types/types_components" ] +derive_component_assign = [ "derive_components", "former_meta/derive_component_assign", "former_types/types_component_assign" ] +derive_components_assign = [ "derive_components", "derive_component_assign", "former_meta/derive_components_assign" ] +derive_component_from = [ "derive_components", "former_meta/derive_component_from" ] +derive_from_components = [ "derive_components", "former_meta/derive_from_components" ] + + +[dependencies] +former_meta = { workspace = true } +former_types = { workspace = true } +# collection_tools = { workspace = true, features = [ "collection_constructors" ] } + + +[dev-dependencies] +test_tools = { workspace = true, features = [ "full" ] } +collection_tools = { workspace = true, features = [ "collection_constructors" ] } diff --git a/module/core/former/License b/module/core/former/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/former/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/former/Readme.md b/module/core/former/Readme.md new file mode 100644 index 0000000000..05852dba11 --- /dev/null +++ b/module/core/former/Readme.md @@ -0,0 +1,1367 @@ + + +# Module :: former + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml) [![docs.rs](https://img.shields.io/docsrs/former?color=e3e8f0&logo=docs.rs)](https://docs.rs/former) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer%2Fexamples%2Fformer_trivial.rs,RUN_POSTFIX=--example%20former_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +A flexible and extensible implementation of the builder pattern. + +It offers specialized subformers for common Rust collections like `Vec`, `HashMap`, and `HashSet`, enabling the construction of complex data structures in a fluent and intuitive manner. + +## How Former Works + +- **Trait Derivation** : By deriving `Former` on a struct, you automatically generate builder methods for each field. +- **Fluent Interface** : Each field's builder method allows for setting the value of that field and returns a mutable reference to the builder, + enabling method chaining. +- **Optional Fields** : Optional fields can be easily handled without needing to explicitly set them to `None`. +- **Finalization** : The `.form()` method finalizes the building process and returns the constructed struct instance. + +This approach abstracts away the need for manually implementing a builder for each struct, making code more readable and maintainable. + +## Example : Trivial + + + + + + + + +The provided code snippet illustrates a basic use-case of the Former, which is used to apply the builder pattern for structured and flexible object creation. Below is a detailed explanation of each part of the markdown chapter, aimed at clarifying how the Former trait simplifies struct instantiation. + +```rust +# #[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +# fn main() +# { + + use former::Former; + + // Use attribute debug to print expanded code. + #[ derive( Debug, PartialEq, Former ) ] + // #[ debug ] + pub struct UserProfile + { + age : i32, + username : String, + bio_optional : Option< String >, // Fields could be optional + } + + let profile = UserProfile::former() + .age( 30 ) + .username( "JohnDoe".to_string() ) + .bio_optional( "Software Developer".to_string() ) // Optionally provide a bio + .form(); + + dbg!( &profile ); + // Expected output: + // &profile = UserProfile { + // age: 30, + // username: "JohnDoe", + // bio_optional: Some("Software Developer"), + // } + +# } +``` + +
    +The code above will be expanded to this + +```rust +# #[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +# fn main() +# { + + // Use attribute debug to print expanded code. + #[ derive( Debug, PartialEq ) ] + pub struct UserProfile + { + age : i32, + username : String, + bio_optional : Option< String >, // Fields could be optional + } + + impl UserProfile + where + { + #[ inline( always ) ] + pub fn former() -> UserProfileFormer< + UserProfileFormerDefinition< (), UserProfile, former::ReturnPreformed > + > + { + UserProfileFormer::< UserProfileFormerDefinition< (), UserProfile, former::ReturnPreformed > >:: + new_coercing(former::ReturnPreformed) + } + } + + // = entity to + + impl< Definition > former::EntityToFormer< Definition > for UserProfile + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, + { + type Former = UserProfileFormer< Definition >; + } + + impl former::EntityToStorage for UserProfile + where + { + type Storage = UserProfileFormerStorage; + } + + impl< Context, Formed, End > former::EntityToDefinition< Context, Formed, End > for UserProfile + where + End : former::FormingEnd< UserProfileFormerDefinitionTypes< Context, Formed > >, + { + type Definition = UserProfileFormerDefinition< Context, Formed, End >; + type Types = UserProfileFormerDefinitionTypes< Context, Formed >; + } + + // = definition + + #[derive(Debug)] + pub struct UserProfileFormerDefinitionTypes< Context = (), Formed = UserProfile, > + where + { + _phantom : core::marker::PhantomData< (*const Context, *const Formed) >, + } + + impl< Context, Formed, > ::core::default::Default for UserProfileFormerDefinitionTypes< Context, Formed, > + where + { + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + } + + impl< Context, Formed, > former::FormerDefinitionTypes for UserProfileFormerDefinitionTypes< Context, Formed, > + where + { + type Storage = UserProfileFormerStorage; + type Formed = Formed; + type Context = Context; + } + + #[derive(Debug)] + pub struct UserProfileFormerDefinition< Context = (), Formed = UserProfile, End = former::ReturnPreformed, > + where + { + _phantom : core::marker::PhantomData< (*const Context, *const Formed, *const End) >, + } + + impl< Context, Formed, End, > ::core::default::Default for UserProfileFormerDefinition< Context, Formed, End, > + where + { + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + } + + impl< Context, Formed, End, > former::FormerDefinition for UserProfileFormerDefinition< Context, Formed, End, > + where + End : former::FormingEnd< UserProfileFormerDefinitionTypes< Context, Formed, > >, + { + type Types = UserProfileFormerDefinitionTypes< Context, Formed, >; + type End = End; + type Storage = UserProfileFormerStorage; + type Formed = Formed; + type Context = Context; + } + + impl< Context, Formed, > former::FormerMutator for UserProfileFormerDefinitionTypes< Context, Formed, > + where + {} + + // = storage + + pub struct UserProfileFormerStorage + where + { + pub age : ::core::option::Option< i32 >, + pub username : ::core::option::Option< String >, + pub bio_optional : Option< String >, + } + + impl ::core::default::Default for UserProfileFormerStorage + where + { + #[ inline( always ) ] + fn default() -> Self + { + Self + { + age : ::core::option::Option::None, + username : ::core::option::Option::None, + bio_optional : ::core::option::Option::None, + } + } + } + + impl former::Storage for UserProfileFormerStorage + where + { + type Preformed = UserProfile; + } + + impl former::StoragePreform for UserProfileFormerStorage + where + { + fn preform(mut self) -> Self::Preformed + { + let age = if self.age.is_some() + { + self.age.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default(self : &Self) -> T + { + panic!("Field 'age' isn't initialized") + } + } + impl< T > MaybeDefault< T > for &::core::marker::PhantomData< T > + {} + impl< T > MaybeDefault< T > for ::core::marker::PhantomData< T > + where T : ::core::default::Default, + { + fn maybe_default(self : &Self) -> T + { + T::default() + } + } + (&::core::marker::PhantomData::< i32 >).maybe_default() + } + }; + let username = if self.username.is_some() + { + self.username.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default(self : &Self) -> T + { + panic!("Field 'username' isn't initialized") + } + } + impl< T > MaybeDefault< T > for &::core::marker::PhantomData< T > + {} + impl< T > MaybeDefault< T > for ::core::marker::PhantomData< T > + where T : ::core::default::Default, + { + fn maybe_default(self : &Self) -> T + { + T::default() + } + } + (&::core::marker::PhantomData::< String >).maybe_default() + } + }; + let bio_optional = if self.bio_optional.is_some() + { + ::core::option::Option::Some(self.bio_optional.take().unwrap()) + } + else + { + ::core::option::Option::None + }; + let result = UserProfile::<> + { + age, + username, + bio_optional, + }; + return result; + } + } + + pub struct UserProfileFormer< Definition = UserProfileFormerDefinition< (), UserProfile, former::ReturnPreformed >, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, + { + pub storage : Definition::Storage, + pub context : core::option::Option< Definition::Context >, + pub on_end : core::option::Option< Definition::End >, + } + + impl< Definition, > UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, Definition::Types : former::FormerDefinitionTypes< Storage = UserProfileFormerStorage >, + { + #[ inline( always ) ] + pub fn new(on_end : Definition::End) -> Self + { + Self::begin_coercing(None, None, on_end) + } + + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >(end : IntoEnd) -> Self + where IntoEnd : Into< Definition::End >, + { + Self::begin_coercing(None, None, end,) + } + + #[ inline( always ) ] + pub fn begin(mut storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : ::End,) -> Self + { + if storage.is_none() + { + storage = Some(::core::default::Default::default()); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some(on_end), + } + } + + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd >(mut storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : IntoEnd,) -> Self + where IntoEnd : ::core::convert::Into< ::End >, + { + if storage.is_none() + { + storage = Some(::core::default::Default::default()); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some(::core::convert::Into::into(on_end)), + } + } + + #[ inline( always ) ] + pub fn form(self) -> ::Formed + { + self.end() + } + + #[ inline( always ) ] + pub fn end(mut self) -> ::Formed + { + let on_end = self.on_end.take().unwrap(); + let mut context = self.context.take(); + ::form_mutation(&mut self.storage, &mut context); + former::FormingEnd::::call(&on_end, self.storage, context) + } + + #[ inline( always ) ] + pub fn age< Src >(mut self, src : Src) -> Self + where Src : ::core::convert::Into< i32 >, + { + debug_assert!(self.storage.age.is_none()); + self.storage.age = ::core::option::Option::Some(::core::convert::Into::into( src )); + self + } + + #[ inline( always ) ] + pub fn username< Src >(mut self, src : Src) -> Self + where Src : ::core::convert::Into< String >, + { + debug_assert!(self.storage.username.is_none()); + self.storage.username = ::core::option::Option::Some(::core::convert::Into::into( src )); + self + } + + #[ inline( always ) ] + pub fn bio_optional< Src >(mut self, src : Src) -> Self + where Src : ::core::convert::Into< String >, + { + debug_assert!(self.storage.bio_optional.is_none()); + self.storage.bio_optional = ::core::option::Option::Some(::core::convert::Into::into( src )); + self + } + } + + impl< Definition, > UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage, Formed = UserProfile >, + { + pub fn preform(self) -> ::Formed + { + former::StoragePreform::preform(self.storage) + } + } + + impl< Definition, > UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage, Formed = UserProfile, >, + { + #[ inline( always ) ] + pub fn perform(self) -> Definition::Formed + { + let result = self.form(); + return result; + } + } + + impl< Definition > former::FormerBegin< Definition > for UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, + { + #[ inline( always ) ] + fn former_begin(storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : Definition::End,) -> Self + { + debug_assert!(storage.is_none()); + Self::begin(None, context, on_end) + } + } + + // = as subformer + + pub type UserProfileAsSubformer< Superformer, End > = + UserProfileFormer< UserProfileFormerDefinition< Superformer, Superformer, End, >, >; + + pub trait UserProfileAsSubformerEnd< SuperFormer > + where + Self : former::FormingEnd< UserProfileFormerDefinitionTypes< SuperFormer, SuperFormer >, >, {} + + impl< SuperFormer, T > UserProfileAsSubformerEnd< SuperFormer > for T + where + Self : former::FormingEnd< UserProfileFormerDefinitionTypes< SuperFormer, SuperFormer >, >, + {} + + // = end + + let profile = UserProfile::former() + .age( 30 ) + .username( "JohnDoe".to_string() ) + .bio_optional( "Software Developer".to_string() ) // Optionally provide a bio + .form(); + dbg!( &profile ); + + // Expected output: + // + // &profile = UserProfile { + // age: 30, + // username: "JohnDoe", + // bio_optional: Some("Software Developer"), + // } + +# } +``` + +
    + +Try out `cargo run --example former_trivial`. +
    +[See code](./examples/former_trivial.rs). + +## Example : Custom and Alternative Setters + +With help of `Former`, it is possible to define multiple versions of a setter for a single field, providing the flexibility to include custom logic within the setter methods. This feature is particularly useful when you need to preprocess data or enforce specific constraints before assigning values to fields. Custom setters should have unique names to differentiate them from the default setters generated by `Former`, allowing for specialized behavior while maintaining clarity in your code. + +```rust +# #[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +# fn main() +# { + +use former::Former; + +/// Structure with a custom setter. +#[ derive( Debug, Former ) ] +pub struct StructWithCustomSetters +{ + word : String, +} + +impl StructWithCustomSettersFormer +{ + + // Custom alternative setter for `word` + pub fn word_exclaimed( mut self, value : impl Into< String > ) -> Self + { + debug_assert!( self.storage.word.is_none() ); + self.storage.word = Some( format!( "{}!", value.into() ) ); + self + } + +} + +let example = StructWithCustomSetters::former() +.word( "Hello" ) +.form(); +assert_eq!( example.word, "Hello".to_string() ); + +let example = StructWithCustomSetters::former() +.word_exclaimed( "Hello" ) +.form(); +assert_eq!( example.word, "Hello!".to_string() ); + +# } +``` + +In the example above showcases a custom alternative setter, `word_exclaimed`, which appends an exclamation mark to the input string before storing it. This approach allows for additional processing or validation of the input data without compromising the simplicity of the builder pattern. + +Try out `cargo run --example former_custom_setter`. +
    +[See code](./examples/former_custom_setter.rs). + +## Example : Custom Setter Overriding + +But it's also possible to completely override setter and write its own from scratch. For that use attribe `[ setter( false ) ]` to disable setter. + +```rust +# #[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +# fn main() +# { + + use former::Former; + + /// Structure with a custom setter. + #[ derive( Debug, Former ) ] + pub struct StructWithCustomSetters + { + // Use `debug` to gennerate sketch of setter. + #[ scalar( setter = false ) ] + word : String, + } + + impl< Definition > StructWithCustomSettersFormer< Definition > + where + Definition : former::FormerDefinition< Storage = StructWithCustomSettersFormerStorage >, + { + // Custom alternative setter for `word` + #[ inline ] + pub fn word< Src >( mut self, src : Src ) -> Self + where + Src : ::core::convert::Into< String >, + { + debug_assert!( self.storage.word.is_none() ); + self.storage.word = Some( format!( "{}!", src.into() ) ); + self + } + } + + let example = StructWithCustomSetters::former() + .word( "Hello" ) + .form(); + assert_eq!( example.word, "Hello!".to_string() ); + dbg!( example ); + //> StructWithCustomSetters { + //> word: "Hello!", + //> } + +# } +``` + +In the example above, the default setter for `word` is disabled, and a custom setter is defined to automatically append an exclamation mark to the string. This method allows for complete control over the data assignment process, enabling the inclusion of any necessary logic or validation steps. + +Try out `cargo run --example former_custom_setter_overriden`. +
    +[See code](./examples/former_custom_setter_overriden.rs). + +## Example : Custom Defaults + +The `Former` crate enhances struct initialization by allowing the specification of custom default values for fields through the `default` attribute. This feature not only provides a way to set initial values for struct fields without relying on the `Default` trait but also adds flexibility in handling cases where a field's type does not implement `Default`, or a non-standard default value is desired. + +```rust +# #[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +# fn main() +# { + +use former::Former; + +/// Structure with default attributes. +#[ derive( Debug, PartialEq, Former ) ] +pub struct ExampleStruct +{ + #[ former( default = 5 ) ] + number : i32, + #[ former( default = "Hello, Former!".to_string() ) ] + greeting : String, + #[ former( default = vec![ 10, 20, 30 ] ) ] + numbers : Vec< i32 >, +} + +let instance = ExampleStruct::former().form(); +let expected = ExampleStruct +{ + number : 5, + greeting : "Hello, Former!".to_string(), + numbers : vec![ 10, 20, 30 ], +}; +assert_eq!( instance, expected ); +dbg!( &instance ); +// > &instance = ExampleStruct { +// > number: 5, +// > greeting: "Hello, Former!", +// > numbers: [ +// > 10, +// > 20, +// > 30, +// > ], +// > } + +# } +``` + +The above code snippet showcases the `Former` crate's ability to initialize struct fields with custom default values: +- The `number` field is initialized to `5`. +- The `greeting` field defaults to a greeting message, "Hello, Former!". +- The `numbers` field starts with a vector containing the integers `10`, `20`, and `30`. + +This approach significantly simplifies struct construction, particularly for complex types or where defaults beyond the `Default` trait's capability are required. By utilizing the `default` attribute, developers can ensure their structs are initialized safely and predictably, enhancing code clarity and maintainability. + +Try out `cargo run --example former_custom_defaults`. +
    +[See code](./examples/former_custom_defaults.rs). + +## Concept of Storage and Former + +Storage is temporary storage structure holds the intermediate state of an object during its construction. + +Purpose of Storage: + +- **Intermediate State Holding**: Storage serves as a temporary repository for all the partially set properties and data of the object being formed. This functionality is essential in situations where the object's completion depends on multiple, potentially complex stages of configuration. +- **Decoupling Configuration from Instantiation**: Storage separates the accumulation of configuration states from the actual creation of the final object. This separation fosters cleaner, more maintainable code, allowing developers to apply configurations in any order and manage interim states more efficiently, without compromising the integrity of the final object. + +Storage is not just a passive collection; it is an active part of a larger ecosystem that includes the former itself, a context, and a callback (often referred to as `FormingEnd`): + +- **Former as an Active Manager**: The former is responsible for managing the storage, utilizing it to keep track of the object's evolving configuration. It orchestrates the formation process by handling intermediate states and preparing the object for its final form. +- **Contextual Flexibility**: The context associated with the former adds an additional layer of flexibility, allowing the former to adjust its behavior based on the broader circumstances of the object's formation. This is particularly useful when the forming process involves conditions or states external to the object itself. +- **FormingEnd Callback**: The `FormingEnd` callback is a dynamic component that defines the final steps of the forming process. It can modify the storage based on final adjustments, validate the object's readiness, or integrate the object into a larger structure, such as embedding it as a subformer within another structure. + +These elements work in concert to ensure that the forming process is not only about building an object step-by-step but also about integrating it seamlessly into larger, more complex structures or systems. + +## Concept of subformer + +Subformers are specialized builders used within the former to construct nested or collection-based data structures like vectors, hash maps, and hash sets. They simplify the process of adding elements to these structures by providing a fluent interface that can be seamlessly integrated into the overall builder pattern of a parent struct. This approach allows for clean and intuitive initialization of complex data structures, enhancing code readability and maintainability. + +## Types of Setters / Subformers + +Understanding the distinctions among the types of setters or subformers is essential for effectively employing the builder pattern in object construction. Each type of setter is designed to meet specific needs in building complex, structured data entities: + +- **Scalar Setter**: Handles the direct assignment of scalar values or simple fields within an entity. These setters manage basic data types or individual fields and do not involve nested formers or complex structuring. + +- **Subform Collection Setter**: Facilitates the management of a collection as a whole by returning a former that provides an interface to configure the entire collection. This setter is beneficial for applying uniform configurations or validations to all elements in a collection, such as a `HashMap` of children. + +- **Subform Entry Setter**: This setter allows for the individual formation of elements within a collection. It returns a former for each element, enabling detailed configuration and addition of complex elements within collections, exemplified by managing `Child` entities within a `Parent`'s `HashMap`. + +- **Subform Scalar Setter**: Similar to the subform entry setter but designed for scalar fields that have a former implementation. This setter does not collect instances into a collection because there is no collection involved, only a scalar field. It is used when the scalar field itself needs to be configured or modified through its dedicated former. + +These setters ensure that developers can precisely and efficiently set properties, manage collections, and configure complex structures within their applications. + +## Example : Collection Setter for a Vector + +This example demonstrates how to employ the `Former` trait to configure a `Vec` using a collection setter in a structured manner. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +# fn main() +# { + + #[ derive( Debug, PartialEq, former::Former ) ] + pub struct StructWithVec + { + #[ subform_collection ] + vec : Vec< &'static str >, + } + + let instance = StructWithVec::former() + .vec() + .add( "apple" ) + .add( "banana" ) + .end() + .form(); + + assert_eq!( instance, StructWithVec { vec: vec![ "apple", "banana" ] } ); + dbg!( instance ); + +# } +``` + +Try out `cargo run --example former_collection_vector`. +
    +[See code](./examples/former_collection_vector.rs). + +## Example : Collection Setter for a Hashmap + +This example demonstrates how to effectively employ the `Former` trait to configure a `HashMap` using a collection setter. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +# fn main() +# { + use collection_tools::{ HashMap, hmap }; + + #[ derive( Debug, PartialEq, former::Former ) ] + pub struct StructWithMap + { + #[ subform_collection ] + map : HashMap< &'static str, &'static str >, + } + + let instance = StructWithMap::former() + .map() + .add( ( "a", "b" ) ) + .add( ( "c", "d" ) ) + .end() + .form() + ; + assert_eq!( instance, StructWithMap { map : hmap!{ "a" => "b", "c" => "d" } } ); + dbg!( instance ); + +# } +``` + +Try out `cargo run --example former_collection_hashmap`. +
    +[See code](./examples/former_collection_hashmap.rs). + +## Example : Collection Setter for a Hashset + +This example demonstrates the use of the `Former` trait to build a `collection_tools::HashSet` through subforming. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +# fn main() +{ + use collection_tools::{ HashSet, hset }; + + #[ derive( Debug, PartialEq, former::Former ) ] + pub struct StructWithSet + { + #[ subform_collection ] + set : HashSet< &'static str >, + } + + let instance = StructWithSet::former() + .set() + .add( "apple" ) + .add( "banana" ) + .end() + .form(); + + assert_eq!(instance, StructWithSet { set : hset![ "apple", "banana" ] }); + dbg!( instance ); + +# } +``` + +Try out `cargo run --example former_collection_hashset`. +
    +[See code](./examples/former_collection_hashset.rs). + +## Example : Custom Scalar Setter + +This example demonstrates the implementation of a scalar setter using the `Former` trait. Unlike the more complex subform and collection setters shown in previous examples, this example focuses on a straightforward approach to directly set a scalar value within a parent entity. The `Parent` struct manages a `HashMap` of `Child` entities, and the scalar setter is used to set the entire `HashMap` directly. + +The `child` function within `ParentFormer` is a custom subform setter that plays a crucial role. It uniquely employs the `ChildFormer` to add and configure children by their names within the parent's builder pattern. This method demonstrates a powerful technique for integrating subformers that manage specific elements of a collection—each child entity in this case. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +# fn main() +# { + use collection_tools::HashMap; + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // #[ debug ] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct to hold children + #[ derive( Debug, PartialEq, Former ) ] + // #[ debug ] + pub struct Parent + { + // Use `debug` to gennerate sketch of setter. + #[ scalar( setter = false ) ] + children : HashMap< String, Child >, + } + + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = ParentFormerStorage >, + { + #[ inline ] + pub fn children< Src >( mut self, src : Src ) -> Self + where + Src : ::core::convert::Into< HashMap< String, Child > >, + { + debug_assert!( self.storage.children.is_none() ); + self.storage.children = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + } + } + + let echo = Child { name : "echo".to_string(), description : "prints all subjects and properties".to_string() }; + let exit = Child { name : "exit".to_string(), description : "just exit".to_string() }; + let mut children = HashMap::new(); + children.insert( echo.name.clone(), echo ); + children.insert( exit.name.clone(), exit ); + let ca = Parent::former() + .children( children ) + .form(); + + dbg!( &ca ); + // > &ca = Parent { + // > child: { + // > "echo": Child { + // > name: "echo", + // > description: "prints all subjects and properties", + // > }, + // > "exit": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > }, + // > } + +# } +``` + +In this example, the `Parent` struct functions as a collection for multiple `Child` structs, each identified by a unique child name. The `ParentFormer` implements a custom method `child`, which serves as a subformer for adding `Child` instances into the `Parent`. + +- **Child Definition**: Each `Child` consists of a `name` and a `description`, and we derive `Former` to enable easy setting of these properties using a builder pattern. +- **Parent Definition**: It holds a collection of `Child` objects in a `HashMap`. The `#[setter(false)]` attribute is used to disable the default setter, and a custom method `child` is defined to facilitate the addition of children with specific attributes. +- **Custom Subformer Integration**: The `child` method in the `ParentFormer` initializes a `ChildFormer` with a closure that integrates the `Child` into the `Parent`'s `child` map upon completion. + +Try out `cargo run --example former_custom_scalar_setter`. +
    +[See code](./examples/former_custom_scalar_setter.rs). + +## Example : Custom Subform Scalar Setter + +Implementation of a custom subform scalar setter using the `Former` trait in Rust. + +This example focuses on the usage of a subform scalar setter to manage complex scalar types within a parent structure. +Unlike more general subform setters that handle collections, this setter specifically configures scalar fields that have +their own formers, allowing for detailed configuration within a nested builder pattern. + +```rust + +# #[ cfg( not( all( feature = "enabled", feature = "derive_former" ) ) ) ] +# fn main() +# {} +# +# // Ensures the example only compiles when the appropriate features are enabled. +# #[ cfg( all( feature = "enabled", feature = "derive_former" ) ) ] +# fn main() +# { + + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // Optional: Use `#[debug]` to expand and debug generated code. + // #[debug] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct designed to hold a single Child instance using subform scalar + #[ derive( Debug, PartialEq, Former ) ] + // Optional: Use `#[debug]` to expand and debug generated code. + // #[debug] + pub struct Parent + { + // The `subform_scalar` attribute is used to specify that the 'child' field has its own former + // and can be individually configured via a subform setter. This is not a collection but a single scalar entity. + #[ subform_scalar( setter = false ) ] + child : Child, + } + + /// Extends `ParentFormer` to include a method that initializes and configures a subformer for the 'child' field. + /// This function demonstrates the dynamic addition of a named child, leveraging a subformer to specify detailed properties. + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + { + #[ inline( always ) ] + pub fn child( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._child_subform_scalar::< ChildFormer< _ >, _, >().name( name ) + } + } + + // Creating an instance of `Parent` using the builder pattern to configure `Child` + let ca = Parent::former() + .child( "echo" ) // starts the configuration of the `child` subformer + .description( "prints all subjects and properties" ) // sets additional properties for the `Child` + .end() // finalize the child configuration + .form(); // finalize the Parent configuration + + dbg!( &ca ); // Outputs the structured data for review + // Expected output: + //> Parent { + //> child: Child { + //> name: "echo", + //> description: "prints all subjects and properties", + //> }, + //> } + +# } +``` + +## Example : Custom Subform Collection Setter + +This example demonstrates the use of collection setters to manage complex nested data structures with the `Former` trait, focusing on a parent-child relationship structured around a collection `HashMap`. Unlike typical builder patterns that add individual elements using subform setters, this example uses a collection setter to manage the entire collection of children. + +The `child` function within `ParentFormer` is a custom subform setter that plays a crucial role. It uniquely employs the `ChildFormer` to add and configure children by their names within the parent's builder pattern. This method demonstrates a powerful technique for integrating subformers that manage specific elements of a collection—each child entity in this case. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +# fn main() {} + +// Ensure the example only compiles when the appropriate features are enabled. +# #[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +# fn main() +# { + use collection_tools::HashMap; + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // #[ debug ] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct to hold children + #[ derive( Debug, PartialEq, Former ) ] + // #[ debug ] + pub struct Parent + { + // Use `debug` to gennerate sketch of setter. + #[ scalar( setter = false ) ] + children : HashMap< String, Child >, + } + + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = ParentFormerStorage >, + { + #[ inline ] + pub fn children< Src >( mut self, src : Src ) -> Self + where + Src : ::core::convert::Into< HashMap< String, Child > >, + { + debug_assert!( self.storage.children.is_none() ); + self.storage.children = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + } + } + + let echo = Child { name : "echo".to_string(), description : "prints all subjects and properties".to_string() }; + let exit = Child { name : "exit".to_string(), description : "just exit".to_string() }; + let mut children = HashMap::new(); + children.insert( echo.name.clone(), echo ); + children.insert( exit.name.clone(), exit ); + let ca = Parent::former() + .children( children ) + .form(); + + dbg!( &ca ); + // > &ca = Parent { + // > child: { + // > "echo": Child { + // > name: "echo", + // > description: "prints all subjects and properties", + // > }, + // > "exit": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > }, + // > } + +# } +``` + +Try out `cargo run --example former_custom_subform_collection`. +
    +[See code](./examples/former_custom_subform_collection.rs). + +## Example : Custom Subform Entry Setter + +This example illustrates the implementation of nested builder patterns using the `Former` trait, emphasizing a parent-child relationship. Here, the `Parent` struct utilizes `ChildFormer` as a custom subformer to dynamically manage its `child` field—a `HashMap`. Each child in the `HashMap` is uniquely identified and configured via the `ChildFormer`. + +The `child` function within `ParentFormer` is a custom subform setter that plays a crucial role. It uniquely employs the `ChildFormer` to add and configure children by their names within the parent's builder pattern. This method demonstrates a powerful technique for integrating subformers that manage specific elements of a collection—each child entity in this case. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +# fn main() {} + +# // Ensure the example only compiles when the appropriate features are enabled. +# #[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +# fn main() +# { + use collection_tools::HashMap; + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // #[ debug ] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct to hold children + #[ derive( Debug, PartialEq, Former ) ] + // #[ debug ] + pub struct Parent + { + // Use `debug` to gennerate sketch of setter. + #[ subform_entry( setter = false ) ] + child : HashMap< String, Child >, + } + + /// Initializes and configures a subformer for adding named child entities. This method leverages an internal function + /// to create and return a configured subformer instance. It allows for the dynamic addition of children with specific names, + /// integrating them into the formation process of the parent entity. + /// + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + { + + #[ inline( always ) ] + pub fn child( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._child_subform_entry::< ChildFormer< _ >, _, >() + .name( name ) + } + + } + + // Required to define how `value` is converted into pair `( key, value )` + impl former::ValToEntry< HashMap< String, Child > > for Child + { + type Entry = ( String, Child ); + #[ inline( always ) ] + fn val_to_entry( self ) -> Self::Entry + { + ( self.name.clone(), self ) + } + } + + let ca = Parent::former() + .child( "echo" ) + .description( "prints all subjects and properties" ) // sets additional properties using custom subformer + .end() + .child( "exit" ) + .description( "just exit" ) // Sets additional properties using using custom subformer + .end() + .form(); + + dbg!( &ca ); + // > &ca = Parent { + // > child: { + // > "echo": Child { + // > name: "echo", + // > description: "prints all subjects and properties", + // > }, + // > "exit": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > }, + // > } +# } +``` + +Try out `cargo run --example former_custom_subform_entry`. +
    +[See code](./examples/former_custom_subform_entry.rs). + +## General Collection Interface + +There are suite of traits designed to abstract and enhance the functionality of collection data structures within the forming process. These traits are integral to managing the complexity of collection operations, such as adding, modifying, and converting between different representations within collections like vectors, hash maps, etc. They are especially useful when used in conjunction with the `collection` attribute in the `former` macro, which automates the implementation of these traits to create robust and flexible builder patterns for complex data structures. + +- [`Collection`] - Defines basic functionalities for collections, managing entries and values, establishing the fundamental operations required for any custom collection implementation in forming processes. +- [`EntryToVal`] - Facilitates the conversion of collection entries to their value representations, crucial for operations that treat collection elements more abstractly as values. +- [`ValToEntry`] - Provides the reverse functionality of `EntryToVal`, converting values back into entries, which is essential for operations that require adding or modifying entries in the collection based on value data. +- [`CollectionAdd`] - Adds functionality for inserting entries into a collection, considering collection-specific rules such as duplication handling and order preservation, enhancing the usability of collections in forming scenarios. +- [`CollectionAssign`] - Extends the collection functionality to replace all existing entries with new ones, enabling bulk updates or complete resets of collection contents, which is particularly useful in dynamic data environments. + +## Custom Collection Former + +Collection interface is defined in the crate and implemented for collections like vectors, hash maps, etc, but if you want to use non-standard collection you can implement collection interface for the collection. This example demonstrate how to do that. + +Try out `cargo run --example former_custom_collection`. +
    +[See code](./examples/former_custom_collection.rs). + +## Concept of Mutator + +Provides a mechanism for mutating the context and storage just before the forming process is completed. + +The `FormerMutator` trait allows for the implementation of custom mutation logic on the internal state +of an entity (context and storage) just before the final forming operation is completed. This mutation +occurs immediately before the `FormingEnd` callback is invoked. + +Use cases of Mutator + +- Applying last-minute changes to the data being formed. +- Setting or modifying properties that depend on the final state of the storage or context. +- Storage-specific fields which are not present in formed structure. + +## Storage-Specific Fields + +Storage-specific fields are intermediate fields that exist only in the storage structure during +the forming process. These fields are not present in the final formed structure but are instrumental +in complex forming operations, such as conditional mutations, temporary state tracking, or accumulations. + +These fields are used to manage intermediate data or state that aids in the construction +of the final object but does not necessarily have a direct representation in the object's schema. For +instance, counters, flags, or temporary computation results that determine the final state of the object. + +The `FormerMutator` trait facilitates the implementation of custom mutation logic. It acts on the internal +state (context and storage) just before the final forming operation is completed, right before the `FormingEnd` +callback is invoked. This trait is crucial for making last-minute adjustments or computations based on the +accumulated state in the storage. + +## Mutator vs `FormingEnd` + +Unlike `FormingEnd`, which is responsible for integrating and finalizing the formation process of a field within +a parent former, `form_mutation` directly pertains to the entity itself. This method is designed to be independent +of whether the forming process is occurring within the context of a superformer or if the structure is a standalone +or nested field. This makes `form_mutation` suitable for entity-specific transformations that should not interfere +with the hierarchical forming logic managed by `FormingEnd`. + +## Example : Mutator and Storage Fields + +This example illustrates how to use the `FormerMutator` trait for implementing custom mutations +and demonstrates the concept of storage-specific fields in the forming process. + +In this example, the fields `a` and `b` are defined only within the storage and used +within the custom mutator to enrich or modify the field `c` of the formed entity. This approach +allows for a richer and more flexible formation logic that can adapt based on the intermediate state +held within the storage. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former" ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +# fn main() +# { + + use former::Former; + + #[ derive( Debug, PartialEq, Former ) ] + #[ storage_fields( a : i32, b : Option< String > ) ] + #[ mutator( custom ) ] + pub struct Struct1 + { + c : String, + } + + // = former mutator + + impl< Context, Formed > former::FormerMutator + for Struct1FormerDefinitionTypes< Context, Formed > + { + /// Mutates the context and storage of the entity just before the formation process completes. + #[ inline ] + fn form_mutation( storage : &mut Self::Storage, _context : &mut ::core::option::Option< Self::Context > ) + { + storage.a.get_or_insert_with( Default::default ); + storage.b.get_or_insert_with( Default::default ); + storage.c = Some( format!( "{:?} - {}", storage.a.unwrap(), storage.b.as_ref().unwrap() ) ); + } + } + + let got = Struct1::former().a( 13 ).b( "abc" ).c( "def" ).form(); + let exp = Struct1 + { + c : "13 - abc".to_string(), + }; + assert_eq!( got, exp ); + dbg!( got ); + // > got = Struct1 { + // > c: "13 - abc", + // > } + +# } +``` + +Try out `cargo run --example former_custom_mutator`. +
    +[See code](./examples/former_custom_mutator.rs). + +## Concept of Definitions + +Definitions are utilized to encapsulate and manage generic parameters efficiently and avoid passing each parameter individually. + +Two key definition Traits: + +1. **`FormerDefinitionTypes`**: + - This trait outlines the essential components involved in the formation process, including the types of storage, the form being created, and the context used. It focuses on the types involved rather than the termination of the formation process. +2. **`FormerDefinition`**: + - Building upon `FormerDefinitionTypes`, this trait incorporates the `FormingEnd` callback, linking the formation types with a definitive ending. It specifies how the formation process should conclude, which may involve validations, transformations, or integrations into larger structures. + - The inclusion of the `End` type parameter specifies the end conditions of the formation process, effectively connecting the temporary state held in storage to its ultimate form. + +## Overview of Formation Traits + +The formation process utilizes several core traits, each serving a specific purpose in the lifecycle of entity creation. These traits ensure that entities are constructed methodically, adhering to a structured pattern that enhances maintainability and scalability. Below is a summary of these key traits: + +- `EntityToDefinition`: Links entities to their respective formation definitions which dictate their construction process. +- `EntityToFormer`: Connects entities with formers that are responsible for their step-by-step construction. +- `EntityToStorage`: Specifies the storage structures that temporarily hold the state of an entity during its formation. +- `FormerDefinition`, `FormerDefinitionTypes`: Define the essential properties and ending conditions of the formation process, ensuring entities are formed according to predetermined rules and logic. +- `Storage`: Establishes the fundamental interface for storage types used in the formation process, ensuring each can initialize to a default state. +- `StoragePreform`: Describes the transformation of storage from a mutable, intermediate state into the final, immutable state of the entity, crucial for accurately concluding the formation process. +- `FormerMutator`: Allows for custom mutation logic on the storage and context immediately before the formation process completes, ensuring last-minute adjustments are possible. +- `FormingEnd`: Specifies the closure action at the end of the formation process, which can transform or validate the final state of the entity. +- `FormingEndClosure`: Provides a flexible mechanism for dynamically handling the end of the formation process using closures, useful for complex scenarios. +- `FormerBegin`: Initiates a subforming process, managing how entities begin their formation in terms of storage and context setup. + +These traits collectively facilitate a robust and flexible builder pattern that supports complex object creation and configuration scenarios. + +## Example : Custom Definition + +Define a custom former definition and custom forming logic, and apply them to a collection. + +The example showcases how to accumulate elements into a collection and then transform them into a single result using a custom `FormingEnd` implementation. This pattern is useful for scenarios where the formation process involves aggregation or transformation of input elements into a different type or form. + +```rust +# #[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +# fn main() {} + +# #[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +# fn main() +# { + + // Define a struct `Sum` that will act as a custom former definition. + struct Sum; + + // Implement `FormerDefinitionTypes` for `Sum`. + // This trait defines the types used during the forming process. + impl former::FormerDefinitionTypes for Sum + { + type Storage = Vec; // Collection for the integers. + type Formed = i32; // The final type after forming, which is a single integer. + type Context = (); // No additional context is used in this example. + } + + // Implement `FormerMutator` for `Sum`. + // This trait could include custom mutation logic applied during the forming process, but it's empty in this example. + impl former::FormerMutator for Sum + { + } + + // Implement `FormerDefinition` for `Sum`. + // This trait links the custom types to the former. + impl former::FormerDefinition for Sum + { + type Types = Sum; // Associate the `FormerDefinitionTypes` with `Sum`. + type End = Sum; // Use `Sum` itself as the end handler. + type Storage = Vec; // Specify the storage type. + type Formed = i32; // Specify the final formed type. + type Context = (); // Specify the context type, not used here. + } + + // Implement `FormingEnd` for `Sum`. + // This trait handles the final step of the forming process. + impl former::FormingEnd for Sum + { + fn call + ( + &self, + storage: < Sum as former::FormerDefinitionTypes >::Storage, + _context: Option< < Sum as former::FormerDefinitionTypes >::Context> + ) + -> < Sum as former::FormerDefinitionTypes >::Formed + { + // Sum all integers in the storage vector. + storage.iter().sum() + } + } + + // Use the custom `Former` to sum a list of integers. + let got = former::CollectionFormer::::new(Sum) + .add( 1 ) // Add an integer to the storage. + .add( 2 ) // Add another integer. + .add( 10 ) // Add another integer. + .form(); // Perform the form operation, which triggers the summing logic. + let exp = 13; // Expected result after summing 1, 2, and 10. + assert_eq!(got, exp); // Assert the result is as expected. + + dbg!(got); // Debug print the result to verify the output. + // > got = 13 + +# } +``` + +## Index of Examples + + + + + + + +- [Custom Defaults](./examples/former_custom_defaults.rs) - Former allows the specification of custom default values for fields through the `former( default )` attribute. +- [Custom Definition](./examples/former_custom_definition.rs) - Define a custom former definition and custom forming logic, and apply them to a collection. + + + +## To add to your project + +```sh +cargo add former +``` + +## Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/former_trivial +cargo run +``` diff --git a/module/core/former/examples/former_collection_hashmap.rs b/module/core/former/examples/former_collection_hashmap.rs new file mode 100644 index 0000000000..93b7ea3526 --- /dev/null +++ b/module/core/former/examples/former_collection_hashmap.rs @@ -0,0 +1,29 @@ +//! +//! This example demonstrates how to effectively employ the `Former` trait to configure a `HashMap` using a collection setter. +//! + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use collection_tools::{ HashMap, hmap }; + + #[ derive( Debug, PartialEq, former::Former ) ] + pub struct StructWithMap + { + #[ subform_collection ] + map : HashMap< &'static str, &'static str >, + } + + let instance = StructWithMap::former() + .map() + .add( ( "a", "b" ) ) + .add( ( "c", "d" ) ) + .end() + .form() + ; + assert_eq!( instance, StructWithMap { map : hmap!{ "a" => "b", "c" => "d" } } ); + dbg!( instance ); + +} diff --git a/module/core/former/examples/former_collection_hashset.rs b/module/core/former/examples/former_collection_hashset.rs new file mode 100644 index 0000000000..81c81f604f --- /dev/null +++ b/module/core/former/examples/former_collection_hashset.rs @@ -0,0 +1,29 @@ +//! +//! This example demonstrates the use of the `Former` trait to build a `collection_tools::HashSet` through subforming. +//! + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use collection_tools::{ HashSet, hset }; + + #[ derive( Debug, PartialEq, former::Former ) ] + pub struct StructWithSet + { + #[ subform_collection ] + set : HashSet< &'static str >, + } + + let instance = StructWithSet::former() + .set() + .add( "apple" ) + .add( "banana" ) + .end() + .form(); + + assert_eq!(instance, StructWithSet { set : hset![ "apple", "banana" ] }); + dbg!( instance ); + +} diff --git a/module/core/former/examples/former_collection_vector.rs b/module/core/former/examples/former_collection_vector.rs new file mode 100644 index 0000000000..b51b4fa378 --- /dev/null +++ b/module/core/former/examples/former_collection_vector.rs @@ -0,0 +1,28 @@ +//! +//! This example demonstrates how to employ the `Former` trait to configure a `Vec` using a collection setter in a structured manner. +//! + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + + #[ derive( Debug, PartialEq, former::Former ) ] + pub struct StructWithVec + { + #[ subform_collection ] + vec : Vec< &'static str >, + } + + let instance = StructWithVec::former() + .vec() + .add( "apple" ) + .add( "banana" ) + .end() + .form(); + + assert_eq!( instance, StructWithVec { vec: vec![ "apple", "banana" ] } ); + dbg!( instance ); + +} diff --git a/module/core/former/examples/former_component_from.rs b/module/core/former/examples/former_component_from.rs new file mode 100644 index 0000000000..2472fdf7ef --- /dev/null +++ b/module/core/former/examples/former_component_from.rs @@ -0,0 +1,40 @@ +//! +//! Macro to implement `From` for each component (field) of a structure. +//! This macro simplifies the creation of `From` trait implementations for struct fields, +//! enabling easy conversion from a struct reference to its field types. +//! +//! # Features +//! +//! - Requires the `derive_component_from` feature to be enabled for use. +//! - The `ComponentFrom` derive macro can be applied to structs to automatically generate +//! `From` implementations for each field. +//! +//! # Attributes +//! +//! - `debug` : Optional attribute to enable debug-level output during the macro expansion process. +//! + +#[ cfg( not( all( feature = "enabled", feature = "derive_component_from" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "enabled", feature = "derive_component_from" ) ) ] +fn main() +{ + + #[ derive( former::ComponentFrom ) ] + struct MyStruct + { + pub field1 : i32, + pub field2 : String, + } + + // Generated implementations allow for the following conversions : + let my_struct = MyStruct { field1 : 10, field2 : "Hello".into() }; + let field1 : i32 = From::from( &my_struct ); + let field2 : String = From::from( &my_struct ); + dbg!( field1 ); + dbg!( field2 ); + // > field1 = 10 + // > field2 = "Hello" + +} diff --git a/module/core/former/examples/former_custom_collection.rs b/module/core/former/examples/former_custom_collection.rs new file mode 100644 index 0000000000..54062a7fc7 --- /dev/null +++ b/module/core/former/examples/former_custom_collection.rs @@ -0,0 +1,280 @@ +//! Example former_custom_collection.rs +//! +//! This example demonstrates how to define and use a custom collection with former. +//! The custom collection implemented here is a `LoggingSet`, which extends the basic `HashSet` behavior +//! by logging each addition. This example illustrates how to integrate such custom collections with the +//! Former trait system for use in structured data types. + +// qqq : replace !no_std with !no_std || use_alloc when collection_tools reexports iterators -- done +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use collection_tools::HashSet; + + // Custom collection that logs additions. + #[ derive( Debug, PartialEq ) ] + pub struct LoggingSet< K > + where + K : core::cmp::Eq + core::hash::Hash, + { + set : HashSet< K >, // Internal HashSet to store the elements. + } + + // Implement default for the custom collection. + impl< K > Default for LoggingSet< K > + where + K : core::cmp::Eq + core::hash::Hash, + { + #[ inline( always ) ] + fn default() -> Self + { + Self + { + set : Default::default() // Initialize the internal HashSet. + } + } + } + + // Allow the custom collection to be converted into an iterator, to iterate over the elements. + impl< K > IntoIterator for LoggingSet< K > + where + K : std::cmp::Eq + std::hash::Hash, + { + type Item = K; + type IntoIter = collection_tools::hset::IntoIter< K >; + + fn into_iter( self ) -> Self::IntoIter + { + self.set.into_iter() // Create an iterator from the internal HashSet. + } + } + + // Similar iterator functionality but for borrowing the elements. + impl<'a, K> IntoIterator for &'a LoggingSet< K > + where + K : std::cmp::Eq + std::hash::Hash, + { + type Item = &'a K; + type IntoIter = collection_tools::hset::Iter< 'a, K >; + + fn into_iter( self ) -> Self::IntoIter + { + self.set.iter() // Borrow the elements via an iterator. + } + } + + // Implement the Collection trait to integrate with the former system. + impl< K > former::Collection for LoggingSet< K > + where + K : core::cmp::Eq + core::hash::Hash, + { + type Entry = K; + type Val = K; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e // Direct mapping of entries to values. + } + } + + // Implement CollectionAdd to handle adding elements to the custom collection. + impl< K > former::CollectionAdd for LoggingSet< K > + where + K : core::cmp::Eq + core::hash::Hash, + { + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.set.insert( e ) // Log the addition and add the element to the internal HashSet. + } + } + + // Implement CollectionAssign to handle bulk assignment of elements. + impl< K > former::CollectionAssign for LoggingSet< K > + where + K : core::cmp::Eq + core::hash::Hash, + { + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.set.len(); + self.set.extend( elements ); // Extend the set with a collection of elements. + self.set.len() - initial_len // Return the number of elements added. + } + } + + // Implement CollectionValToEntry to convert values back to entries. + impl< K > former::CollectionValToEntry< K > for LoggingSet< K > + where + K : core::cmp::Eq + core::hash::Hash, + { + type Entry = K; + #[ inline( always ) ] + fn val_to_entry( val : K ) -> Self::Entry + { + val // Direct conversion of value to entry. + } + } + + // = storage + + // Define storage behavior for the custom collection. + impl< K > former::Storage + for LoggingSet< K > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + { + type Preformed = LoggingSet< K >; // Define the type after the forming process. + } + + // Implement the preforming behavior to finalize the storage. + impl< K > former::StoragePreform + for LoggingSet< K > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + { + fn preform( self ) -> Self::Preformed + { + self // Return the collection as is. + } + } + + // = definition types + + // Definitions related to the type settings for the LoggingSet, which detail how the collection should behave with former. + + /// Holds generic parameter types for forming operations related to `LoggingSet`. + #[ derive( Debug, Default ) ] + pub struct LoggingSetDefinitionTypes< K, Context = (), Formed = LoggingSet< K > > + { + _phantom : core::marker::PhantomData< ( K, Context, Formed ) >, + } + + /// Specifies the storage, formed type, and context for the `LoggingSet` when used in a forming process. + impl< K, Context, Formed > former::FormerDefinitionTypes + for LoggingSetDefinitionTypes< K, Context, Formed > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + { + type Storage = LoggingSet< K >; // Specifies that `LoggingSet` is used as the storage. + type Formed = Formed; // The final formed type after the forming process. + type Context = Context; // The context required for forming, can be specified by the user. + } + + // = definition + + /// Provides a complete definition for `LoggingSet` including the end condition of the forming process. + #[ derive( Debug, Default ) ] + pub struct LoggingSetDefinition< K, Context = (), Formed = LoggingSet< K >, End = former::ReturnStorage > + { + _phantom : core::marker::PhantomData< ( K, Context, Formed, End ) >, + } + + /// Associates the `LoggingSet` with a specific forming process and defines its behavior. + impl< K, Context, Formed, End > former::FormerDefinition + for LoggingSetDefinition< K, Context, Formed, End > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : former::FormingEnd< LoggingSetDefinitionTypes< K, Context, Formed > >, + { + type Storage = LoggingSet< K >; // The storage type during the formation process. + type Formed = Formed; // The type resulting from the formation process. + type Context = Context; // The context used during the formation process. + type Types = LoggingSetDefinitionTypes< K, Context, Formed >; // The associated type settings. + type End = End; // The ending condition for the forming process. + } + + // = mutator + + /// Optional: Implements mutating capabilities to modify the forming process of `LoggingSet` if needed. + impl< K, Context, Formed > former::FormerMutator + for LoggingSetDefinitionTypes< K, Context, Formed > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + { + } + + // = Entity To + + /// Associates the `LoggingSet` with a specific `Former` for use in forming processes. + impl< K, Definition > former::EntityToFormer< Definition > for LoggingSet< K > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + Definition : former::FormerDefinition + < + Storage = LoggingSet< K >, + Types = LoggingSetDefinitionTypes + < + K, + < Definition as former::FormerDefinition >::Context, + < Definition as former::FormerDefinition >::Formed, + >, + >, + Definition::End : former::FormingEnd< Definition::Types >, + { + type Former = LoggingSetAsSubformer< K, Definition::Context, Definition::Formed, Definition::End >; + } + + /// Specifies the storage for `LoggingSet`. + impl< K > former::EntityToStorage + for LoggingSet< K > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + { + type Storage = LoggingSet< K >; + } + + /// Defines the relationship between `LoggingSet` and its formal definition within the forming system. + impl< K, Context, Formed, End > former::EntityToDefinition< Context, Formed, End > + for LoggingSet< K > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : former::FormingEnd< LoggingSetDefinitionTypes< K, Context, Formed > >, + { + type Definition = LoggingSetDefinition< K, Context, Formed, End >; + type Types = LoggingSetDefinitionTypes< K, Context, Formed >; + } + + /// Provides type-specific settings for the formation process related to `LoggingSet`. + impl< K, Context, Formed > former::EntityToDefinitionTypes< Context, Formed > + for LoggingSet< K > + where + K : ::core::cmp::Eq + ::core::hash::Hash, + { + type Types = LoggingSetDefinitionTypes< K, Context, Formed >; + } + + // = subformer + + // Subformer type alias simplifies the usage of `CollectionFormer` with `LoggingSet`. + pub type LoggingSetAsSubformer< K, Context, Formed, End > = + former::CollectionFormer::< K, LoggingSetDefinition< K, Context, Formed, End > >; + + // == use custom collection + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, former::Former ) ] + pub struct Parent + { + #[ subform_collection ] + children : LoggingSet< i32 >, + } + + // Using the builder pattern provided by Former to manipulate Parent + let parent = Parent::former() + .children() + .add(10) + .add(20) + .add(10) + .end() + .form(); + + println!("Got: {:?}", parent); + // > Parent { children: LoggingSet { set: {10, 20} } } + +} diff --git a/module/core/former/examples/former_custom_defaults.rs b/module/core/former/examples/former_custom_defaults.rs new file mode 100644 index 0000000000..e7f8e779d7 --- /dev/null +++ b/module/core/former/examples/former_custom_defaults.rs @@ -0,0 +1,56 @@ + +//! ## Example : Custom Defaults +//! +//! Former allows the specification of custom default values for fields through the `former( default )` attribute. +//! +//! This feature not only provides a way to set initial values for struct fields without relying on the `Default` trait but also adds flexibility in handling cases where a field's type does not implement `Default`, or a non-standard default value is desired. +//! The example showcases the `Former` crate's ability to initialize struct fields with custom default values: +//! - The `number` field is initialized to `5`. +//! - The `greeting` field defaults to a greeting message, "Hello, Former!". +//! - The `numbers` field starts with a vector containing the integers `10`, `20`, and `30`. +//! +//! This approach significantly simplifies struct construction, particularly for complex types or where defaults beyond the `Default` trait's capability are required. By utilizing the `default` attribute, developers can ensure their structs are initialized safely and predictably, enhancing code clarity and maintainability. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former::Former; + + /// Structure with default attributes. + #[ derive( Debug, PartialEq, Former ) ] + pub struct ExampleStruct + { + #[ former( default = 5 ) ] + number : i32, + #[ former( default = "Hello, Former!".to_string() ) ] + greeting : String, + #[ former( default = vec![ 10, 20, 30 ] ) ] + numbers : Vec< i32 >, + } + + // + + let instance = ExampleStruct::former().form(); + let expected = ExampleStruct + { + number : 5, + greeting : "Hello, Former!".to_string(), + numbers : vec![ 10, 20, 30 ], + }; + assert_eq!( instance, expected ); + dbg!( &instance ); + // > &instance = ExampleStruct { + // > number: 5, + // > greeting: "Hello, Former!", + // > numbers: [ + // > 10, + // > 20, + // > 30, + // > ], + // > } + +} diff --git a/module/core/former/examples/former_custom_definition.rs b/module/core/former/examples/former_custom_definition.rs new file mode 100644 index 0000000000..df7203a188 --- /dev/null +++ b/module/core/former/examples/former_custom_definition.rs @@ -0,0 +1,72 @@ +//! ## Example : Custom Definition +//! +//! Define a custom former definition and custom forming logic, and apply them to a collection. +//! +//! The example showcases how to accumulate elements into a collection and then transform them into a single result +//! using a custom `FormingEnd` implementation. This pattern is useful for scenarios where the formation process +//! involves aggregation or transformation of input elements into a different type or form. + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + // Define a struct `Sum` that will act as a custom former definition. + struct Sum; + + // Implement `FormerDefinitionTypes` for `Sum`. + // This trait defines the types used during the forming process. + impl former::FormerDefinitionTypes for Sum + { + type Storage = Vec; // Collection for the integers. + type Formed = i32; // The final type after forming, which is a single integer. + type Context = (); // No additional context is used in this example. + } + + // Implement `FormerMutator` for `Sum`. + // This trait could include custom mutation logic applied during the forming process, but it's empty in this example. + impl former::FormerMutator for Sum + { + } + + // Implement `FormerDefinition` for `Sum`. + // This trait links the custom types to the former. + impl former::FormerDefinition for Sum + { + type Types = Sum; // Associate the `FormerDefinitionTypes` with `Sum`. + type End = Sum; // Use `Sum` itself as the end handler. + type Storage = Vec; // Specify the storage type. + type Formed = i32; // Specify the final formed type. + type Context = (); // Specify the context type, not used here. + } + + // Implement `FormingEnd` for `Sum`. + // This trait handles the final step of the forming process. + impl former::FormingEnd for Sum + { + fn call + ( + &self, + storage: < Sum as former::FormerDefinitionTypes >::Storage, + _context: Option< < Sum as former::FormerDefinitionTypes >::Context> + ) + -> < Sum as former::FormerDefinitionTypes >::Formed + { + // Sum all integers in the storage vector. + storage.iter().sum() + } + } + + // Use the custom `Former` to sum a list of integers. + let got = former::CollectionFormer::::new(Sum) + .add( 1 ) // Add an integer to the storage. + .add( 2 ) // Add another integer. + .add( 10 ) // Add another integer. + .form(); // Perform the form operation, which triggers the summing logic. + let exp = 13; // Expected result after summing 1, 2, and 10. + assert_eq!(got, exp); // Assert the result is as expected. + + dbg!(got); // Debug print the result to verify the output. + // > got = 13 +} diff --git a/module/core/former/examples/former_custom_mutator.rs b/module/core/former/examples/former_custom_mutator.rs new file mode 100644 index 0000000000..e70323e588 --- /dev/null +++ b/module/core/former/examples/former_custom_mutator.rs @@ -0,0 +1,76 @@ +// former_custom_mutator.rs + +//! This example illustrates how to use the `FormerMutator` trait for implementing custom mutations +//! and demonstrates the concept of storage-specific fields in the forming process. +//! +//! #### Storage-Specific Fields +//! +//! Storage-specific fields are intermediate fields that exist only in the storage structure during +//! the forming process. These fields are not present in the final formed structure but are instrumental +//! in complex forming operations, such as conditional mutations, temporary state tracking, or accumulations. +//! +//! These fields are used to manage intermediate data or state that aids in the construction +//! of the final object but does not necessarily have a direct representation in the object's schema. For +//! instance, counters, flags, or temporary computation results that determine the final state of the object. +//! +//! The `FormerMutator` trait facilitates the implementation of custom mutation logic. It acts on the internal +//! state (context and storage) just before the final forming operation is completed, right before the `FormingEnd` +//! callback is invoked. This trait is crucial for making last-minute adjustments or computations based on the +//! accumulated state in the storage. +//! +//! In this example, the fields `a` and `b` are defined only within the storage and used +//! within the custom mutator to enrich or modify the field `c` of the formed entity. This approach +//! allows for a richer and more flexible formation logic that can adapt based on the intermediate state +//! held within the storage. +//! +//! #### Differences from `FormingEnd` +//! +//! Unlike `FormingEnd`, which is primarily responsible for integrating and finalizing the formation process of a field +//! within a parent former, `form_mutation` directly pertains to the entity itself. This method is designed to be independent +//! of whether the forming process is occurring within the context of a superformer or if the structure is a standalone +//! or nested field. This makes `form_mutation` suitable for entity-specific transformations that should not interfere +//! with the hierarchical forming logic managed by `FormingEnd`. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former::Former; + + #[ derive( Debug, PartialEq, Former ) ] + #[ storage_fields( a : i32, b : Option< String > ) ] + #[ mutator( custom ) ] + pub struct Struct1 + { + c : String, + } + + // = former mutator + + impl< Context, Formed > former::FormerMutator + for Struct1FormerDefinitionTypes< Context, Formed > + { + //! Mutates the context and storage of the entity just before the formation process completes. + #[ inline ] + fn form_mutation( storage : &mut Self::Storage, _context : &mut ::core::option::Option< Self::Context > ) + { + storage.a.get_or_insert_with( Default::default ); + storage.b.get_or_insert_with( Default::default ); + storage.c = Some( format!( "{:?} - {}", storage.a.unwrap(), storage.b.as_ref().unwrap() ) ); + } + } + + let got = Struct1::former().a( 13 ).b( "abc" ).c( "def" ).form(); + let exp = Struct1 + { + c : "13 - abc".to_string(), + }; + assert_eq!( got, exp ); + dbg!( got ); + // > got = Struct1 { + // > c: "13 - abc", + // > } + +} diff --git a/module/core/former/examples/former_custom_scalar_setter.rs b/module/core/former/examples/former_custom_scalar_setter.rs new file mode 100644 index 0000000000..753adcc618 --- /dev/null +++ b/module/core/former/examples/former_custom_scalar_setter.rs @@ -0,0 +1,92 @@ +// Example former_custom_scalar_setter.rs + +//! ## Example : Custom Scalar Setter +//! +//! Use of a scalar setter within a `Former` trait implementation to directly assign a `HashMap` of `Child` entities to a `Parent` structure using a custom setter function. +//! +//! Unlike the more complex subform and collection setters shown in previous examples, this example focuses on a straightforward approach to directly set a scalar value within a parent entity. The `Parent` struct manages a `HashMap` of `Child` entities, and the scalar setter is used to set the entire `HashMap` directly. The `child` function within `ParentFormer` is a custom subform setter that plays a crucial role. It uniquely employs the `ChildFormer` to add and configure children by their names within the parent's builder pattern. This method demonstrates a powerful technique for integrating subformers that manage specific elements of a collection—each child entity in this case. +//! +//! #### Types of Setters / Subformers +//! +//! Understanding the distinctions among the types of setters or subformers is essential for effectively employing the builder pattern in object construction. Each type of setter is designed to meet specific needs in building complex, structured data entities: +//! +//! - **Scalar Setter**: Handles the direct assignment of scalar values or simple fields within an entity. These setters manage basic data types or individual fields and do not involve nested formers or complex structuring. +//! +//! - **Subform Collection Setter**: Facilitates the management of a collection as a whole by returning a former that provides an interface to configure the entire collection. This setter is beneficial for applying uniform configurations or validations to all elements in a collection, such as a `HashMap` of children. +//! +//! - **Subform Entry Setter**: This setter allows for the individual formation of elements within a collection. It returns a former for each element, enabling detailed configuration and addition of complex elements within collections, exemplified by managing `Child` entities within a `Parent`'s `HashMap`. +//! +//! - **Subform Scalar Setter**: Similar to the subform entry setter but designed for scalar fields that have a former implementation. This setter does not collect instances into a collection because there is no collection involved, only a scalar field. It is used when the scalar field itself needs to be configured or modified through its dedicated former. +//! +//! These setters ensure that developers can precisely and efficiently set properties, manage collections, and configure complex structures within their applications. +//! + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} + +// Ensure the example only compiles when the appropriate features are enabled. +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use collection_tools::HashMap; + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct to hold children + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Parent + { + // Use `debug` to gennerate sketch of setter. + #[ scalar( setter = false ) ] + children : HashMap< String, Child >, + } + + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = ParentFormerStorage >, + { + #[ inline ] + pub fn children< Src >( mut self, src : Src ) -> Self + where + Src : ::core::convert::Into< HashMap< String, Child > >, + { + debug_assert!( self.storage.children.is_none() ); + self.storage.children = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + } + } + + let echo = Child { name : "echo".to_string(), description : "prints all subjects and properties".to_string() }; + let exit = Child { name : "exit".to_string(), description : "just exit".to_string() }; + let mut children = HashMap::new(); + children.insert( echo.name.clone(), echo ); + children.insert( exit.name.clone(), exit ); + let ca = Parent::former() + .children( children ) + .form(); + + dbg!( &ca ); + // > &ca = Parent { + // > child: { + // > "echo": Child { + // > name: "echo", + // > description: "prints all subjects and properties", + // > }, + // > "exit": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > }, + // > } +} diff --git a/module/core/former/examples/former_custom_setter.rs b/module/core/former/examples/former_custom_setter.rs new file mode 100644 index 0000000000..10c592f913 --- /dev/null +++ b/module/core/former/examples/former_custom_setter.rs @@ -0,0 +1,45 @@ +//! With help of `Former`, it is possible to define multiple versions of a setter for a single field, providing the flexibility to include custom logic within the setter methods. +//! +//! This feature is particularly useful when you need to preprocess data or enforce specific constraints before assigning values to fields. Custom setters should have unique names to differentiate them from the default setters generated by `Former`, allowing for specialized behavior while maintaining clarity in your code. +//! In the example showcases a custom alternative setter, `word_exclaimed`, which appends an exclamation mark to the input string before storing it. This approach allows for additional processing or validation of the input data without compromising the simplicity of the builder pattern. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former::Former; + + /// Structure with a custom setter. + #[ derive( Debug, Former ) ] + pub struct StructWithCustomSetters + { + word : String, + } + + impl StructWithCustomSettersFormer + { + + // Custom alternative setter for `word` + pub fn word_exclaimed( mut self, value : impl Into< String > ) -> Self + { + debug_assert!( self.storage.word.is_none() ); + self.storage.word = Some( format!( "{}!", value.into() ) ); + self + } + + } + + let example = StructWithCustomSetters::former() + .word( "Hello" ) + .form(); + assert_eq!( example.word, "Hello".to_string() ); + + let example = StructWithCustomSetters::former() + .word_exclaimed( "Hello" ) + .form(); + assert_eq!( example.word, "Hello!".to_string() ); + +} diff --git a/module/core/former/examples/former_custom_setter_overriden.rs b/module/core/former/examples/former_custom_setter_overriden.rs new file mode 100644 index 0000000000..7c57e5eaa1 --- /dev/null +++ b/module/core/former/examples/former_custom_setter_overriden.rs @@ -0,0 +1,51 @@ +//! +//! ## Example : Custom Setter Overriding +//! +//! It's also possible to completely override setter and write its own from scratch. +//! +//! For that use attribe `[ setter( false ) ]` to disable setter. In the example, the default setter for `word` is disabled, and a custom setter is defined to automatically append an exclamation mark to the string. This method allows for complete control over the data assignment process, enabling the inclusion of any necessary logic or validation steps. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former::Former; + + /// Structure with a custom setter. + #[ derive( Debug, Former ) ] + pub struct StructWithCustomSetters + { + // Use `debug` to gennerate sketch of setter. + #[ scalar( setter = false ) ] + word : String, + } + + impl< Definition > StructWithCustomSettersFormer< Definition > + where + Definition : former::FormerDefinition< Storage = StructWithCustomSettersFormerStorage >, + { + // Custom alternative setter for `word` + #[ inline ] + pub fn word< Src >( mut self, src : Src ) -> Self + where + Src : ::core::convert::Into< String >, + { + debug_assert!( self.storage.word.is_none() ); + self.storage.word = Some( format!( "{}!", src.into() ) ); + self + } + } + + let example = StructWithCustomSetters::former() + .word( "Hello" ) + .form(); + assert_eq!( example.word, "Hello!".to_string() ); + dbg!( example ); + //> StructWithCustomSetters { + //> word: "Hello!", + //> } + +} diff --git a/module/core/former/examples/former_custom_subform_collection.rs b/module/core/former/examples/former_custom_subform_collection.rs new file mode 100644 index 0000000000..f0de7350a0 --- /dev/null +++ b/module/core/former/examples/former_custom_subform_collection.rs @@ -0,0 +1,95 @@ +// Example former_custom_subform_collection.rs + +//! +//! ## Example : Custom Subform Collection Setter +//! +//! This example demonstrates the use of collection setters to manage complex nested data structures with the `Former` trait, focusing on a parent-child relationship structured around a collection `HashMap`. Unlike typical builder patterns that add individual elements using subform setters, this example uses a collection setter to manage the entire collection of children. +//! +//! The `child` function within `ParentFormer` is a custom subform setter that plays a crucial role. It uniquely employs the `ChildFormer` to add and configure children by their names within the parent's builder pattern. This method demonstrates a powerful technique for integrating subformers that manage specific elements of a collection—each child entity in this case. +//! +//! #### Types of Setters / Subformers +//! +//! Understanding the distinctions among the types of setters or subformers is essential for effectively employing the builder pattern in object construction. Each type of setter is designed to meet specific needs in building complex, structured data entities: +//! +//! - **Scalar Setter**: Handles the direct assignment of scalar values or simple fields within an entity. These setters manage basic data types or individual fields and do not involve nested formers or complex structuring. +//! +//! - **Subform Collection Setter**: Facilitates the management of a collection as a whole by returning a former that provides an interface to configure the entire collection. This setter is beneficial for applying uniform configurations or validations to all elements in a collection, such as a `HashMap` of children. +//! +//! - **Subform Entry Setter**: This setter allows for the individual formation of elements within a collection. It returns a former for each element, enabling detailed configuration and addition of complex elements within collections, exemplified by managing `Child` entities within a `Parent`'s `HashMap`. +//! +//! - **Subform Scalar Setter**: Similar to the subform entry setter but designed for scalar fields that have a former implementation. This setter does not collect instances into a collection because there is no collection involved, only a scalar field. It is used when the scalar field itself needs to be configured or modified through its dedicated former. +//! +//! These setters ensure that developers can precisely and efficiently set properties, manage collections, and configure complex structures within their applications. +//! + +// Ensure the example only compiles when the appropriate features are enabled. +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use collection_tools::HashMap; + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct to hold children + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Parent + { + // Use `debug` to gennerate sketch of setter. + #[ subform_collection( setter = false ) ] + children : HashMap< String, Child >, + } + + /// The containr setter provides a collection setter that returns a CollectionFormer tailored for managing a collection of child entities. It employs a generic collection definition to facilitate operations on the entire collection, such as adding or updating elements. + impl< Definition, > ParentFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = ParentFormerStorage >, + { + + #[ inline( always ) ] + pub fn children( self ) -> former::CollectionFormer:: + < + ( String, Child ), + former::HashMapDefinition< String, Child, Self, Self, ParentSubformCollectionChildrenEnd< Definition >, > + > + { + self._children_subform_collection() + } + + } + + let echo = Child { name : "echo".to_string(), description : "prints all subjects and properties".to_string() }; + let exit = Child { name : "exit".to_string(), description : "just exit".to_string() }; + let ca = Parent::former() + .children() + .add( ( echo.name.clone(), echo ) ) + .add( ( exit.name.clone(), exit ) ) + .end() + .form(); + + dbg!( &ca ); + // > &ca = Parent { + // > child: { + // > "echo": Child { + // > name: "echo", + // > description: "prints all subjects and properties", + // > }, + // > "exit": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > }, + // > } +} diff --git a/module/core/former/examples/former_custom_subform_entry.rs b/module/core/former/examples/former_custom_subform_entry.rs new file mode 100644 index 0000000000..e046434da8 --- /dev/null +++ b/module/core/former/examples/former_custom_subform_entry.rs @@ -0,0 +1,106 @@ +// Example former_custom_subform_entry.rs + +//! ## Example : Custom Subform Entry Setter +//! +//! This example illustrates the implementation of nested builder patterns using the `Former` trait, emphasizing a parent-child relationship. Here, the `Parent` struct utilizes `ChildFormer` as a custom subformer to dynamically manage its `child` field—a `HashMap`. Each child in the `HashMap` is uniquely identified and configured via the `ChildFormer`. +//! +//! The `child` function within `ParentFormer` is a custom subform setter that plays a crucial role. It uniquely employs the `ChildFormer` to add and configure children by their names within the parent's builder pattern. This method demonstrates a powerful technique for integrating subformers that manage specific elements of a collection—each child entity in this case. +//! +//! #### Types of Setters / Subformers +//! +//! Understanding the distinctions among the types of setters or subformers is essential for effectively employing the builder pattern in object construction. Each type of setter is designed to meet specific needs in building complex, structured data entities: +//! +//! - **Scalar Setter**: Handles the direct assignment of scalar values or simple fields within an entity. These setters manage basic data types or individual fields and do not involve nested formers or complex structuring. +//! +//! - **Subform Collection Setter**: Facilitates the management of a collection as a whole by returning a former that provides an interface to configure the entire collection. This setter is beneficial for applying uniform configurations or validations to all elements in a collection, such as a `HashMap` of children. +//! +//! - **Subform Entry Setter**: This setter allows for the individual formation of elements within a collection. It returns a former for each element, enabling detailed configuration and addition of complex elements within collections, exemplified by managing `Child` entities within a `Parent`'s `HashMap`. +//! +//! - **Subform Scalar Setter**: Similar to the subform entry setter but designed for scalar fields that have a former implementation. This setter does not collect instances into a collection because there is no collection involved, only a scalar field. It is used when the scalar field itself needs to be configured or modified through its dedicated former. +//! +//! These setters ensure that developers can precisely and efficiently set properties, manage collections, and configure complex structures within their applications. +//! + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} + +// Ensure the example only compiles when the appropriate features are enabled. +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use collection_tools::HashMap; + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct to hold children + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Parent + { + // Use `debug` to gennerate sketch of setter. + #[ subform_entry( setter = false ) ] + child : HashMap< String, Child >, + } + + /// Initializes and configures a subformer for adding named child entities. This method leverages an internal function + /// to create and return a configured subformer instance. It allows for the dynamic addition of children with specific names, + /// integrating them into the formation process of the parent entity. + /// + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + { + + #[ inline( always ) ] + pub fn child( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._child_subform_entry::< ChildFormer< _ >, _, >() + .name( name ) + } + + } + + // Required to define how `value` is converted into pair `( key, value )` + impl former::ValToEntry< HashMap< String, Child > > for Child + { + type Entry = ( String, Child ); + #[ inline( always ) ] + fn val_to_entry( self ) -> Self::Entry + { + ( self.name.clone(), self ) + } + } + + let ca = Parent::former() + .child( "echo" ) + .description( "prints all subjects and properties" ) // sets additional properties using custom subformer + .end() + .child( "exit" ) + .description( "just exit" ) // Sets additional properties using using custom subformer + .end() + .form(); + + dbg!( &ca ); + // > &ca = Parent { + // > child: { + // > "echo": Child { + // > name: "echo", + // > description: "prints all subjects and properties", + // > }, + // > "exit": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > }, + // > } +} diff --git a/module/core/former/examples/former_custom_subform_entry2.rs b/module/core/former/examples/former_custom_subform_entry2.rs new file mode 100644 index 0000000000..c4592ee34f --- /dev/null +++ b/module/core/former/examples/former_custom_subform_entry2.rs @@ -0,0 +1,162 @@ +// Example former_custom_subformer2.rs + +//! +//! This example extends the demonstration of nested builder patterns using the `Former` trait, highlighting a parent-child relationship similar to the `former_custom_subformer.rs`. However, this variant, `former_custom_subformer2.rs`, showcases a more flexible but complex approach to managing the `child` field in the `Parent` struct—a `HashMap` of `Child` entities. Instead of relying on a predefined subformer setter (`_child_subform_entry`), this example constructs the subformer logic directly using closures. This method provides greater control over how children are added and managed within the `Parent`. +//! +//! #### Custom Subform Setter +//! +//! The `child` function within `ParentFormer` is a custom subform setter that plays a crucial role. It uniquely employs the `ChildFormer` to add and configure children by their names within the parent's builder pattern. This method demonstrates a powerful technique for integrating subformers that manage specific elements of a collection—each child entity in this case. +//! +//! #### Types of Setters / Subformers +//! +//! Understanding the distinctions among the types of setters or subformers is essential for effectively employing the builder pattern in object construction. Each type of setter is designed to meet specific needs in building complex, structured data entities: +//! +//! - **Scalar Setter**: Handles the direct assignment of scalar values or simple fields within an entity. These setters manage basic data types or individual fields and do not involve nested formers or complex structuring. +//! +//! - **Subform Collection Setter**: Facilitates the management of a collection as a whole by returning a former that provides an interface to configure the entire collection. This setter is beneficial for applying uniform configurations or validations to all elements in a collection, such as a `HashMap` of children. +//! +//! - **Subform Entry Setter**: This setter allows for the individual formation of elements within a collection. It returns a former for each element, enabling detailed configuration and addition of complex elements within collections, exemplified by managing `Child` entities within a `Parent`'s `HashMap`. +//! +//! - **Subform Scalar Setter**: Similar to the subform entry setter but designed for scalar fields that have a former implementation. This setter does not collect instances into a collection because there is no collection involved, only a scalar field. It is used when the scalar field itself needs to be configured or modified through its dedicated former. +//! +//! These setters ensure that developers can precisely and efficiently set properties, manage collections, and configure complex structures within their applications. +//! + +// Ensure the example only compiles when the appropriate features are enabled. +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use collection_tools::HashMap; + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Clone, Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct to hold children + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct Parent + { + // Use `debug` to gennerate sketch of setter. + #[ subform_entry( setter = false ) ] + child : HashMap< String, Child >, + } + + // Use ChildFormer as custom subformer for ParentFormer to add children by name. + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + { + + /// Adds a named child entity to the `Parent`'s `child` field using a custom subformer setup. + /// This method simplifies the process of dynamically adding child entities with specified names, + /// providing a basic yet powerful example of custom subformer implementation. + /// + #[ inline( always ) ] + pub fn child1( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + let on_end = | substorage : ChildFormerStorage, super_former : core::option::Option< Self > | -> Self + { + let mut super_former = super_former.unwrap(); + let preformed = former::StoragePreform::preform( substorage ); + + if super_former.storage.child.is_none() + { + super_former.storage.child = Some( Default::default() ); + } + + // add instance to the collection + super_former.storage.child.as_mut().unwrap() + .entry( preformed.name.clone() ) + .or_insert( preformed.clone() ); + + super_former + }; + let subformer = ChildAsSubformer::< Self, _ >::begin( None, Some( self ), former::FormingEndClosure::new( on_end ) ); + subformer.name( name ) + } + + /// Dynamically adds named child entities to the `Parent` structure using a custom subformer. + /// Unlike traditional methods that might use predefined setters like `_child_subform_entry`, this function + /// explicitly constructs a subformer setup through a closure to provide greater flexibility and control. + /// + #[ inline( always ) ] + pub fn child2( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + let on_end = | substorage : ChildFormerStorage, super_former : core::option::Option< Self > | -> Self + { + let mut super_former = super_former.unwrap(); + let preformed = former::StoragePreform::preform( substorage ); + + if super_former.storage.child.is_none() + { + super_former.storage.child = Some( Default::default() ); + } + + // add instance to the collection + super_former.storage.child.as_mut().unwrap() + .entry( preformed.name.clone() ) + .or_insert( preformed.clone() ); + + // custom logic to add two instances to the collection + super_former.storage.child.as_mut().unwrap() + .entry( format!( "{}_2", preformed.name ) ) + .or_insert( preformed.clone() ); + + super_former + }; + let subformer = ChildAsSubformer::< Self, _ >::begin( None, Some( self ), former::FormingEndClosure::new( on_end ) ); + subformer.name( name ) + } + + } + + // Required to define how `value` is converted into pair `( key, value )` + impl former::ValToEntry< HashMap< String, Child > > for Child + { + type Entry = ( String, Child ); + #[ inline( always ) ] + fn val_to_entry( self ) -> Self::Entry + { + ( self.name.clone(), self ) + } + } + + let ca = Parent::former() + .child1( "echo" ) + .description( "prints all subjects and properties" ) // sets additional properties using custom subformer + .end() + .child2( "exit" ) + .description( "just exit" ) // Sets additional properties using using custom subformer + .end() + .form(); + + dbg!( &ca ); + // > &ca = Parent { + // > child: { + // > "echo": Child { + // > name: "echo", + // > description: "prints all subjects and properties", + // > }, + // > "exit": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > "exit_2": Child { + // > name: "exit", + // > description: "just exit", + // > }, + // > }, + // > } + +} diff --git a/module/core/former/examples/former_custom_subform_scalar.rs b/module/core/former/examples/former_custom_subform_scalar.rs new file mode 100644 index 0000000000..7bb0eb97cd --- /dev/null +++ b/module/core/former/examples/former_custom_subform_scalar.rs @@ -0,0 +1,88 @@ +// Example former_custom_subform_scalar.rs + +//! +//! ## Example : Custom Subform Scalar Setter +//! +//! Implementation of a custom subform scalar setter using the `Former` trait in Rust. +//! +//! This example focuses on the usage of a subform scalar setter to manage complex scalar types within a parent structure. +//! Unlike more general subform setters that handle collections, this setter specifically configures scalar fields that have +//! their own formers, allowing for detailed configuration within a nested builder pattern. +//! +//! #### Types of Setters / Subformers +//! +//! Understanding the distinctions among the types of setters or subformers is essential for effectively employing the builder pattern in object construction. Each type of setter is designed to meet specific needs in building complex, structured data entities: +//! +//! - **Scalar Setter**: Handles the direct assignment of scalar values or simple fields within an entity. These setters manage basic data types or individual fields and do not involve nested formers or complex structuring. +//! +//! - **Subform Collection Setter**: Facilitates the management of a collection as a whole by returning a former that provides an interface to configure the entire collection. This setter is beneficial for applying uniform configurations or validations to all elements in a collection, such as a `HashMap` of children. +//! +//! - **Subform Entry Setter**: This setter allows for the individual formation of elements within a collection. It returns a former for each element, enabling detailed configuration and addition of complex elements within collections, exemplified by managing `Child` entities within a `Parent`'s `HashMap`. +//! +//! - **Subform Scalar Setter**: Similar to the subform entry setter but designed for scalar fields that have a former implementation. This setter does not collect instances into a collection because there is no collection involved, only a scalar field. It is used when the scalar field itself needs to be configured or modified through its dedicated former. +//! +//! These setters ensure that developers can precisely and efficiently set properties, manage collections, and configure complex structures within their applications. +//! + + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc",not( feature = "no_std" ) ) ) ) ) ] +fn main() +{} + +// Ensures the example only compiles when the appropriate features are enabled. +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc",not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use former::Former; + + // Child struct with Former derived for builder pattern support + #[ derive( Debug, PartialEq, Former ) ] + // Optional: Use `#[debug]` to expand and debug generated code. + // #[debug] + pub struct Child + { + name : String, + description : String, + } + + // Parent struct designed to hold a single Child instance using subform scalar + #[ derive( Debug, PartialEq, Former ) ] + // Optional: Use `#[debug]` to expand and debug generated code. + // #[debug] + pub struct Parent + { + // The `subform_scalar` attribute is used to specify that the 'child' field has its own former + // and can be individually configured via a subform setter. This is not a collection but a single scalar entity. + #[ subform_scalar( setter = false ) ] + child : Child, + } + + /// Extends `ParentFormer` to include a method that initializes and configures a subformer for the 'child' field. + /// This function demonstrates the dynamic addition of a named child, leveraging a subformer to specify detailed properties. + impl< Definition > ParentFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + { + #[ inline( always ) ] + pub fn child( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._child_subform_scalar::< ChildFormer< _ >, _, >().name( name ) + } + } + + // Creating an instance of `Parent` using the builder pattern to configure `Child` + let ca = Parent::former() + .child( "echo" ) // starts the configuration of the `child` subformer + .description( "prints all subjects and properties" ) // sets additional properties for the `Child` + .end() // finalize the child configuration + .form(); // finalize the Parent configuration + + dbg!( &ca ); // Outputs the structured data for review + // Expected output: + //> Parent { + //> child: Child { + //> name: "echo", + //> description: "prints all subjects and properties", + //> }, + //> } +} diff --git a/module/core/former/examples/former_debug.rs b/module/core/former/examples/former_debug.rs new file mode 100644 index 0000000000..8d610eae3c --- /dev/null +++ b/module/core/former/examples/former_debug.rs @@ -0,0 +1,39 @@ +//! +//! This is a demonstration of attribute debug. +//! The attribute `#[ debug ]` outputs generated code into the console during compilation. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former::Former; + + + #[ derive( Debug, PartialEq, Former ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + pub struct UserProfile + { + age : i32, + username : String, + bio_optional : Option< String >, // Fields could be optional + } + + let profile = UserProfile::former() + .age( 30 ) + .username( "JohnDoe".to_string() ) + .bio_optional( "Software Developer".to_string() ) // Optionally provide a bio + .form(); + + dbg!( &profile ); + // Expected output: + // &profile = UserProfile { + // age: 30, + // username: "JohnDoe", + // bio_optional: Some("Software Developer"), + // } + +} diff --git a/module/core/former/examples/former_many_fields.rs b/module/core/former/examples/former_many_fields.rs new file mode 100644 index 0000000000..1ca64722e0 --- /dev/null +++ b/module/core/former/examples/former_many_fields.rs @@ -0,0 +1,70 @@ +//! +//! Utilizing the Former Crate for Struct Initialization +//! +//! This example demonstrates the capability of the `Former` crate to simplify struct initialization through the builder pattern, particularly for structs with a mix of required and optional fields, as well as collections like vectors and hash maps. +//! +//! The `Structure1` struct is defined with various field types to showcase the flexibility of `Former`: +//! - `int_1`: A required integer field. +//! - `string_1`: A required string field. +//! - `vec_1`: A vector of unsigned integers, showcasing collection handling. +//! - `hashmap_1`: A hash map storing key-value pairs, both strings, illustrating how `Former` can manage more complex data structures. +//! - `int_optional_1`: An optional integer field, demonstrating `Former`'s capability to handle optional fields seamlessly. +//! - `string_optional_1`: An optional string field, further exemplifying optional field handling. +//! +//! A hash map is first created and populated with two key-value pairs. The `Structure1` struct is then instantiated using the fluent builder pattern methods provided by `Former`. Each method corresponds to one of `Structure1`'s fields, allowing for intuitive and clear field assignment. The `.form()` method completes the construction of the `Structure1` instance. +//! +//! The builder pattern methods significantly streamline the process of struct initialization, especially for structs with complex or optional fields. By leveraging `Former`, developers can write more readable and maintainable initialization code, avoiding the verbosity and complexity often associated with manual struct instantiation. +//! +//! The `dbg!` macro is utilized to print the constructed `Structure1` instance, confirming that all fields are correctly assigned, including the handling of optional fields and collections. + +#[ cfg( not( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "enabled", feature = "derive_former", any( feature = "use_alloc", not( feature = "no_std" ) ) ) ) ] +fn main() +{ + use former::Former; + + #[ derive( Debug, PartialEq, Eq, Former ) ] + pub struct Structure1 + { + int_1 : i32, + string_1 : String, + vec_1 : Vec< u32 >, + hashmap_1 : collection_tools::HashMap< String, String >, + int_optional_1 : core::option::Option< i32 >, + string_optional_1 : Option< String >, + } + let hashmap = collection_tools::HashMap::from + ([ + ( "k1".to_string(), "v1".to_string() ), + ( "k2".to_string(), "v2".to_string() ), + ]); + + let struct1 = Structure1::former() + .int_1( 13 ) + .string_1( "Abcd".to_string() ) + .vec_1( vec![ 1, 3 ] ) + .hashmap_1( hashmap ) + .string_optional_1( "dir1" ) + .form(); + dbg!( &struct1 ); + +// < &struct1 = Structure1 { +// < int_1: 13, +// < string_1: "Abcd", +// < vec_1: [ +// < 1, +// < 3, +// < ], +// < hashmap_1: { +// < "k1": "v1", +// < "k2": "v2", +// < }, +// < int_optional_1: None, +// < string_optional_1: Some( +// < "dir1", +// < ), +// < } + +} diff --git a/module/core/former/examples/former_trivial.rs b/module/core/former/examples/former_trivial.rs new file mode 100644 index 0000000000..b330278f68 --- /dev/null +++ b/module/core/former/examples/former_trivial.rs @@ -0,0 +1,52 @@ +//! # Builder Pattern Implementation with Former +//! +//! This module demonstrates the use of the `Former` trait to apply the builder pattern for Rust structs. +//! The `Former` trait simplifies the instantiation of structs by enabling a fluent, method-chaining approach +//! to set fields before finalizing the instance with `.form()`. It is particularly useful for structs with optional fields +//! or when a clear and concise way to instantiate complex data structures is needed. +//! +//! ## How Former Works +//! +//! - **Trait Derivation** : By deriving `Former` on a struct, you automatically generate builder methods for each field. +//! - **Fluent Interface** : Each field's builder method allows for setting the value of that field and returns a mutable reference to the builder, +//! enabling method chaining. +//! - **Optional Fields** : Optional fields can be easily handled without needing to explicitly set them to `None`. +//! - **Finalization** : The `.form()` method finalizes the building process and returns the constructed struct instance. +//! +//! This approach abstracts away the need for manually implementing a builder for each struct, making code more readable and maintainable. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former::Former; + + // Use attribute debug to print expanded code. + #[ derive( Debug, PartialEq, Former ) ] + // Uncomment to see what derive expand into + // #[ debug ] + pub struct UserProfile + { + age : i32, + username : String, + bio_optional : Option< String >, // Fields could be optional + } + + let profile = UserProfile::former() + .age( 30 ) + .username( "JohnDoe".to_string() ) + .bio_optional( "Software Developer".to_string() ) // Optionally provide a bio + .form(); + + dbg!( &profile ); + // Expected output: + // &profile = UserProfile { + // age: 30, + // username: "JohnDoe", + // bio_optional: Some("Software Developer"), + // } + +} diff --git a/module/core/former/examples/former_trivial_expaned.rs b/module/core/former/examples/former_trivial_expaned.rs new file mode 100644 index 0000000000..4968b11838 --- /dev/null +++ b/module/core/former/examples/former_trivial_expaned.rs @@ -0,0 +1,408 @@ +#![ allow( dead_code ) ] +//! # Builder Pattern Implementation with Former +//! +//! This module demonstrates the use of the `Former` trait to apply the builder pattern for Rust structs. +//! The `Former` trait simplifies the instantiation of structs by enabling a fluent, method-chaining approach +//! to set fields before finalizing the instance with `.form()`. It is particularly useful for structs with optional fields +//! or when a clear and concise way to instantiate complex data structures is needed. +//! +//! ## How Former Works +//! +//! - **Trait Derivation** : By deriving `Former` on a struct, you automatically generate builder methods for each field. +//! - **Fluent Interface** : Each field's builder method allows for setting the value of that field and returns a mutable reference to the builder, +//! enabling method chaining. +//! - **Optional Fields** : Optional fields can be easily handled without needing to explicitly set them to `None`. +//! - **Finalization** : The `.form()` method finalizes the building process and returns the constructed struct instance. +//! +//! This approach abstracts away the need for manually implementing a builder for each struct, making code more readable and maintainable. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + + // Use attribute debug to print expanded code. + #[ derive( Debug, PartialEq ) ] + pub struct UserProfile + { + age : i32, + username : String, + bio_optional : Option< String >, // Fields could be optional + } + + impl UserProfile + where + { + #[ inline( always ) ] + pub fn former() -> UserProfileFormer< + UserProfileFormerDefinition< (), UserProfile, former::ReturnPreformed > + > + { + UserProfileFormer::< UserProfileFormerDefinition< (), UserProfile, former::ReturnPreformed > >:: + new_coercing(former::ReturnPreformed) + } + } + + // = entity to + + impl< Definition > former::EntityToFormer< Definition > for UserProfile + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, + { + type Former = UserProfileFormer< Definition >; + } + + impl former::EntityToStorage for UserProfile + where + { + type Storage = UserProfileFormerStorage; + } + + impl< Context, Formed, End > former::EntityToDefinition< Context, Formed, End > for UserProfile< > + where + End : former::FormingEnd< UserProfileFormerDefinitionTypes< Context, Formed > >, + { + type Definition = UserProfileFormerDefinition< Context, Formed, End >; + type Types = UserProfileFormerDefinitionTypes< Context, Formed >; + } + + // = definition + + #[derive(Debug)] + pub struct UserProfileFormerDefinitionTypes< Context = (), Formed = UserProfile, > + where + { + _phantom : core::marker::PhantomData< (*const Context, *const Formed) >, + } + + impl< Context, Formed, > ::core::default::Default for UserProfileFormerDefinitionTypes< Context, Formed, > + where + { + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + } + + impl< Context, Formed, > former::FormerDefinitionTypes for UserProfileFormerDefinitionTypes< Context, Formed, > + where + { + type Storage = UserProfileFormerStorage; + type Formed = Formed; + type Context = Context; + } + + #[derive(Debug)] + pub struct UserProfileFormerDefinition< Context = (), Formed = UserProfile, End = former::ReturnPreformed, > + where + { + _phantom : core::marker::PhantomData< (*const Context, *const Formed, *const End) >, + } + + impl< Context, Formed, End, > ::core::default::Default for UserProfileFormerDefinition< Context, Formed, End, > + where + { + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + } + + impl< Context, Formed, End, > former::FormerDefinition for UserProfileFormerDefinition< Context, Formed, End, > + where + End : former::FormingEnd< UserProfileFormerDefinitionTypes< Context, Formed, > >, + { + type Types = UserProfileFormerDefinitionTypes< Context, Formed, >; + type End = End; + type Storage = UserProfileFormerStorage; + type Formed = Formed; + type Context = Context; + } + + impl< Context, Formed, > former::FormerMutator for UserProfileFormerDefinitionTypes< Context, Formed, > + where + {} + + // = storage + + pub struct UserProfileFormerStorage + where + { + pub age : ::core::option::Option< i32 >, + pub username : ::core::option::Option< String >, + pub bio_optional : Option< String >, + } + + impl ::core::default::Default for UserProfileFormerStorage + where + { + #[ inline( always ) ] + fn default() -> Self + { + Self + { + age : ::core::option::Option::None, + username : ::core::option::Option::None, + bio_optional : ::core::option::Option::None, + } + } + } + + impl former::Storage for UserProfileFormerStorage + where + { + type Preformed = UserProfile; + } + + impl former::StoragePreform for UserProfileFormerStorage + where + { + // type Preformed = UserProfile; + fn preform(mut self) -> Self::Preformed + { + let age = if self.age.is_some() + { + self.age.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default(self : &Self) -> T + { + panic!("Field 'age' isn't initialized") + } + } + impl< T > MaybeDefault< T > for &::core::marker::PhantomData< T > + {} + impl< T > MaybeDefault< T > for ::core::marker::PhantomData< T > + where T : ::core::default::Default, + { + fn maybe_default(self : &Self) -> T + { + T::default() + } + } + (&::core::marker::PhantomData::< i32 >).maybe_default() + } + }; + let username = if self.username.is_some() + { + self.username.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default(self : &Self) -> T + { + panic!("Field 'username' isn't initialized") + } + } + impl< T > MaybeDefault< T > for &::core::marker::PhantomData< T > + {} + impl< T > MaybeDefault< T > for ::core::marker::PhantomData< T > + where T : ::core::default::Default, + { + fn maybe_default(self : &Self) -> T + { + T::default() + } + } + (&::core::marker::PhantomData::< String >).maybe_default() + } + }; + let bio_optional = if self.bio_optional.is_some() + { + ::core::option::Option::Some(self.bio_optional.take().unwrap()) + } + else + { + ::core::option::Option::None + }; + let result = UserProfile::<> + { + age, + username, + bio_optional, + }; + return result; + } + } + + pub struct UserProfileFormer< Definition = UserProfileFormerDefinition< (), UserProfile, former::ReturnPreformed >, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, + { + pub storage : Definition::Storage, + pub context : core::option::Option< Definition::Context >, + pub on_end : core::option::Option< Definition::End >, + } + + impl< Definition, > UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, Definition::Types : former::FormerDefinitionTypes< Storage = UserProfileFormerStorage >, + { + #[ inline( always ) ] + pub fn new(on_end : Definition::End) -> Self + { + Self::begin_coercing(None, None, on_end) + } + + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >(end : IntoEnd) -> Self + where IntoEnd : Into< Definition::End >, + { + Self::begin_coercing(None, None, end,) + } + + #[ inline( always ) ] + pub fn begin(mut storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : ::End,) -> Self + { + if storage.is_none() + { + storage = Some(::core::default::Default::default()); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some(on_end), + } + } + + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd >(mut storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : IntoEnd,) -> Self + where IntoEnd : ::core::convert::Into< ::End >, + { + if storage.is_none() + { + storage = Some(::core::default::Default::default()); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some(::core::convert::Into::into(on_end)), + } + } + + #[ inline( always ) ] + pub fn form(self) -> ::Formed + { + self.end() + } + + #[ inline( always ) ] + pub fn end(mut self) -> ::Formed + { + let on_end = self.on_end.take().unwrap(); + let mut context = self.context.take(); + ::form_mutation(&mut self.storage, &mut context); + former::FormingEnd::::call(&on_end, self.storage, context) + } + + #[ inline( always ) ] + pub fn age< Src >(mut self, src : Src) -> Self + where Src : ::core::convert::Into< i32 >, + { + debug_assert!(self.storage.age.is_none()); + self.storage.age = ::core::option::Option::Some(::core::convert::Into::into( src )); + self + } + + #[ inline( always ) ] + pub fn username< Src >(mut self, src : Src) -> Self + where Src : ::core::convert::Into< String >, + { + debug_assert!(self.storage.username.is_none()); + self.storage.username = ::core::option::Option::Some(::core::convert::Into::into( src )); + self + } + + #[ inline( always ) ] + pub fn bio_optional< Src >(mut self, src : Src) -> Self + where Src : ::core::convert::Into< String >, + { + debug_assert!(self.storage.bio_optional.is_none()); + self.storage.bio_optional = ::core::option::Option::Some(::core::convert::Into::into( src )); + self + } + } + + impl< Definition, > UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage, Formed = UserProfile >, + { + pub fn preform(self) -> ::Formed + { + former::StoragePreform::preform(self.storage) + } + } + + impl< Definition, > UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage, Formed = UserProfile, >, + { + #[ inline( always ) ] + pub fn perform(self) -> Definition::Formed + { + let result = self.form(); + return result; + } + } + + impl< Definition > former::FormerBegin< Definition > for UserProfileFormer< Definition, > + where + Definition : former::FormerDefinition< Storage = UserProfileFormerStorage >, + { + #[ inline( always ) ] + fn former_begin(storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : Definition::End,) -> Self + { + debug_assert!(storage.is_none()); + Self::begin(None, context, on_end) + } + } + + // = as subformer + + pub type UserProfileAsSubformer< Superformer, End > = + UserProfileFormer< UserProfileFormerDefinition< Superformer, Superformer, End, >, >; + + pub trait UserProfileAsSubformerEnd< SuperFormer > + where + Self : former::FormingEnd< UserProfileFormerDefinitionTypes< SuperFormer, SuperFormer >, >, {} + + impl< SuperFormer, T > UserProfileAsSubformerEnd< SuperFormer > for T + where + Self : former::FormingEnd< UserProfileFormerDefinitionTypes< SuperFormer, SuperFormer >, >, + {} + + // = end + + let profile = UserProfile::former() + .age( 30 ) + .username( "JohnDoe".to_string() ) + .bio_optional( "Software Developer".to_string() ) // Optionally provide a bio + .form(); + dbg!( &profile ); + + // Expected output: + // + // &profile = UserProfile { + // age: 30, + // username: "JohnDoe", + // bio_optional: Some("Software Developer"), + // } + +} diff --git a/module/core/former/src/lib.rs b/module/core/former/src/lib.rs new file mode 100644 index 0000000000..2eb4e674d2 --- /dev/null +++ b/module/core/former/src/lib.rs @@ -0,0 +1,119 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/former/latest/former/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// /// Axiomatic things. +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( feature = "derive_former" ) ] +// mod axiomatic; +// /// Forming process. +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( feature = "derive_former" ) ] +// mod definition; +// /// Forming process. +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( feature = "derive_former" ) ] +// mod forming; +// /// Storage. +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( feature = "derive_former" ) ] +// mod storage; +// +// /// Interface for collections. +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +// #[ cfg( feature = "derive_former" ) ] +// mod collection; +// +// /// Component-based forming. +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( any( feature = "derive_component_from", feature = "derive_component_assign" ) ) ] +// mod component; + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use former_types; + pub use former_meta; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use former_meta as derive; +} + +/// Parented namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use former_meta::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use former_types::exposed::*; + +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// #[ cfg( feature = "derive_former" ) ] +// pub use super:: +// { +// axiomatic::*, +// definition::*, +// forming::*, +// storage::*, +// }; +// +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +// #[ cfg( feature = "derive_former" ) ] +// pub use super::collection::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // #[ cfg( any( feature = "derive_component_from", feature = "derive_component_assign" ) ) ] + // pub use super::component::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use former_types::prelude::*; + +} diff --git a/module/core/former/tests/experimental.rs b/module/core/former/tests/experimental.rs new file mode 100644 index 0000000000..fe640ab353 --- /dev/null +++ b/module/core/former/tests/experimental.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use former as the_module; + +// #[ path = "./inc/components_composite.rs" ] +// mod experimental; diff --git a/module/core/former/tests/inc/components_tests/compiletime/components_component_from_debug.rs b/module/core/former/tests/inc/components_tests/compiletime/components_component_from_debug.rs new file mode 100644 index 0000000000..d0d06ae699 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/compiletime/components_component_from_debug.rs @@ -0,0 +1,18 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq, the_module::ComponentFrom ) ] +#[ debug ] +// zzz : enable the test +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +// diff --git a/module/core/former/tests/inc/components_tests/component_assign.rs b/module/core/former/tests/inc/components_tests/component_assign.rs new file mode 100644 index 0000000000..546cb3852b --- /dev/null +++ b/module/core/former/tests/inc/components_tests/component_assign.rs @@ -0,0 +1,17 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use former::Assign; + + +#[ derive( Default, PartialEq, Debug, former::Assign ) ] +// #[ debug ] +struct Person +{ + age : i32, + name : String, +} + +// + +include!( "./only_test/component_assign.rs" ); diff --git a/module/core/former/tests/inc/components_tests/component_assign_manual.rs b/module/core/former/tests/inc/components_tests/component_assign_manual.rs new file mode 100644 index 0000000000..fe1131845a --- /dev/null +++ b/module/core/former/tests/inc/components_tests/component_assign_manual.rs @@ -0,0 +1,36 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use former::Assign; + + +#[ derive( Default, PartialEq, Debug ) ] +struct Person +{ + age : i32, + name : String, +} + +impl< IntoT > Assign< i32, IntoT > for Person +where + IntoT : Into< i32 >, +{ + fn assign( &mut self, component : IntoT ) + { + self.age = component.into(); + } +} + +impl< IntoT > Assign< String, IntoT > for Person +where + IntoT : Into< String >, +{ + fn assign( &mut self, component : IntoT ) + { + self.name = component.into(); + } +} + +// + +include!( "./only_test/component_assign.rs" ); diff --git a/module/core/former/tests/inc/components_tests/component_from.rs b/module/core/former/tests/inc/components_tests/component_from.rs new file mode 100644 index 0000000000..2151d3d3d7 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/component_from.rs @@ -0,0 +1,20 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq, the_module::ComponentFrom ) ] +// #[ debug ] +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +// + + +include!( "./only_test/component_from.rs" ); diff --git a/module/core/former/tests/inc/components_tests/component_from_manual.rs b/module/core/former/tests/inc/components_tests/component_from_manual.rs new file mode 100644 index 0000000000..94e854b381 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/component_from_manual.rs @@ -0,0 +1,45 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +impl From< &Options1 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options1 > for String +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field2.clone() + } +} + +impl From< &Options1 > for f32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field3.clone() + } +} + +// + +include!( "./only_test/component_from.rs" ); diff --git a/module/core/former/tests/inc/components_tests/components_assign.rs b/module/core/former/tests/inc/components_tests/components_assign.rs new file mode 100644 index 0000000000..2867a3cc8b --- /dev/null +++ b/module/core/former/tests/inc/components_tests/components_assign.rs @@ -0,0 +1,76 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use former::{ Assign, AssignWithType }; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq, the_module::Assign, the_module::ComponentsAssign ) ] +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +impl From< &Options1 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options1 > for String +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field2.clone() + } +} + +impl From< &Options1 > for f32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field3.clone() + } +} + +/// +/// Options2 +/// + +#[ derive( Debug, Default, PartialEq, the_module::Assign, the_module::ComponentsAssign ) ] +pub struct Options2 +{ + field1 : i32, + field2 : String, +} + +impl From< &Options2 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options2 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options2 > for String +{ + #[ inline( always ) ] + fn from( src : &Options2 ) -> Self + { + src.field2.clone() + } +} + +// + +include!( "./only_test/components_assign.rs" ); diff --git a/module/core/former/tests/inc/components_tests/components_assign_manual.rs b/module/core/former/tests/inc/components_tests/components_assign_manual.rs new file mode 100644 index 0000000000..bc88f29e14 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/components_assign_manual.rs @@ -0,0 +1,195 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use former::{ Assign, AssignWithType }; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +impl From< &Options1 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options1 > for String +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field2.clone() + } +} + +impl From< &Options1 > for f32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field3.clone() + } +} + +impl< IntoT > former::Assign< i32, IntoT > for Options1 +where + IntoT : Into< i32 >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field1 = component.into().clone(); + } +} + +impl< IntoT > former::Assign< String, IntoT > for Options1 +where + IntoT : Into< String >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field2 = component.into().clone(); + } +} + +impl< IntoT > former::Assign< f32, IntoT > for Options1 +where + IntoT : Into< f32 >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field3 = component.into().clone(); + } +} + +/// +/// Options1ComponentsAssign. +/// + +// #[ allow( dead_code ) ] +pub trait Options1ComponentsAssign< IntoT > +where + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Into< f32 >, + IntoT : Clone, +{ + fn options_1_assign( &mut self, component : IntoT ); +} + +// #[ allow( dead_code ) ] +impl< T, IntoT > Options1ComponentsAssign< IntoT > for T +where + T : former::Assign< i32, IntoT >, + T : former::Assign< String, IntoT >, + T : former::Assign< f32, IntoT >, + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Into< f32 >, + IntoT : Clone, +{ + #[ inline( always ) ] + fn options_1_assign( &mut self, component : IntoT ) + { + former::Assign::< i32, _ >::assign( self, component.clone() ); + former::Assign::< String, _ >::assign( self, component.clone() ); + former::Assign::< f32, _ >::assign( self, component.clone() ); + } +} + +/// +/// Options2 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options2 +{ + field1 : i32, + field2 : String, +} + +impl From< &Options2 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options2 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options2 > for String +{ + #[ inline( always ) ] + fn from( src : &Options2 ) -> Self + { + src.field2.clone() + } +} + +impl< IntoT > former::Assign< i32, IntoT > for Options2 +where + IntoT : Into< i32 >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field1 = component.into().clone(); + } +} + +impl< IntoT > former::Assign< String, IntoT > for Options2 +where + IntoT : Into< String >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field2 = component.into().clone(); + } +} + +/// +/// Options2ComponentsAssign. +/// + +pub trait Options2ComponentsAssign< IntoT > +where + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Clone, +{ + fn options_2_assign( &mut self, component : IntoT ); +} + +impl< T, IntoT > Options2ComponentsAssign< IntoT > for T +where + T : former::Assign< i32, IntoT >, + T : former::Assign< String, IntoT >, + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Clone, +{ + #[ inline( always ) ] + fn options_2_assign( &mut self, component : IntoT ) + { + former::Assign::< i32, _ >::assign( self, component.clone() ); + former::Assign::< String, _ >::assign( self, component.clone() ); + } +} + +// + +include!( "./only_test/components_assign.rs" ); diff --git a/module/core/former/tests/inc/components_tests/composite.rs b/module/core/former/tests/inc/components_tests/composite.rs new file mode 100644 index 0000000000..091fcc268b --- /dev/null +++ b/module/core/former/tests/inc/components_tests/composite.rs @@ -0,0 +1,75 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use former::{ Assign, AssignWithType }; + +/// +/// Options1 +/// + +#[ + derive + ( + Debug, + Default, + PartialEq, + the_module::ComponentFrom, + the_module::Assign, + the_module::ComponentsAssign, + the_module::FromComponents, + ) +] +// qqq : make these traits working for generic struct, use `split_for_impl` +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +/// +/// Options2 +/// + +#[ + derive + ( + Debug, + Default, + PartialEq, + the_module::ComponentFrom, + the_module::Assign, + the_module::ComponentsAssign, + the_module::FromComponents, + ) +] +pub struct Options2 +{ + field1 : i32, + field2 : String, +} + +// + +// impl< T > From< T > for Options2 +// where +// T : Into< i32 >, +// T : Into< String >, +// T : Clone, +// { +// #[ inline( always ) ] +// fn from( src : T ) -> Self +// { +// let field1 = Into::< i32 >::into( src.clone() ); +// let field2 = Into::< String >::into( src.clone() ); +// Options2 +// { +// field1, +// field2, +// } +// } +// } + +// + +include!( "./only_test/composite.rs" ); diff --git a/module/core/former/tests/inc/components_tests/composite_manual.rs b/module/core/former/tests/inc/components_tests/composite_manual.rs new file mode 100644 index 0000000000..276def66ae --- /dev/null +++ b/module/core/former/tests/inc/components_tests/composite_manual.rs @@ -0,0 +1,212 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use former::{ Assign, AssignWithType }; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +impl From< &Options1 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options1 > for String +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field2.clone() + } +} + +impl From< &Options1 > for f32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field3.clone() + } +} + +impl< IntoT > former::Assign< i32, IntoT > for Options1 +where + IntoT : Into< i32 >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field1 = component.into().clone(); + } +} + +impl< IntoT > former::Assign< String, IntoT > for Options1 +where + IntoT : Into< String >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field2 = component.into().clone(); + } +} + +impl< IntoT > former::Assign< f32, IntoT > for Options1 +where + IntoT : Into< f32 >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field3 = component.into().clone(); + } +} + +/// +/// Options1ComponentsAssign. +/// + +pub trait Options1ComponentsAssign< IntoT > +where + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Into< f32 >, + IntoT : Clone, +{ + fn options_1_assign( &mut self, component : IntoT ); +} + +impl< T, IntoT > Options1ComponentsAssign< IntoT > for T +where + T : former::Assign< i32, IntoT >, + T : former::Assign< String, IntoT >, + T : former::Assign< f32, IntoT >, + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Into< f32 >, + IntoT : Clone, +{ + #[ inline( always ) ] + fn options_1_assign( &mut self, component : IntoT ) + { + former::Assign::< i32, _ >::assign( self, component.clone() ); + former::Assign::< String, _ >::assign( self, component.clone() ); + former::Assign::< f32, _ >::assign( self, component.clone() ); + } +} + +/// +/// Options2 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options2 +{ + field1 : i32, + field2 : String, +} + +impl From< &Options2 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options2 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options2 > for String +{ + #[ inline( always ) ] + fn from( src : &Options2 ) -> Self + { + src.field2.clone() + } +} + +impl< IntoT > former::Assign< i32, IntoT > for Options2 +where + IntoT : Into< i32 >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field1 = component.into().clone(); + } +} + +impl< IntoT > former::Assign< String, IntoT > for Options2 +where + IntoT : Into< String >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.field2 = component.into().clone(); + } +} + +/// +/// Options2ComponentsAssign. +/// + +pub trait Options2ComponentsAssign< IntoT > +where + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Clone, +{ + fn options_2_assign( &mut self, component : IntoT ); +} + +impl< T, IntoT > Options2ComponentsAssign< IntoT > for T +where + T : former::Assign< i32, IntoT >, + T : former::Assign< String, IntoT >, + IntoT : Into< i32 >, + IntoT : Into< String >, + IntoT : Clone, +{ + #[ inline( always ) ] + fn options_2_assign( &mut self, component : IntoT ) + { + former::Assign::< i32, _ >::assign( self, component.clone() ); + former::Assign::< String, _ >::assign( self, component.clone() ); + } +} + +impl< T > From< T > for Options2 +where + T : Into< i32 >, + T : Into< String >, + T : Clone, +{ + #[ inline( always ) ] + fn from( src : T ) -> Self + { + let field1 = Into::< i32 >::into( src.clone() ); + let field2 = Into::< String >::into( src.clone() ); + Options2 + { + field1, + field2, + } + } +} + +// + +include!( "./only_test/composite.rs" ); diff --git a/module/core/former/tests/inc/components_tests/from_components.rs b/module/core/former/tests/inc/components_tests/from_components.rs new file mode 100644 index 0000000000..2105667d9f --- /dev/null +++ b/module/core/former/tests/inc/components_tests/from_components.rs @@ -0,0 +1,75 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +impl From< &Options1 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options1 > for String +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field2.clone() + } +} + +impl From< &Options1 > for f32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field3.clone() + } +} + +/// +/// Options2 +/// + +#[ derive( Debug, Default, PartialEq, the_module::FromComponents ) ] +pub struct Options2 +{ + field1 : i32, + field2 : String, +} + +// impl< T > From< T > for Options2 +// where +// T : Into< i32 >, +// T : Into< String >, +// T : Clone, +// { +// #[ inline( always ) ] +// fn from( src : T ) -> Self +// { +// let field1 = Into::< i32 >::into( src.clone() ); +// let field2 = Into::< String >::into( src.clone() ); +// Options2 +// { +// field1, +// field2, +// } +// } +// } + +// + +include!( "./only_test/from_components.rs" ); diff --git a/module/core/former/tests/inc/components_tests/from_components_manual.rs b/module/core/former/tests/inc/components_tests/from_components_manual.rs new file mode 100644 index 0000000000..edd26c9c80 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/from_components_manual.rs @@ -0,0 +1,75 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// +/// Options1 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options1 +{ + field1 : i32, + field2 : String, + field3 : f32, +} + +impl From< &Options1 > for i32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field1.clone() + } +} + +impl From< &Options1 > for String +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field2.clone() + } +} + +impl From< &Options1 > for f32 +{ + #[ inline( always ) ] + fn from( src : &Options1 ) -> Self + { + src.field3.clone() + } +} + +/// +/// Options2 +/// + +#[ derive( Debug, Default, PartialEq ) ] +pub struct Options2 +{ + field1 : i32, + field2 : String, +} + +impl< T > From< T > for Options2 +where + T : Into< i32 >, + T : Into< String >, + T : Clone, +{ + #[ inline( always ) ] + fn from( src : T ) -> Self + { + let field1 = Into::< i32 >::into( src.clone() ); + let field2 = Into::< String >::into( src.clone() ); + Self + { + field1, + field2, + } + } +} + +// + +include!( "./only_test/from_components.rs" ); diff --git a/module/core/former/tests/inc/components_tests/only_test/component_assign.rs b/module/core/former/tests/inc/components_tests/only_test/component_assign.rs new file mode 100644 index 0000000000..0adb4ed674 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/only_test/component_assign.rs @@ -0,0 +1,12 @@ + + +#[ test ] +fn component_assign() +{ + + let mut got : Person = Default::default(); + got.assign( 13 ); + got.assign( "John" ); + assert_eq!( got, Person { age : 13, name : "John".to_string() } ); + +} diff --git a/module/core/former/tests/inc/components_tests/only_test/component_from.rs b/module/core/former/tests/inc/components_tests/only_test/component_from.rs new file mode 100644 index 0000000000..dc5f14a10f --- /dev/null +++ b/module/core/former/tests/inc/components_tests/only_test/component_from.rs @@ -0,0 +1,18 @@ + + +#[ test ] +fn component_assign() +{ + + let o1 = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.01 }; + + let field1 : i32 = ( &o1 ).into(); + assert_eq!( field1, 42 ); + + let field2 : String = ( &o1 ).into(); + assert_eq!( field2, "Hello, world!".to_string() ); + + let field3 : f32 = ( &o1 ).into(); + assert_eq!( field3, 13.01 ); + +} diff --git a/module/core/former/tests/inc/components_tests/only_test/components_assign.rs b/module/core/former/tests/inc/components_tests/only_test/components_assign.rs new file mode 100644 index 0000000000..37d11147aa --- /dev/null +++ b/module/core/former/tests/inc/components_tests/only_test/components_assign.rs @@ -0,0 +1,64 @@ + + +#[ test ] +fn component_assign() +{ + + let mut o2 = Options2::default(); + o2.assign( 42 ); + o2.assign( "Hello, world!" ); + println!( "field1 : {}, field2 : {}", o2.field1, o2.field2 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + +} + +#[ test ] +fn components_assign() +{ + + // o1.options_2_assign( &o2 ) + + let o1 = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.1 }; + let mut o2 = Options2::default(); + o2.options_2_assign( &o1 ); + Options2ComponentsAssign::options_2_assign( &mut o2, &o1 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + + + // o1.options_2_assign( &o2 ) + + let o2 = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + let mut o1 = Options1::default(); + o1.options_2_assign( &o2 ); + Options2ComponentsAssign::options_2_assign( &mut o1, &o2 ); + let exp = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 0.0 }; + assert_eq!( o1, exp ); + + +} + +#[ test ] +fn components_assign_self() +{ + + // o1.options_1_assign( &o2 ) + + let o1 = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.1 }; + let mut o2 = Options1::default(); + o2.options_1_assign( &o1 ); + Options1ComponentsAssign::options_1_assign( &mut o2, &o1 ); + let exp = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.1 }; + assert_eq!( o2, exp ); + + // o1.options_2_assign( &o2 ) + + let o1 = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + let mut o2 = Options2::default(); + o2.options_2_assign( &o1 ); + Options2ComponentsAssign::options_2_assign( &mut o2, &o1 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + +} diff --git a/module/core/former/tests/inc/components_tests/only_test/composite.rs b/module/core/former/tests/inc/components_tests/only_test/composite.rs new file mode 100644 index 0000000000..cf8ed8a4f0 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/only_test/composite.rs @@ -0,0 +1,115 @@ + + +#[ test ] +fn component_assign() +{ + + let mut o1 = Options1::default(); + o1.assign( 42 ); + o1.assign( "Hello, world!" ); + o1.assign( 13.01 ); + println!( "field1: {}, field2: {}", o1.field1, o1.field2 ); + let exp = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.01 }; + assert_eq!( o1, exp ); + +} + +#[ test ] +fn component_assign_with_composite() +{ + + // assign( Into::< i32 >::into( &o1 ) ) + + let mut o1 = Options1::default(); + o1.assign( 42 ); + o1.assign( "Hello, world!" ); + o1.assign( 13.01 ); + let mut o2 = Options2::default(); + o2.assign( Into::< i32 >::into( &o1 ) ); + o2.assign( Into::< String >::into( &o1 ) ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + + // assign_with_type + + let mut o1 = Options1::default(); + o1.assign( 42 ); + o1.assign( "Hello, world!" ); + o1.assign( 13.01 ); + let mut o2 = Options2::default(); + o2.assign_with_type::< i32, _ >( &o1 ); + o2.assign_with_type::< String, _ >( &o1 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + +} + +#[ test ] +fn assign() +{ + + // o2.assign( &o1 ) + + let mut o1 = Options1::default(); + o1.assign( 42 ); + o1.assign( "Hello, world!" ); + o1.assign( 13.01 ); + let mut o2 = Options2::default(); + o2.options_2_assign( &o1 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + + // o1.assign( &o2 ) + + let mut o2 = Options2::default(); + o2.assign( 42 ); + o2.assign( "Hello, world!" ); + let mut o1 = Options1::default(); + o1.options_2_assign( &o2 ); + Options2ComponentsAssign::options_2_assign( &mut o1, &o2 ); + let exp = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 0.0 }; + assert_eq!( o1, exp ); + +} + +#[ test ] +fn from_components() +{ + + // o2 : Options2 = o1.into() + + let mut o1 = Options1::default(); + o1.assign( 42 ); + o1.assign( "Hello, world!" ); + o1.assign( 13.01 ); + let o2 : Options2 = Into::< Options2 >::into( &o1 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + let o2 : Options2 = (&o1).into(); + assert_eq!( o2, exp ); + +} + +#[ test ] +fn components_assign_self() +{ + + // o1.options_1_assign( &o2 ) + + let o1 = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.1 }; + let mut o2 = Options1::default(); + o2.options_1_assign( &o1 ); + Options1ComponentsAssign::options_1_assign( &mut o2, &o1 ); + let exp = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.1 }; + assert_eq!( o2, exp ); + + // o1.options_2_assign( &o2 ) + + let o1 = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + let mut o2 = Options2::default(); + o2.options_2_assign( &o1 ); + Options2ComponentsAssign::options_2_assign( &mut o2, &o1 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + +} diff --git a/module/core/former/tests/inc/components_tests/only_test/from_components.rs b/module/core/former/tests/inc/components_tests/only_test/from_components.rs new file mode 100644 index 0000000000..afd4bb9cd6 --- /dev/null +++ b/module/core/former/tests/inc/components_tests/only_test/from_components.rs @@ -0,0 +1,15 @@ + +#[ test ] +fn from_components() +{ + + // o2 : Options2 = o1.into() + + let o1 = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.01 }; + let o2 : Options2 = Into::< Options2 >::into( &o1 ); + let exp = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; + assert_eq!( o2, exp ); + let o2 : Options2 = (&o1).into(); + assert_eq!( o2, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/a_basic.rs b/module/core/former/tests/inc/former_tests/a_basic.rs new file mode 100644 index 0000000000..a3f7e74e5f --- /dev/null +++ b/module/core/former/tests/inc/former_tests/a_basic.rs @@ -0,0 +1,18 @@ +#![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, former::Former ) ] +// #[ derive( Debug, PartialEq, former::Former ) ] #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Struct1 +{ + pub int_1 : i32, +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/basic.rs" ); diff --git a/module/core/former/tests/inc/former_tests/a_basic_manual.rs b/module/core/former/tests/inc/former_tests/a_basic_manual.rs new file mode 100644 index 0000000000..4e0fd2aebc --- /dev/null +++ b/module/core/former/tests/inc/former_tests/a_basic_manual.rs @@ -0,0 +1,325 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq ) ] +pub struct Struct1 +{ + pub int_1 : i32, +} + +// == begin of generated + +// = formed + +#[ automatically_derived ] +impl Struct1 +{ + + #[ inline( always ) ] + pub fn former() -> Struct1Former< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > > + { + Struct1Former + ::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > > + ::new( former::ReturnPreformed ) + } + +} + +// = entity to former + +impl< Definition > former::EntityToFormer< Definition > for Struct1 +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, +{ + type Former = Struct1Former< Definition >; +} + +impl former::EntityToStorage for Struct1 +{ + type Storage = Struct1FormerStorage; +} + +impl< Context, Formed, End > former::EntityToDefinition< Context, Formed, End > +for Struct1 +where + End : former::FormingEnd< Struct1FormerDefinitionTypes< Context, Formed > >, +{ + type Definition = Struct1FormerDefinition< Context, Formed, End >; + type Types = Struct1FormerDefinitionTypes< Context, Formed >; +} + +impl< Context, Formed > former::EntityToDefinitionTypes< Context, Formed > +for Struct1 +{ + type Types = Struct1FormerDefinitionTypes< Context, Formed >; +} + +// = definition types + +#[ derive( Debug ) ] +// pub struct Struct1FormerDefinitionTypes< Context = (), Formed = Struct1 > +pub struct Struct1FormerDefinitionTypes< Context, Formed > +{ + _phantom : core::marker::PhantomData< ( Context, Formed ) >, +} + +impl< Context, Formed > Default for Struct1FormerDefinitionTypes< Context, Formed > +{ + fn default() -> Self + { + Self { _phantom : core::marker::PhantomData, } + } +} + +impl< Context, Formed > former::FormerDefinitionTypes +for Struct1FormerDefinitionTypes< Context, Formed > +{ + type Storage = Struct1FormerStorage; + type Formed = Formed; + type Context = Context; +} + +// = definition + +#[ derive( Debug ) ] +// pub struct Struct1FormerDefinition< Context = (), Formed = Struct1, End = former::ReturnPreformed > +pub struct Struct1FormerDefinition< Context, Formed, End > +{ + _phantom : core::marker::PhantomData< ( Context, Formed, End ) >, +} + +impl< Context, Formed, End > Default for Struct1FormerDefinition< Context, Formed, End > +{ + fn default() -> Self + { + Self { _phantom : core::marker::PhantomData, } + } +} + +impl< Context, Formed, End > former::FormerDefinition for Struct1FormerDefinition< Context, Formed, End > +where + End : former::FormingEnd< Struct1FormerDefinitionTypes< Context, Formed > > +{ + type Storage = Struct1FormerStorage; + type Formed = Formed; + type Context = Context; + type Types = Struct1FormerDefinitionTypes< Context, Formed >; + type End = End; +} + +// pub type Struct1FormerWithClosure< Context, Formed > = +// Struct1FormerDefinition< Context, Formed, former::FormingEndClosure< Struct1FormerDefinitionTypes< Context, Formed > > >; + +// = storage + +pub struct Struct1FormerStorage +{ + pub int_1 : ::core::option::Option< i32 >, +} + +impl ::core::default::Default for Struct1FormerStorage +{ + #[ inline( always ) ] + fn default() -> Self + { + Self { int_1 : ::core::option::Option::None, } + } +} + +impl former::Storage for Struct1FormerStorage +{ + type Preformed = Struct1; +} + +impl former::StoragePreform for Struct1FormerStorage +{ + // type Preformed = < Self as former::Storage >::Formed; + fn preform( mut self ) -> Self::Preformed + { + let int_1 = if self.int_1.is_some() + { + self.int_1.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default( self : & Self ) -> T + { + panic!( "Field 'int_1' isn't initialized" ) + } + } + + impl< T > MaybeDefault< T > for & ::core::marker::PhantomData< T > {} + impl< T > MaybeDefault< T > for ::core::marker::PhantomData< T > + where T : ::core::default::Default, + { + fn maybe_default( self : & Self ) -> T { T::default() } + } + + (& ::core::marker::PhantomData::< i32 >).maybe_default() + } + }; + let result = Struct1 { int_1, }; + return result; + } +} + +// = former mutator + +impl< Context, Formed > former::FormerMutator +for Struct1FormerDefinitionTypes< Context, Formed > +{ +} + +// = former + +pub struct Struct1Former +< + Definition = Struct1FormerDefinition< (), Struct1, former::ReturnPreformed >, +> +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, +{ + storage : Definition::Storage, + context : ::core::option::Option< Definition::Context >, + on_end : ::core::option::Option< Definition::End >, +} + +#[ automatically_derived ] +impl< Definition > Struct1Former< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, + +{ + + #[ inline( always ) ] + pub fn perform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let result = self.form(); + return result; + } + + #[ inline( always ) ] + pub fn new( on_end : Definition::End ) -> Self + { + Self::begin_coercing( None, None, on_end ) + } + + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >( end : IntoEnd ) -> Self + where IntoEnd : Into< Definition::End >, + { + Self::begin_coercing( None, None, end, ) + } + + #[ inline( always ) ] + pub fn begin + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : < Definition as former::FormerDefinition >::End, + ) + -> Self + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( on_end ), + } + } + + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd > + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : IntoEnd, + ) + -> Self + where + IntoEnd : ::core::convert::Into< < Definition as former::FormerDefinition >::End >, + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( ::core::convert::Into::into( on_end ) ), + } + } + + #[ inline( always ) ] + pub fn form( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + self.end() + } + + #[ inline( always ) ] + pub fn end( mut self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let on_end = self.on_end.take().unwrap(); + let mut context = self.context.take(); + < Definition::Types as former::FormerMutator >::form_mutation( &mut self.storage, &mut context ); + former::FormingEnd::< Definition::Types >::call( & on_end, self.storage, context ) + } + + #[ inline ] + pub fn int_1< Src >( mut self, src : Src ) -> Self + where Src : ::core::convert::Into< i32 >, + { + debug_assert!( self.storage.int_1.is_none() ); + self.storage.int_1 = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + } + +} + +// = preform with Storage::preform + +impl< Definition > Struct1Former< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage, Formed = Struct1 >, + Definition::Storage : former::StoragePreform< Preformed = Struct1 >, + +{ + pub fn preform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + former::StoragePreform::preform( self.storage ) + } +} + +impl< Definition > former::FormerBegin< Definition > +for Struct1Former< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, + +{ + + #[ inline( always ) ] + fn former_begin + ( + storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : Definition::End, + ) + -> Self + { + debug_assert!( storage.is_none() ); + Self::begin( None, context, on_end ) + } + +} + +// == end of generated + +include!( "./only_test/basic.rs" ); diff --git a/module/core/former/tests/inc/former_tests/a_primitives.rs b/module/core/former/tests/inc/former_tests/a_primitives.rs new file mode 100644 index 0000000000..658420597c --- /dev/null +++ b/module/core/former/tests/inc/former_tests/a_primitives.rs @@ -0,0 +1,21 @@ +#![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, former::Former ) ] +// #[ derive( Debug, PartialEq, former::Former ) ] #[ debug ] +// #[ derive( Debug, PartialEq ) ] #[ debug ] +pub struct Struct1 +{ + pub int_1 : i32, + string_1 : String, + int_optional_1 : core::option::Option< i32 >, + string_optional_1 : Option< String >, +} + +// = begin_coercing of generated + +// == end of generated + +include!( "./only_test/primitives.rs" ); diff --git a/module/core/former/tests/inc/former_tests/a_primitives_manual.rs b/module/core/former/tests/inc/former_tests/a_primitives_manual.rs new file mode 100644 index 0000000000..baafc6e1ae --- /dev/null +++ b/module/core/former/tests/inc/former_tests/a_primitives_manual.rs @@ -0,0 +1,321 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq ) ] +pub struct Struct1 +{ + pub int_1 : i32, + string_1 : String, + int_optional_1 : core::option::Option< i32 >, + string_optional_1 : Option< String >, +} + +// = formed + +// generated by former +impl Struct1 +{ + pub fn former() -> Struct1Former + { + Struct1Former::new_coercing( former::ReturnPreformed ) + } +} + +// = definition + +#[ derive( Debug ) ] +pub struct Struct1FormerDefinition< Context = (), Formed = Struct1, End = former::ReturnPreformed > +{ + _phantom : core::marker::PhantomData< ( Context, Formed, End ) >, +} + +impl< Context, Formed, End > Default +for Struct1FormerDefinition< Context, Formed, End > +{ + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +#[ derive( Debug ) ] +pub struct Struct1FormerDefinitionTypes< Context = (), Formed = Struct1 > +{ + _phantom : core::marker::PhantomData< ( Context, Formed ) >, +} + +impl< Context, Formed > Default +for Struct1FormerDefinitionTypes< Context, Formed > +{ + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +impl< Context, Formed > former::FormerDefinitionTypes +for Struct1FormerDefinitionTypes< Context, Formed > +{ + type Storage = Struct1FormerStorage; + type Formed = Formed; + type Context = Context; +} + +impl< Context, Formed > former::FormerMutator +for Struct1FormerDefinitionTypes< Context, Formed > +{ +} + +impl< Context, Formed, End > former::FormerDefinition +for Struct1FormerDefinition< Context, Formed, End > +where + End : former::FormingEnd< Struct1FormerDefinitionTypes< Context, Formed > >, +{ + type Types = Struct1FormerDefinitionTypes< Context, Formed >; + type End = End; + type Storage = Struct1FormerStorage; + type Formed = Formed; + type Context = Context; +} + +// = storage + +// generated by former +pub struct Struct1FormerStorage +{ + pub int_1 : core::option::Option< i32 >, + pub string_1 : core::option::Option< String >, + pub int_optional_1 : core::option::Option< i32 >, + pub string_optional_1 : core::option::Option< String >, +} + +impl Default for Struct1FormerStorage +{ + + #[ inline( always ) ] + fn default() -> Self + { + Self + { + int_1 : core::option::Option::None, + string_1 : core::option::Option::None, + int_optional_1 : core::option::Option::None, + string_optional_1 : core::option::Option::None, + } + } + +} + +impl former::Storage +for Struct1FormerStorage +{ + type Preformed = Struct1; +} + +impl former::StoragePreform +for Struct1FormerStorage +{ + // type Preformed = Struct1; + + // fn preform( mut self ) -> < Self as former::Storage >::Formed + fn preform( mut self ) -> Self::Preformed + { + + let int_1 = if self.int_1.is_some() + { + self.int_1.take().unwrap() + } + else + { + let val : i32 = Default::default(); + val + }; + + let string_1 = if self.string_1.is_some() + { + self.string_1.take().unwrap() + } + else + { + let val : String = Default::default(); + val + }; + + let int_optional_1 = if self.int_optional_1.is_some() + { + Some( self.int_optional_1.take().unwrap() ) + } + else + { + None + }; + + let string_optional_1 = if self.string_optional_1.is_some() + { + Some( self.string_optional_1.take().unwrap() ) + } + else + { + None + }; + + // Rust failt to use parameter here + // < < Self as former::Storage >::Definition::Types as former::FormerDefinitionTypes >::Formed + Struct1 + { + int_1, + string_1, + int_optional_1, + string_optional_1, + } + + } + +} + +// = former + +pub struct Struct1Former< Definition = Struct1FormerDefinition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, + // Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage >, +{ + storage : Definition::Storage, + context : core::option::Option< Definition::Context >, + on_end : core::option::Option< Definition::End >, +} + +impl< Definition > Struct1Former< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, +{ + + #[ inline( always ) ] + pub fn perform(self) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let result = self.form(); + return result; + } + + #[ inline( always ) ] + pub fn new( on_end : Definition::End ) -> Self + { + Self::begin( None, None, on_end ) + } + + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >( end : IntoEnd ) -> Self + where + IntoEnd : Into< Definition::End >, + { + Self::begin_coercing + ( + None, + None, + end, + ) + } + + #[ inline( always ) ] + pub fn begin + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : < Definition as former::FormerDefinition >::End, + ) -> Self + { + if storage.is_none() + { + storage = Some( core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context, + on_end : ::core::option::Option::Some( on_end ), + } + } + + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd > + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : IntoEnd, + ) -> Self + where + IntoEnd : ::core::convert::Into< < Definition as former::FormerDefinition >::End > + { + if storage.is_none() + { + storage = Some( core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context, + on_end : ::core::option::Option::Some( ::core::convert::Into::into( on_end ) ), + } + } + + #[ inline( always ) ] + pub fn end( mut self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let on_end = self.on_end.take().unwrap(); + let context = self.context.take(); + former::FormingEnd::< Definition::Types >::call( &on_end, self.storage, context ) + } + + #[ inline( always ) ] + pub fn form( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + self.end() + } + + pub fn int_1< Src >( mut self, src : Src ) -> Self + where Src : core::convert::Into< i32 >, + { + debug_assert!( self.storage.int_1.is_none() ); + self.storage.int_1 = Some( ::core::convert::Into::into( src ) ); + self + } + + pub fn string_1< Src >( mut self, src : Src ) -> Self + where Src : core::convert::Into< String >, + { + debug_assert!( self.storage.string_1.is_none() ); + self.storage.string_1 = Some( ::core::convert::Into::into( src ) ); + self + } + + pub fn string_optional_1< Src >( mut self, src : Src ) -> Self + where Src : core::convert::Into< String > + { + debug_assert!( self.storage.string_optional_1.is_none() ); + self.storage.string_optional_1 = Some( ::core::convert::Into::into( src ) ); + self + } + +} + +impl< Definition > Struct1Former< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage, Formed = Struct1 >, + Definition::Storage : former::StoragePreform, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage, Formed = Struct1 >, +{ + pub fn preform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + former::StoragePreform::preform( self.storage ) + } +} + +// + +include!( "./only_test/primitives.rs" ); diff --git a/module/core/former/tests/inc/former_tests/attribute_alias.rs b/module/core/former/tests/inc/former_tests/attribute_alias.rs new file mode 100644 index 0000000000..a173d57182 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_alias.rs @@ -0,0 +1,51 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +// + +tests_impls! +{ + fn test_alias() + { + #[ derive( Debug, PartialEq, the_module::Former ) ] + // #[ derive( Debug, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, PartialEq ) ] + pub struct AliasTestStruct + { + #[ scalar( name = first_field ) ] + string_field : String, + #[ scalar( name = second_field ) ] + i32_field : i32, + i8_field : i8, + } + + // == begin of generated + + // == end of generated + + let test_struct = AliasTestStruct::former() + .first_field( "first_field" ) + .second_field( 2 ) + // .i32_field( 2 ) + .i8_field( 1 ) + .form(); + + let expected_struct = AliasTestStruct + { + string_field: "first_field".to_string(), + i32_field: 2, + i8_field: 1, + }; + + a_id!( test_struct, expected_struct ); + } +} + +// + +tests_index! +{ + test_alias, +} diff --git a/module/core/former/tests/inc/former_tests/attribute_default_collection.rs b/module/core/former/tests/inc/former_tests/attribute_default_collection.rs new file mode 100644 index 0000000000..3129fe839d --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_default_collection.rs @@ -0,0 +1,52 @@ +#[ allow( unused_imports ) ] +use super::*; + +use collection_tools::HashMap; +use collection_tools::HashSet; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +pub struct Struct1 +{ + + #[ former( default = collection_tools::vec![ 1, 2, 3 ] ) ] + vec_ints : Vec< i32 >, + #[ former( default = collection_tools::hmap!{ 1 => 11 } ) ] + hashmap_ints : HashMap< i32, i32 >, + #[ former( default = collection_tools::hset!{ 11 } ) ] + hashset_ints : HashSet< i32 >, + + #[ former( default = collection_tools::vec![ "abc".to_string(), "def".to_string() ] ) ] + vec_strings : Vec< String >, + #[ former( default = collection_tools::hmap!{ "k1".to_string() => "v1".to_string() } ) ] + hashmap_strings : HashMap< String, String >, + #[ former( default = collection_tools::hset!{ "k1".to_string() } ) ] + hashset_strings : HashSet< String >, + +} + +// + +tests_impls! +{ + fn test_complex() + { + let command = Struct1::former().form(); + let expected = Struct1 + { + vec_ints : collection_tools::vec![ 1, 2, 3 ], + hashmap_ints : collection_tools::hmap!{ 1 => 11 }, + hashset_ints : collection_tools::hset!{ 11 }, + vec_strings : collection_tools::vec![ "abc".to_string(), "def".to_string() ], + hashmap_strings : collection_tools::hmap!{ "k1".to_string() => "v1".to_string() }, + hashset_strings : collection_tools::hset!{ "k1".to_string() }, + }; + a_id!( command, expected ); + } +} + +// + +tests_index! +{ + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/attribute_default_conflict.rs b/module/core/former/tests/inc/former_tests/attribute_default_conflict.rs new file mode 100644 index 0000000000..6a930e1014 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_default_conflict.rs @@ -0,0 +1,32 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, Default, the_module::Former ) ] +pub struct Struct1 +{ + #[ former( default = 31 ) ] + pub int_1 : i32, +} + +// + +tests_impls! +{ + fn test_complex() + { + let command = Struct1::former().form(); + + let expected = Struct1 + { + int_1 : 31, + }; + a_id!( command, expected ); + } +} + +// + +tests_index! +{ + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/attribute_default_primitive.rs b/module/core/former/tests/inc/former_tests/attribute_default_primitive.rs new file mode 100644 index 0000000000..6636695537 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_default_primitive.rs @@ -0,0 +1,51 @@ +#[ allow( unused_imports ) ] +use super::*; + +use collection_tools::HashMap; +use collection_tools::HashSet; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +pub struct Struct1 +{ + #[ former( default = 31 ) ] + pub int_1 : i32, + #[ former( default = "abc" ) ] + string_1 : String, + #[ former( default = 31 ) ] + int_optional_1 : Option< i32 >, + #[ former( default = "abc" ) ] + string_optional_1 : Option< String >, + + vec_1 : Vec< String >, + hashmap_1 : HashMap< String, String >, + hashset_1 : HashSet< String >, +} + +// + +tests_impls! +{ + fn test_complex() + { + let command = Struct1::former().form(); + + let expected = Struct1 + { + int_1 : 31, + string_1 : "abc".to_string(), + int_optional_1 : Some( 31 ), + string_optional_1 : Some( "abc".to_string() ), + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + } +} + +// + +tests_index! +{ + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/attribute_feature.rs b/module/core/former/tests/inc/former_tests/attribute_feature.rs new file mode 100644 index 0000000000..20dea37cf8 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_feature.rs @@ -0,0 +1,43 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq ) ] +pub struct BaseCase +{ + #[ cfg( feature = "enabled" ) ] + enabled : i32, + #[ cfg( feature = "disabled" ) ] + disabled : i32, +} + +#[ derive( Debug, PartialEq, former::Former ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Foo +{ + #[ cfg( feature = "enabled" ) ] + #[ allow( dead_code ) ] + enabled : i32, + #[ cfg( feature = "disabled" ) ] + disabled : i32, +} + +// == begin of generated + +// == end of generated + +#[ test ] +fn basecase() +{ + let got = BaseCase { enabled : 13 }; + let exp = BaseCase { enabled : 13 }; + a_id!( got, exp ); +} + +#[ test ] +fn basic() +{ + let got = Foo::former().enabled( 13 ).form(); + let exp = Foo { enabled : 13 }; + a_id!( got, exp ); +} diff --git a/module/core/former/tests/inc/former_tests/attribute_multiple.rs b/module/core/former/tests/inc/former_tests/attribute_multiple.rs new file mode 100644 index 0000000000..55c3745e8d --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_multiple.rs @@ -0,0 +1,34 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +pub struct Struct1 +{ + + #[ former( default = collection_tools::vec![ 1, 2, 3 ] ) ] + #[ former( default = collection_tools::vec![ 2, 3, 4 ] ) ] + vec_ints : Vec< i32 >, + +} + +// + +tests_impls! +{ + fn test_complex() + { + let command = Struct1::former().form(); + let expected = Struct1 + { + vec_ints : collection_tools::vec![ 2, 3, 4 ], + }; + a_id!( command, expected ); + } +} + +// + +tests_index! +{ + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/attribute_perform.rs b/module/core/former/tests/inc/former_tests/attribute_perform.rs new file mode 100644 index 0000000000..2eaaa75fa0 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_perform.rs @@ -0,0 +1,70 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +pub struct Struct0 +{ + pub int_1 : i32, +} + +// #[ derive( Debug, PartialEq ) ] +// #[ derive( Debug, PartialEq, the_module::Former ) ] #[ debug ] +#[ derive( Debug, PartialEq, the_module::Former ) ] +#[ perform( fn perform1< 'a >() -> Option< &'a str > ) ] +pub struct Struct1 +{ + pub int_1 : i32, +} + +// == begin of generated + +// == end of generated + +impl Struct1 +{ + fn perform1< 'a >( &self ) -> Option< &'a str > + { + Some( "abc" ) + } +} + +// + +tests_impls! +{ + + fn basecase() + { + + let got = Struct0::former().form(); + let expected = Struct0 { int_1 : 0 }; + a_id!( got, expected ); + + let got = Struct0::former().perform(); + let expected = Struct0 { int_1 : 0 }; + a_id!( got, expected ); + + } + + fn basic() + { + + let got = Struct1::former().form(); + let expected = Struct1 { int_1 : 0 }; + a_id!( got, expected ); + + let got = Struct1::former().perform(); + let expected = Some( "abc" ); + a_id!( got, expected ); + + } + +} + +// + +tests_index! +{ + basecase, + basic, +} diff --git a/module/core/former/tests/inc/former_tests/attribute_setter.rs b/module/core/former/tests/inc/former_tests/attribute_setter.rs new file mode 100644 index 0000000000..ee18f78657 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_setter.rs @@ -0,0 +1,68 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +pub struct StructWithCustomSetters +{ + ordinary : String, + #[ scalar( setter = false ) ] + magic : String, +} + +impl< Definition > StructWithCustomSettersFormer< Definition > +where + Definition : former::FormerDefinition< Storage = StructWithCustomSettersFormerStorage >, +{ + + /// Custom alternative setter of ordinary field. + fn ordinary_exclamaited< IntoString >( mut self, val : IntoString ) -> Self + where + IntoString : Into< String > + { + debug_assert!( self.storage.ordinary.is_none() ); + self.storage.ordinary = Some( format!( "{}!", val.into() ) ); + self + } + + /// Custom primary setter of field without autogenerated setter. + fn magic< IntoString >( mut self, val : IntoString ) -> Self + where + IntoString : Into< String > + { + debug_assert!( self.storage.magic.is_none() ); + self.storage.magic = Some( format!( "Some magic : < {} >", val.into() ) ); + self + } + +} + +#[ test ] +fn basic() +{ + + // ordinary + magic + let got = StructWithCustomSetters::former() + .ordinary( "val1" ) + .magic( "val2" ) + .form() + ; + let exp = StructWithCustomSetters + { + ordinary : "val1".to_string(), + magic : "Some magic : < val2 >".to_string(), + }; + a_id!( got, exp ); + + // alternative + let got = StructWithCustomSetters::former() + .ordinary_exclamaited( "val1" ) + .form() + ; + let exp = StructWithCustomSetters + { + ordinary : "val1!".to_string(), + magic : "".to_string(), + }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/attribute_storage_with_end.rs b/module/core/former/tests/inc/former_tests/attribute_storage_with_end.rs new file mode 100644 index 0000000000..57d5f5f7da --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_storage_with_end.rs @@ -0,0 +1,96 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +#[ storage_fields( a : i32, b : Option< String > ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Struct1 +{ + c : String, +} + +pub struct Struct1CustomEnd +{ + _phantom : core::marker::PhantomData< ( (), ) >, +} + +// impl< Definition > Default for Struct1CustomEnd< Definition > +impl Default for Struct1CustomEnd +{ + + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + +} + +#[ automatically_derived ] +impl< Context, > former::FormingEnd +< + Struct1FormerDefinitionTypes< Context, Struct1 > +> +for Struct1CustomEnd +{ + #[ inline( always ) ] + fn call + ( + &self, + storage : Struct1FormerStorage, + super_former : Option< Context >, + ) + -> Struct1 + { + let a = if let Some( a ) = storage.a + { + a + } + else + { + Default::default() + }; + let b = if let Some( b ) = storage.b + { + b + } + else + { + Default::default() + }; + Struct1 { c : format!( "{:?} - {}", a, b ) } + } +} + +// == begin of generated + +// == end of generated + +tests_impls! +{ + + fn test_complex() + { + // let got = Struct1::former().a( 13 ).b( "abc" ).c( "def" ).form(); + let end = Struct1CustomEnd::default(); + let got = Struct1Former + ::< Struct1FormerDefinition< (), Struct1, _ > > + ::new( end ) + .a( 13 ).b( "abc" ).c( "def" ).form(); + let exp = Struct1 + { + c : "13 - abc".to_string(), + }; + a_id!( got, exp ); + } + +} + +tests_index! +{ + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/attribute_storage_with_mutator.rs b/module/core/former/tests/inc/former_tests/attribute_storage_with_mutator.rs new file mode 100644 index 0000000000..983fbc655e --- /dev/null +++ b/module/core/former/tests/inc/former_tests/attribute_storage_with_mutator.rs @@ -0,0 +1,51 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +#[ storage_fields( a : i32, b : Option< String > ) ] +#[ mutator( custom ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Struct1 +{ + c : String, +} + +// = former mutator + +impl< Context, Formed > former::FormerMutator +for Struct1FormerDefinitionTypes< Context, Formed > +{ + /// Mutates the context and storage of the entity just before the formation process completes. + #[ inline ] + fn form_mutation( storage : &mut Self::Storage, _context : &mut ::core::option::Option< Self::Context > ) + { + storage.a.get_or_insert_with( Default::default ); + storage.b.get_or_insert_with( Default::default ); + storage.c = Some( format!( "{:?} - {}", storage.a.unwrap(), storage.b.as_ref().unwrap() ) ); + } +} + +// == begin of generated + +// == end of generated + +tests_impls! +{ + + fn test_complex() + { + let got = Struct1::former().a( 13 ).b( "abc" ).c( "def" ).form(); + let exp = Struct1 + { + c : "13 - abc".to_string(), + }; + a_id!( got, exp ); + } + +} + +tests_index! +{ + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_binary_heap.rs b/module/core/former/tests/inc/former_tests/collection_former_binary_heap.rs new file mode 100644 index 0000000000..354585ec10 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_binary_heap.rs @@ -0,0 +1,207 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::BinaryHeap; + +#[ test ] +fn add() +{ + + // explicit with CollectionFormer + + let got : BinaryHeap< String > = the_module + ::CollectionFormer + ::< String, former::BinaryHeapDefinition< String, (), BinaryHeap< String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::heap! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + // explicit with BinaryHeapFormer + + let got : BinaryHeap< String > = the_module::BinaryHeapFormer::< String, (), BinaryHeap< String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::heap! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + // compact with BinaryHeapFormer + + let got : BinaryHeap< String > = the_module::BinaryHeapFormer::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::heap! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + // with begin_coercing + + let got : BinaryHeap< String > = the_module::BinaryHeapFormer + ::begin( Some( collection_tools::heap![ "a".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( "b" ) + .form(); + let exp = collection_tools::heap! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + // with help of ext + + use the_module::BinaryHeapExt; + let got : BinaryHeap< String > = BinaryHeap::former() + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::heap! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + // + +} + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn replace() +{ + + let got : BinaryHeap< String > = the_module::BinaryHeapFormer::new( former::ReturnStorage ) + .add( "x" ) + .replace( collection_tools::heap![ "a".to_string(), "b".to_string() ] ) + .form(); + let exp = collection_tools::heap! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + +} + +#[ test ] +fn entity_to() +{ + + let got = < BinaryHeap< i32 > as former::EntityToFormer< former::BinaryHeapDefinition< i32, (), BinaryHeap< i32 >, former::ReturnStorage > > > + ::Former::new( former::ReturnStorage ) + .add( 13 ) + .form(); + let exp = collection_tools::heap![ 13 ]; + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + let got = < BinaryHeap< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + BinaryHeap< i32 > as former::EntityToFormer + < + former::BinaryHeapDefinition + < + i32, + (), + BinaryHeap< i32 >, + former::ReturnStorage, + > + > + >::Former::new( former::ReturnStorage ) + .form(); + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + + let got = < BinaryHeap< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + BinaryHeap< i32 > as former::EntityToFormer + < + < BinaryHeap< i32 > as former::EntityToDefinition< (), BinaryHeap< i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got.into_sorted_vec(), exp.into_sorted_vec() ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< BinaryHeap< i32 > >::entry_to_val( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + let got = former::ValToEntry::< BinaryHeap< i32 > >::val_to_entry( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::BinaryHeapDefinition ) ] + children : BinaryHeap< Child >, + } + + impl PartialEq< Parent > for Parent + { + fn eq( &self, other : &Parent ) -> bool + { + self.children.clone().into_sorted_vec() == other.children.clone().into_sorted_vec() + } + } + + let got = Parent::former() + .children() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::heap! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_btree_map.rs b/module/core/former/tests/inc/former_tests/collection_former_btree_map.rs new file mode 100644 index 0000000000..3bce14765f --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_btree_map.rs @@ -0,0 +1,221 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::BTreeMap; + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn add() +{ + + // expliccit with CollectionFormer + + let got : BTreeMap< String, String > = the_module + ::CollectionFormer + ::< ( String, String ), former::BTreeMapDefinition< String, String, (), BTreeMap< String, String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::bmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // expliccit with BTreeMapFormer + + let got : BTreeMap< String, String > = the_module::BTreeMapFormer::< String, String, (), BTreeMap< String, String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::bmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // compact with BTreeMapFormer + + let got : BTreeMap< String, String > = the_module::BTreeMapFormer::new( former::ReturnStorage ) + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::bmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // with begin + + let got : BTreeMap< String, String > = the_module::BTreeMapFormer + ::begin( Some( collection_tools::bmap![ "a".to_string() => "x".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::bmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // with help of ext + + use the_module::BTreeMapExt; + let got : BTreeMap< String, String > = BTreeMap::former() + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::bmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // + +} + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn replace() +{ + + let got : BTreeMap< String, String > = the_module::BTreeMapFormer::new( former::ReturnStorage ) + .add( ( "x".to_string(), "y".to_string() ) ) + .replace( collection_tools::bmap![ "a".to_string() => "x".to_string(), "b".to_string() => "y".to_string(), ] ) + .form(); + let exp = collection_tools::bmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + +} + +#[ test ] +fn entity_to() +{ + + let got = < BTreeMap< i32, i32 > as former::EntityToFormer< former::BTreeMapDefinition< i32, i32, (), BTreeMap< i32, i32 >, former::ReturnStorage > > > + ::Former::new( former::ReturnStorage ) + .add( ( 13, 14 ) ) + .form(); + let exp = collection_tools::bmap![ 13 => 14 ]; + a_id!( got, exp ); + + let got = < BTreeMap< i32, i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + BTreeMap< i32, i32 > as former::EntityToFormer + < + former::BTreeMapDefinition + < + i32, + i32, + (), + BTreeMap< i32, i32 >, + former::ReturnStorage, + > + > + >::Former::new( former::ReturnStorage ) + .form(); + a_id!( got, exp ); + + let got = < BTreeMap< i32, i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + BTreeMap< i32, i32 > as former::EntityToFormer + < + < BTreeMap< i32, i32 > as former::EntityToDefinition< (), BTreeMap< i32, i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< BTreeMap< u32, i32 > >::entry_to_val( ( 1u32, 13i32 ) ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + + #[ derive( Clone, Copy, Debug, PartialEq ) ] + struct Val + { + key : u32, + data : i32, + } + + impl former::ValToEntry< BTreeMap< u32, Val > > for Val + { + type Entry = ( u32, Val ); + #[ inline( always ) ] + fn val_to_entry( self ) -> Self::Entry + { + ( self.key, self ) + } + } + + let got = former::ValToEntry::< BTreeMap< u32, Val > >::val_to_entry( Val { key : 1u32, data : 13i32 } ); + let exp = ( 1u32, Val { key : 1u32, data : 13i32 } ); + a_id!( got, exp ) + +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::BTreeMapDefinition ) ] + children : BTreeMap< u32, Child >, + } + + let got = Parent::former() + .children() + .add( ( 0, Child::former().name( "a" ).form() ) ) + .add( ( 1, Child::former().name( "b" ).form() ) ) + .end() + .form(); + + let children = collection_tools::bmap! + [ + 0 => Child { name : "a".to_string(), data : false }, + 1 => Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_btree_set.rs b/module/core/former/tests/inc/former_tests/collection_former_btree_set.rs new file mode 100644 index 0000000000..310b12b710 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_btree_set.rs @@ -0,0 +1,199 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::BTreeSet; + +#[ test ] +fn add() +{ + + // explicit with CollectionFormer + + let got : BTreeSet< String > = the_module + ::CollectionFormer + ::< String, former::BTreeSetDefinition< String, (), BTreeSet< String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::bset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // explicit with BTreeSetFormer + + let got : BTreeSet< String > = the_module::BTreeSetFormer::< String, (), BTreeSet< String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::bset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // compact with BTreeSetFormer + + let got : BTreeSet< String > = the_module::BTreeSetFormer::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::bset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with begin_coercing + + let got : BTreeSet< String > = the_module::BTreeSetFormer + ::begin( Some( collection_tools::bset![ "a".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( "b" ) + .form(); + let exp = collection_tools::bset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with help of ext + + use the_module::BTreeSetExt; + let got : BTreeSet< String > = BTreeSet::former() + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::bset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // + +} + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn replace() +{ + + let got : BTreeSet< String > = the_module::BTreeSetFormer::new( former::ReturnStorage ) + .add( "x" ) + .replace( collection_tools::bset![ "a".to_string(), "b".to_string() ] ) + .form(); + let exp = collection_tools::bset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + +} + +#[ test ] +fn entity_to() +{ + + let got = < BTreeSet< i32 > as former::EntityToFormer< former::BTreeSetDefinition< i32, (), BTreeSet< i32 >, former::ReturnStorage > > > + ::Former::new( former::ReturnStorage ) + .add( 13 ) + .form(); + let exp = collection_tools::bset![ 13 ]; + a_id!( got, exp ); + + let got = < BTreeSet< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + BTreeSet< i32 > as former::EntityToFormer + < + former::BTreeSetDefinition + < + i32, + (), + BTreeSet< i32 >, + former::ReturnStorage, + > + > + >::Former::new( former::ReturnStorage ) + .form(); + a_id!( got, exp ); + + let got = < BTreeSet< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + BTreeSet< i32 > as former::EntityToFormer + < + < BTreeSet< i32 > as former::EntityToDefinition< (), BTreeSet< i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< BTreeSet< i32 > >::entry_to_val( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + let got = former::ValToEntry::< BTreeSet< i32 > >::val_to_entry( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Debug, Default, PartialEq, Eq, PartialOrd, Ord, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::BTreeSetDefinition ) ] + children : BTreeSet< Child >, + } + + let got = Parent::former() + .children() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::bset! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_common.rs b/module/core/former/tests/inc/former_tests/collection_former_common.rs new file mode 100644 index 0000000000..80ed29689e --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_common.rs @@ -0,0 +1,301 @@ +// #![ allow( dead_code ) ] + +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::Vec; + +// + +#[ test ] +fn definitions() +{ + + pub fn f1< Definition >( _x : Definition ) + where + Definition : former::FormerDefinitionTypes, + { + } + + pub fn f2< Definition >( _x : Definition ) + where + Definition : former::FormerDefinition, + { + } + + pub fn f3< Definition, End >( _x : End ) + where + Definition : former::FormerDefinitionTypes, + End : former::FormingEnd< Definition >, + { + } + + f1( former::VectorDefinitionTypes::< String, (), Vec< String > >::default() ); + f2( former::VectorDefinition::< String, (), Vec< String >, the_module::NoEnd >::default() ); + f3::< former::VectorDefinitionTypes< String, (), Vec< String > >, the_module::ReturnStorage >( the_module::ReturnStorage ); + f3::< < former::VectorDefinition< String, (), Vec< String >, the_module::NoEnd > as the_module::FormerDefinition >::Types, the_module::ReturnStorage >( the_module::ReturnStorage ); + +} + +// + +#[ test ] +fn begin_and_custom_end() +{ + + // basic case + + fn return_13( _storage : Vec< String >, _context : Option< () > ) -> f32 + { + 13.1 + } + let got = the_module::VectorFormer::begin( None, None, return_13 ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13.1; + a_id!( got, exp ); + + let got = the_module::VectorFormer::new( return_13 ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13.1; + a_id!( got, exp ); + + // with a context + + fn context_plus_13( _storage : Vec< String >, context : Option< f32 > ) -> f32 + { + if let Some( context ) = context + { + 13.1 + context + } + else + { + 13.1 + } + } + let got = the_module::VectorFormer::begin( None, Some( 10.0 ), context_plus_13 ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 23.1; + a_id!( got, exp ); + + // + +} + +// + +#[ test ] +fn custom_definition() +{ + + struct Return13; + impl former::FormerDefinitionTypes for Return13 + { + type Storage = Vec< String >; + type Formed = i32; + type Context = (); + } + + impl former::FormerMutator + for Return13 + { + } + + impl former::FormerDefinition for Return13 + { + type Types = Return13; + type End = Return13; + type Storage = Vec< String >; + type Formed = i32; + type Context = (); + } + + // - + + impl former::FormingEnd< Return13 > + for Return13 + { + fn call + ( + &self, + _storage : < Return13 as former::FormerDefinitionTypes >::Storage, + _context : Option< < Return13 as former::FormerDefinitionTypes >::Context > + ) -> < Return13 as former::FormerDefinitionTypes >::Formed + { + 13 + } + } + + // + + let got = former::CollectionFormer::< String, Return13 >::begin( None, None, Return13 ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + let got = former::CollectionFormer::< String, Return13 >::new( Return13 ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + // + +} + +// + +#[ test ] +fn custom_definition_parametrized() +{ + + struct Return13< E >( ::core::marker::PhantomData< E > ); + + impl< E > Return13< E > + { + pub fn new() -> Self + { + Self ( ::core::marker::PhantomData ) + } + } + + impl< E > former::FormerDefinitionTypes for Return13< E > + { + type Storage = Vec< E >; + type Formed = i32; + type Context = (); + } + + impl< E > former::FormerMutator + for Return13< E > + { + } + + impl< E > former::FormerDefinition for Return13< E > + { + type Types = Return13< E >; + type End = Return13< E >; + type Storage = Vec< E >; + type Formed = i32; + type Context = (); + } + + // - + + impl< E > the_module::FormingEnd< Return13< E > > + for Return13< E > + { + fn call + ( + &self, + _storage : < Return13< E > as the_module::FormerDefinitionTypes >::Storage, + _context : Option< < Return13< E > as the_module::FormerDefinitionTypes >::Context > + ) -> < Return13< E > as the_module::FormerDefinitionTypes >::Formed + { + 13 + } + } + + // + + let got = the_module::CollectionFormer::< String, Return13< String > >::begin_coercing( None, None, Return13::new() ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + let got = the_module::CollectionFormer::< String, Return13< String > >::new_coercing( Return13::new() ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + // + + type MyCollection< E > = the_module::CollectionFormer::< E, Return13< E > >; + + let got = MyCollection::< String >::begin_coercing( None, None, Return13::new() ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + let got = MyCollection::< String >::new_coercing( Return13::new() ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + // + +} + +// + +#[ test ] +fn custom_definition_custom_end() +{ + + struct Return13; + impl former::FormerDefinitionTypes for Return13 + { + type Storage = Vec< String >; + type Formed = i32; + type Context = (); + } + impl former::FormerMutator + for Return13 + { + } + impl former::FormerDefinition for Return13 + { + type Types = Return13; + type End = former::FormingEndClosure< < Self as former::FormerDefinition >::Types >; + type Storage = Vec< String >; + type Formed = i32; + type Context = (); + } + + fn return_13( _storage : Vec< String >, _context : Option< () > ) -> i32 + { + 13 + } + + let end_wrapper : the_module::FormingEndClosure< Return13 > = the_module::FormingEndClosure::new( return_13 ); + let got = the_module::CollectionFormer::< String, Return13 >::new( end_wrapper ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + let got = the_module::CollectionFormer::< String, Return13 >::new( return_13.into() ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + let got = the_module::CollectionFormer::< String, Return13 >::new_coercing( return_13 ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = 13; + a_id!( got, exp ); + + // + +} + +// diff --git a/module/core/former/tests/inc/former_tests/collection_former_hashmap.rs b/module/core/former/tests/inc/former_tests/collection_former_hashmap.rs new file mode 100644 index 0000000000..365a26b23e --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_hashmap.rs @@ -0,0 +1,221 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::HashMap; + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn add() +{ + + // expliccit with CollectionFormer + + let got : HashMap< String, String > = the_module + ::CollectionFormer + ::< ( String, String ), former::HashMapDefinition< String, String, (), HashMap< String, String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::hmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // expliccit with HashMapFormer + + let got : HashMap< String, String > = the_module::HashMapFormer::< String, String, (), HashMap< String, String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::hmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // compact with HashMapFormer + + let got : HashMap< String, String > = the_module::HashMapFormer::new( former::ReturnStorage ) + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::hmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // with begin + + let got : HashMap< String, String > = the_module::HashMapFormer + ::begin( Some( collection_tools::hmap![ "a".to_string() => "x".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::hmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // with help of ext + + use the_module::HashMapExt; + let got : HashMap< String, String > = HashMap::former() + .add( ( "a".into(), "x".into() ) ) + .add( ( "b".into(), "y".into() ) ) + .form(); + let exp = collection_tools::hmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + + // + +} + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn replace() +{ + + let got : HashMap< String, String > = the_module::HashMapFormer::new( former::ReturnStorage ) + .add( ( "x".to_string(), "y".to_string() ) ) + .replace( collection_tools::hmap![ "a".to_string() => "x".to_string(), "b".to_string() => "y".to_string(), ] ) + .form(); + let exp = collection_tools::hmap! + [ + "a".to_string() => "x".to_string(), + "b".to_string() => "y".to_string(), + ]; + a_id!( got, exp ); + +} + +#[ test ] +fn entity_to() +{ + + let got = < HashMap< i32, i32 > as former::EntityToFormer< former::HashMapDefinition< i32, i32, (), HashMap< i32, i32 >, former::ReturnStorage > > > + ::Former::new( former::ReturnStorage ) + .add( ( 13, 14 ) ) + .form(); + let exp = collection_tools::hmap![ 13 => 14 ]; + a_id!( got, exp ); + + let got = < HashMap< i32, i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + HashMap< i32, i32 > as former::EntityToFormer + < + former::HashMapDefinition + < + i32, + i32, + (), + HashMap< i32, i32 >, + former::ReturnStorage, + > + > + >::Former::new( former::ReturnStorage ) + .form(); + a_id!( got, exp ); + + let got = < HashMap< i32, i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + HashMap< i32, i32 > as former::EntityToFormer + < + < HashMap< i32, i32 > as former::EntityToDefinition< (), HashMap< i32, i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< HashMap< u32, i32 > >::entry_to_val( ( 1u32, 13i32 ) ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + + #[ derive( Clone, Copy, Debug, PartialEq ) ] + struct Val + { + key : u32, + data : i32, + } + + impl former::ValToEntry< HashMap< u32, Val > > for Val + { + type Entry = ( u32, Val ); + #[ inline( always ) ] + fn val_to_entry( self ) -> Self::Entry + { + ( self.key, self ) + } + } + + let got = former::ValToEntry::< HashMap< u32, Val > >::val_to_entry( Val { key : 1u32, data : 13i32 } ); + let exp = ( 1u32, Val { key : 1u32, data : 13i32 } ); + a_id!( got, exp ) + +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::HashMapDefinition ) ] + children : HashMap< u32, Child >, + } + + let got = Parent::former() + .children() + .add( ( 0, Child::former().name( "a" ).form() ) ) + .add( ( 1, Child::former().name( "b" ).form() ) ) + .end() + .form(); + + let children = collection_tools::hmap! + [ + 0 => Child { name : "a".to_string(), data : false }, + 1 => Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_hashset.rs b/module/core/former/tests/inc/former_tests/collection_former_hashset.rs new file mode 100644 index 0000000000..031efb7528 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_hashset.rs @@ -0,0 +1,201 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::HashSet; + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn add() +{ + + // explicit with CollectionFormer + + let got : HashSet< String > = the_module + ::CollectionFormer + ::< String, former::HashSetDefinition< String, (), HashSet< String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::hset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // explicit with HashSetFormer + + let got : HashSet< String > = the_module::HashSetFormer::< String, (), HashSet< String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::hset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // compact with HashSetFormer + + let got : HashSet< String > = the_module::HashSetFormer::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::hset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with begin_coercing + + let got : HashSet< String > = the_module::HashSetFormer + ::begin( Some( collection_tools::hset![ "a".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( "b" ) + .form(); + let exp = collection_tools::hset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with help of ext + + use the_module::HashSetExt; + let got : HashSet< String > = HashSet::former() + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::hset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // + +} + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn replace() +{ + + let got : HashSet< String > = the_module::HashSetFormer::new( former::ReturnStorage ) + .add( "x" ) + .replace( collection_tools::hset![ "a".to_string(), "b".to_string() ] ) + .form(); + let exp = collection_tools::hset! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + +} + +#[ test ] +fn entity_to() +{ + + let got = < HashSet< i32 > as former::EntityToFormer< former::HashSetDefinition< i32, (), HashSet< i32 >, former::ReturnStorage > > > + ::Former::new( former::ReturnStorage ) + .add( 13 ) + .form(); + let exp = collection_tools::hset![ 13 ]; + a_id!( got, exp ); + + let got = < HashSet< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + HashSet< i32 > as former::EntityToFormer + < + former::HashSetDefinition + < + i32, + (), + HashSet< i32 >, + former::ReturnStorage, + > + > + >::Former::new( former::ReturnStorage ) + .form(); + a_id!( got, exp ); + + let got = < HashSet< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + HashSet< i32 > as former::EntityToFormer + < + < HashSet< i32 > as former::EntityToDefinition< (), HashSet< i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< HashSet< i32 > >::entry_to_val( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + let got = former::ValToEntry::< HashSet< i32 > >::val_to_entry( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Debug, Default, PartialEq, Eq, Hash, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::HashSetDefinition ) ] + children : HashSet< Child >, + } + + let got = Parent::former() + .children() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::hset! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_linked_list.rs b/module/core/former/tests/inc/former_tests/collection_former_linked_list.rs new file mode 100644 index 0000000000..286288f859 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_linked_list.rs @@ -0,0 +1,203 @@ +// #![ allow( dead_code ) ] + +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::LinkedList; + +// + +#[ test ] +fn add() +{ + + // explicit with CollectionFormer + + let got : LinkedList< String > = the_module + ::CollectionFormer + ::< String, former::LinkedListDefinition< String, (), LinkedList< String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::list! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // explicit with LinkedListFormer + + let got : LinkedList< String > = the_module::LinkedListFormer::< String, (), LinkedList< String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::list! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // compact with Former + + let got : LinkedList< String > = the_module::LinkedListFormer::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::list! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with begin_coercing + + let got : LinkedList< String > = the_module::LinkedListFormer + ::begin( Some( collection_tools::list![ "a".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( "b" ) + .form(); + let exp = collection_tools::list! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with help of ext + + use the_module::LinkedListExt; + let got : LinkedList< String > = LinkedList::former() + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::list! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // + +} + +// + +#[ test ] +fn replace() +{ + + let got : LinkedList< String > = the_module::LinkedListFormer::new( former::ReturnStorage ) + .add( "x" ) + .replace( collection_tools::list![ "a".to_string(), "b".to_string() ] ) + .form(); + let exp = collection_tools::list! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + +} + +// + +#[ test ] +fn entity_to() +{ + + let got = < LinkedList< i32 > as former::EntityToFormer< former::LinkedListDefinition< i32, (), LinkedList< i32 >, former::ReturnPreformed > > > + ::Former::new( former::ReturnPreformed ) + .add( 13 ) + .form(); + let exp = collection_tools::list![ 13 ]; + a_id!( got, exp ); + + // qqq : uncomment and make it working + let got = < LinkedList< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + LinkedList< i32 > as former::EntityToFormer + < + former::LinkedListDefinition + < + i32, + (), + LinkedList< i32 >, + former::ReturnPreformed, + > + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + + let got = < LinkedList< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + LinkedList< i32 > as former::EntityToFormer + < + < LinkedList< i32 > as former::EntityToDefinition< (), LinkedList< i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< LinkedList< i32 > >::entry_to_val( 13 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + let got = former::ValToEntry::< LinkedList< i32 > >::val_to_entry( 13 ); + let exp = 13; + a_id!( got, exp ) +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::LinkedListDefinition ) ] + children : LinkedList< Child >, + } + + let got = Parent::former() + .children() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::list! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_vec.rs b/module/core/former/tests/inc/former_tests/collection_former_vec.rs new file mode 100644 index 0000000000..4a40e45a25 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_vec.rs @@ -0,0 +1,205 @@ +// #![ allow( dead_code ) ] + +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::Vec; + +// + +#[ test ] +fn add() +{ + + // expliccit with CollectionFormer + + let got : Vec< String > = the_module + ::CollectionFormer + ::< String, former::VectorDefinition< String, (), Vec< String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vec! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // expliccit with VectorFormer + + let got : Vec< String > = the_module::VectorFormer::< String, (), Vec< String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vec! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // compact with VectorFormer + + let got : Vec< String > = the_module::VectorFormer::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vec! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with begin_coercing + + let got : Vec< String > = the_module::VectorFormer + ::begin( Some( collection_tools::vec![ "a".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( "b" ) + .form(); + let exp = collection_tools::vec! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with help of ext + + use the_module::VecExt; + let got : Vec< String > = Vec::former() + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vec! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // + +} + +// + +#[ test ] +fn replace() +{ + + let got : Vec< String > = the_module::VectorFormer::new( former::ReturnStorage ) + .add( "x" ) + .replace( collection_tools::vec![ "a".to_string(), "b".to_string() ] ) + .form(); + let exp = collection_tools::vec! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + +} + +// + +// qqq : make similar test for all collections -- done +#[ test ] +fn entity_to() +{ + + // qqq : uncomment and make it working -- done + let got = < Vec< i32 > as former::EntityToFormer< former::VectorDefinition< i32, (), Vec< i32 >, former::ReturnPreformed > > > + ::Former::new( former::ReturnPreformed ) + .add( 13 ) + .form(); + let exp = collection_tools::vec![ 13 ]; + a_id!( got, exp ); + + // qqq : uncomment and make it working + let got = < Vec< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + Vec< i32 > as former::EntityToFormer + < + former::VectorDefinition + < + i32, + (), + Vec< i32 >, + former::ReturnPreformed, + > + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + + let got = < Vec< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + Vec< i32 > as former::EntityToFormer + < + < Vec< i32 > as former::EntityToDefinition< (), Vec< i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< Vec< i32 > >::entry_to_val( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + let got = former::ValToEntry::< Vec< i32 > >::val_to_entry( 13i32 ); + let exp = 13i32; + a_id!( got, exp ) +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::VectorDefinition ) ] + children : Vec< Child >, + } + + let got = Parent::former() + .children() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/collection_former_vec_deque.rs b/module/core/former/tests/inc/former_tests/collection_former_vec_deque.rs new file mode 100644 index 0000000000..04c29f23b2 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/collection_former_vec_deque.rs @@ -0,0 +1,205 @@ +// #![ allow( dead_code ) ] + +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::VecDeque; + +// + +#[ test ] +fn add() +{ + + // explicit with CollectionFormer + + let got : VecDeque< String > = the_module + ::CollectionFormer + ::< String, former::VecDequeDefinition< String, (), VecDeque< String >, the_module::ReturnStorage > > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vecd! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // explicit with VecDequeFormer + + let got : VecDeque< String > = the_module::VecDequeFormer::< String, (), VecDeque< String >, the_module::ReturnStorage > + ::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vecd! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // compact with VecDequeFormer + + let got : VecDeque< String > = the_module::VecDequeFormer::new( former::ReturnStorage ) + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vecd! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with begin_coercing + + let got : VecDeque< String > = the_module::VecDequeFormer + ::begin( Some( collection_tools::vecd![ "a".to_string() ] ), Some( () ), former::ReturnStorage ) + .add( "b" ) + .form(); + let exp = collection_tools::vecd! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // with help of ext + + use the_module::VecDequeExt; + let got : VecDeque< String > = VecDeque::former() + .add( "a" ) + .add( "b" ) + .form(); + let exp = collection_tools::vecd! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + + // + +} + +// + +#[ test ] +fn replace() +{ + + let got : VecDeque< String > = the_module::VecDequeFormer::new( former::ReturnStorage ) + .add( "x" ) + .replace( collection_tools::vecd![ "a".to_string(), "b".to_string() ] ) + .form(); + let exp = collection_tools::vecd! + [ + "a".to_string(), + "b".to_string(), + ]; + a_id!( got, exp ); + +} + +// + +// qqq : make similar test for all collections -- done +#[ test ] +fn entity_to() +{ + + // qqq : uncomment and make it working -- done + let got = < VecDeque< i32 > as former::EntityToFormer< former::VecDequeDefinition< i32, (), VecDeque< i32 >, former::ReturnStorage > > > + ::Former::new( former::ReturnStorage ) + .add( 13 ) + .form(); + let exp = collection_tools::vecd![ 13 ]; + a_id!( got, exp ); + + // qqq : uncomment and make it working + let got = < VecDeque< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + VecDeque< i32 > as former::EntityToFormer + < + former::VecDequeDefinition + < + i32, + (), + VecDeque< i32 >, + former::ReturnStorage, + > + > + >::Former::new( former::ReturnStorage ) + .form(); + a_id!( got, exp ); + + let got = < VecDeque< i32 > as former::EntityToStorage >::Storage::default(); + let exp = + < + VecDeque< i32 > as former::EntityToFormer + < + < VecDeque< i32 > as former::EntityToDefinition< (), VecDeque< i32 >, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ) + .form(); + a_id!( got, exp ); + +} + +#[ test ] +fn entry_to_val() +{ + let got = former::EntryToVal::< VecDeque< i32 > >::entry_to_val( 13 ); + let exp = 13; + a_id!( got, exp ) +} + +#[ test ] +fn val_to_entry() +{ + let got = former::ValToEntry::< VecDeque< i32 > >::val_to_entry( 13 ); + let exp = 13; + a_id!( got, exp ) +} + +#[ test ] +fn subformer() +{ + + /// Parameter description. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + pub struct Child + { + name : String, + data : bool, + } + + /// Parent required for the template. + #[ derive( Debug, Default, PartialEq, the_module::Former ) ] + // #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] + // #[ derive( Debug, Default, PartialEq ) ] + pub struct Parent + { + #[ subform_collection( definition = former::VecDequeDefinition ) ] + children : VecDeque< Child >, + } + + let got = Parent::former() + .children() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::vecd! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.rs b/module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.rs new file mode 100644 index 0000000000..ac9d99fb69 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.rs @@ -0,0 +1,11 @@ +use former::Former; + +#[ derive( Former ) ] +pub struct Struct1 +{ + #[ defaultx( 31 ) ] + int_1 : i32, +} + +fn main() +{} \ No newline at end of file diff --git a/module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.stderr b/module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.stderr new file mode 100644 index 0000000000..8162f72bf2 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/compiletime/field_attr_bad.stderr @@ -0,0 +1,11 @@ +error: Unknown field attribute #[defaultx(31)] + --> tests/inc/former_tests/compiletime/field_attr_bad.rs:6:3 + | +6 | #[ defaultx( 31 ) ] + | ^^^^^^^^^^^^^^^^^^^ + +error: cannot find attribute `defaultx` in this scope + --> tests/inc/former_tests/compiletime/field_attr_bad.rs:6:6 + | +6 | #[ defaultx( 31 ) ] + | ^^^^^^^^ diff --git a/module/core/former/tests/inc/former_tests/compiletime/hashmap_without_parameter.rs b/module/core/former/tests/inc/former_tests/compiletime/hashmap_without_parameter.rs new file mode 100644 index 0000000000..dcca1bf665 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/compiletime/hashmap_without_parameter.rs @@ -0,0 +1,16 @@ +use former::Former; + +struct HashMap< T > +{ + f1 : T, +} + +#[ derive( Former ) ] +pub struct Struct1 +{ + f2 : HashMap< i32 >, +} + +fn main() +{ +} diff --git a/module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.rs b/module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.rs new file mode 100644 index 0000000000..a08670ab93 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.rs @@ -0,0 +1,11 @@ +use former::Former; + +#[ derive( Former ) ] +#[ defaultx ] +pub struct Struct1 +{ + int_1 : i32, +} + +fn main() +{} \ No newline at end of file diff --git a/module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.stderr b/module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.stderr new file mode 100644 index 0000000000..7425033f39 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/compiletime/struct_attr_bad.stderr @@ -0,0 +1,12 @@ +error: Known structure attirbutes are : `storage_fields`, `perform`, `debug`. + Unknown structure attribute : #[defaultx] + --> tests/inc/former_tests/compiletime/struct_attr_bad.rs:4:1 + | +4 | #[ defaultx ] + | ^^^^^^^^^^^^^ + +error: cannot find attribute `defaultx` in this scope + --> tests/inc/former_tests/compiletime/struct_attr_bad.rs:4:4 + | +4 | #[ defaultx ] + | ^^^^^^^^ diff --git a/module/core/former/tests/inc/former_tests/compiletime/vector_without_parameter.rs b/module/core/former/tests/inc/former_tests/compiletime/vector_without_parameter.rs new file mode 100644 index 0000000000..325d008dfa --- /dev/null +++ b/module/core/former/tests/inc/former_tests/compiletime/vector_without_parameter.rs @@ -0,0 +1,16 @@ +use former::Former; + +struct Vec +{ + f1 : i32, +} + +#[ derive( Former ) ] +pub struct Struct1 +{ + f2 : Vec<>, +} + +fn main() +{ +} diff --git a/module/core/former/tests/inc/former_tests/default_user_type.rs b/module/core/former/tests/inc/former_tests/default_user_type.rs new file mode 100644 index 0000000000..300f0344e6 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/default_user_type.rs @@ -0,0 +1,40 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + fn test_user_type_with_default() + { + #[ derive( Debug, PartialEq, Default ) ] + pub struct UserType + { + int : i32, + uint : u32, + } + + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Struct2 + { + user : UserType, + string : String, + } + let command = Struct2::former().form(); + + // assert!( false ); + + let expected = Struct2 + { + user : UserType { int : 0, uint : 0 }, + string : String::from( "" ), + }; + + a_id!( command, expected ); + } +} + +// + +tests_index! +{ + test_user_type_with_default, +} diff --git a/module/core/former/tests/inc/former_tests/name_collision_context.rs b/module/core/former/tests/inc/former_tests/name_collision_context.rs new file mode 100644 index 0000000000..ca4b73fc02 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/name_collision_context.rs @@ -0,0 +1,19 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; + + +pub mod core {} +pub mod std {} +pub mod marker {} +pub trait CloneAny{} +// pub trait Context{} +pub trait Formed{} +pub trait OnEnd{} + +#[ derive( Clone, the_module::Former ) ] +pub struct Context +{ + inner : ::std::sync::Arc< ::core::cell::RefCell< dyn CloneAny > > +} diff --git a/module/core/former/tests/inc/former_tests/name_collision_core.rs b/module/core/former/tests/inc/former_tests/name_collision_core.rs new file mode 100644 index 0000000000..8cdf38cb3f --- /dev/null +++ b/module/core/former/tests/inc/former_tests/name_collision_core.rs @@ -0,0 +1,19 @@ +#![ allow( dead_code ) ] +#![ allow( non_camel_case_types ) ] + +#[ allow( unused_imports ) ] +use super::*; + +// pub mod core {} +pub mod std {} +pub mod marker {} +pub trait CloneAny{} +pub trait Context{} +pub trait Formed{} +pub trait OnEnd{} + +#[ derive( Clone, the_module::Former ) ] +pub struct core +{ + inner : ::std::sync::Arc< ::core::cell::RefCell< dyn CloneAny > > +} diff --git a/module/core/former/tests/inc/former_tests/name_collision_end.rs b/module/core/former/tests/inc/former_tests/name_collision_end.rs new file mode 100644 index 0000000000..b998b6153c --- /dev/null +++ b/module/core/former/tests/inc/former_tests/name_collision_end.rs @@ -0,0 +1,24 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; + +pub mod core {} +pub mod std {} +pub mod marker {} +pub trait CloneAny{} +pub trait Context{} +pub trait Formed{} +pub trait OnEnd{} + +#[ derive( Clone, the_module::Former ) ] +// #[ derive( Clone, the_module::Former ) ] #[ debug ] +// #[ derive( Clone ) ] +pub struct End +{ + inner : ::std::sync::Arc< ::core::cell::RefCell< dyn CloneAny > > +} + +// = begin_coercing of generated + +// == end of generated \ No newline at end of file diff --git a/module/core/former/tests/inc/former_tests/name_collision_former_hashmap_without_parameter.rs b/module/core/former/tests/inc/former_tests/name_collision_former_hashmap_without_parameter.rs new file mode 100644 index 0000000000..31df1f43e6 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/name_collision_former_hashmap_without_parameter.rs @@ -0,0 +1,44 @@ +use super::*; +use the_module::Former; + +pub mod core {} +pub mod std {} +pub mod marker {} +pub trait CloneAny{} +pub trait Context{} +pub trait Formed{} +pub trait OnEnd{} + +#[ derive( Debug, PartialEq ) ] +struct HashMap< T > +{ + pub f1 : T, +} + +#[ derive( Debug, PartialEq, Former ) ] +pub struct Struct1 +{ + f2 : HashMap< i32 >, +} + +tests_impls! +{ + + // Name conflict is not a problem. + fn basic() + { + + let got = Struct1::former().f2( HashMap { f1 : 3 } ).form(); + let expected = Struct1 { f2 : HashMap { f1 : 3 } }; + a_id!( got, expected ); + + } + +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/former/tests/inc/former_tests/name_collision_former_vector_without_parameter.rs b/module/core/former/tests/inc/former_tests/name_collision_former_vector_without_parameter.rs new file mode 100644 index 0000000000..c79d0e8ba3 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/name_collision_former_vector_without_parameter.rs @@ -0,0 +1,44 @@ +use super::*; +use the_module::Former; + +pub mod core {} +pub mod std {} +pub mod marker {} +pub trait CloneAny{} +pub trait Context{} +pub trait Formed{} +pub trait OnEnd{} + +#[ derive( Debug, PartialEq ) ] +struct Vec +{ + f1 : i32, +} + +#[ derive( Debug, PartialEq, Former ) ] +pub struct Struct1 +{ + f2 : Vec<>, +} + +tests_impls! +{ + + // Name conflict is not a problem. + fn basic() + { + + let got = Struct1::former().f2( Vec { f1 : 3 } ).form(); + let expected = Struct1 { f2 : Vec { f1 : 3 } }; + a_id!( got, expected ); + + } + +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/former/tests/inc/former_tests/name_collision_on_end.rs b/module/core/former/tests/inc/former_tests/name_collision_on_end.rs new file mode 100644 index 0000000000..3645d92588 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/name_collision_on_end.rs @@ -0,0 +1,18 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; + +pub mod core {} +pub mod std {} +pub mod marker {} +pub trait CloneAny{} +pub trait Context{} +pub trait Formed{} +// pub trait OnEnd{} + +#[ derive( Clone, the_module::Former ) ] +pub struct OnEnd +{ + inner : ::std::sync::Arc< ::core::cell::RefCell< dyn CloneAny > > +} diff --git a/module/core/former/tests/inc/former_tests/name_collisions.rs b/module/core/former/tests/inc/former_tests/name_collisions.rs new file mode 100644 index 0000000000..e23adcdd45 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/name_collisions.rs @@ -0,0 +1,44 @@ +#[ allow( unused_imports ) ] +use super::*; + +pub mod core {} +pub mod std {} +pub trait CloneAny{} +pub trait Context{} +pub trait Formed{} +pub trait OnEnd{} + +#[ allow( dead_code ) ] +type Option = (); +#[ allow( dead_code ) ] +type Some = (); +#[ allow( dead_code ) ] +type None = (); +#[ allow( dead_code ) ] +type Result = (); +#[ allow( dead_code ) ] +type Ok = (); +#[ allow( dead_code ) ] +type Err = (); +#[ allow( dead_code ) ] +type Box = (); +#[ allow( dead_code ) ] +type Default = (); +#[ allow( dead_code ) ] +type HashSet = (); +#[ allow( dead_code ) ] +type HashMap = (); + +#[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ derive( Debug, PartialEq ) ] +// #[ debug ] +pub struct Struct1 +{ + vec_1 : Vec< String >, + hashmap_1 : collection_tools::HashMap< String, String >, + hashset_1 : collection_tools::HashSet< String >, +} + +// + +include!( "./only_test/collections_without_subformer.rs" ); diff --git a/module/core/former/tests/inc/former_tests/only_test/basic.rs b/module/core/former/tests/inc/former_tests/only_test/basic.rs new file mode 100644 index 0000000000..a3a0f00e2b --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/basic.rs @@ -0,0 +1,562 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + + // + + fn internals() + { + + let former = Struct1::former(); + a_id!( former.storage.int_1, None ); + a_id!( former.context, None ); + a_id!( print!( "{:?}", former.on_end ), print!( "{:?}", Some( the_module::ReturnPreformed ) ) ); + let former2 = Struct1Former::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > >::new_coercing( former::ReturnPreformed ); + a_id!( ::std::mem::size_of_val( &former ), ::std::mem::size_of_val( &former2 ) ); + let former2 = Struct1Former::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > >::new( former::ReturnPreformed ); + a_id!( ::std::mem::size_of_val( &former ), ::std::mem::size_of_val( &former2 ) ); + + let command = Struct1::former().form(); + a_id!( command.int_1, 0 ); + + let command = Struct1::former().perform(); + a_id!( command.int_1, 0 ); + + let command = Struct1::former().end(); + a_id!( command.int_1, 0 ); + + } + + // + + fn entity_to() + { + + let got = < Struct1 as former::EntityToFormer< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > > >::Former::new( former::ReturnPreformed ) + .int_1( 13 ) + .form(); + let exp = Struct1 { int_1 : 13 }; + a_id!( got, exp ); + + let got = < Struct1 as former::EntityToStorage >::Storage::default(); + let exp = + < + Struct1 as former::EntityToFormer + < + Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > + > + >::Former::new( former::ReturnPreformed ); + a_id!( got.int_1, exp.storage.int_1 ); + + let got = < Struct1 as former::EntityToStorage >::Storage::default(); + let exp = + < + Struct1 as former::EntityToFormer + < + < Struct1 as former::EntityToDefinition< (), Struct1, former::ReturnPreformed > >::Definition + > + >::Former::new( former::ReturnPreformed ); + a_id!( got.int_1, exp.storage.int_1 ); + + } + + // + + fn former_begin() + { + + let former = < Struct1Former as former::FormerBegin< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > > > + ::former_begin( None, None, former::ReturnPreformed ); + let got = former + .int_1( 13 ) + .form(); + let exp = Struct1 { int_1 : 13 }; + a_id!( got, exp ); + + } + + // + + fn custom_definition_params() + { + + // custom params + let got = Struct1Former + :: + < + Struct1FormerDefinition< i32, i32, former::FormingEndClosure< Struct1FormerDefinitionTypes< i32, i32 > > > + > + ::begin_coercing + ( + None, + Some( 3 ), + | storage : Struct1FormerStorage, context : Option< i32 > | { 2 * ( storage.int_1.unwrap() + context.unwrap() ) }, + ) + .int_1( 13 ) + .form(); + a_id!( got, 32 ); + + // custom params with into + let got = Struct1Former + :: + < + Struct1FormerDefinition< i32, i32, former::FormingEndClosure< Struct1FormerDefinitionTypes< i32, i32 > > > + > + ::begin_coercing + ( + None, + Some( 3 ), + | storage : Struct1FormerStorage, context : Option< i32 > | { 2 * ( storage.int_1.unwrap() + context.unwrap() ) }, + ) + .int_1( 13 ) + .form(); + a_id!( got, 32 ); + + // custom params begin_coercing + let got = Struct1Former + :: + < + + Struct1FormerDefinition< i32, i32, former::FormingEndClosure< Struct1FormerDefinitionTypes< i32, i32 > > > + > + ::begin_coercing + ( + None, + Some( 3 ), + | storage : Struct1FormerStorage, context : Option< i32 > | { 2 * ( storage.int_1.unwrap() + context.unwrap() ) } + ) + .int_1( 13 ) + .form(); + a_id!( got, 32 ); + + // custom params begin_coercing with Struct1FormerWithClosure + let got = Struct1Former + :: + < + + Struct1FormerDefinition< i32, i32, former::FormingEndClosure< Struct1FormerDefinitionTypes< i32, i32 > > > + > + ::begin_coercing + ( + None, + Some( 3 ), + | storage : Struct1FormerStorage, context : Option< i32 > | { 2 * ( storage.int_1.unwrap() + context.unwrap() ) } + ) + .int_1( 13 ) + .form(); + a_id!( got, 32 ); + + // less explicit + let got = Struct1Former + :: + < + + Struct1FormerDefinition< i32, i32, former::FormingEndClosure< _ > > + > + ::begin_coercing + ( + None, + Some( 3 ), + | storage : Struct1FormerStorage, context : Option< i32 > | { 2 * ( storage.int_1.unwrap() + context.unwrap() ) } + ) + .int_1( 13 ) + .form(); + a_id!( got, 32 ); + + } + + // + + fn begin_coercing() + { + + // begin_coercing with none + let got = Struct1Former::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > >::begin_coercing( None, None, the_module::ReturnPreformed ).int_1( 13 ).form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // begin_coercing with storage + let mut storage = Struct1FormerStorage::default(); + storage.int_1 = Some( 13 ); + let exp = Struct1Former::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > >::begin_coercing( Some( storage ), None, the_module::ReturnPreformed ).form(); + a_id!( got, exp ); + + // begin_coercing with context + let mut storage = Struct1FormerStorage::default(); + storage.int_1 = Some( 13 ); + let exp = Struct1Former + :: + < + Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > + > + ::begin_coercing( Some( storage ), Some( () ), the_module::ReturnPreformed ) + .form(); + a_id!( got, exp ); + + } + + // + + fn begin() + { + + // custom params + let got = Struct1Former + // ::< Struct1FormerDefinition< i32, i32, _ > > + :: + < + + Struct1FormerDefinition< i32, i32, _ > + > + ::begin + ( + None, + Some( 3 ), + former::FormingEndClosure::new + ( + | storage : Struct1FormerStorage, context | { 2 * ( storage.int_1.unwrap() + context.unwrap() ) } + ), + ) + .int_1( 13 ) + .form(); + a_id!( got, 32 ); + + // custom params with into + let got = Struct1Former + // ::< Struct1FormerDefinition< i32, i32, former::FormingEndClosure< Struct1FormerDefinitionTypes< i32, i32 > > > > + :: + < + + Struct1FormerDefinition< i32, i32, former::FormingEndClosure< Struct1FormerDefinitionTypes< i32, i32 > > > + > + ::begin + ( + None, + Some( 3 ), + ( + | storage : Struct1FormerStorage, context : Option< i32 > | { 2 * ( storage.int_1.unwrap() + context.unwrap() ) } + ).into(), + ) + .int_1( 13 ) + .form(); + a_id!( got, 32 ); + + } + + // + + fn new_coercing() + { + + // basic case + let former = Struct1::former(); + let former2 = Struct1Former::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > >::new( former::ReturnPreformed ); + a_id!( ::std::mem::size_of_val( &former ), ::std::mem::size_of_val( &former2 ) ); + let exp = former.form(); + let got = former2.form(); + a_id!( got, exp ); + + // default explicit params + let got = Struct1Former + ::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > > + ::new_coercing( former::ReturnPreformed ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // default explicit params with wrapper + fn f1( storage : Struct1FormerStorage, _context : Option< () > ) -> Struct1 + { + former::StoragePreform::preform( storage ) + } + let end_wrapper : former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > = former::FormingEndClosure::new( f1 ); + let got = Struct1Former + // ::< Struct1FormerDefinition< (), Struct1, former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > > > + :: + < + Struct1FormerDefinition< (), Struct1, former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > > + > + ::new_coercing( end_wrapper ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // default explicit params with wrapper and closure + let got = Struct1Former + // ::< Struct1FormerDefinition< (), Struct1, former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > > > + :: + < + + Struct1FormerDefinition< (), Struct1, former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > > + > + ::new_coercing( former::FormingEndClosure::new( | storage, _context | { former::StoragePreform::preform( storage ) } ) ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // default explicit params with wrapper and closure, auto types + let got = Struct1Former + // ::< Struct1FormerDefinition< _, _, former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > > > + :: + < + Struct1FormerDefinition< (), Struct1, former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > > + > + ::new_coercing( former::FormingEndClosure::new( | storage, _context : Option< () > | { former::StoragePreform::preform( storage ) } ) ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + } + + // + + fn new() + { + + // basic case + let former = Struct1::former(); + let former2 = Struct1Former::< Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > >::new( former::ReturnPreformed ); + a_id!( ::std::mem::size_of_val( &former ), ::std::mem::size_of_val( &former2 ) ); + let exp = former.form(); + let got = former2.form(); + a_id!( got, exp ); + + // default explicit params + let got = Struct1Former + // ::< Struct1FormerDefinition< (), Struct1, _ > > + :: + < + + Struct1FormerDefinition< (), Struct1, _ >, + > + ::new( former::ReturnPreformed ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // default explicit params with wrapper + fn f1( storage : Struct1FormerStorage, _context : Option< () > ) -> Struct1 + { + former::StoragePreform::preform( storage ) + } + let end_wrapper : former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > = former::FormingEndClosure::new( f1 ); + let got = Struct1Former + // ::< Struct1FormerDefinition< (), Struct1, _ > > + :: + < + Struct1FormerDefinition< (), Struct1, _ >, + > + ::new( end_wrapper ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // + + // default explicit params with wrapper and closure + let got = Struct1Former + // ::< Struct1FormerWithClosure< (), Struct1 > > + :: + < + Struct1FormerDefinition< (), Struct1, _ > + > + ::new( | storage, _context | { former::StoragePreform::preform( storage ) } ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // + + // default explicit params with wrapper and closure + let got = Struct1Former + // ::< Struct1FormerDefinition< (), Struct1, _ > > + :: + < + Struct1FormerDefinition< (), Struct1, _ >, + > + ::new( former::FormingEndClosure::new( | storage, _context | { former::StoragePreform::preform( storage ) } ) ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + // default explicit params with wrapper and closure, auto types + let got = Struct1Former + // ::< Struct1FormerDefinition< _, _, _ > > + :: + < + Struct1FormerDefinition< _, _, _ >, + > + ::new( former::FormingEndClosure::new( | storage, _context : Option< () > | { former::StoragePreform::preform( storage ) } ) ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + } + + // + + fn preform() + { + + // formation should have method preform + let got = Struct1::former().preform(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // storage should have method preform + let got = the_module::StoragePreform::preform( Struct1::former().storage ); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // storage should have method preform + use the_module::StoragePreform; + let got = Struct1::former().storage.preform(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + } + + // + + fn definition() + { + + // default is implemented for definition + let _default = Struct1FormerDefinition::< (), Struct1, former::ReturnPreformed >::default(); + // let _default = Struct1FormerDefinition::default(); // why does not work? + + // definition types exists and has Formed + let got = < Struct1FormerDefinitionTypes< (), Struct1 > as the_module::FormerDefinitionTypes >::Formed::former().form(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // definition types exists and has Formed + let got = < Struct1FormerDefinitionTypes< (), Struct1 > as the_module::FormerDefinitionTypes >::Formed::former().form(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // definition types exists and has Storage + use former::StoragePreform; + let got = < Struct1FormerDefinitionTypes< (), Struct1 > as the_module::FormerDefinitionTypes >::Storage + ::preform( Struct1::former().storage ); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // definition exists and has Storage + let got = < < Struct1FormerDefinition< (), Struct1, former::ReturnPreformed > as the_module::FormerDefinition >::Types as the_module::FormerDefinitionTypes >::Formed + ::former().form(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + } + + // + + fn storage() + { + + // definition exists and has Storage + let got = < Struct1FormerStorage as the_module::StoragePreform >::preform( Struct1::former().storage ); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // default is implemented for Storage + let got = Struct1FormerStorage::default().preform(); + let exp = Struct1::former().storage.preform(); + a_id!( got, exp ); + + // definition exists and has Storage + use former::StoragePreform; + let got = Struct1::former().storage.preform(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // storage exists + let got = < Struct1FormerStorage as the_module::Storage >::Preformed::former().form(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + } + + // + + fn test_int() + { + + // test.case( "basic" ); + + let command = Struct1::former() + .int_1( 13 ) + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + int_1 : 13, + }; + a_id!( command, expected ); + + // test.case( "rewriting" ); + + // should_throw( || + // { + // let _command = Struct1::former() + // .int_1( 1 ) + // .int_1( 3 ) + // .form(); + // Ok( () ) + // })?; + } + + // + + fn test_underscored_form() + { + // test.case( "basic" ); + let command = Struct1::former() + .int_1( 13 ) + .form(); + + let expected = Struct1 + { + int_1 : 13, + }; + a_id!( command, expected ); + } + + // + + +} + +// + +tests_index! +{ + internals, + entity_to, + former_begin, + custom_definition_params, + begin_coercing, + begin, + new_coercing, + new, + preform, + definition, + storage, + test_int, + test_underscored_form, +} diff --git a/module/core/former/tests/inc/former_tests/only_test/collections_with_subformer.rs b/module/core/former/tests/inc/former_tests/only_test/collections_with_subformer.rs new file mode 100644 index 0000000000..3765e3eb92 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/collections_with_subformer.rs @@ -0,0 +1,365 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + + // + + fn internals() + { + + // test.case( "vector : construction" ); + + // fields + let former = Struct1::former(); + a_id!( former.storage.vec_1, None ); + a_id!( former.storage.hashmap_1, None ); + a_id!( former.storage.hashset_1, None ); + a_id!( former.context, None ); + + // form + let got = Struct1::former().form(); + let exp = Struct1::default(); + a_id!( got, exp ); + + // preform + let got = Struct1::former().preform(); + let exp = Struct1::default(); + a_id!( got, exp ); + + // perform + let got = Struct1::former().perform(); + let exp = Struct1::default(); + a_id!( got, exp ); + + // end + let got = Struct1::former().end(); + let exp = Struct1::default(); + a_id!( got, exp ); + + } + + // + + fn new() + { + + // former with explicit definition + let former = Struct1::former(); + a_id!( print!( "{:?}", former.on_end ), print!( "{:?}", Some( the_module::ReturnPreformed ) ) ); + let former2 = Struct1Former::< Struct1FormerDefinition >::new_coercing( former::ReturnPreformed ); + a_id!( ::std::mem::size_of_val( &former ), ::std::mem::size_of_val( &former2 ) ); + + // default parameters + let former = Struct1::former(); + let former2 : Struct1Former = Struct1Former::new_coercing( former::ReturnPreformed ); + a_id!( ::std::mem::size_of_val( &former ), ::std::mem::size_of_val( &former2 ) ); + + // closure without helper + let got : Struct1 = Struct1Former + ::< Struct1FormerDefinition< _, _, former::FormingEndClosure< Struct1FormerDefinitionTypes< (), Struct1 > > > > + ::new_coercing( | storage : Struct1FormerStorage, _context | { former::StoragePreform::preform( storage ) } ) + .vec_1().replace( collection_tools::vec![ "a".to_string(), "b".to_string() ] ).end() + .form(); + let exp : Struct1 = Struct1 + { + vec_1 : collection_tools::vec![ "a".to_string(), "b".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( got, exp ); + + // closure with helper + let got : Struct1 = Struct1Former + ::< Struct1FormerDefinition< (), Struct1, _ > > + ::new( | storage, _context | { former::StoragePreform::preform( storage ) } ) + .vec_1().replace( collection_tools::vec![ "a".to_string(), "b".to_string() ] ).end() + .form(); + let exp : Struct1 = Struct1 + { + vec_1 : collection_tools::vec![ "a".to_string(), "b".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( got, exp ); + + // // closure with helper + // let got : Struct1 = Struct1Former + // ::< Struct1FormerWithClosure< (), Struct1 > > + // ::new_coercing( | storage : Struct1FormerStorage, _context | { former::StoragePreform::preform( storage ) } ) + // .vec_1().replace( collection_tools::vec![ "a".to_string(), "b".to_string() ] ).end() + // .form(); + // let exp : Struct1 = Struct1 + // { + // vec_1 : collection_tools::vec![ "a".to_string(), "b".to_string() ], + // hashmap_1 : collection_tools::hmap!{}, + // hashset_1 : collection_tools::hset!{}, + // }; + // a_id!( got, exp ); + + // closure with helper + let got : Struct1 = Struct1Former + ::< Struct1FormerDefinition< (), Struct1, _ > > + ::begin( None, None, | storage, _context | { former::StoragePreform::preform( storage ) } ) + .vec_1().replace( collection_tools::vec![ "a".to_string(), "b".to_string() ] ).end() + .form(); + let exp : Struct1 = Struct1 + { + vec_1 : collection_tools::vec![ "a".to_string(), "b".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( got, exp ); + + } + + // + + fn field_forming_end() + { + + // Collection subformers are defined + let _got = Struct1SubformCollectionVec1End::< Struct1FormerDefinition >::default(); + let _got = Struct1SubformCollectionHashmap1End::< Struct1FormerDefinition >::default(); + let _got = Struct1SubformCollectionHashset1End::< Struct1FormerDefinition >::default(); + + // AsSubformerEnd is defined + fn _f1< End : Struct1AsSubformerEnd< Struct1Former > > + ( + _end : End, + _subformer : Struct1AsSubformer< Struct1Former, impl Struct1AsSubformerEnd< Struct1Former > > + ) + { + } + + } + + // + + fn test_vector() + { + + // test.case( "vector : implicit construction" ); + + let command = Struct1::former() + .vec_1().add( "ghi" ).add( "klm" ).end() + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![ "ghi".to_string(), "klm".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + + // test.case( "vector : replace" ); + + let command = Struct1::former() + .vec_1().replace( collection_tools::vec![ "a".to_string(), "bc".to_string(), "def".to_string() ] ).end() + .form(); + let expected = Struct1 + { + vec_1 : collection_tools::vec![ "a".to_string(), "bc".to_string(), "def".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + + let command = Struct1::former() + .vec_1().add( "x" ).replace( collection_tools::vec![ "a".to_string(), "bc".to_string(), "def".to_string() ] ).end() + .form(); + let expected = Struct1 + { + vec_1 : collection_tools::vec![ "a".to_string(), "bc".to_string(), "def".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + + // test.case( "vector : replace and add" ); + + let command = Struct1::former() + .vec_1().replace( collection_tools::vec![ "a".to_string(), "bc".to_string(), "def".to_string() ] ).add( "gh" ).end() + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![ "a".to_string(), "bc".to_string(), "def".to_string(), "gh".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + } + + // + + fn test_hashmap() + { + + // test.case( "implicit construction" ); + + let command = Struct1::former() + .hashmap_1().add( ( "k1".to_string(), "v1".to_string() ) ).add( ( "k2".to_string(), "v2".to_string() ) ).end() + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() }, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + + // test.case( "replace" ); + + let command = Struct1::former() + .hashmap_1().replace( collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() } ).end() + .form() + ; + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() }, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + + let command = Struct1::former() + .hashmap_1().add( ( "x".to_string(), "v1".to_string() ) ).replace( collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() } ).end() + .form() + ; + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() }, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + + // test.case( "replace and add" ); + + let command = Struct1::former() + .hashmap_1().replace( collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() } ) + .add( ( "k3".to_string(), "v3".to_string() ) ).end() + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string(), "k3".to_string() => "v3".to_string() }, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + } + + // + + fn test_hashset() + { + + // test.case( "implicit construction" ); + + let command = Struct1::former() + .hashset_1().add( "v1" ).add( "v2" ).end() + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{ "v1".to_string(), "v2".to_string() }, + }; + a_id!( command, expected ); + + // test.case( "replace" ); + + let command = Struct1::former() + .hashset_1().replace( collection_tools::hset!{ "v1".to_string(), "v2".to_string() } ).end() + .form() + ; + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{ "v1".to_string(), "v2".to_string() }, + }; + a_id!( command, expected ); + + let command = Struct1::former() + .hashset_1().add( "x" ).replace( collection_tools::hset!{ "v1".to_string(), "v2".to_string() } ).end() + .form() + ; + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{ "v1".to_string(), "v2".to_string() }, + }; + a_id!( command, expected ); + + // test.case( "replace and add" ); + + let command = Struct1::former() + .hashset_1().replace( collection_tools::hset!{ "v1".to_string(), "v2".to_string() } ).add( "v3" ).end() + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{ "v1".to_string(), "v2".to_string(), "v3".to_string() }, + }; + a_id!( command, expected ); + } + + // + + fn test_complex() + { + + let command = Struct1::former() + .vec_1().add( "ghi" ).add( "klm" ).end() + .hashmap_1().add( ( "k1".to_string(), "v1".to_string() ) ).add( ( "k2".to_string(), "v2".to_string() ) ).end() + .hashset_1().add( "k1" ).end() + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![ "ghi".to_string(), "klm".to_string() ], + hashmap_1 : collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() }, + hashset_1 : collection_tools::hset!{ "k1".to_string() }, + }; + a_id!( command, expected ); + + } + +} + +// + +tests_index! +{ + internals, + new, + field_forming_end, + test_vector, + test_hashmap, + test_hashset, + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/only_test/collections_without_subformer.rs b/module/core/former/tests/inc/former_tests/only_test/collections_without_subformer.rs new file mode 100644 index 0000000000..4b68747c33 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/collections_without_subformer.rs @@ -0,0 +1,161 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + + // + + fn internals() + { + + // test.case( "vector : construction" ); + + let former = Struct1::former(); + a_id!( former.storage.vec_1, None ); + a_id!( former.storage.hashmap_1, None ); + a_id!( former.storage.hashset_1, None ); + a_id!( former.context, None ); + a_id!( print!( "{:?}", former.on_end ), print!( "{:?}", Some( the_module::ReturnPreformed ) ) ); + let former2 = Struct1Former::< Struct1FormerDefinition >::new_coercing( the_module::ReturnPreformed ); + a_id!( ::std::mem::size_of_val( &former ), ::std::mem::size_of_val( &former2 ) ); + + let command = Struct1::former().form(); + a_id!( command.vec_1, Vec::< String >::new() ); + a_id!( command.hashmap_1, collection_tools::hmap!{} ); + a_id!( command.hashset_1, collection_tools::hset![] ); + + let command = Struct1::former().perform(); + a_id!( command.vec_1, Vec::< String >::new() ); + a_id!( command.hashmap_1, collection_tools::hmap!{} ); + a_id!( command.hashset_1, collection_tools::hset![] ); + + let command = Struct1::former().end(); + a_id!( command.vec_1, Vec::< String >::new() ); + a_id!( command.hashmap_1, collection_tools::hmap!{} ); + a_id!( command.hashset_1, collection_tools::hset![] ); + + } + + // + + fn test_vector() + { + + // test.case( "vector : construction" ); + + let command = Struct1::former() + .vec_1( collection_tools::vec![ "ghi".to_string(), "klm".to_string() ] ) + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![ "ghi".to_string(), "klm".to_string() ], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + } + + // + + fn test_hashmap() + { + + // test.case( "construction" ); + + let command = Struct1::former() + .hashmap_1( collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() } ) + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() }, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + } + + // + + fn test_hashset() + { + + // test.case( "construction" ); + let command = Struct1::former() + .hashset_1( collection_tools::hset!{ "v1".to_string(), "v2".to_string() } ) + .form() + ; + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{ "v1".to_string(), "v2".to_string() }, + }; + a_id!( command, expected ); + } + + // + + fn test_underscored_form() + { + // test.case( "basic" ); + let command = Struct1::former() + .form(); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![], + hashmap_1 : collection_tools::hmap!{}, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + } + + // + + fn test_complex() + { + let command = Struct1::former() + .vec_1( collection_tools::vec![ "ghi".to_string(), "klm".to_string() ] ) + .hashmap_1( collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() } ) + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + vec_1 : collection_tools::vec![ "ghi".to_string(), "klm".to_string() ], + hashmap_1 : collection_tools::hmap!{ "k1".to_string() => "v1".to_string(), "k2".to_string() => "v2".to_string() }, + hashset_1 : collection_tools::hset!{}, + }; + a_id!( command, expected ); + + #[ cfg( debug_assertions ) ] + println!( "Debugging enabled" ); + #[ cfg( not( debug_assertions ) ) ] + println!( "Debugging disabled" ); + } +} + +// + +tests_index! +{ + + internals, + test_vector, + test_hashmap, + test_hashset, + test_underscored_form, + test_complex, + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/parametrized_field.rs b/module/core/former/tests/inc/former_tests/only_test/parametrized_field.rs new file mode 100644 index 0000000000..7449ec7129 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/parametrized_field.rs @@ -0,0 +1,8 @@ + +#[ test ] +fn basic() +{ + let got = Child::< 'static, str >::former().name( "abc" ).arg( "arg1" ).end(); + let exp = Child::< 'static, str >{ name : "abc".into(), arg : "arg1" }; + a_id!( got, exp ); +} diff --git a/module/core/former/tests/inc/former_tests/only_test/parametrized_struct.rs b/module/core/former/tests/inc/former_tests/only_test/parametrized_struct.rs new file mode 100644 index 0000000000..e73d4d1d88 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/parametrized_struct.rs @@ -0,0 +1,69 @@ +#[ test ] +fn command_form() +{ + + // form + let got = Child::< &str >::former() + .name( "a" ) + .form(); + let exp = Child::< &str > + { + name : "a".to_string(), + properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + + // perform + let got = Child::< &str >::former() + .name( "a" ) + .perform(); + let exp = Child::< &str > + { + name : "a".to_string(), + properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + + // end + let got = Child::< &str >::former() + .name( "a" ) + .end(); + let exp = Child::< &str > + { + name : "a".to_string(), + properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + +} + +// + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn command_properties() +{ + + // with HashMapFormer + let got = Child::< &str >::former() + .name( "a" ) + .properties() + .add( ( "property1", Property::< &str >::new( "property1", 13isize ) ) ) + .add( ( "property2", Property::new( "property2", 13isize ) ) ) + .add( ( "property2", Property::new( "property2", 113isize ) ) ) + .end() + .form(); + let exp = Child::< &str > + { + name : "a".to_string(), + properties : collection_tools::hmap! + { + "property1" => Property::new( "property1", 13isize ), + "property2" => Property::new( "property2", 113isize ), + }, + // properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/primitives.rs b/module/core/former/tests/inc/former_tests/only_test/primitives.rs new file mode 100644 index 0000000000..c38fea9bf8 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/primitives.rs @@ -0,0 +1,241 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + + // + + fn api() + { + + // form + let command = Struct1::former().form(); + a_id!( command.int_1, 0 ); + a_id!( command.string_1, "".to_string() ); + a_id!( command.int_optional_1, None ); + a_id!( command.string_optional_1, None ); + + // end + let command = Struct1::former().end(); + a_id!( command.int_1, 0 ); + a_id!( command.string_1, "".to_string() ); + a_id!( command.int_optional_1, None ); + a_id!( command.string_optional_1, None ); + + // perform + let command = Struct1::former().perform(); + a_id!( command.int_1, 0 ); + a_id!( command.string_1, "".to_string() ); + a_id!( command.int_optional_1, None ); + a_id!( command.string_optional_1, None ); + + // formation should have method preform + let got = Struct1::former().preform(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // default explicit params with wrapper and closure + let got = Struct1Former + ::< Struct1FormerDefinition< (), Struct1, _ > > + ::new( | storage, _context | { former::StoragePreform::preform( storage ) } ) + .int_1( 13 ) + .form(); + let exp = Struct1::former().int_1( 13 ).form(); + a_id!( got, exp ); + + } + + // + + fn test_int() + { + + // test.case( "basic" ); + + let command = Struct1::former() + .int_1( 13 ) + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + int_1 : 13, + string_1 : "".to_string(), + int_optional_1 : None, + string_optional_1 : None, + }; + a_id!( command, expected ); + + // test.case( "rewriting" ); + + // should_throw( || + // { + // let _command = Struct1::former() + // .int_1( 1 ) + // .int_1( 3 ) + // .form(); + // Ok( () ) + // })?; + } + + // + + fn test_string() + { + + // test.case( "string : object" ); + + let command = Struct1::former() + .string_1( "Abcd".to_string() ) + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + int_1 : 0, + string_1 : "Abcd".to_string(), + int_optional_1 : None, + string_optional_1 : None, + }; + a_id!( command, expected ); + + // test.case( "string : slice" ); + + let command = Struct1::former() + .string_1( "Abcd" ) + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + int_1 : 0, + string_1 : "Abcd".to_string(), + int_optional_1 : None, + string_optional_1 : None, + }; + a_id!( command, expected ); + + // test.case( "string : rewriting" ); + + // should_throw( || + // { + // let _command = Struct1::former() + // .string_1( "dir1" ) + // .string_1( "dir2" ) + // .form(); + // Ok( () ) + // })?; + } + + // + + fn test_optional_string() + { + + // test.case( "basic" ); + + let command = Struct1::former() + .string_optional_1( "dir1" ) + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + int_1 : 0, + string_1 : "".to_string(), + int_optional_1 : None, + string_optional_1 : Some( "dir1".to_string() ), + }; + a_id!( command, expected ); + + // test.case( "none" ); + + let command = Struct1::former() + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + int_1 : 0, + string_1 : "".to_string(), + int_optional_1 : None, + string_optional_1 : None, + }; + a_id!( command, expected ); + + // test.case( "optional : rewriting" ); + + // should_throw( || + // { + // let _command = Struct1::former() + // .string_optional_1( "dir1" ) + // .string_optional_1( "dir2" ) + // .form(); + // Ok( () ) + // })?; + } + + // + + fn test_underscored_form() + { + // test.case( "basic" ); + let command = Struct1::former() + .int_1( 13 ) + .form(); + + let expected = Struct1 + { + int_1 : 13, + string_1 : "".to_string(), + int_optional_1 : None, + string_optional_1 : None, + }; + a_id!( command, expected ); + } + + // + + fn test_complex() + { + let command = Struct1::former() + .int_1( 13 ) + .string_1( "Abcd".to_string() ) + // .vec_1().push( "ghi" ).push( "klm" ).end() + // .hashmap_1().insert( "k1", "v1" ).insert( "k2", "v2" ).end() + .string_optional_1( "dir1" ) + .form(); + // dbg!( &command ); + + let expected = Struct1 + { + int_1 : 13, + string_1 : "Abcd".to_string(), + int_optional_1 : None, + string_optional_1 : Some( "dir1".to_string() ), + }; + a_id!( command, expected ); + + #[ cfg( debug_assertions ) ] + println!( "Debugging enabled" ); + #[ cfg( not( debug_assertions ) ) ] + println!( "Debugging disabled" ); + } + +} + +// + +tests_index! +{ + api, + + test_int, + test_string, + test_optional_string, + test_underscored_form, + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/only_test/scalar_children.rs b/module/core/former/tests/inc/former_tests/only_test/scalar_children.rs new file mode 100644 index 0000000000..d8b3084d8f --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/scalar_children.rs @@ -0,0 +1,23 @@ + +#[ test ] +fn scalar() +{ + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let got = Parent::former() + .children( children ) + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/scalar_children3.rs b/module/core/former/tests/inc/former_tests/only_test/scalar_children3.rs new file mode 100644 index 0000000000..2d0c840078 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/scalar_children3.rs @@ -0,0 +1,23 @@ + +#[ test ] +fn scalar() +{ + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let got = Parent::former() + .children3( children ) + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/string_slice.rs b/module/core/former/tests/inc/former_tests/only_test/string_slice.rs new file mode 100644 index 0000000000..2ed7eb90c5 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/string_slice.rs @@ -0,0 +1,101 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +// + +tests_impls! +{ + + + // + + fn api() + { + + // form + let command = Struct1::former().form(); + a_id!( command.string_slice_1, "" ); + + // end + let command = Struct1::former().end(); + a_id!( command.string_slice_1, "" ); + + // perform + let command = Struct1::former().perform(); + a_id!( command.string_slice_1, "" ); + + // formation should have method preform + let got = Struct1::former().preform(); + let exp = Struct1::former().form(); + a_id!( got, exp ); + + // default explicit params with wrapper and closure + let got = Struct1Former + ::< Struct1FormerDefinition< (), Struct1, _ > > + ::new( | storage, _context | { former::StoragePreform::preform( storage ) } ) + .string_slice_1( "abc" ) + .form(); + let exp = Struct1::former().string_slice_1( "abc" ).form(); + a_id!( got, exp ); + + // closure with helper + let got : Struct1 = Struct1Former + ::< Struct1FormerDefinition< (), Struct1, _ > > + ::begin( None, None, | storage, _context | { former::StoragePreform::preform( storage ) } ) + .string_slice_1( "abc" ) + .form(); + let exp = Struct1::former().string_slice_1( "abc" ).form(); + a_id!( got, exp ); + + } + + // + + fn test_complex() + { + // test.case( "default" ); + + let command = Struct1::former().form(); + let expected = Struct1 + { + string_slice_1 : "", + }; + a_id!( command, expected ); + + // test.case( "from slice" ); + + let command = Struct1::former() + .string_slice_1( "abc" ) + .form(); + let expected = Struct1 + { + string_slice_1 : "abc", + }; + a_id!( command, expected ); + +// // test.case( "from string" ); +// +// let command = Struct1::former() +// .string_slice_1( "abc".to_string() ) +// .form(); +// let expected = Struct1 +// { +// string_slice_1 : "abc", +// }; +// a_id!( command, expected ); + + } + + // + +} + +// + +tests_index! +{ + api, + test_complex, +} diff --git a/module/core/former/tests/inc/former_tests/only_test/subform_basic.rs b/module/core/former/tests/inc/former_tests/only_test/subform_basic.rs new file mode 100644 index 0000000000..e235a46b9d --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/subform_basic.rs @@ -0,0 +1,169 @@ +// let ca = wca::ChildsParent::former() +// .command_with_closure( "echo" ) +// .name( "prints all subjects and properties" ) +// .subject( "Subject", wca::Type::String, true ) +// .property( "property", "simple property", wca::Type::String, true ) +// .routine( f1 ) +// .perform() +// .command_with_closure( "exit" ) +// .name( "just exit" ) +// .routine( || exit() ) +// .perform() +// .perform() +// ; +// ca.execute( input ).unwrap(); + +// qqq : for Anton : zzz : here and in all similar tests remove `#[ cfg( not( feature = "use_alloc" ) ) ]` -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn command_with_closure() +{ + + let got = Child::< &str >::former() + .name( "a" ) + .subject( "b" ) + .form(); + let exp = Child::< &str > + { + name : "a".to_string(), + subject : "b".to_string(), + properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + + let got = Child::< &str >::former() + .name( "a" ) + .subject( "b" ) + .perform(); + let exp = Child::< &str > + { + name : "a".to_string(), + subject : "b".to_string(), + properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + + let got = Child::< &str >::former() + .name( "a" ) + .subject( "b" ) + .end(); + let exp = Child::< &str > + { + name : "a".to_string(), + subject : "b".to_string(), + properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + +} + +// + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn command_properties() +{ + + // with helper + let got = Child::< &str >::former() + .name( "a" ) + .subject( "b" ) + .property( "property1", "simple property", 13isize ) + .property( "property2", "simple property 2", 13isize ) + .property( "property2", "simple property 3", 113isize ) + .form(); + let exp = Child::< &str > + { + name : "a".to_string(), + subject : "b".to_string(), + properties : collection_tools::hmap! + { + "property1" => Property::new( "property1", "simple property", 13isize ), + "property2" => Property::new( "property2", "simple property 3", 113isize ), + }, + // properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + + // with HashMapFormer + let got = Child::< &str >::former() + .name( "a" ) + .subject( "b" ) + .properties() + .add( ( "property1", Property::new( "property1", "simple property", 13isize ) ) ) + .add( ( "property2", Property::new( "property2", "simple property 2", 13isize ) ) ) + .add( ( "property2", Property::new( "property2", "simple property 3", 113isize ) ) ) + .end() + .form(); + let exp = Child::< &str > + { + name : "a".to_string(), + subject : "b".to_string(), + properties : collection_tools::hmap! + { + "property1" => Property::new( "property1", "simple property", 13isize ), + "property2" => Property::new( "property2", "simple property 3", 113isize ), + }, + // properties : collection_tools::HashMap::< &str, Property< &str > >::new(), + }; + a_id!( got, exp ); + +} + +// + +// qqq : zzz : remove #[ cfg( not( feature = "use_alloc" ) ) ] -- done +// #[ cfg( not( feature = "use_alloc" ) ) ] +#[ test ] +fn aggregator() +{ + + // with helper + let got = Parent::< &str >::former() + .parameter1( "p1" ) + .commands().add( ( "name1".to_string(), ChildFormer::< &str >::new_coercing( former::ReturnPreformed ).name( "name1" ).subject( "s" ).end() ) ).end() + .form() + ; + + let name1 = Child::< &str > + { + name : "name1".to_string(), + subject : "s".to_string(), + properties : collection_tools::hmap!{}, + }; + let exp = Parent + { + parameter1 : "p1".to_string(), + commands : collection_tools::hmap!{ "name1".to_string() => name1 }, + }; + dbg!( &got ); + dbg!( &exp ); + a_id!( got, exp ); + +} + +// + +#[ test ] +fn aggregator_alternative_form() +{ + + let exp = Parent::< &str >::former() + .parameter1( "p1" ) + .form() + ; + + let got = Parent::< &str >::former() + .parameter1( "p1" ) + .perform() + ; + a_id!( got, exp ); + + let got = Parent::< &str >::former() + .parameter1( "p1" ) + .end() + ; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/subform_collection.rs b/module/core/former/tests/inc/former_tests/only_test/subform_collection.rs new file mode 100644 index 0000000000..2c32c32ba8 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/subform_collection.rs @@ -0,0 +1,21 @@ + +#[ test ] +fn basic() +{ + + let got = Parent::former() + .children() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/subform_collection_children2.rs b/module/core/former/tests/inc/former_tests/only_test/subform_collection_children2.rs new file mode 100644 index 0000000000..84f0132ed7 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/subform_collection_children2.rs @@ -0,0 +1,21 @@ + +#[ test ] +fn collection() +{ + + let got = Parent::former() + .children2() + .add( Child::former().name( "a" ).form() ) + .add( Child::former().name( "b" ).form() ) + .end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/subform_entry_child.rs b/module/core/former/tests/inc/former_tests/only_test/subform_entry_child.rs new file mode 100644 index 0000000000..a94acc77a6 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/subform_entry_child.rs @@ -0,0 +1,38 @@ + +#[ test ] +fn child() +{ + + let got = Parent::former() + .child( "a" ).end() + .child( "b" ).end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} + +#[ test ] +fn _child() +{ + + let got = Parent::former() + ._child().name( "a" ).end() + ._child().name( "b" ).end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/subform_entry_children2.rs b/module/core/former/tests/inc/former_tests/only_test/subform_entry_children2.rs new file mode 100644 index 0000000000..e21b9d8da0 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/subform_entry_children2.rs @@ -0,0 +1,19 @@ + +#[ test ] +fn subform() +{ + + let got = Parent::former() + .children2( "a" ).end() + .children2( "b" ).end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : false }, + Child { name : "b".to_string(), data : false }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/only_test/subform_scalar.rs b/module/core/former/tests/inc/former_tests/only_test/subform_scalar.rs new file mode 100644 index 0000000000..90ba084724 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/only_test/subform_scalar.rs @@ -0,0 +1,13 @@ + +#[ test ] +fn subforme_scalar() +{ + + let got = Parent::former() + .child().name( "a" ).data( true ).end() + .form(); + + let exp = Parent { child : Child { name : "a".to_string(), data : true } }; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/parametrized_field.rs b/module/core/former/tests/inc/former_tests/parametrized_field.rs new file mode 100644 index 0000000000..fce1a22818 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/parametrized_field.rs @@ -0,0 +1,20 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +/// Parameter description. +#[ allow( explicit_outlives_requirements ) ] +#[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Child< 'child, T : ?Sized + 'child > +{ + name : String, + arg : &'child T, +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/parametrized_field.rs" ); diff --git a/module/core/former/tests/inc/former_tests/parametrized_field_where.rs b/module/core/former/tests/inc/former_tests/parametrized_field_where.rs new file mode 100644 index 0000000000..baaaed538f --- /dev/null +++ b/module/core/former/tests/inc/former_tests/parametrized_field_where.rs @@ -0,0 +1,22 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +/// Parameter description. +#[ allow( explicit_outlives_requirements ) ] +#[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Child< 'child, T > +where + T : ?Sized + 'child, +{ + name : String, + arg : &'child T, +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/parametrized_field.rs" ); diff --git a/module/core/former/tests/inc/former_tests/parametrized_slice.rs b/module/core/former/tests/inc/former_tests/parametrized_slice.rs new file mode 100644 index 0000000000..70466144db --- /dev/null +++ b/module/core/former/tests/inc/former_tests/parametrized_slice.rs @@ -0,0 +1,15 @@ +use super::*; + +#[ derive( Debug, PartialEq, former::Former ) ] +// #[ derive( Debug, PartialEq, former::Former ) ] #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Struct1< 'a > +{ + pub string_slice_1 : &'a str, +} + +// === begin_coercing of generated + +// === end of generated + +include!( "./only_test/string_slice.rs" ); diff --git a/module/core/former/tests/inc/former_tests/parametrized_slice_manual.rs b/module/core/former/tests/inc/former_tests/parametrized_slice_manual.rs new file mode 100644 index 0000000000..6b9632f366 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/parametrized_slice_manual.rs @@ -0,0 +1,268 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq ) ] +pub struct Struct1< 'a > +{ + pub string_slice_1 : &'a str, +} + +// === begin_coercing of generated + +#[ automatically_derived ] +impl< 'a > Struct1< 'a > +{ + + #[ inline( always ) ] + pub fn former() -> Struct1Former< 'a > + { + Struct1Former::new_coercing( former::ReturnPreformed ) + } +} + +// = definition types + +#[ derive( Debug ) ] +// pub struct Struct1FormerDefinitionTypes< 'a, Context = (), Formed = Struct1< 'a > > +pub struct Struct1FormerDefinitionTypes< 'a, Context, Formed > +{ + _phantom : core::marker::PhantomData< ( &'a(), Context, Formed ) >, +} + +impl< 'a, Context, Formed > Default for Struct1FormerDefinitionTypes< 'a, Context, Formed > +{ + fn default() -> Self + { + Self { _phantom : core::marker::PhantomData, } + } +} + +impl< 'a, Context, Formed > former::FormerDefinitionTypes +for Struct1FormerDefinitionTypes< 'a, Context, Formed > +{ + type Storage = Struct1FormerStorage< 'a >; + type Formed = Formed; + type Context = Context; +} + +// = former mutator + +impl< 'a, Context, Formed > former::FormerMutator +for Struct1FormerDefinitionTypes< 'a, Context, Formed > +{ +} + +// = definition + +#[ derive( Debug ) ] +// pub struct Struct1FormerDefinition< 'a, Context = (), Formed = Struct1< 'a >, End = former::ReturnPreformed > +pub struct Struct1FormerDefinition< 'a, Context, Formed, End > +{ + _phantom : core::marker::PhantomData< ( &'a(), Context, Formed, End ) >, +} + +impl< 'a, Context, Formed, End > Default for Struct1FormerDefinition< 'a, Context, Formed, End > +{ + fn default() -> Self + { + Self { _phantom : core::marker::PhantomData, } + } +} + +impl< 'a, Context, Formed, End > former::FormerDefinition +for Struct1FormerDefinition< 'a, Context, Formed, End > +where + End : former::FormingEnd< Struct1FormerDefinitionTypes< 'a, Context, Formed > > +{ + type Types = Struct1FormerDefinitionTypes< 'a, Context, Formed >; + type End = End; + type Storage = Struct1FormerStorage< 'a >; + type Formed = Formed; + type Context = Context; +} + +// pub type Struct1FormerWithClosure< 'a, Context, Formed > = +// Struct1FormerDefinition< 'a, Context, Formed, former::FormingEndClosure< Struct1FormerDefinitionTypes< 'a, Context, Formed > > >; + +// = storage + +pub struct Struct1FormerStorage< 'a > +{ + pub string_slice_1 : ::core::option::Option< &'a str >, +} + +impl< 'a > ::core::default::Default for Struct1FormerStorage< 'a > +{ + #[ inline( always ) ] + fn default() -> Self + { + Self { string_slice_1 : ::core::option::Option::None, } + } +} + +impl< 'a > former::Storage for Struct1FormerStorage< 'a > +{ + type Preformed = Struct1< 'a >; +} + +impl< 'a > former::StoragePreform for Struct1FormerStorage< 'a > +{ + // type Preformed = Struct1< 'a >; + + fn preform( mut self ) -> Self::Preformed + // fn preform( mut self ) -> < Self as former::Storage >::Formed + // fn preform( mut self ) -> Struct1< 'a > + { + let string_slice_1 = if self.string_slice_1.is_some() + { + self.string_slice_1.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default( self : & Self ) -> T + { + panic!( "Field 'string_slice_1' isn't initialized" ) + } + } + + impl< T > MaybeDefault< T > for & ::core::marker::PhantomData< T > {} + impl< T > MaybeDefault< T > for ::core::marker::PhantomData< T > + where T : ::core::default::Default, + { + fn maybe_default( self : & Self ) -> T { T::default() } + } + + (& ::core::marker::PhantomData::< &'a str >).maybe_default() + } + }; + let result = Struct1 { string_slice_1, }; + return result; + } +} + +// = former + +pub struct Struct1Former< 'a, Definition = Struct1FormerDefinition< 'a, (), Struct1< 'a >, former::ReturnPreformed > > +where + // End : former::FormingEnd::< Definition::Types >, + // Definition : former::FormerDefinition< End = End >, + // Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage< 'a >, Formed = Formed, Context = Context >, + Definition : former::FormerDefinition, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage< 'a > >, +{ + storage : Definition::Storage, + context : core::option::Option< Definition::Context >, + on_end : core::option::Option< Definition::End >, +} + +#[ automatically_derived ] +impl< 'a, Definition > Struct1Former< 'a, Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage< 'a > >, + // Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage< 'a > >, +{ + + #[ inline( always ) ] + pub fn perform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let result = self.form(); + return result; + } + + #[ inline( always ) ] + pub fn new( on_end : Definition::End ) -> Self + { + Self::begin_coercing( None, None, on_end ) + } + + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >( end : IntoEnd ) -> Self + where IntoEnd : Into< Definition::End >, + { + Self::begin_coercing( None, None, end, ) + } + + #[ inline( always ) ] + pub fn begin + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : < Definition as former::FormerDefinition >::End, + ) -> Self + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( on_end ), + } + } + + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd > + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : IntoEnd, + ) -> Self + where IntoEnd : ::core::convert::Into< < Definition as former::FormerDefinition >::End >, + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( ::core::convert::Into::into( on_end ) ), + } + } + + #[ inline( always ) ] + pub fn form( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + self.end() + } + + #[ inline( always ) ] + pub fn end( mut self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let on_end = self.on_end.take().unwrap(); + let context = self.context.take(); + former::FormingEnd::< Definition::Types >::call( & on_end, self.storage, context ) + } + + #[ inline ] + pub fn string_slice_1< Src >( mut self, src : Src ) -> Self + where Src : ::core::convert::Into< &'a str >, + { + debug_assert!( self.storage.string_slice_1.is_none() ); + self.storage.string_slice_1 = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + } +} + +impl< 'a, Definition > Struct1Former< 'a, Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage< 'a >, Formed = Struct1< 'a > >, + // Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage< 'a >, Formed = Struct1< 'a > >, + Definition::Storage : former::StoragePreform< Preformed = Struct1< 'a > >, +{ + pub fn preform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + // panic!(); + former::StoragePreform::preform( self.storage ) + } +} + +// === end of generated + +include!( "./only_test/string_slice.rs" ); diff --git a/module/core/former/tests/inc/former_tests/parametrized_struct_imm.rs b/module/core/former/tests/inc/former_tests/parametrized_struct_imm.rs new file mode 100644 index 0000000000..8ffd7ad762 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/parametrized_struct_imm.rs @@ -0,0 +1,39 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, Default ) ] +pub struct Property< Name > +{ + name : Name, + code : isize, +} + +/// generated by new +impl< Name > Property< Name > +{ + #[ inline ] + pub fn new< Code >( name : Name, code : Code ) -> Self + where + Name : core::convert::Into< Name >, + Code : core::convert::Into< isize >, + { + Self { name : name.into(), code : code.into() } + } +} + +#[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ derive( Debug, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Child< K : core::hash::Hash + std::cmp::Eq > +{ + pub name : String, + #[ subform_collection( definition = former::HashMapDefinition ) ] + pub properties : collection_tools::HashMap< K, Property< K > >, +} + +// == begin_coercing of generated + +// == end of generated + +include!( "./only_test/parametrized_struct.rs" ); diff --git a/module/core/former/tests/inc/former_tests/parametrized_struct_manual.rs b/module/core/former/tests/inc/former_tests/parametrized_struct_manual.rs new file mode 100644 index 0000000000..efab5306c5 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/parametrized_struct_manual.rs @@ -0,0 +1,371 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, Default ) ] +pub struct Property< Name > +{ + name : Name, + code : isize, +} + +/// generated by new +impl< Name > Property< Name > +{ + #[ inline ] + pub fn new< Code >( name : Name, code : Code ) -> Self + where + Name : core::convert::Into< Name >, + Code : core::convert::Into< isize >, + { + Self { name : name.into(), code : code.into() } + } +} + +// #[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ derive( Debug, PartialEq, the_module::Former ) ] #[ debug ] +#[ derive( Debug, PartialEq ) ] +pub struct Child< K > +where + K : core::hash::Hash + std::cmp::Eq, +{ + pub name : String, + // #[ subform_collection( definition = former::HashMapDefinition ) ] + pub properties : collection_tools::HashMap< K, Property< K > >, +} + +// == begin_coercing of generated + +#[ automatically_derived ] +impl< K, > Child< K, > where K : core :: hash :: Hash + std :: cmp :: Eq, +{ + + + + #[ inline( always ) ] + pub fn former() -> ChildFormer< K, ChildFormerDefinition< K, (), Child< K, >, former :: ReturnPreformed > > + { + ChildFormer + :: + < K, ChildFormerDefinition< K, (), Child< K, >, former :: ReturnPreformed > > + :: new( former :: ReturnPreformed ) + } +} + +#[ derive( Debug ) ] +pub struct ChildFormerDefinitionTypes< K, __Context = (), __Formed = Child< K, >, > +where K : core :: hash :: Hash + std :: cmp :: Eq, +{ + _phantom : core :: marker :: PhantomData< ( K, __Context, __Formed ) >, +} + +impl< K, __Context, __Formed, > :: core :: default :: Default +for ChildFormerDefinitionTypes< K, __Context, __Formed, > +where + K : core :: hash :: Hash + std :: cmp :: Eq, +{ + fn default() -> Self + { + Self + { + _phantom : core :: marker :: PhantomData, + } + } +} + +impl< K, __Context, __Formed, > former :: FormerDefinitionTypes +for ChildFormerDefinitionTypes< K, __Context, __Formed, > +where + K : core :: hash :: Hash + std :: cmp :: Eq, +{ + type Storage = ChildFormerStorage< K, >; + type Formed = __Formed; + type Context = __Context; +} + +impl< K, Context, Formed > former::FormerMutator +for ChildFormerDefinitionTypes< K, Context, Formed > +where + K : core :: hash :: Hash + std :: cmp :: Eq, +{ +} + +#[ derive( Debug ) ] +pub struct ChildFormerDefinition +< K, __Context = (), __Formed = Child< K, >, __End = former :: ReturnPreformed, > +where + K : core :: hash :: Hash + std :: cmp :: Eq, +{ + _phantom : core :: marker :: PhantomData< ( K, __Context, __Formed, __End ) >, +} + +impl< K, __Context, __Formed, __End, > :: core :: default :: Default +for ChildFormerDefinition< K, __Context, __Formed, __End, > +where + K : core :: hash :: Hash + std :: cmp :: Eq, +{ + fn default() -> Self + { + Self + { + _phantom : core :: marker :: PhantomData, + } + } +} + +impl< K, __Context, __Formed, __End, > former :: FormerDefinition +for ChildFormerDefinition< K, __Context, __Formed, __End, > +where + __End : former :: FormingEnd< ChildFormerDefinitionTypes< K, __Context, __Formed, > >, + K : core :: hash :: Hash + std :: cmp :: Eq, +{ + type Types = ChildFormerDefinitionTypes< K, __Context, __Formed, >; + type End = __End; + type Storage = ChildFormerStorage< K, >; + type Formed = __Formed; + type Context = __Context; +} + +// pub type ChildFormerWithClosure< K, __Context, __Formed, > = ChildFormerDefinition< K, __Context, __Formed, former :: FormingEndClosure< ChildFormerDefinitionTypes< K, __Context, __Formed, > > >; + +pub struct ChildFormerStorage< K, > where K : core :: hash :: Hash + std :: cmp :: Eq, +{ + + pub name : :: core :: option :: Option< String >, + + pub properties : :: core :: option :: Option< collection_tools :: HashMap< K, Property< K > > >, +} + +impl< K, > :: core :: default :: Default for ChildFormerStorage< K, > where K : core :: hash :: Hash + std :: cmp :: Eq, +{ + #[ inline( always ) ] + fn default() -> Self + { + Self + { + name : :: core :: option :: Option :: None, + properties : :: core :: option :: Option :: None, + } + } +} + +impl< K, > former :: Storage for ChildFormerStorage< K, > where K : core :: hash :: Hash + std :: cmp :: Eq, +{ + type Preformed = Child< K, >; +} + +impl< K, > former :: StoragePreform for ChildFormerStorage< K, > where K : core :: hash :: Hash + std :: cmp :: Eq, +{ + // type Preformed = Child< K, >; + + fn preform( mut self ) -> Self::Preformed + // fn preform( mut self ) -> < Self as former :: Storage > :: Formed + { + let name = if self.name.is_some() + { + self.name.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default( self : & Self ) -> T + { + panic!( "Field 'name' isn't initialized" ) + } + } + impl< T > MaybeDefault< T > for & :: core :: marker :: PhantomData< T > {} + impl< T > MaybeDefault< T > for :: core :: marker :: PhantomData< T > where T : :: core :: default :: Default, + { + fn maybe_default( self : & Self ) -> T { T :: default() } + } + ( & :: core :: marker :: PhantomData :: < String > ).maybe_default() + } + }; + + let properties = if self.properties.is_some() + { + self.properties.take().unwrap() + } + else + { + { + trait MaybeDefault< T > + { + fn maybe_default( self : & Self ) -> T + { + panic!( "Field 'properties' isn't initialized" ) + } + } + impl< T > MaybeDefault< T > for & :: core :: marker :: PhantomData< T > {} + impl< T > MaybeDefault< T > for :: core :: marker :: PhantomData< T > where T : :: core :: default :: Default, + { + fn maybe_default( self : & Self ) -> T { T :: default() } + } + ( & :: core :: marker :: PhantomData :: < collection_tools :: HashMap< K, Property< K > > > ).maybe_default() + } + }; + + let result = Child :: < K, > { name, properties, }; + return result; + } +} + +pub struct ChildFormer< K, Definition = ChildFormerDefinition< K, (), Child< K, >, former::ReturnPreformed >, > +where + K : core::hash::Hash + std::cmp::Eq, + Definition : former::FormerDefinition< Storage = ChildFormerStorage< K, > >, + // Definition::Types : former::FormerDefinitionTypes< Storage = ChildFormerStorage< K, > > +{ + storage : Definition::Storage, + context : core::option::Option< Definition::Context >, + on_end : core::option::Option< Definition::End >, +} + +#[ automatically_derived ] +impl< K, Definition, > ChildFormer< K, Definition, > +where + K : core::hash::Hash + std::cmp::Eq, + Definition : former::FormerDefinition< Storage = ChildFormerStorage< K, > > + // Definition::Types : former::FormerDefinitionTypes< Storage = ChildFormerStorage< K, > >, +{ + + #[ inline( always ) ] + pub fn perform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let result = self.form(); + return result; + } + + #[ inline( always ) ] + pub fn new( on_end : Definition::End ) -> Self + { + Self::begin_coercing( None, None, on_end ) + } + + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >( end : IntoEnd ) -> Self + where IntoEnd : Into< Definition::End > + { + Self::begin_coercing( None, None, end ) + } + + #[ inline( always ) ] + pub fn begin( mut storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : < Definition as former::FormerDefinition >::End, ) -> Self + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( on_end ), + } + } + + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd > + ( + mut storage : core::option::Option< Definition::Storage >, context : core::option::Option< Definition::Context >, on_end : IntoEnd, + ) + -> Self + where + IntoEnd : ::core::convert::Into< < Definition as former::FormerDefinition >::End > + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( ::core::convert::Into::into( on_end ) ), + } + } + + #[ inline( always ) ] + pub fn form( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + self.end() + } + + #[ inline( always ) ] + pub fn end( mut self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let on_end = self.on_end.take().unwrap(); + let context = self.context.take(); + former::FormingEnd::< Definition::Types >::call( &on_end, self.storage, context ) + } + + #[ inline ] + pub fn name< Src >( mut self, src : Src ) -> Self + where Src : ::core::convert::Into< String > + { + debug_assert!( self.storage.name.is_none() ); + self.storage.name = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + } + + #[ inline( always ) ] + pub fn properties_set< Former2 >( self ) -> Former2 + where Former2 : former::FormerBegin< former::HashMapDefinition< K, Property< K >, Self, Self, ChildFormerPropertiesEnd, > > + { + Former2::former_begin( None, Some( self ), ChildFormerPropertiesEnd ) + } + + #[ inline( always ) ] + pub fn properties( self ) -> former::CollectionFormer::< ( K, Property< K >, ), former::HashMapDefinition< K, Property< K >, Self, Self, ChildFormerPropertiesEnd > > + { + self.properties_set::< former::CollectionFormer::< ( K, Property< K >, ), former::HashMapDefinition< K, Property< K >, Self, Self, ChildFormerPropertiesEnd > >>() + } +} + +// + +impl< K, Definition, > ChildFormer< K, Definition, > +where + K : core::hash::Hash + std::cmp::Eq, + Definition : former::FormerDefinition< Storage = ChildFormerStorage< K, >, Formed = Child< K, > >, + // Definition::Types : former::FormerDefinitionTypes< Storage = ChildFormerStorage< K, >, Formed = Child< K, > >, + Definition::Storage : former::StoragePreform< Preformed = Child< K, > > +{ + pub fn preform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + former::StoragePreform::preform( self.storage ) + } +} + +#[ allow( non_camel_case_types ) ] +pub struct ChildFormerPropertiesEnd; + +#[ automatically_derived ] +impl< K, Definition, > former::FormingEnd< former::HashMapDefinitionTypes< K, Property< K >, ChildFormer< K, Definition, >, ChildFormer< K, Definition, > >, > +for ChildFormerPropertiesEnd +where + K : core::hash::Hash + std::cmp::Eq, + Definition : former::FormerDefinition< Storage = ChildFormerStorage< K, > >, + // Definition::Types : former::FormerDefinitionTypes< Storage = ChildFormerStorage< K, > >, +{ + #[ inline( always ) ] + fn call( &self, storage : collection_tools::HashMap< K, Property< K > >, super_former : Option< ChildFormer< K, Definition, > >, ) -> ChildFormer< K, Definition, > + { + let mut super_former = super_former.unwrap(); + if let Some( ref mut field ) = super_former.storage.properties + { + former::CollectionAssign::assign( field, storage ); + } + else + { + super_former.storage.properties = Some( storage ); + } + super_former + } +} + +// == end of generated + +include!( "./only_test/parametrized_struct.rs" ); diff --git a/module/core/former/tests/inc/former_tests/parametrized_struct_where.rs b/module/core/former/tests/inc/former_tests/parametrized_struct_where.rs new file mode 100644 index 0000000000..b45429c63c --- /dev/null +++ b/module/core/former/tests/inc/former_tests/parametrized_struct_where.rs @@ -0,0 +1,41 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, Default ) ] +pub struct Property< Name > +{ + name : Name, + code : isize, +} + +/// generated by new +impl< Name > Property< Name > +{ + #[ inline ] + pub fn new< Code >( name : Name, code : Code ) -> Self + where + Name : core::convert::Into< Name >, + Code : core::convert::Into< isize >, + { + Self { name : name.into(), code : code.into() } + } +} + +#[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ derive( Debug, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Child< K > +where + K : core::hash::Hash + std::cmp::Eq, +{ + pub name : String, + #[ subform_collection( definition = former::HashMapDefinition ) ] + pub properties : collection_tools::HashMap< K, Property< K > >, +} + +// == begin_coercing of generated + +// == end of generated + +include!( "./only_test/parametrized_struct.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_all.rs b/module/core/former/tests/inc/former_tests/subform_all.rs new file mode 100644 index 0000000000..6a4cd78a03 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_all.rs @@ -0,0 +1,56 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ scalar( name = children3 ) ] + #[ subform_collection( name = children2 ) ] + #[ subform_entry( name = _child ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn child( self, name : &str ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< ChildFormer< _ >, _, >() + .name( name ) + } + + #[ inline( always ) ] + pub fn children( self ) -> &'static str + { + r#" + Scalar setter `children` should not be generated by default if subform is used. + It can only be generated if req + "# + } + +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_entry_child.rs" ); +include!( "./only_test/subform_collection_children2.rs" ); +include!( "./only_test/scalar_children3.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_all_parametrized.rs b/module/core/former/tests/inc/former_tests/subform_all_parametrized.rs new file mode 100644 index 0000000000..8d85935a66 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_all_parametrized.rs @@ -0,0 +1,134 @@ +#![ allow( dead_code ) ] +#[ allow( unused_imports ) ] +use super::*; + +/// Parameter description. +#[ allow( explicit_outlives_requirements ) ] +#[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ derive( Debug, PartialEq ) ] +pub struct Child< 'child, T > +where + T : 'child + ?Sized, +{ + name : String, + data : &'child T, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent< 'child > +{ + #[ scalar( name = children3 ) ] + #[ subform_collection( name = children2 ) ] + #[ subform_entry( name = _child ) ] + children : Vec< Child< 'child, str > >, +} + +impl< 'child, Definition > ParentFormer< 'child, Definition > +where + Definition : former::FormerDefinition< Storage = < Parent< 'child > as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn child( self, name : &str ) -> + ChildAsSubformer< 'child, str, Self, impl ChildAsSubformerEnd< 'child, str, Self > > + { + self._children_subform_entry + ::< ChildFormer< '_, _, _ >, _, >() + .name( name ) + } + +} + +// == begin of generated + +// == end of generated + +#[ test ] +fn subform_child() +{ + + let got = Parent::former() + .child( "a" ).data( "aa" ).end() + .child( "b" ).data( "bb" ).end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : "aa" }, + Child { name : "b".to_string(), data : "bb" }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} + +#[ test ] +fn subform_child_generated() +{ + + let got = Parent::former() + ._child().name( "a" ).data( "aa" ).end() + ._child().name( "b" ).data( "bb" ).end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : "aa" }, + Child { name : "b".to_string(), data : "bb" }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} + +#[ test ] +fn collection() +{ + + let got = Parent::former() + .children2() + .add( Child::former().name( "a" ).data( "aa" ).form() ) + .add( Child::former().name( "b" ).data( "bb" ).form() ) + .end() + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : "aa" }, + Child { name : "b".to_string(), data : "bb" }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} + + +#[ test ] +fn scalar() +{ + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : "aa" }, + Child { name : "b".to_string(), data : "bb" }, + ]; + let got = Parent::former() + .children3( children ) + .form(); + + let children = collection_tools::vec! + [ + Child { name : "a".to_string(), data : "aa" }, + Child { name : "b".to_string(), data : "bb" }, + ]; + let exp = Parent { children }; + a_id!( got, exp ); + +} + +// include!( "./only_test/subform_entry_child.rs" ); +// include!( "./only_test/subform_collection_children2.rs" ); +// include!( "./only_test/subform_scalar_children3.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_all_private.rs b/module/core/former/tests/inc/former_tests/subform_all_private.rs new file mode 100644 index 0000000000..df7f1e4738 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_all_private.rs @@ -0,0 +1,56 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +struct Parent +{ + #[ scalar( name = children3 ) ] + #[ subform_collection( name = children2 ) ] + #[ subform_entry( name = _child ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + fn child( self, name : &str ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< ChildFormer< _ >, _, >() + .name( name ) + } + + #[ inline( always ) ] + fn children( self ) -> &'static str + { + r#" + Scalar setter `children` should not be generated by default if subform is used. + It can only be generated if req + "# + } + +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_entry_child.rs" ); +include!( "./only_test/subform_collection_children2.rs" ); +include!( "./only_test/scalar_children3.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection.rs b/module/core/former/tests/inc/former_tests/subform_collection.rs new file mode 100644 index 0000000000..782cc7f213 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection.rs @@ -0,0 +1,27 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_collection( definition = former::VectorDefinition ) ] + children : Vec< Child >, +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_collection.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_basic.rs b/module/core/former/tests/inc/former_tests/subform_collection_basic.rs new file mode 100644 index 0000000000..5ea8dc2e47 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_basic.rs @@ -0,0 +1,26 @@ +#![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use super::*; + +// use std::collections::HashMap; +// use std::collections::HashSet; + +#[ derive( Default, Debug, PartialEq, former::Former ) ] +// #[ derive( Default, Debug, PartialEq, former::Former ) ] #[ debug ] +// #[ derive( Default, Debug, PartialEq ) ] +pub struct Struct1 +{ + #[ subform_collection( definition = former::VectorDefinition ) ] + vec_1 : Vec< String >, + #[ subform_collection( definition = former::HashMapDefinition ) ] + hashmap_1 : collection_tools::HashMap< String, String >, + #[ subform_collection( definition = former::HashSetDefinition ) ] + hashset_1 : collection_tools::HashSet< String >, +} + +// == generated begin + +// == generated end + +include!( "./only_test/collections_with_subformer.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_basic_manual.rs b/module/core/former/tests/inc/former_tests/subform_collection_basic_manual.rs new file mode 100644 index 0000000000..314bace671 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_basic_manual.rs @@ -0,0 +1,670 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Default, Debug, PartialEq ) ] +pub struct Struct1 +{ + vec_1 : Vec< String >, + hashmap_1 : collection_tools::HashMap< String, String >, + hashset_1 : collection_tools::HashSet< String >, +} + +// == begin of generated + +#[automatically_derived] +impl< > Struct1< > +where +{ + + #[ inline( always ) ] + pub fn former() -> Struct1Former< + Struct1FormerDefinition<(), Struct1<>, former::ReturnPreformed> + > + { + Struct1Former::< Struct1FormerDefinition< (), Struct1<>, former::ReturnPreformed > >::new_coercing(former::ReturnPreformed) + } +} + +impl< Definition > former::EntityToFormer< Definition > +for Struct1< > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage<> >, +{ + type Former = Struct1Former< Definition >; +} + +impl< > former::EntityToStorage for Struct1< > +where +{ + type Storage = Struct1FormerStorage<>; +} + +#[derive(Debug)] +pub struct Struct1FormerDefinitionTypes< Context = (), Formed = Struct1<>, > +where +{ + _phantom : core::marker::PhantomData<(Context, Formed)>, +} + +impl< Context, Formed, > core::default::Default +for Struct1FormerDefinitionTypes< Context, Formed, > +where +{ + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +impl< Context, Formed, > former::FormerDefinitionTypes +for Struct1FormerDefinitionTypes< Context, Formed, > +where +{ + type Storage = Struct1FormerStorage<>; + type Formed = Formed; + type Context = Context; +} + +impl< Context, Formed > former::FormerMutator +for Struct1FormerDefinitionTypes< Context, Formed > +{ +} + +#[derive(Debug)] +pub struct Struct1FormerDefinition< Context = (), Formed = Struct1<>, End = former::ReturnPreformed, > +where +{ + _phantom : core::marker::PhantomData<(Context, Formed, End)>, +} + +impl< Context, Formed, End, > core::default::Default for Struct1FormerDefinition< Context, Formed, End, > +where +{ + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +impl< Context, Formed, End, > former::FormerDefinition for Struct1FormerDefinition< Context, Formed, End, > +where + End : former::FormingEnd< Struct1FormerDefinitionTypes< Context, Formed, > >, +{ + type Types = Struct1FormerDefinitionTypes< Context, Formed, >; + type End = End; + type Storage = Struct1FormerStorage<>; + type Formed = Formed; + type Context = Context; +} + + +pub struct Struct1FormerStorage<> +where +{ + + pub vec_1 : core::option::Option>, + + pub hashmap_1 : core::option::Option>, + + pub hashset_1 : core::option::Option>, +} + +impl< > core::default::Default for Struct1FormerStorage<> +where +{ + #[ inline( always ) ] + fn default() -> Self + { + Self + { + vec_1 : core::option::Option::None, + hashmap_1 : core::option::Option::None, + hashset_1 : core::option::Option::None, + } + } +} + +impl< > former::Storage for Struct1FormerStorage<> +where +{ + type Preformed = Struct1<>; +} + +impl< > former::StoragePreform for Struct1FormerStorage<> +where +{ + // type Preformed = Struct1<>; + + fn preform(mut self) -> Self::Preformed + { + let vec_1 = if self.vec_1.is_some() + { + self.vec_1.take().unwrap() + } + else + { + { + trait MaybeDefault + { + fn maybe_default(self: &Self) -> T + { + panic!("Field 'vec_1' isn't initialized") + } + } + + impl MaybeDefault for &core::marker::PhantomData {} + + impl MaybeDefault for core::marker::PhantomData + where + T : core::default::Default, + { + fn maybe_default(self: &Self) -> T + { + T::default() + } + } + + (&core::marker::PhantomData::>).maybe_default() + } + }; + + let hashmap_1 = if self.hashmap_1.is_some() + { + self.hashmap_1.take().unwrap() + } + else + { + { + trait MaybeDefault + { + fn maybe_default(self: &Self) -> T + { + panic!("Field 'hashmap_1' isn't initialized") + } + } + + impl MaybeDefault for &core::marker::PhantomData {} + + impl MaybeDefault for core::marker::PhantomData + where + T : core::default::Default, + { + fn maybe_default(self: &Self) -> T + { + T::default() + } + } + + (&core::marker::PhantomData::>).maybe_default() + } + }; + + let hashset_1 = if self.hashset_1.is_some() + { + self.hashset_1.take().unwrap() + } + else + { + { + trait MaybeDefault + { + fn maybe_default(self: &Self) -> T + { + panic!("Field 'hashset_1' isn't initialized") + } + } + + impl MaybeDefault for &core::marker::PhantomData {} + + impl MaybeDefault for core::marker::PhantomData + where + T : core::default::Default, + { + fn maybe_default(self: &Self) -> T + { + T::default() + } + } + + (&core::marker::PhantomData::>).maybe_default() + } + }; + + let result = Struct1::<> + { + vec_1, hashmap_1, hashset_1, + }; + + return result; + } +} + +pub struct Struct1Former< Definition = Struct1FormerDefinition<(), Struct1<>, former::ReturnPreformed>, > +where + Definition : former::FormerDefinition, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage<> >, +{ + storage : ::Storage, + context : core::option::Option<::Context>, + on_end : core::option::Option, +} + +#[automatically_derived] +impl< Definition, > Struct1Former< Definition, > +where + Definition : former::FormerDefinition, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage<> >, +{ + + + + #[ inline( always ) ] + pub fn new(on_end: Definition::End) -> Self + { + Self::begin_coercing(None, None, on_end) + } + + + + + #[ inline( always ) ] + pub fn new_coercing(end: IntoEnd) -> Self + where + IntoEnd : Into, + { + Self::begin_coercing(None, None, end,) + } + + + + + #[ inline( always ) ] + pub fn begin(mut storage: core::option::Option<::Storage>, context: core::option::Option<::Context>, on_end: ::End,) -> Self + { + if storage.is_none() + { + storage = Some(core::default::Default::default()); + } + Self + { + storage: storage.unwrap(), + context: context, + on_end: core::option::Option::Some(on_end), + } + } + + + + + #[ inline( always ) ] + pub fn begin_coercing(mut storage: core::option::Option<::Storage>, context: core::option::Option<::Context>, on_end: IntoEnd,) -> Self + where + IntoEnd : core::convert::Into<::End>, + { + if storage.is_none() + { + storage = Some(core::default::Default::default()); + } + Self + { + storage: storage.unwrap(), + context: context, + on_end: core::option::Option::Some(core::convert::Into::into(on_end)), + } + } + + + + + #[ inline( always ) ] + pub fn form(self) -> ::Formed + { + self.end() + } + + #[ inline( always ) ] + pub fn end(mut self) -> ::Formed + { + let on_end = self.on_end.take().unwrap(); + let context = self.context.take(); + former::FormingEnd::::call(&on_end, self.storage, context) + } + + #[ inline( always ) ] + pub fn _vec_1_assign< Former2 >( self ) -> Former2 + where + Former2 : former::FormerBegin + < + former::VectorDefinition< String, Self, Self, Struct1SubformCollectionVec1End< Definition > >, + >, + former::VectorDefinition< String, Self, Self, Struct1SubformCollectionVec1End< Definition > > : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < collection_tools::Vec< String > as former::Collection >::Entry >, + Storage = Vec< String >, + Context = Struct1Former< Definition >, + End = Struct1SubformCollectionVec1End< Definition >, + >, + Struct1SubformCollectionVec1End< Definition > : former::FormingEnd + < + < collection_tools::Vec< String > as former::EntityToDefinitionTypes< Self, Self > >::Types + >, + { + Former2::former_begin( None, Some( self ), Struct1SubformCollectionVec1End::< Definition >::default() ) + } + + #[ inline( always ) ] + pub fn vec_1( self ) -> former::CollectionFormer:: + < + String, + former::VectorDefinition< String, Self, Self, Struct1SubformCollectionVec1End< Definition > >, + > + where + former::VectorDefinition< String, Self, Self, Struct1SubformCollectionVec1End< Definition > > : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < collection_tools::Vec< String > as former::Collection >::Entry >, + Storage = Vec< String >, + Context = Struct1Former< Definition >, + End = Struct1SubformCollectionVec1End< Definition >, + >, + Struct1SubformCollectionVec1End< Definition > : former::FormingEnd + < + < collection_tools::Vec< String > as former::EntityToDefinitionTypes< Self, Self > >::Types + >, + { + self._vec_1_assign::< former::CollectionFormer:: + < + String, + former::VectorDefinition< String, Self, Self, Struct1SubformCollectionVec1End< Definition > >, + > > () + } + + #[ inline( always ) ] + pub fn _hashmap_1_assign< Former2 >( self ) -> Former2 + where + Former2 : former::FormerBegin + < + former::HashMapDefinition< String, String, Self, Self, Struct1SubformCollectionHashmap1End< Definition > >, + >, + former::HashMapDefinition< String, String, Self, Self, Struct1SubformCollectionHashmap1End< Definition > > : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < collection_tools::HashMap< String, String > as former::Collection >::Entry >, + Storage = collection_tools::HashMap< String, String >, + Context = Struct1Former< Definition >, + End = Struct1SubformCollectionHashmap1End< Definition >, + >, + Struct1SubformCollectionHashmap1End< Definition > : former::FormingEnd + < + < collection_tools::HashMap< String, String > as former::EntityToDefinitionTypes< Self, Self > >::Types + >, + { + Former2::former_begin( None, Some( self ), Struct1SubformCollectionHashmap1End::< Definition >::default() ) + } + + #[ inline( always ) ] + pub fn hashmap_1( self ) -> former::CollectionFormer:: + < + ( String, String ), + former::HashMapDefinition< String, String, Self, Self, Struct1SubformCollectionHashmap1End< Definition > >, + > + where + former::HashMapDefinition< String, String, Self, Self, Struct1SubformCollectionHashmap1End< Definition > > : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < collection_tools::HashMap< String, String > as former::Collection >::Entry >, + Storage = collection_tools::HashMap< String, String >, + Context = Struct1Former< Definition >, + End = Struct1SubformCollectionHashmap1End< Definition >, + >, + Struct1SubformCollectionHashmap1End< Definition > : former::FormingEnd + < + < collection_tools::HashMap< String, String > as former::EntityToDefinitionTypes< Self, Self > >::Types + >, + { + self._hashmap_1_assign::< former::CollectionFormer:: + < + ( String, String ), + former::HashMapDefinition< String, String, Self, Self, Struct1SubformCollectionHashmap1End< Definition > >, + > > () + } + + #[ inline( always ) ] + pub fn _hashset_1_assign< Former2 >( self ) -> Former2 + where + Former2 : former::FormerBegin + < + former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > >, + >, + former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > > : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < collection_tools::HashSet< String > as former::Collection >::Entry >, + Storage = collection_tools::HashSet< String >, + Context = Struct1Former< Definition >, + End = Struct1SubformCollectionHashset1End< Definition >, + >, + Struct1SubformCollectionHashset1End< Definition > : former::FormingEnd + < + < collection_tools::HashSet< String > as former::EntityToDefinitionTypes< Self, Self > >::Types + >, + { + Former2::former_begin( None, Some( self ), Struct1SubformCollectionHashset1End::< Definition >::default() ) + } + + #[ inline( always ) ] + pub fn hashset_1( self ) -> former::CollectionFormer:: + < + String, + former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > >, + > + where + former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > > : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < collection_tools::HashSet< String > as former::Collection >::Entry >, + Storage = collection_tools::HashSet< String >, + Context = Struct1Former< Definition >, + End = Struct1SubformCollectionHashset1End< Definition >, + >, + Struct1SubformCollectionHashset1End< Definition > : former::FormingEnd + < + < collection_tools::HashSet< String > as former::EntityToDefinitionTypes< Self, Self > >::Types + >, + { + self._hashset_1_assign::< former::CollectionFormer:: + < + String, + former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > >, + > > () + } + +} + +impl< Definition, > Struct1Former< Definition, > +where + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage<>, Formed = Struct1<> >, + Definition : former::FormerDefinition, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage<> >, +{ + pub fn preform(self) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + former::StoragePreform::preform(self.storage) + } +} + +impl< Definition, > Struct1Former< Definition, > +where + Definition : former::FormerDefinition, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage<>, Formed = Struct1<> >, +{ + + #[ inline( always ) ] + pub fn perform(self) -> ::Formed + { + let result = self.form(); + return result; + } +} + +impl< Definition > former::FormerBegin< Definition > for Struct1Former< Definition, > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage<> >, +{ + #[ inline( always ) ] + fn former_begin(storage: core::option::Option, context: core::option::Option, on_end: Definition::End,) -> Self + { + debug_assert!(storage.is_none()); + Self::begin(None, context, on_end) + } +} + +#[ allow( dead_code ) ] +pub type Struct1AsSubformer< Superformer, End > = Struct1Former +< + Struct1FormerDefinition< Superformer, Superformer, End, >, +>; + +#[ allow( dead_code ) ] +pub trait Struct1AsSubformerEnd +where Self : former::FormingEnd< Struct1FormerDefinitionTypes, > +{} + +impl Struct1AsSubformerEnd for T +where + Self : former::FormingEnd< Struct1FormerDefinitionTypes, >, +{} + +// = former assign end + +pub struct Struct1SubformCollectionVec1End< Definition > +{ + _phantom : core::marker::PhantomData< ( Definition, ) >, +} + +impl Default for Struct1SubformCollectionVec1End< Definition > +{ + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +// Struct1Former< Definition = Struct1FormerDefinition<(), Struct1<>, former::ReturnPreformed>, > + +impl< Definition > former::FormingEnd +< + former::VectorDefinitionTypes< String, Struct1Former< Definition >, Struct1Former< Definition > > +> +for Struct1SubformCollectionVec1End< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage >, +{ + #[ inline( always ) ] + fn call( &self, storage : collection_tools::Vec< String >, super_former : Option< Struct1Former< Definition > > ) + -> Struct1Former< Definition, > + { + let mut super_former = super_former.unwrap(); + if let Some( ref mut field ) = super_former.storage.vec_1 + { + former::CollectionAssign::assign( field, storage ); + } + else + { + super_former.storage.vec_1 = Some( storage ); + } + super_former + } +} + +pub struct Struct1SubformCollectionHashmap1End +{ + _phantom : core::marker::PhantomData<(Definition,)>, +} + +impl Default for Struct1SubformCollectionHashmap1End +{ + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +impl< Definition, > former::FormingEnd +< former::HashMapDefinitionTypes< String, String, Struct1Former< Definition >, Struct1Former< Definition > > > +for Struct1SubformCollectionHashmap1End< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage >, +{ + #[ inline( always ) ] + fn call( &self, storage : collection_tools::HashMap< String, String >, super_former : Option< Struct1Former< Definition > > ) + -> Struct1Former< Definition, > + { + let mut super_former = super_former.unwrap(); + if let Some( ref mut field ) = super_former.storage.hashmap_1 + { + former::CollectionAssign::assign( field, storage ); + } + else + { + super_former.storage.hashmap_1 = Some( storage ); + } + super_former + } +} + +pub struct Struct1SubformCollectionHashset1End +{ + _phantom : core::marker::PhantomData<(Definition,)>, +} + +impl Default for Struct1SubformCollectionHashset1End +{ + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +impl< Definition, > former::FormingEnd +< former::HashSetDefinitionTypes< String, Struct1Former< Definition >, Struct1Former< Definition > > > +for Struct1SubformCollectionHashset1End< Definition > +where + Definition : former::FormerDefinition< Storage = Struct1FormerStorage >, + Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage >, +{ + #[ inline( always ) ] + fn call( &self, storage : collection_tools::HashSet< String >, super_former : Option< Struct1Former< Definition >, > ) + -> Struct1Former< Definition, > + { + let mut super_former = super_former.unwrap(); + if let Some( ref mut field ) = super_former.storage.hashset_1 + { + former::CollectionAssign::assign( field, storage ); + } + else + { + super_former.storage.hashset_1 = Some( storage ); + } + super_former + } +} + +// == end of generated + +include!( "./only_test/collections_with_subformer.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_basic_scalar.rs b/module/core/former/tests/inc/former_tests/subform_collection_basic_scalar.rs new file mode 100644 index 0000000000..cf35e3dc49 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_basic_scalar.rs @@ -0,0 +1,23 @@ +#![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use super::*; + +use collection_tools::HashMap; +use collection_tools::HashSet; + +#[ derive( Debug, PartialEq, the_module::Former ) ] +// #[ derive( Debug, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Struct1 +{ + vec_1 : Vec< String >, + hashmap_1 : HashMap< String, String >, + hashset_1 : HashSet< String >, +} + +// = begin_coercing of generated + +// == end of generated + +include!( "./only_test/collections_without_subformer.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_custom.rs b/module/core/former/tests/inc/former_tests/subform_collection_custom.rs new file mode 100644 index 0000000000..c5a4f910eb --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_custom.rs @@ -0,0 +1,264 @@ +#![ deny( missing_docs ) ] +#![ allow( dead_code ) ] + +use super::*; +use collection_tools::HashSet; + +// == define custom collections + +// Custom collection that logs additions +#[ derive( Debug, PartialEq ) ] +pub struct LoggingSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + set : HashSet< K >, +} + +impl< K > Default for LoggingSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + + #[ inline( always ) ] + fn default() -> Self + { + Self + { + set : Default::default() + } + } + +} + +impl< K > IntoIterator for LoggingSet< K > +where + K : std::cmp::Eq + std::hash::Hash, +{ + type Item = K; + type IntoIter = collection_tools::hset::IntoIter< K >; + + fn into_iter( self ) -> Self::IntoIter + { + self.set.into_iter() + } +} + +impl<'a, K> IntoIterator for &'a LoggingSet< K > +where + K : std::cmp::Eq + std::hash::Hash, +{ + type Item = &'a K; + type IntoIter = collection_tools::hset::Iter< 'a, K >; + + fn into_iter( self ) -> Self::IntoIter + { + self.set.iter() + } +} + +impl< K > former::Collection for LoggingSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + type Entry = K; + type Val = K; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e + } + +} + +impl< K > former::CollectionAdd for LoggingSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.set.insert( e ) + } + +} + +impl< K > former::CollectionAssign for LoggingSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.set.len(); + self.set.extend( elements ); + self.set.len() - initial_len + } +} + +impl< K > former::CollectionValToEntry< K > for LoggingSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + type Entry = K; + #[ inline( always ) ] + fn val_to_entry( val : K ) -> Self::Entry + { + val + } +} + +// = storage + +impl< K > former::Storage +for LoggingSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Preformed = LoggingSet< K >; +} + +impl< K > former::StoragePreform +for LoggingSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition types + +#[ derive( Debug, Default ) ] +pub struct LoggingSetDefinitionTypes< K, Context = (), Formed = LoggingSet< K > > +{ + _phantom : core::marker::PhantomData< ( K, Context, Formed ) >, +} + +impl< K, Context, Formed > former::FormerDefinitionTypes +for LoggingSetDefinitionTypes< K, Context, Formed > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Storage = LoggingSet< K >; + type Formed = Formed; + type Context = Context; +} + +// = definition + +#[ derive( Debug, Default ) ] +pub struct LoggingSetDefinition< K, Context = (), Formed = LoggingSet< K >, End = former::ReturnStorage > +{ + _phantom : core::marker::PhantomData< ( K, Context, Formed, End ) >, +} + +impl< K, Context, Formed, End > former::FormerDefinition +for LoggingSetDefinition< K, Context, Formed, End > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : former::FormingEnd< LoggingSetDefinitionTypes< K, Context, Formed > >, +{ + type Storage = LoggingSet< K >; + type Formed = Formed; + type Context = Context; + + type Types = LoggingSetDefinitionTypes< K, Context, Formed >; + type End = End; +} + +// = mutator + +impl< K, Context, Formed > former::FormerMutator +for LoggingSetDefinitionTypes< K, Context, Formed > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ +} + +// = Entity To + +impl< K, Definition > former::EntityToFormer< Definition > for LoggingSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + Definition : former::FormerDefinition + < + Storage = LoggingSet< K >, + Types = LoggingSetDefinitionTypes + < + K, + < Definition as former::FormerDefinition >::Context, + < Definition as former::FormerDefinition >::Formed, + >, + >, + Definition::End : former::FormingEnd< Definition::Types >, +{ + type Former = LoggingSetAsSubformer< K, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< K > former::EntityToStorage +for LoggingSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Storage = LoggingSet< K >; +} + +impl< K, Context, Formed, End > former::EntityToDefinition< Context, Formed, End > +for LoggingSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : former::FormingEnd< LoggingSetDefinitionTypes< K, Context, Formed > >, +{ + type Definition = LoggingSetDefinition< K, Context, Formed, End >; + type Types = LoggingSetDefinitionTypes< K, Context, Formed >; +} + +impl< K, Context, Formed > former::EntityToDefinitionTypes< Context, Formed > +for LoggingSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Types = LoggingSetDefinitionTypes< K, Context, Formed >; +} + +// = subformer + +pub type LoggingSetAsSubformer< K, Context, Formed, End > = +former::CollectionFormer::< K, LoggingSetDefinition< K, Context, Formed, End > >; + +// == use custom collection + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Parent +{ + #[ subform_collection ] + children : LoggingSet< i32 >, +} + +// == begin of generated + +// == end of generated + +#[ test ] +fn basic() +{ + + // Using the builder pattern provided by Former to manipulate Parent + let parent = Parent::former() + .children() + .add(10) + .add(20) + .add(10) + .end() + .form(); + + println!("Got: {:?}", parent); + +} diff --git a/module/core/former/tests/inc/former_tests/subform_collection_implicit.rs b/module/core/former/tests/inc/former_tests/subform_collection_implicit.rs new file mode 100644 index 0000000000..101e5cd210 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_implicit.rs @@ -0,0 +1,29 @@ +#![ deny( missing_docs ) ] +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + // #[ subform_collection( definition = former::VectorDefinition ) ] + #[ subform_collection ] + children : Vec< Child >, +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_collection.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_manual.rs b/module/core/former/tests/inc/former_tests/subform_collection_manual.rs new file mode 100644 index 0000000000..ee30f941b8 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_manual.rs @@ -0,0 +1,109 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + // #[ subform_collection( definition = former::VectorDefinition ) ] + #[ scalar( setter = false ) ] + children : Vec< Child >, +} + +// == begin of generated for Parent in context of attribute collection( former::VectorDefinition ) ] + +#[ automatically_derived ] +impl< Definition, > ParentFormer< Definition, > +where + Definition : former::FormerDefinition< Storage = ParentFormerStorage< > >, +{ + + #[ inline( always ) ] + pub fn _children_subform_collection< Former2 >( self ) -> Former2 + where + Former2 : former::FormerBegin< former::VectorDefinition< Child, Self, Self, ParentSubformCollectionChildrenEnd< Definition >, > >, + { + Former2::former_begin( None, Some( self ), ParentSubformCollectionChildrenEnd::< Definition >::default() ) + } + + #[ inline( always ) ] + pub fn children( self ) -> former::CollectionFormer:: + < + Child, + former::VectorDefinition< Child, Self, Self, ParentSubformCollectionChildrenEnd< Definition >, > + > + { + self._children_subform_collection::< former::CollectionFormer::< Child, former::VectorDefinition< Child, Self, Self, ParentSubformCollectionChildrenEnd< Definition >, > > >() + } + +} + +// + +#[ doc = r"Callback to return original former after forming of collection for `vec_1` is done. Callback replace content of collection assigning new content from subformer's storage." ] +pub struct ParentSubformCollectionChildrenEnd< Definition > +{ + _phantom : core::marker::PhantomData< ( Definition, ) >, +} + +impl< Definition > Default for ParentSubformCollectionChildrenEnd< Definition > +{ + + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + +} + +#[ automatically_derived ] +impl< Definition, > former::FormingEnd +< + < + Vec< Child > as former::EntityToDefinitionTypes< ParentFormer< Definition, >, ParentFormer< Definition, > > + >::Types +> +for ParentSubformCollectionChildrenEnd< Definition > +where + Definition : former::FormerDefinition< Storage = ParentFormerStorage< > >, +{ + #[ inline( always ) ] + fn call + ( + &self, + storage : Vec< Child >, + super_former : Option< ParentFormer< Definition, > >, + ) + -> ParentFormer< Definition, > + { + let mut super_former = super_former.unwrap(); + if let Some( ref mut field ) = super_former.storage.children + { + former::CollectionAssign::assign( field, storage ); + } + else + { + super_former.storage.children = Some( storage ); + } + super_former + } +} + +// == end of generated for Parent in context of attribute collection( former::VectorDefinition ) ] + +include!( "./only_test/subform_collection.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_named.rs b/module/core/former/tests/inc/former_tests/subform_collection_named.rs new file mode 100644 index 0000000000..1f06c4b6ea --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_named.rs @@ -0,0 +1,43 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_collection( name = children2 ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn children( self ) -> &'static str + { + r#" + Scalar setter `children` should not be generated by default if collection is used. + It can only be generated if req + "# + } + +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_collection_children2.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_playground.rs b/module/core/former/tests/inc/former_tests/subform_collection_playground.rs new file mode 100644 index 0000000000..0e3782a900 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_playground.rs @@ -0,0 +1,112 @@ +#![ deny( missing_docs ) ] +#![ allow( dead_code ) ] +use super::*; + +// +// this should work +// +// let ca = Parent::former() +// .parameter1( "val" ) +// .command( "echo" ) +// .name( "prints all subjects and properties" ) +// .subject( "Subject", wca::Type::String, true ) +// .property( "property", "simple property", wca::Type::String, true ) +// .routine( f1 ) +// .end() +// .command( "exit" ) +// .name( "just exit" ) +// .routine( || exit() ) +// .end() +// .perform() +// ; +// ca.execute( input ).unwrap(); + +// == property + +#[ derive( Debug, PartialEq, Default ) ] +pub struct Property< Name > +{ + name : Name, + description : String, + code : isize, +} + +// zzz : implement derive new +/// generated by new +impl< Name > Property< Name > +{ + #[ inline ] + pub fn new< Description, Code >( name : Name, description : Description, code : Code ) -> Self + where + Name : core::convert::Into< Name >, + Description : core::convert::Into< String >, + Code : core::convert::Into< isize >, + { + Self { name : name.into(), description : description.into(), code : code.into() } + } +} + +// == command + +#[ derive( Debug, PartialEq, the_module::Former ) ] +pub struct Child< K > +where + K : core::hash::Hash + std::cmp::Eq, +{ + pub name : String, + pub subject : String, + #[ subform_collection( definition = former::HashMapDefinition ) ] + pub properties : collection_tools::HashMap< K, Property< K > >, +} + +// manual +impl< K, Definition > ChildFormer< K, Definition > +where + K : core::hash::Hash + std::cmp::Eq, + Definition : former::FormerDefinition< Storage = ChildFormerStorage< K > >, + Definition::Storage : former::StoragePreform, +{ + + /// Inserts a key-value pair into the map. Make a new collection if it was not made so far. + #[ inline( always ) ] + pub fn property< Name, Description, Code > + ( mut self, name : Name, description : Description, code : Code ) -> Self + where + Name : core::convert::Into< K > + Clone, + Description : core::convert::Into< String >, + Code : core::convert::Into< isize >, + { + if self.storage.properties.is_none() + { + self.storage.properties = core::option::Option::Some( Default::default() ); + } + if let core::option::Option::Some( ref mut properties ) = self.storage.properties + { + let property = Property + { + name : name.clone().into(), + description : description.into(), + code : code.into(), + }; + properties.insert( name.into(), property ); + } + self + } + +} + +// == aggregator + +#[ derive( Debug, PartialEq, the_module::Former ) ] +pub struct Parent< K > +where + K : core::hash::Hash + std::cmp::Eq, +{ + pub parameter1 : String, + #[ subform_collection( definition = former::HashMapDefinition ) ] + pub commands : collection_tools::HashMap< String, Child< K > >, +} + +// == + +include!( "./only_test/subform_basic.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_setter_off.rs b/module/core/former/tests/inc/former_tests/subform_collection_setter_off.rs new file mode 100644 index 0000000000..fa01385e98 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_setter_off.rs @@ -0,0 +1,51 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_collection( setter = false ) ] + // #[ scalar( setter = false ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn children( self ) -> &'static str + { + r#" + Scalar setter `children` should not be generated by default if collection is used. + It can only be generated if req + "# + } + + #[ inline( always ) ] + pub fn children2( self ) -> former::CollectionFormer:: + < + Child, + former::VectorDefinition< Child, Self, Self, ParentSubformCollectionChildrenEnd< Definition >, > + > + { + self._children_subform_collection::< _ >() + } + +} + +include!( "./only_test/subform_collection_children2.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_collection_setter_on.rs b/module/core/former/tests/inc/former_tests/subform_collection_setter_on.rs new file mode 100644 index 0000000000..0f35a3c2a0 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_collection_setter_on.rs @@ -0,0 +1,45 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + // Such parameters switch off generation of front-end collection setter and switch on scalar setter. + // Without explicit scalar_setter( true ) scalar setter is not generated. + #[ subform_entry( setter = false ) ] + #[ scalar( setter = true ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn children2( self ) -> former::CollectionFormer:: + < + Child, + former::VectorDefinition< Child, Self, Self, ParentSubformCollectionChildrenEnd< Definition >, > + > + { + self._children_subform_collection::< _ >() + } + +} + +include!( "./only_test/subform_scalar_children.rs" ); +include!( "./only_test/subform_collection_children2.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_entry.rs b/module/core/former/tests/inc/former_tests/subform_entry.rs new file mode 100644 index 0000000000..063fec5dc4 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry.rs @@ -0,0 +1,49 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_entry( setter = false ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn child( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry::< ChildFormer< _ >, _, >() + .name( name ) + } + + #[ inline( always ) ] + pub fn _child( self ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + } + +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_entry_child.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_entry_hashmap.rs b/module/core/former/tests/inc/former_tests/subform_entry_hashmap.rs new file mode 100644 index 0000000000..48bcddf617 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry_hashmap.rs @@ -0,0 +1,57 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::HashMap; + +// Child struct with Former derived for builder pattern support +#[ derive( Debug, PartialEq, former::Former ) ] +pub struct Child +{ + name : String, + description : String, +} + +// Parent struct to hold commands +#[ derive( Debug, PartialEq, former::Former ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Parent +{ + #[ subform_entry ] + command : HashMap< String, Child >, +} + +impl former::ValToEntry< HashMap< String, Child > > for Child +{ + type Entry = ( String, Child ); + #[ inline( always ) ] + fn val_to_entry( self ) -> Self::Entry + { + ( self.name.clone(), self ) + } +} + +// == begin of generated + +// == end of generated + +#[ test ] +fn basic() +{ + + let got = Parent::former() + .command() + .name( "echo" ) + .description( "prints all subjects and properties" ) // sets additional properties using custom subformer + .end() + .command() + .name( "exit" ) + .description( "just exit" ) // Sets additional properties using using custom subformer + .end() + .form(); + + a_id!( got.command.len(), 2 ); + +} diff --git a/module/core/former/tests/inc/former_tests/subform_entry_hashmap_custom.rs b/module/core/former/tests/inc/former_tests/subform_entry_hashmap_custom.rs new file mode 100644 index 0000000000..1b1dce6e63 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry_hashmap_custom.rs @@ -0,0 +1,178 @@ +#![ allow( dead_code ) ] + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use collection_tools::HashMap; + +// Child struct with Former derived for builder pattern support +#[ derive( Clone, Debug, PartialEq, former::Former ) ] +pub struct Child +{ + name : String, + description : String, +} + +// Parent struct to hold commands +#[ derive( Debug, PartialEq, former::Former ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Parent +{ + #[ subform_entry( setter = false ) ] + command : HashMap< String, Child >, +} + +// Use ChildFormer as custom subformer for ParentFormer to add commands by name. +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + // more generic version + #[ inline( always ) ] + pub fn _children_subform_entry_with_closure< Former2, Definition2, Types2 >( self ) -> + Former2 + where + Types2 : former::FormerDefinitionTypes + < + Storage = ChildFormerStorage, + Formed = Self, + Context = Self, + >, + Definition2 : former::FormerDefinition + < + Types = Types2, + End = former::FormingEndClosure< Types2 >, + Storage = ChildFormerStorage, + Formed = Self, + Context = Self, + >, + Definition2::End : former::FormingEnd< Definition2::Types >, + Former2 : former::FormerBegin + < + Definition2, + >, + { + let on_end = | substorage : ChildFormerStorage, super_former : core::option::Option< Self > | -> Self + { + let mut super_former = super_former.unwrap(); + if super_former.storage.command.is_none() + { + super_former.storage.command = Some( Default::default() ); + } + if let Some( ref mut children ) = super_former.storage.command + { + former::CollectionAdd::add + ( + children, + < < HashMap< String, Child > as former::Collection >::Val as former::ValToEntry< HashMap< String, Child > > > + ::val_to_entry( former::StoragePreform::preform( substorage ) ) + ); + } + super_former + }; + Former2::former_begin( None, Some( self ), former::FormingEndClosure::new( on_end ) ) + } + + // reuse _command_subform_entry + #[ inline( always ) ] + pub fn command( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._command_subform_entry::< ChildFormer< _ >, _, >() + .name( name ) + } + + // that's how you should do custom subformer setters if you can't reuse _command_subform_entry + #[ inline( always ) ] + pub fn command2( self, name : &str ) -> ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + let on_end = | substorage : ChildFormerStorage, super_former : core::option::Option< Self > | -> Self + { + let mut super_former = super_former.unwrap(); + let preformed = former::StoragePreform::preform( substorage ); + + if super_former.storage.command.is_none() + { + super_former.storage.command = Some( Default::default() ); + } + + // add instance to the collection + super_former.storage.command.as_mut().unwrap() + .entry( preformed.name.clone() ) + .or_insert( preformed.clone() ); + + // custom logic to add two instances to the collection + super_former.storage.command.as_mut().unwrap() + .entry( format!( "{}_2", preformed.name ) ) + .or_insert( preformed.clone() ); + + super_former + }; + let subformer = ChildAsSubformer::< Self, _ >::begin( None, Some( self ), former::FormingEndClosure::new( on_end ) ); + subformer.name( name ) + } + +} + +impl former::ValToEntry< HashMap< String, Child > > for Child +{ + type Entry = ( String, Child ); + #[ inline( always ) ] + fn val_to_entry( self ) -> Self::Entry + { + ( self.name.clone(), self ) + } +} + +// == begin of generated + +// == end of generated + +#[ test ] +fn custom1() +{ + + let got = Parent::former() + .command( "echo" ) + .description( "prints all subjects and properties" ) // sets additional properties using custom subformer + .end() + .command( "exit" ) + .description( "just exit" ) // Sets additional properties using using custom subformer + .end() + .form(); + + let got = got.command.iter().map( | e | e.0 ).cloned().collect::< collection_tools::HashSet< String > >(); + let exp = collection_tools::hset! + [ + "echo".into(), + "exit".into(), + ]; + a_id!( got, exp ); + +} + +#[ test ] +fn custom2() +{ + + let got = Parent::former() + .command2( "echo" ) + .description( "prints all subjects and properties" ) // sets additional properties using custom subformer + .end() + .command2( "exit" ) + .description( "just exit" ) // Sets additional properties using using custom subformer + .end() + .form(); + + let got = got.command.iter().map( | e | e.0 ).cloned().collect::< collection_tools::HashSet< String > >(); + let exp = collection_tools::hset! + [ + "echo".into(), + "echo_2".into(), + "exit".into(), + "exit_2".into(), + ]; + a_id!( got, exp ); + +} diff --git a/module/core/former/tests/inc/former_tests/subform_entry_manual.rs b/module/core/former/tests/inc/former_tests/subform_entry_manual.rs new file mode 100644 index 0000000000..2a210b97bb --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry_manual.rs @@ -0,0 +1,202 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + // #[ subform_collection( definition = former::VectorDefinition ) ] + // #[ subform_entry ] + #[ scalar( setter = false ) ] + children : Vec< Child >, +} + +// = custom + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + // Definition::Types : former::FormerDefinitionTypes< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn _children_subform_entry_with_closure< Former2, Definition2, Types2 >( self ) -> + Former2 + where + Types2 : former::FormerDefinitionTypes + < + Storage = ChildFormerStorage, + Formed = Self, + Context = Self, + >, + Definition2 : former::FormerDefinition + < + Types = Types2, + End = former::FormingEndClosure< Types2 >, + Storage = ChildFormerStorage, + Formed = Self, + Context = Self, + >, + Definition2::End : former::FormingEnd< Definition2::Types >, + Former2 : former::FormerBegin + < + Definition2, + >, + { + let on_end = | substorage : ChildFormerStorage, super_former : core::option::Option< Self > | -> Self + { + let mut super_former = super_former.unwrap(); + if super_former.storage.children.is_none() + { + super_former.storage.children = Some( Default::default() ); + } + if let Some( ref mut children ) = super_former.storage.children + { + former::CollectionAdd::add + ( + children, + < < Vec< Child > as former::Collection >::Val as former::ValToEntry< Vec< Child > > > + ::val_to_entry( former::StoragePreform::preform( substorage ) ) + ); + } + super_former + }; + Former2::former_begin( None, Some( self ), former::FormingEndClosure::new( on_end ) ) + } + + // less generic, but more concise way to define custom subform setter + #[ inline( always ) ] + pub fn child( self, name : &str ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< ChildFormer< _ >, _, >() + .name( name ) + } + + // #[ inline( always ) ] + // pub fn _child( self ) -> + // ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + // { + // self._children_subform_entry + // ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + // } + + // it is generated + #[ inline( always ) ] + pub fn _child( self ) -> + < < Vec< Child > as former::Collection >::Entry as former::EntityToFormer + < + // ChildFormerDefinition< Self, Self, ParentSubformEntryChildrenEnd< Definition > >, + < + < Vec< Child > as former::Collection >::Entry as former::EntityToDefinition< Self, Self, ParentSubformEntryChildrenEnd< Definition > > + >::Definition, + > + >::Former + { + self._children_subform_entry + ::< < < Vec< Child > as former::Collection >::Entry as former::EntityToFormer< _ > >::Former, _, >() + } + +} + +// == begin of generated for Parent in context of attribute subform + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + // Definition::Types : former::FormerDefinitionTypes< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn _children_subform_entry< Former2, Definition2 >( self ) -> + Former2 + where + Definition2 : former::FormerDefinition + < + End = ParentSubformEntryChildrenEnd< Definition >, + Storage = < Child as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Definition2::Types : former::FormerDefinitionTypes + < + Storage = < Child as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Former2 : former::FormerBegin< Definition2 >, + { + Former2::former_begin( None, Some( self ), ParentSubformEntryChildrenEnd::default() ) + } + +} + +/// Handles the completion of and element of subformer's collection. +pub struct ParentSubformEntryChildrenEnd< Definition > +{ + _phantom : core::marker::PhantomData< fn( Definition ) >, +} + +impl< Definition > Default +for ParentSubformEntryChildrenEnd< Definition > +{ + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +impl< Types2, Definition > former::FormingEnd< Types2, > +for ParentSubformEntryChildrenEnd< Definition > +where + Definition : former::FormerDefinition + < + Storage = < Parent as former::EntityToStorage >::Storage, + >, + Types2 : former::FormerDefinitionTypes + < + Storage = < < Vec< Child > as former::Collection >::Entry as former::EntityToStorage >::Storage, + Formed = ParentFormer< Definition >, + Context = ParentFormer< Definition >, + >, +{ + #[ inline( always ) ] + fn call + ( + &self, + substorage : Types2::Storage, + super_former : core::option::Option< Types2::Context >, + ) + -> Types2::Formed + { + let mut super_former = super_former.unwrap(); + if super_former.storage.children.is_none() + { + super_former.storage.children = Some( Default::default() ); + } + if let Some( ref mut fields ) = super_former.storage.children + { + former::CollectionAdd::add( fields, former::StoragePreform::preform( substorage ) ); + } + super_former + } +} + +// == end of generated for Parent in context of attribute subform + +include!( "./only_test/subform_entry_child.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_entry_named.rs b/module/core/former/tests/inc/former_tests/subform_entry_named.rs new file mode 100644 index 0000000000..37e2c79d55 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry_named.rs @@ -0,0 +1,62 @@ +#![ deny( missing_docs ) ] +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_entry( name = _child ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, + // Definition::Types : former::FormerDefinitionTypes< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn children( self ) -> &'static str + { + r#" + Scalar setter `children` should not be generated by default if subform is used. + It can only be generated if req + "# + } + + #[ inline( always ) ] + pub fn child( self, name : &str ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< ChildFormer< _ >, _, >() + .name( name ) + } + + // #[ inline( always ) ] + // pub fn _child( self ) -> + // ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + // { + // self._children_subform_entry + // ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + // } + +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_entry_child.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_entry_named_manual.rs b/module/core/former/tests/inc/former_tests/subform_entry_named_manual.rs new file mode 100644 index 0000000000..3d0542c592 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry_named_manual.rs @@ -0,0 +1,72 @@ +#![ deny( missing_docs ) ] +#![ allow( dead_code ) ] + +use super::*; + +/// Parameter description. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent required for the template. +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ derive( Debug, Default, PartialEq, the_module::Former ) ] #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_entry ] + // #[ scalar( setter = false ) ] + children : Vec< Child >, +} + +// == begin of custom + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn child( self, name : &str ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< ChildFormer< _ >, _, >() + .name( name ) + } + + // #[ inline( always ) ] + // pub fn _child( self ) -> + // ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + // { + // self._children_subform_entry + // ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + // } + + #[ inline( always ) ] + pub fn _child( self ) -> + < < Vec< Child > as former::Collection >::Entry as former::EntityToFormer + < + // ChildFormerDefinition< Self, Self, ParentSubformEntryChildrenEnd< Definition > >, + < + < Vec< Child > as former::Collection >::Entry as former::EntityToDefinition< Self, Self, ParentSubformEntryChildrenEnd< Definition > > + >::Definition, + > + >::Former + { + self._children_subform_entry + ::< < < Vec< Child > as former::Collection >::Entry as former::EntityToFormer< _ > >::Former, _, >() + } + +} + +// == end of custom + +// == begin of generated for Parent in context of attribute subform + +// == end of generated for Parent in context of attribute subform + +include!( "./only_test/subform_entry_child.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_entry_setter_off.rs b/module/core/former/tests/inc/former_tests/subform_entry_setter_off.rs new file mode 100644 index 0000000000..ae08d3c05c --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry_setter_off.rs @@ -0,0 +1,49 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_entry( setter = false ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn children( self ) -> &'static str + { + r#" + Scalar setter `children` should not be generated by default if subform is used. + It can only be generated if req + "# + } + + #[ inline( always ) ] + pub fn children2( self, name : &str ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< ChildFormer< _ >, _, >() + .name( name ) + } + +} + +include!( "./only_test/subform_entry_children2.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_entry_setter_on.rs b/module/core/former/tests/inc/former_tests/subform_entry_setter_on.rs new file mode 100644 index 0000000000..fd5608463e --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_entry_setter_on.rs @@ -0,0 +1,44 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + // Such parameters switch off generation of front-end subform setter and switch on scalar setter. + // Without explicit scalar_setter( true ) scalar setter is not generated. + #[ subform_entry( setter = false ) ] + #[ scalar( setter = true ) ] + children : Vec< Child >, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn children2( self, name : &str ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._children_subform_entry + ::< ChildFormer< _ >, _, >() + .name( name ) + } + +} + +include!( "./only_test/scalar_children.rs" ); +include!( "./only_test/subform_entry_children2.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_scalar.rs b/module/core/former/tests/inc/former_tests/subform_scalar.rs new file mode 100644 index 0000000000..bf081269fb --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_scalar.rs @@ -0,0 +1,28 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_scalar ] + child : Child, +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_scalar.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_scalar_manual.rs b/module/core/former/tests/inc/former_tests/subform_scalar_manual.rs new file mode 100644 index 0000000000..d0d8ef9608 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_scalar_manual.rs @@ -0,0 +1,140 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ scalar( setter = false ) ] + // #[ scalar_subform ] + child : Child, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn _child_subform_scalar< Former2, Definition2 >( self ) -> + Former2 + where + Definition2 : former::FormerDefinition + < + End = ParentFormerSubformScalarChildEnd< Definition >, + Storage = < Child as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Definition2::Types : former::FormerDefinitionTypes + < + Storage = < Child as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Former2 : former::FormerBegin< Definition2 >, + { + Former2::former_begin( None, Some( self ), ParentFormerSubformScalarChildEnd::default() ) + } + +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + #[ inline( always ) ] + pub fn child( self ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._child_subform_scalar + ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + } + +} + +// = end + +/// Represents the endpoint for the forming process of a scalar field managed by a subformer within a `Parent` entity. +/// +/// This structure is a critical component of the forming process when using a subform scalar setter. It handles +/// the finalization of the scalar field's value that has been configured through its dedicated subformer. +/// Essentially, this end action integrates the individually formed scalar value back into the parent structure. +/// +/// ## Type Parameters +/// +/// - `Definition`: The type that defines the former setup for the `Parent` entity, influencing storage and behavior during forming. +/// +/// ## Parameters of `call` +/// +/// - `substorage`: Storage type specific to the `Child`, containing the newly formed scalar value. +/// - `super_former`: An optional context of the `ParentFormer`, which will receive the value. The function ensures +/// that this context is not `None` and inserts the formed value into the designated field within `Parent`'s storage. +/// + +pub struct ParentFormerSubformScalarChildEnd< Definition > +{ + _phantom : core::marker::PhantomData< fn( Definition ) >, +} + +impl< Definition > Default +for ParentFormerSubformScalarChildEnd< Definition > +{ + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } +} + +impl< Types2, Definition > former::FormingEnd< Types2, > +for ParentFormerSubformScalarChildEnd< Definition > +where + Definition : former::FormerDefinition + < + Storage = < Parent as former::EntityToStorage >::Storage, + >, + Types2 : former::FormerDefinitionTypes + < + Storage = < Child as former::EntityToStorage >::Storage, + Formed = ParentFormer< Definition >, + Context = ParentFormer< Definition >, + >, +{ + #[ inline( always ) ] + fn call + ( + &self, + substorage : Types2::Storage, + super_former : core::option::Option< Types2::Context >, + ) + -> Types2::Formed + { + let mut super_former = super_former.unwrap(); + debug_assert!( super_former.storage.child.is_none() ); + super_former.storage.child = Some( ::core::convert::Into::into( former::StoragePreform::preform( substorage ) ) ); + super_former + } +} + +// == begin of generated + +// == end of generated + +include!( "./only_test/subform_scalar.rs" ); diff --git a/module/core/former/tests/inc/former_tests/subform_scalar_name.rs b/module/core/former/tests/inc/former_tests/subform_scalar_name.rs new file mode 100644 index 0000000000..87a0d52ded --- /dev/null +++ b/module/core/former/tests/inc/former_tests/subform_scalar_name.rs @@ -0,0 +1,73 @@ +#![ allow( dead_code ) ] + +use super::*; + +/// Child +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +pub struct Child +{ + name : String, + data : bool, +} + +/// Parent + +#[ derive( Debug, Default, PartialEq, the_module::Former ) ] +// #[ debug ] +// #[ derive( Debug, Default, PartialEq ) ] +pub struct Parent +{ + #[ subform_scalar( name = child2 ) ] + child : Child, +} + +impl< Definition > ParentFormer< Definition > +where + Definition : former::FormerDefinition< Storage = < Parent as former::EntityToStorage >::Storage >, +{ + + pub fn child() + { + } + + #[ inline( always ) ] + pub fn child3( self ) -> + ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + { + self._child_subform_scalar + ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + } + +} + +// == begin of generated + +// == end of generated + +#[ test ] +fn subforme_scalar_2() +{ + + let got = Parent::former() + .child2().name( "a" ).data( true ).end() + .form(); + + let exp = Parent { child : Child { name : "a".to_string(), data : true } }; + a_id!( got, exp ); + +} + +#[ test ] +fn subforme_scalar_3() +{ + + let got = Parent::former() + .child3().name( "a" ).data( true ).end() + .form(); + + let exp = Parent { child : Child { name : "a".to_string(), data : true } }; + a_id!( got, exp ); + +} + +// qqq : write tests similar to `subform_all` which apply attributes `scalar`, `subform_entry` and `subform_scalar` on the same field and check all three attribtues don't interfere with each other diff --git a/module/core/former/tests/inc/former_tests/tuple_struct.rs b/module/core/former/tests/inc/former_tests/tuple_struct.rs new file mode 100644 index 0000000000..2925f0f592 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/tuple_struct.rs @@ -0,0 +1,37 @@ +#![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use super::*; + +// xxx : qqq : make that working + +// use collection_tools::HashMap; +// +// type Key = &'static str; +// type Value = &'static str; +// +// #[ derive( Debug, PartialEq, former::Former ) ] +// pub struct Struct1( #[ subform_collection ] HashMap< Key, Value > ); +// +// impl Struct1 +// { +// pub fn get( &self, key : Key ) -> Option< &Value > +// { +// self.0.get( key ) +// } +// } +// +// #[ test ] +// fn example() +// { +// // form a key-value store +// let instance = Struct1::former() +// .map() +// .add( ( "first", "Value1" ) ) +// .add( ( "second", "Value2" ) ) +// .end() +// .form(); +// +// // now it is a read-only storage with pre-configured data +// assert_eq!( Some( &"Value1" ), instance.get( "first" ) ); +// } diff --git a/module/core/former/tests/inc/former_tests/unsigned_primitive_types.rs b/module/core/former/tests/inc/former_tests/unsigned_primitive_types.rs new file mode 100644 index 0000000000..abfbe7d183 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/unsigned_primitive_types.rs @@ -0,0 +1,146 @@ +#[ allow( unused_imports ) ] +use super::*; + +// #[ allow( unused_imports ) ] +// use test_tools::exposed::*; +// +// only_for_aggregating_module! +// { +// #[ allow( unused_imports ) ] +// use wtools::meta::*; +// #[ allow( unused_imports ) ] +// use wtools::the_module::Former; +// } +// +// only_for_terminal_module! +// { +// #[ allow( unused_imports ) ] +// use meta_tools::*; +// #[ allow( unused_imports ) ] +// use the_module::Former; +// } + +// + +tests_impls! +{ + + fn with_u8() + { + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Counter + { + count : u8, + } + + let counter = Counter::former() + .count( 0 ) + .form(); + + let expected = Counter + { + count : 0, + }; + + a_id!( counter, expected ); + } + + // + + fn with_u16() + { + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Counter + { + count : u16, + } + + let counter = Counter::former() + .count( 0u16 ) + .form(); + + let expected = Counter + { + count : 0, + }; + + a_id!( counter, expected ); + } + + // + + fn with_u32() + { + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Counter + { + count : u32, + } + + let counter = Counter::former() + .count( 0u32 ) + .form(); + + let expected = Counter + { + count : 0, + }; + + a_id!( counter, expected ); + } + + // + + fn with_u64() + { + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Counter + { + count : u64, + } + + let counter = Counter::former() + .count( 0u64 ) + .form(); + + let expected = Counter + { + count : 0, + }; + + a_id!( counter, expected ); + } + + // + + fn with_usize() + { + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Counter + { + count : usize, + } + + let counter = Counter::former() + .count( 0usize ) + .form(); + + let expected = Counter + { + count : 0, + }; + + a_id!( counter, expected ); + } +} + +// + +tests_index! +{ + with_u8, + with_u16, + with_u32, + with_u64, + with_usize, +} diff --git a/module/core/former/tests/inc/former_tests/user_type_no_debug.rs b/module/core/former/tests/inc/former_tests/user_type_no_debug.rs new file mode 100644 index 0000000000..17036fbb1c --- /dev/null +++ b/module/core/former/tests/inc/former_tests/user_type_no_debug.rs @@ -0,0 +1,60 @@ +#[ allow( unused_imports ) ] +use super::*; + +// #[ allow( unused_imports ) ] +// use test_tools::exposed::*; +// +// only_for_aggregating_module! +// { +// #[ allow( unused_imports ) ] +// use wtools::meta::*; +// #[ allow( unused_imports ) ] +// use wtools::the_module::Former; +// } +// +// only_for_terminal_module! +// { +// #[ allow( unused_imports ) ] +// use meta_tools::*; +// #[ allow( unused_imports ) ] +// use the_module::Former; +// } + +// + +tests_impls! +{ + fn test_user_type_with_no_debug() + { + #[ derive( Default, PartialEq ) ] + pub struct State + { + on : bool + } + + #[ derive( PartialEq, the_module::Former ) ] + pub struct Device + { + device : String, + state : State, + } + + let device = Device::former() + .form(); + + let expected = Device + { + device : "".to_string(), + state : State { on : false }, + }; + + assert!( device == expected ); + } +} + +// + +tests_index! +{ + test_user_type_with_no_debug, +} diff --git a/module/core/former/tests/inc/former_tests/user_type_no_default.rs b/module/core/former/tests/inc/former_tests/user_type_no_default.rs new file mode 100644 index 0000000000..562425bf46 --- /dev/null +++ b/module/core/former/tests/inc/former_tests/user_type_no_default.rs @@ -0,0 +1,84 @@ +#[ allow( unused_imports ) ] +use super::*; + +// #[ allow( unused_imports ) ] +// use test_tools::exposed::*; +// +// only_for_aggregating_module! +// { +// #[ allow( unused_imports ) ] +// use wtools::meta::*; +// #[ allow( unused_imports ) ] +// use wtools::the_module::Former; +// } +// +// only_for_terminal_module! +// { +// #[ allow( unused_imports ) ] +// use meta_tools::*; +// #[ allow( unused_imports ) ] +// use the_module::Former; +// } + +// + +tests_impls! +{ + fn test_user_type_with_no_default() + { + #[ derive( Debug, PartialEq ) ] + pub enum State + { + On, + Off, + } + + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Device + { + device : String, + state : State, + } + + let device = Device::former() + .state( State::On ) + .form(); + + let expected = Device + { + device : "".to_string(), + state : State::On, + }; + + a_id!( device, expected ); + } + + // + + #[ should_panic ] + fn test_user_type_with_no_default_throwing() + { + #[ derive( Debug, PartialEq ) ] + pub enum State + { + On, + Off, + } + + #[ derive( Debug, PartialEq, the_module::Former ) ] + pub struct Device + { + device : String, + state : State, + } + let device = Device::former().form(); + } +} + +// + +tests_index! +{ + test_user_type_with_no_default, + test_user_type_with_no_default_throwing, +} diff --git a/module/core/former/tests/inc/former_tests/visibility.rs b/module/core/former/tests/inc/former_tests/visibility.rs new file mode 100644 index 0000000000..7df53933ac --- /dev/null +++ b/module/core/former/tests/inc/former_tests/visibility.rs @@ -0,0 +1,25 @@ +//! Structure must be public. +//! Otherwise public trait can't have it as type. + +#[ allow( unused_imports ) ] +use super::*; + +#[ derive( Debug, PartialEq, former::Former ) ] +// #[ debug ] +// #[ derive( Debug, PartialEq ) ] +pub struct Foo +{ + bar : i32, +} + +// == begin of generated + +// == end of generated + +#[ test ] +fn basic() +{ + let got = Foo::former().bar( 13 ).form(); + let exp = Foo { bar : 13 }; + a_id!( got, exp ); +} \ No newline at end of file diff --git a/module/core/former/tests/inc/mod.rs b/module/core/former/tests/inc/mod.rs new file mode 100644 index 0000000000..30bcd81c0f --- /dev/null +++ b/module/core/former/tests/inc/mod.rs @@ -0,0 +1,224 @@ +// #![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use super::*; + +#[ cfg( feature = "derive_former" ) ] +mod former_tests +{ + #[ allow( unused_imports ) ] + use super::*; + + // = basic + + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod a_basic_manual; + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod a_basic; + mod a_primitives_manual; + mod a_primitives; + mod tuple_struct; + + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod subform_collection_basic_scalar; + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod subform_collection_basic_manual; + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod subform_collection_basic; + + // = attribute + + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod attribute_default_collection; + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod attribute_default_primitive; + mod attribute_default_conflict; + mod attribute_storage_with_end; + mod attribute_storage_with_mutator; + mod attribute_perform; + mod attribute_setter; + mod attribute_alias; + mod attribute_feature; + mod attribute_multiple; + + // = name collision + + mod name_collision_former_hashmap_without_parameter; + mod name_collision_former_vector_without_parameter; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod name_collisions; + mod name_collision_context; + mod name_collision_end; + mod name_collision_on_end; + mod name_collision_core; + + // = parametrization + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod parametrized_struct_manual; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod parametrized_struct_imm; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod parametrized_struct_where; + mod parametrized_field; + mod parametrized_field_where; + + mod parametrized_slice_manual; + mod parametrized_slice; + + // = etc + + mod unsigned_primitive_types; + mod default_user_type; + mod user_type_no_default; + mod user_type_no_debug; + mod visibility; + + // = collection former + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_common; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_btree_map; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_btree_set; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_binary_heap; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_hashmap; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_hashset; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_linked_list; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_vec; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod collection_former_vec_deque; + + // = subform collection + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_collection_playground; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_collection; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_collection_manual; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_collection_implicit; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_collection_setter_off; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_collection_named; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_collection_custom; + + // = subform scalar + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_scalar_manual; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_scalar; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_scalar_name; + + // = subform entry + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry_manual; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry_named; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry_named_manual; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry_setter_off; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry_setter_on; + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry_hashmap; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_entry_hashmap_custom; + + // = subform all : scalar, subform_scalar, subform_entry, subform_collection + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_all; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_all_private; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod subform_all_parametrized; + +} + +#[ cfg( feature = "derive_components" ) ] +mod components_tests +{ + use super::*; + + #[ cfg( feature = "derive_component_from" ) ] + mod component_from_manual; + #[ cfg( feature = "derive_component_from" ) ] + mod component_from; + + #[ cfg( feature = "derive_component_assign" ) ] + mod component_assign_manual; + #[ cfg( feature = "derive_component_assign" ) ] + mod component_assign; + + #[ cfg( all( feature = "derive_component_assign", feature = "derive_components_assign" ) ) ] + mod components_assign_manual; + #[ cfg( all( feature = "derive_component_assign", feature = "derive_components_assign" ) ) ] + mod components_assign; + + #[ cfg( all( feature = "derive_from_components" ) ) ] + mod from_components_manual; + #[ cfg( all( feature = "derive_from_components" ) ) ] + mod from_components; + + #[ cfg( all( feature = "derive_component_from", feature = "derive_component_assign", feature = "derive_components_assign", feature = "derive_from_components" ) ) ] + mod composite_manual; + #[ cfg( all( feature = "derive_component_from", feature = "derive_component_assign", feature = "derive_components_assign", feature = "derive_from_components" ) ) ] + mod composite; + +} + +only_for_terminal_module! +{ + + // stable have different information about error + // that's why these tests are active only for nightly + + #[ cfg( feature = "derive_former" ) ] + #[ test_tools::nightly ] + #[ test ] + fn former_trybuild() + { + + println!( "current_dir : {:?}", std::env::current_dir().unwrap() ); + let t = test_tools::compiletime::TestCases::new(); + + t.compile_fail( "tests/inc/former_tests/compiletime/field_attr_bad.rs" ); + t.compile_fail( "tests/inc/former_tests/compiletime/struct_attr_bad.rs" ); + t.pass( "tests/inc/former_tests/compiletime/hashmap_without_parameter.rs" ); + t.pass( "tests/inc/former_tests/compiletime/vector_without_parameter.rs" ); + + } + + // stable have different information about error + // that's why these tests are active only for nightly + #[ test_tools::nightly ] + #[ test ] + fn components_trybuild() + { + + println!( "current_dir : {:?}", std::env::current_dir().unwrap() ); + let _t = test_tools::compiletime::TestCases::new(); + + // zzz : make it working test + //t.run( "tests/inc/components_tests/compiletime/components_component_from_debug.rs" ); + + } + +} diff --git a/module/core/former/tests/smoke_test.rs b/module/core/former/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/former/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/former/tests/tests.rs b/module/core/former/tests/tests.rs new file mode 100644 index 0000000000..fe0db783b8 --- /dev/null +++ b/module/core/former/tests/tests.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use former as the_module; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/core/former_meta/Cargo.toml b/module/core/former_meta/Cargo.toml new file mode 100644 index 0000000000..3e865a04a8 --- /dev/null +++ b/module/core/former_meta/Cargo.toml @@ -0,0 +1,69 @@ +[package] +name = "former_meta" +version = "2.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/former_meta" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/former_meta" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/former_meta" +description = """ +Former - a variation of builder pattern. Implementation of its derive macro. Should not be used independently, instead use module::former which relies on the module. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] + +default = [ + "enabled", + "derive_former", + "derive_components", + "derive_component_from", + "derive_component_assign", + "derive_components_assign", + "derive_from_components", +] +full = [ + "enabled", + "derive_former", + "derive_components", + "derive_component_from", + "derive_component_assign", + "derive_components_assign", + "derive_from_components", +] +enabled = [ "macro_tools/enabled", "iter_tools/enabled", "former_types/enabled" ] + +derive_former = [ "convert_case" ] +derive_components = [] +derive_component_assign = [] +derive_components_assign = [ "derive_components", "derive_component_assign", "convert_case" ] +derive_component_from = [ "derive_components" ] +derive_from_components = [ "derive_components" ] + +[lib] +proc-macro = true + +[dependencies] +macro_tools = { workspace = true } # qqq : optimize set of features +former_types = { workspace = true, features = [ "enabled", "types_component_assign" ] } +iter_tools = { workspace = true } +convert_case = { version = "0.6.0", default-features = false, optional = true, features = [] } +const_format = { version = "0.2.32" } +# zzz : reexport const_format + +[dev-dependencies] +test_tools = { workspace = true, features = [ "full" ] } +former = { workspace = true, features = [ "full" ] } diff --git a/module/core/former_meta/License b/module/core/former_meta/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/former_meta/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/former_meta/Readme.md b/module/core/former_meta/Readme.md new file mode 100644 index 0000000000..e7eeaec814 --- /dev/null +++ b/module/core/former_meta/Readme.md @@ -0,0 +1,16 @@ + + +# Module :: former_meta + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_former_meta_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_former_meta_push.yml) [![docs.rs](https://img.shields.io/docsrs/former_meta?color=e3e8f0&logo=docs.rs)](https://docs.rs/former_meta) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Former - a variation of builder pattern. Implementation of its derive macro. Should not be used independently, instead use module::former which relies on the module. + +Not intended to be used without runtime. This module and runtime is aggregate in module::former is [here](https://github.com/Wandalen/wTools/tree/master/module/core/former). + +### To add to your project + +```sh +cargo add former_meta +``` diff --git a/module/core/former_meta/src/component/component_assign.rs b/module/core/former_meta/src/component/component_assign.rs new file mode 100644 index 0000000000..de12fc7f5f --- /dev/null +++ b/module/core/former_meta/src/component/component_assign.rs @@ -0,0 +1,80 @@ +use super::*; +use macro_tools::{ attr, diag, Result }; + +/// +/// Generates implementations of the `Assign` trait for each field of a struct. +/// +pub fn component_assign( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + let item_name = &parsed.ident.clone(); + + let for_field = parsed.fields.iter().map( | field | + { + for_each_field( field, &parsed.ident ) + }) + .collect::< Result< Vec< _ > > >()?; + + let result = qt! + { + #( #for_field )* + }; + + if has_debug + { + let about = format!( "derive : Assign\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} + +/// Generates an implementation of the `Assign` trait for a specific field of a struct. +/// +/// This function creates the trait implementation that enables setting a struct's field value +/// with a type that can be converted into the field's type. It dynamically generates code +/// during the macro execution to provide `Assign` trait implementations for each field +/// of the struct, facilitating an ergonomic API for modifying struct instances. +/// +/// # Parameters +/// +/// - `field`: Reference to the struct field's metadata. +/// - `item_name`: The name of the struct. +/// +/// # Example of generated code +/// +/// ```rust, ignore +/// impl< IntoT > former::Assign< i32, IntoT > for Options1 +/// where +/// IntoT : Into< i32 >, +/// { +/// #[ inline( always ) ] +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.field1 = component.into().clone(); +/// } +/// } +/// ``` +fn for_each_field( field : &syn::Field, item_name : &syn::Ident ) -> Result< proc_macro2::TokenStream > +{ + let field_name = field.ident.as_ref() + .ok_or_else( || syn::Error::new( field.span(), "Field without a name" ) )?; + let field_type = &field.ty; + + Ok( qt! + { + #[ allow( non_snake_case ) ] + impl< IntoT > Assign< #field_type, IntoT > for #item_name + where + IntoT : Into< #field_type >, + { + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.#field_name = component.into(); + } + } + }) +} diff --git a/module/core/former_meta/src/component/component_from.rs b/module/core/former_meta/src/component/component_from.rs new file mode 100644 index 0000000000..c5613a48fa --- /dev/null +++ b/module/core/former_meta/src/component/component_from.rs @@ -0,0 +1,78 @@ + +use super::*; +use macro_tools::{ attr, diag, Result }; + +/// Generates `From` implementations for each unique component (field) of the structure. +pub fn component_from( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + let item_name = &parsed.ident; + + let for_field = parsed.fields.iter().map( | field | + { + for_each_field( field, &parsed.ident ) + }) + .collect::< Result< Vec< _ > > >()?; + + let result = qt! + { + #( #for_field )* + }; + + if has_debug + { + let about = format!( "derive : ComponentFrom\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + // if has_debug + // { + // diag::report_print( "derive : ComponentFrom", original_input, &result ); + // } + + Ok( result ) +} + +/// Generates a `From` implementation for a specific field of a struct. +/// +/// # Arguments +/// +/// * `field` - A reference to the field for which to generate the `From` implementation. +/// * `item_name` - The name of the structure containing the field. +/// +/// # Example of generated code +/// +/// If you have a structure `Person` with a field `name: String`, the generated code would look something like this: +/// +/// ```rust, ignore +/// impl From< &Person > for String +/// { +/// #[ inline( always ) ] +/// fn from( src : &Person ) -> Self +/// { +/// src.name.clone() +/// } +/// } +/// + +fn for_each_field( field : &syn::Field, item_name : &syn::Ident ) -> Result< proc_macro2::TokenStream > +{ + let field_name = field.ident.as_ref() + .ok_or_else( || syn::Error::new( field.span(), "Field without a name" ) )?; + let field_type = &field.ty; + + Ok( qt! + { + #[ allow( non_local_definitions ) ] + impl From< &#item_name > for #field_type + { + #[ inline( always ) ] + fn from( src : &#item_name ) -> Self + { + src.#field_name.clone() + } + } + }) +} diff --git a/module/core/former_meta/src/component/components_assign.rs b/module/core/former_meta/src/component/components_assign.rs new file mode 100644 index 0000000000..6b495e7629 --- /dev/null +++ b/module/core/former_meta/src/component/components_assign.rs @@ -0,0 +1,151 @@ +use super::*; +use macro_tools::{ attr, diag, Result, format_ident }; +use iter_tools::{ Itertools }; + +/// +/// Generate `ComponentsAssign` trait implementation for the type, providing `components_assign` function +/// +/// Output example can be found in in the root of the module +/// + +pub fn components_assign( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + use convert_case::{ Case, Casing }; + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + + // name + let item_name = &parsed.ident; + let trait_ident = format_ident! + { + "{}ComponentsAssign", + item_name + }; + let method_ident = format_ident! + { + "{}_assign", + item_name.to_string().to_case( Case::Snake ) + }; + + // fields +// fields + let ( bounds1, bounds2, component_assigns ) : ( Vec< _ >, Vec< _ >, Vec< _ > ) = parsed.fields.iter().map( | field | + { + let field_type = &field.ty; + let bound1 = generate_trait_bounds( field_type ); + let bound2 = generate_impl_bounds( field_type ); + let component_assign = generate_component_assign_call( field ); + ( bound1, bound2, component_assign ) + }).multiunzip(); + + let bounds1 : Vec< _ > = bounds1.into_iter().collect::< Result< _ > >()?; + let bounds2 : Vec< _ > = bounds2.into_iter().collect::< Result< _ > >()?; + let component_assigns : Vec< _ > = component_assigns.into_iter().collect::< Result< _ > >()?; + + // code + let doc = format!( "Interface to assign instance from set of components exposed by a single argument." ); + let trait_bounds = qt! { #( #bounds1 )* IntoT : Clone }; + let impl_bounds = qt! { #( #bounds2 )* #( #bounds1 )* IntoT : Clone }; + let component_assigns = qt! { #( #component_assigns )* }; + let result = qt! + { + + #[ doc = #doc ] + pub trait #trait_ident< IntoT > + where + #trait_bounds, + { + fn #method_ident( &mut self, component : IntoT ); + } + + impl< T, IntoT > #trait_ident< IntoT > for T + where + #impl_bounds, + { + #[ inline( always ) ] + #[ doc = #doc ] + fn #method_ident( &mut self, component : IntoT ) + { + #component_assigns + } + } + + }; + + if has_debug + { + let about = format!( "derive : ComponentsAssign\nstructure : {0}", item_name ); + diag::report_print( about, &original_input, &result ); + } + + // if has_debug + // { + // diag::report_print( "derive : ComponentsAssign", original_input, &result ); + // } + + Ok( result ) +} + +/// +/// Generate trait bounds needed for `components_assign` +/// +/// ### Output example +/// +/// ```ignore +/// IntoT : Into< i32 > +/// ``` +/// +fn generate_trait_bounds( field_type : &syn::Type ) -> Result< proc_macro2::TokenStream > +{ + Ok + ( + qt! + { + IntoT : Into< #field_type >, + } + ) +} + +/// +/// Generate impl bounds needed for `components_assign` +/// +/// ### Output example +/// +/// ```ignore +/// T : former::Assign< i32, IntoT >, +/// ``` +/// +fn generate_impl_bounds( field_type : &syn::Type ) -> Result< proc_macro2::TokenStream > +{ + Ok + ( + qt! + { + T : former::Assign< #field_type, IntoT >, + } + ) +} + +/// +/// Generate set calls needed by `components_assign` +/// Returns a "unit" of work of `components_assign` function, performing `set` on each field. +/// +/// Output example +/// +/// ```ignore +/// former::Assign::< i32, _ >::assign( self.component.clone() ); +/// ``` +/// +fn generate_component_assign_call( field : &syn::Field ) -> Result< proc_macro2::TokenStream > +{ + // let field_name = field.ident.as_ref().expect( "Expected the field to have a name" ); + let field_type = &field.ty; + Ok + ( + qt! + { + former::Assign::< #field_type, _ >::assign( self, component.clone() ); + } + ) +} diff --git a/module/core/former_meta/src/component/from_components.rs b/module/core/former_meta/src/component/from_components.rs new file mode 100644 index 0000000000..d76029ca0a --- /dev/null +++ b/module/core/former_meta/src/component/from_components.rs @@ -0,0 +1,140 @@ +use super::*; +use macro_tools::{ attr, diag, item_struct, Result }; + +/// +/// Generates an implementation of the `From< T >` trait for a custom struct, enabling +/// type-based conversion from `T` to the struct. This function parses the given +/// `TokenStream` representing a struct, and produces code that allows for its +/// fields to be initialized from an instance of type `T`, assuming `T` can be +/// converted into each of the struct's field types. +/// +/// # Example of generated code +/// +/// ```ignore +/// impl< T > From< T > for Options2 +/// where +/// T : Into< i32 >, +/// T : Into< String >, +/// T : Clone, +/// { +/// #[ inline( always ) ] +/// fn from( src : T ) -> Self +/// { +/// let field1 = Into::< i32 >::into( src.clone() ); +/// let field2 = Into::< String >::into( src.clone() ); +/// Options2 +/// { +/// field1, +/// field2, +/// } +/// } +/// } +/// ``` +/// + +#[ inline ] +pub fn from_components( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + + // Struct name + let item_name = &parsed.ident; + + // Generate snipets + let trait_bounds = trait_bounds( item_struct::field_types( &parsed ) ); + let field_assigns = field_assign( parsed.fields.iter() ); + let field_names : Vec< _ > = parsed.fields.iter().map( | field | &field.ident ).collect(); + + // Generate the From trait implementation + let result = qt! + { + impl< T > From< T > for #item_name + where + T : Clone, + #( #trait_bounds )* + { + #[ inline( always ) ] + fn from( src : T ) -> Self + { + #( #field_assigns )* + Self + { + #( #field_names, )* + } + } + } + }; + + if has_debug + { + let about = format!( "derive : FromComponents\nstructure : {0}", &parsed.ident ); + diag::report_print( about, &original_input, &result ); + } + + // if has_debug + // { + // diag::report_print( "derive : FromComponents", original_input, &result ); + // } + + Ok( result.into() ) +} + +/// Generates trait bounds for the `From< T >` implementation, ensuring that `T` +/// can be converted into each of the struct's field types. This function +/// constructs a sequence of trait bounds necessary for the `From< T >` +/// implementation to compile. +/// +/// # Example of generated code +/// +/// Given field types `[i32, String]`, this function generates: +/// +/// ```ignore +/// T : Into< i32 >, +/// T : Into< String >, +/// ``` +/// +/// These trait bounds are then used in the `From` implementation to ensure type compatibility. + +#[ inline ] +// fn trait_bounds( field_types : &[ &syn::Type ] ) -> Vec< proc_macro2::TokenStream > +fn trait_bounds< 'a >( field_types : impl macro_tools::IterTrait< 'a, &'a syn::Type > ) -> Vec< proc_macro2::TokenStream > +{ + field_types.map( | field_type | + { + qt! + { + T : Into< #field_type >, + } + }).collect() +} + +/// Generates code snippets for converting `T` into each of the struct's fields +/// inside the `from` function of the `From` trait implementation. This function +/// creates a series of statements that clone the source `T`, convert it into the +/// appropriate field type, and assign it to the corresponding field of the struct. +/// +/// # Example of generated code +/// +/// For a struct with fields `field1: i32` and `field2: String`, this function generates: +/// +/// ```ignore +/// let field1 = Into::< i32 >::into( src.clone() ); +/// let field2 = Into::< String >::into( src.clone() ); +/// ``` +/// + +#[ inline ] +fn field_assign< 'a >( fields : impl Iterator< Item = &'a syn::Field > ) -> Vec< proc_macro2::TokenStream > +{ + fields.map( | field | + { + let field_ident = &field.ident; + let field_type = &field.ty; + qt! + { + let #field_ident = Into::< #field_type >::into( src.clone() ); + } + }).collect() +} diff --git a/module/core/former_meta/src/derive_former.rs b/module/core/former_meta/src/derive_former.rs new file mode 100644 index 0000000000..d79534fb02 --- /dev/null +++ b/module/core/former_meta/src/derive_former.rs @@ -0,0 +1,781 @@ + +use super::*; +use iter_tools::{ Itertools }; +use macro_tools::{ attr, diag, generic_params, generic_args, typ, derive, Result }; +use proc_macro2::TokenStream; + +// qqq : implement interfaces for other collections + +mod field_attrs; +use field_attrs::*; +mod field; +use field::*; +mod struct_attrs; +use struct_attrs::*; + +/// Generates the code for implementing the `FormerMutator` trait for a specified former definition type. +/// +/// This function generate code that implements the `FormerMutator` trait based on the given +/// former definition types and their associated generics. The `FormerMutator` trait provides the +/// functionality to mutate the storage and context of an entity just before its formation process +/// completes. This is particularly useful for performing final adjustments or validations on the data +/// before the entity is fully constructed. +/// +/// # Example +/// +/// Below is an example of how the generated code might look: +/// +/// ```rust, ignore +/// impl< Context, Formed > former::FormerMutator +/// for Struct1FormerDefinitionTypes< Context, Formed > +/// { +/// /// Mutates the context and storage of the entity just before the formation process completes. +/// #[ inline ] +/// fn form_mutation( storage : &mut Self::Storage, _context : &mut ::core::option::Option< Self::Context > ) +/// { +/// storage.a.get_or_insert_with( Default::default ); +/// storage.b.get_or_insert_with( Default::default ); +/// storage.c = Some( format!( "{:?} - {}", storage.a.unwrap(), storage.b.as_ref().unwrap() ) ); +/// } +/// } +/// ``` +/// + +pub fn mutator +( + item : &syn::Ident, + original_input : &proc_macro::TokenStream, + mutator : &AttributeMutator, + former_definition_types : &syn::Ident, + former_definition_types_generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + former_definition_types_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + former_definition_types_generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, +) +-> Result< TokenStream > +{ + let former_mutator_code = if mutator.custom.value( false ) + { + qt!{} + } + else + { + qt! + { + impl< #former_definition_types_generics_impl > former::FormerMutator + for #former_definition_types < #former_definition_types_generics_ty > + where + #former_definition_types_generics_where + { + } + } + }; + + if mutator.debug.value( false ) + { + let debug = format! + ( + r#" += Example of custom mutator + +impl< {} > former::FormerMutator +for {former_definition_types} < {} > +where + {} +{{ + /// Mutates the context and storage of the entity just before the formation process completes. + #[ inline ] + fn form_mutation( storage : &mut Self::Storage, context : &mut Option< Self::Context > ) + {{ + }} +}} + "#, + format!( "{}", qt!{ #former_definition_types_generics_impl } ), + format!( "{}", qt!{ #former_definition_types_generics_ty } ), + format!( "{}", qt!{ #former_definition_types_generics_where } ), + ); + // println!( "{debug}" ); + let about = format! + ( +r#"derive : Former +item : {item}"#, + ); + diag::report_print( about, original_input, debug ); + }; + + Ok( former_mutator_code ) +} + +/// +/// Generate documentation for the former. +/// + +fn doc_generate( item : &syn::Ident ) -> ( String, String ) +{ + + let doc_former_mod = format! + ( +r#" Implementation of former for [{}]. +"#, + item + ); + + let doc_former_struct = format! + ( +r#" +Structure to form [{}]. Represents a forming entity designed to construct objects through a builder pattern. + +This structure holds temporary storage and context during the formation process and +utilizes a defined end strategy to finalize the object creation. +"#, + item + ); + + ( doc_former_mod, doc_former_struct ) +} + +/// +/// Generate the whole Former ecosystem +/// +/// Output examples can be found in [docs to former crate](https://docs.rs/former/latest/former/) +/// + +pub fn former( input : proc_macro::TokenStream ) -> Result< TokenStream > +{ + use macro_tools::IntoGenericArgs; + + let original_input = input.clone(); + let ast = match syn::parse::< syn::DeriveInput >( input ) + { + Ok( syntax_tree ) => syntax_tree, + Err( err ) => return Err( err ), + }; + let has_debug = attr::has_debug( ast.attrs.iter() )?; + let struct_attrs = ItemAttributes::from_attrs( ast.attrs.iter() )?; + + /* names */ + + let vis = &ast.vis; + let item = &ast.ident; + let former = format_ident!( "{item}Former" ); + let former_storage = format_ident!( "{item}FormerStorage" ); + let former_definition = format_ident!( "{item}FormerDefinition" ); + let former_definition_types = format_ident!( "{item}FormerDefinitionTypes" ); + let as_subformer = format_ident!( "{item}AsSubformer" ); + let as_subformer_end = format_ident!( "{item}AsSubformerEnd" ); + + let as_subformer_end_doc = format! + ( + r#" +Represents an end condition for former of [`${item}`], tying the lifecycle of forming processes to a broader context. + +This trait is intended for use with subformer alias, ensuring that end conditions are met according to the +specific needs of the broader forming context. It mandates the implementation of `former::FormingEnd`. + "# + ); + + /* parameters for structure */ + + let generics = &ast.generics; + let ( struct_generics_with_defaults, struct_generics_impl, struct_generics_ty, struct_generics_where ) + = generic_params::decompose( generics ); + + /* parameters for definition */ + + let extra : macro_tools::syn::AngleBracketedGenericArguments = parse_quote! + { + < (), #item < #struct_generics_ty >, former::ReturnPreformed > + }; + let former_definition_args = generic_args::merge( &generics.into_generic_args(), &extra.into() ).args; + + /* parameters for former */ + + let extra : macro_tools::GenericsWithWhere = parse_quote! + { + < Definition = #former_definition < #former_definition_args > > + where + Definition : former::FormerDefinition< Storage = #former_storage < #struct_generics_ty > >, + Definition::Types : former::FormerDefinitionTypes< Storage = #former_storage < #struct_generics_ty > >, + }; + let extra = generic_params::merge( &generics, &extra.into() ); + + let ( former_generics_with_defaults, former_generics_impl, former_generics_ty, former_generics_where ) + = generic_params::decompose( &extra ); + + /* parameters for former perform */ + + let extra : macro_tools::GenericsWithWhere = parse_quote! + { + < Definition = #former_definition < #former_definition_args > > + where + Definition : former::FormerDefinition + < + Storage = #former_storage < #struct_generics_ty >, + Formed = #item < #struct_generics_ty >, + >, + Definition::Types : former::FormerDefinitionTypes + < + Storage = #former_storage < #struct_generics_ty >, + Formed = #item < #struct_generics_ty >, + >, + }; + let extra = generic_params::merge( &generics, &extra.into() ); + + let ( _former_perform_generics_with_defaults, former_perform_generics_impl, former_perform_generics_ty, former_perform_generics_where ) + = generic_params::decompose( &extra ); + + /* parameters for definition types */ + + let extra : macro_tools::GenericsWithWhere = parse_quote! + { + < __Context = (), __Formed = #item < #struct_generics_ty > > + }; + let former_definition_types_generics = generic_params::merge( &generics, &extra.into() ); + let ( former_definition_types_generics_with_defaults, former_definition_types_generics_impl, former_definition_types_generics_ty, former_definition_types_generics_where ) + = generic_params::decompose( &former_definition_types_generics ); + + let former_definition_types_phantom = macro_tools::phantom::tuple( &former_definition_types_generics_impl ); + + /* parameters for definition */ + + let extra : macro_tools::GenericsWithWhere = parse_quote! + { + < __Context = (), __Formed = #item < #struct_generics_ty >, __End = former::ReturnPreformed > + }; + let generics_of_definition = generic_params::merge( &generics, &extra.into() ); + let ( former_definition_generics_with_defaults, former_definition_generics_impl, former_definition_generics_ty, former_definition_generics_where ) + = generic_params::decompose( &generics_of_definition ); + + let former_definition_phantom = macro_tools::phantom::tuple( &former_definition_generics_impl ); + + /* struct attributes */ + + let ( _doc_former_mod, doc_former_struct ) = doc_generate( item ); + let ( perform, perform_output, perform_generics ) = struct_attrs.performer()?; + + /* fields */ + + let fields = derive::named_fields( &ast )?; + + let formed_fields : Vec< _ > = fields + .into_iter() + .map( | field | + { + FormerField::from_syn( field, true, true ) + }) + .collect::< Result< _ > >()?; + + let storage_fields : Vec< _ > = struct_attrs + .storage_fields() + .iter() + .map( | field | + { + FormerField::from_syn( field, true, false ) + }) + .collect::< Result< _ > >()?; + + let + ( + storage_field_none, + storage_field_optional, + storage_field_name, + storage_field_preform, + former_field_setter, + ) + : + ( Vec< _ >, Vec< _ >, Vec< _ >, Vec< _ >, Vec< _ > ) + = formed_fields + .iter() + .chain( storage_fields.iter() ) + .map( | field | + {( + field.storage_fields_none(), + field.storage_field_optional(), + field.storage_field_name(), + field.storage_field_preform(), + field.former_field_setter + ( + &item, + &original_input, + &struct_generics_impl, + &struct_generics_ty, + &struct_generics_where, + &former, + &former_generics_impl, + &former_generics_ty, + &former_generics_where, + &former_storage, + ), + )}).multiunzip(); + + let results : Result< Vec< _ > > = former_field_setter.into_iter().collect(); + let ( former_field_setter, namespace_code ) : ( Vec< _ >, Vec< _ > ) = results?.into_iter().unzip(); + + // let storage_field_preform : Vec< _ > = process_results( storage_field_preform, | iter | iter.collect() )?; + let storage_field_preform : Vec< _ > = storage_field_preform + .into_iter() + .collect::< Result< _ > >()?; + + let former_mutator_code = mutator + ( + &item, + &original_input, + &struct_attrs.mutator, + &former_definition_types, + &former_definition_types_generics_impl, + &former_definition_types_generics_ty, + &former_definition_types_generics_where, + )?; + + let result = qt! + { + + // = formed + + #[ automatically_derived ] + impl < #struct_generics_impl > #item < #struct_generics_ty > + where + #struct_generics_where + { + + /// + /// Provides a mechanism to initiate the formation process with a default completion behavior. + /// + + #[ inline( always ) ] + pub fn former() -> #former < #struct_generics_ty #former_definition< #former_definition_args > > + { + #former :: < #struct_generics_ty #former_definition< #former_definition_args > > :: new_coercing( former::ReturnPreformed ) + } + + } + + // = entity to former + + impl< #struct_generics_impl Definition > former::EntityToFormer< Definition > + for #item < #struct_generics_ty > + where + Definition : former::FormerDefinition< Storage = #former_storage < #struct_generics_ty > >, + #struct_generics_where + { + type Former = #former < #struct_generics_ty Definition > ; + } + + impl< #struct_generics_impl > former::EntityToStorage + for #item < #struct_generics_ty > + where + #struct_generics_where + { + type Storage = #former_storage < #struct_generics_ty >; + } + + impl< #struct_generics_impl __Context, __Formed, __End > former::EntityToDefinition< __Context, __Formed, __End > + for #item < #struct_generics_ty > + where + __End : former::FormingEnd< #former_definition_types < #struct_generics_ty __Context, __Formed > >, + #struct_generics_where + { + type Definition = #former_definition < #struct_generics_ty __Context, __Formed, __End >; + type Types = #former_definition_types < #struct_generics_ty __Context, __Formed >; + } + + impl< #struct_generics_impl __Context, __Formed > former::EntityToDefinitionTypes< __Context, __Formed > + for #item < #struct_generics_ty > + where + #struct_generics_where + { + type Types = #former_definition_types < #struct_generics_ty __Context, __Formed >; + } + + // = definition types + + /// Defines the generic parameters for formation behavior including context, form, and end conditions. + #[ derive( Debug ) ] + #vis struct #former_definition_types < #former_definition_types_generics_with_defaults > + where + #former_definition_types_generics_where + { + // _phantom : ::core::marker::PhantomData< ( __Context, __Formed ) >, + _phantom : #former_definition_types_phantom, + } + + impl < #former_definition_types_generics_impl > ::core::default::Default + for #former_definition_types < #former_definition_types_generics_ty > + where + #former_definition_types_generics_where + { + fn default() -> Self + { + Self + { + _phantom : ::core::marker::PhantomData, + } + } + } + + impl < #former_definition_types_generics_impl > former::FormerDefinitionTypes + for #former_definition_types < #former_definition_types_generics_ty > + where + #former_definition_types_generics_where + { + type Storage = #former_storage < #struct_generics_ty >; + type Formed = __Formed; + type Context = __Context; + } + + // = definition + + /// Holds the definition types used during the formation process. + #[ derive( Debug ) ] + #vis struct #former_definition < #former_definition_generics_with_defaults > + where + #former_definition_generics_where + { + // _phantom : ::core::marker::PhantomData< ( __Context, __Formed, __End ) >, + _phantom : #former_definition_phantom, + } + + impl < #former_definition_generics_impl > ::core::default::Default + for #former_definition < #former_definition_generics_ty > + where + #former_definition_generics_where + { + fn default() -> Self + { + Self + { + _phantom : ::core::marker::PhantomData, + } + } + } + + impl < #former_definition_generics_impl > former::FormerDefinition + for #former_definition < #former_definition_generics_ty > + where + __End : former::FormingEnd< #former_definition_types < #former_definition_types_generics_ty > >, + #former_definition_generics_where + { + type Types = #former_definition_types < #former_definition_types_generics_ty >; + type End = __End; + type Storage = #former_storage < #struct_generics_ty >; + type Formed = __Formed; + type Context = __Context; + } + + // = former mutator + + #former_mutator_code + + // = storage + + #[ doc = "Stores potential values for fields during the formation process." ] + #[ allow( explicit_outlives_requirements ) ] + #vis struct #former_storage < #struct_generics_with_defaults > + where + #struct_generics_where + { + #( + /// A field + #storage_field_optional, + )* + } + + impl < #struct_generics_impl > ::core::default::Default + for #former_storage < #struct_generics_ty > + where + #struct_generics_where + { + + #[ inline( always ) ] + fn default() -> Self + { + Self + { + #( #storage_field_none, )* + } + } + + } + + impl < #struct_generics_impl > former::Storage + for #former_storage < #struct_generics_ty > + where + #struct_generics_where + { + type Preformed = #item < #struct_generics_ty >; + } + + impl < #struct_generics_impl > former::StoragePreform + for #former_storage < #struct_generics_ty > + where + #struct_generics_where + { + // type Preformed = #item < #struct_generics_ty >; + + fn preform( mut self ) -> Self::Preformed + { + #( #storage_field_preform )* + // Rust does not support that, yet + // let result = < Definition::Types as former::FormerDefinitionTypes >::Formed + let result = #item :: < #struct_generics_ty > + { + #( #storage_field_name )* + // #( #storage_field_name, )* + }; + return result; + } + + } + + // = former + + #[ doc = #doc_former_struct ] + #vis struct #former < #former_generics_with_defaults > + where + #former_generics_where + { + /// Temporary storage for all fields during the formation process. It contains + /// partial data that progressively builds up to the final object. + pub storage : Definition::Storage, + /// An optional context providing additional data or state necessary for custom + /// formation logic or to facilitate this former's role as a subformer within another former. + pub context : ::core::option::Option< Definition::Context >, + /// An optional closure or handler that is invoked to transform the accumulated + /// temporary storage into the final object structure once formation is complete. + pub on_end : ::core::option::Option< Definition::End >, + } + + #[ automatically_derived ] + impl < #former_generics_impl > #former < #former_generics_ty > + where + #former_generics_where + { + + /// + /// Initializes a former with an end condition and default storage. + /// + #[ inline( always ) ] + pub fn new( on_end : Definition::End ) -> Self + { + Self::begin_coercing( None, None, on_end ) + } + + /// + /// Initializes a former with a coercible end condition. + /// + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >( end : IntoEnd ) -> Self + where + IntoEnd : Into< Definition::End >, + { + Self::begin_coercing + ( + None, + None, + end, + ) + } + + /// + /// Begins the formation process with specified context and termination logic. + /// + #[ inline( always ) ] + pub fn begin + ( + mut storage : ::core::option::Option< Definition::Storage >, + context : ::core::option::Option< Definition::Context >, + on_end : < Definition as former::FormerDefinition >::End, + ) + -> Self + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( on_end ), + } + } + + /// + /// Starts the formation process with coercible end condition and optional initial values. + /// + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd > + ( + mut storage : ::core::option::Option< Definition::Storage >, + context : ::core::option::Option< Definition::Context >, + on_end : IntoEnd, + ) -> Self + where + IntoEnd : ::core::convert::Into< < Definition as former::FormerDefinition >::End >, + { + if storage.is_none() + { + storage = Some( ::core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some( ::core::convert::Into::into( on_end ) ), + } + } + + /// + /// Wrapper for `end` to align with common builder pattern terminologies. + /// + #[ inline( always ) ] + pub fn form( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + self.end() + } + + /// + /// Completes the formation and returns the formed object. + /// + #[ inline( always ) ] + pub fn end( mut self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + let on_end = self.on_end.take().unwrap(); + let mut context = self.context.take(); + < Definition::Types as former::FormerMutator >::form_mutation( &mut self.storage, &mut context ); + former::FormingEnd::< Definition::Types >::call( &on_end, self.storage, context ) + } + + #( + #former_field_setter + )* + + } + + // = former :: preform + + impl< #former_generics_impl > #former< #former_generics_ty > + where + Definition : former::FormerDefinition< Storage = #former_storage < #struct_generics_ty >, Formed = #item < #struct_generics_ty > >, + Definition::Types : former::FormerDefinitionTypes< Storage = #former_storage < #struct_generics_ty >, Formed = #item < #struct_generics_ty > >, + #former_generics_where + { + + /// Executes the transformation from the former's storage state to the preformed object as specified by the definition. + pub fn preform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed + { + former::StoragePreform::preform( self.storage ) + } + + } + + // = former :: perform + + #[ automatically_derived ] + impl < #former_perform_generics_impl > #former < #former_perform_generics_ty > + where + #former_perform_generics_where + { + + /// + /// Finish setting options and call perform on formed entity. + /// + /// If `perform` defined then associated method is called and its result returned instead of entity. + /// For example `perform()` of structure with : `#[ perform( fn after1() -> &str > )` returns `&str`. + /// + #[ inline( always ) ] + pub fn perform #perform_generics ( self ) -> #perform_output + { + let result = self.form(); + #perform + } + + } + + // = former begin + + impl< #struct_generics_impl Definition > former::FormerBegin< Definition > + // for ChildFormer< Definition > + for #former + < + #struct_generics_ty + Definition, + > + where + Definition : former::FormerDefinition< Storage = #former_storage < #struct_generics_ty > >, + #struct_generics_where + { + + #[ inline( always ) ] + fn former_begin + ( + storage : ::core::option::Option< Definition::Storage >, + context : ::core::option::Option< Definition::Context >, + on_end : Definition::End, + ) + -> Self + { + debug_assert!( storage.is_none() ); + Self::begin( None, context, on_end ) + } + + } + + // = subformer + + /// Provides a specialized former for structure using predefined settings for superformer and end conditions. + /// + /// This type alias configures former of the structure with a specific definition to streamline its usage in broader contexts, + /// especially where structure needs to be integrated into larger structures with a clear termination condition. + #vis type #as_subformer < #struct_generics_ty __Superformer, __End > = #former + < + #struct_generics_ty + #former_definition + < + #struct_generics_ty + __Superformer, + __Superformer, + __End, + // impl former::FormingEnd< CommandFormerDefinitionTypes< K, __Superformer, __Superformer > >, + >, + >; + + // = as subformer end + + #[ doc = #as_subformer_end_doc ] + pub trait #as_subformer_end < #struct_generics_impl SuperFormer > + where + #struct_generics_where + Self : former::FormingEnd + < + #former_definition_types < #struct_generics_ty SuperFormer, SuperFormer >, + >, + { + } + + impl< #struct_generics_impl SuperFormer, __T > #as_subformer_end < #struct_generics_ty SuperFormer > + for __T + where + #struct_generics_where + Self : former::FormingEnd + < + #former_definition_types < #struct_generics_ty SuperFormer, SuperFormer >, + >, + { + } + + // = etc + + #( + #namespace_code + )* + + }; + + if has_debug + { + let about = format!( "derive : Former\nstructure : {item}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} diff --git a/module/core/former_meta/src/derive_former/field.rs b/module/core/former_meta/src/derive_former/field.rs new file mode 100644 index 0000000000..13a702b308 --- /dev/null +++ b/module/core/former_meta/src/derive_former/field.rs @@ -0,0 +1,1585 @@ + +use super::*; +use macro_tools::{ container_kind }; + +/// +/// Definition of a field. +/// + +#[ allow( dead_code ) ] +pub struct FormerField< 'a > +{ + pub attrs : FieldAttributes, + pub vis : &'a syn::Visibility, + pub ident : &'a syn::Ident, + pub colon_token : &'a Option< syn::token::Colon >, + pub ty : &'a syn::Type, + pub non_optional_ty : &'a syn::Type, + pub is_optional : bool, + pub of_type : container_kind::ContainerKind, + pub for_storage : bool, + pub for_formed : bool, +} + +impl< 'a > FormerField< 'a > +{ + +/** methods + +from_syn + +storage_fields_none +storage_field_optional +storage_field_preform +storage_field_name +former_field_setter +scalar_setter +subform_entry_setter +subform_collection_setter + +scalar_setter_name +subform_scalar_setter_name, +subform_collection_setter_name +subform_entry_setter_name +scalar_setter_required + +*/ + + /// Construct former field from [`syn::Field`] + pub fn from_syn( field : &'a syn::Field, for_storage : bool, for_formed : bool ) -> Result< Self > + { + let attrs = FieldAttributes::from_attrs( field.attrs.iter() )?; + let vis = &field.vis; + let ident = field.ident.as_ref() + .ok_or_else( || syn_err!( field, "Expected that each field has key, but some does not:\n {}", qt!{ #field } ) )?; + let colon_token = &field.colon_token; + let ty = &field.ty; + let is_optional = typ::is_optional( ty ); + let of_type = container_kind::of_optional( ty ).0; + let non_optional_ty : &syn::Type = if is_optional { typ::parameter_first( ty )? } else { ty }; + let field2 = Self + { + attrs, + vis, + ident, + colon_token, + ty, + non_optional_ty, + is_optional, + of_type, + for_storage, + for_formed, + }; + Ok( field2 ) + } + + /// + /// Generate fields for initializer of a struct setting each field to `None`. + /// + /// Used for initializing a Collection, where on initialization all fields are None. User can alter them through builder pattern + /// + /// ### Basic use-case. of output + /// + /// ```ignore + /// int_1 : core::option::Option::None, + /// string_1 : core::option::Option::None, + /// int_optional_1 : core::option::Option::None, + /// ``` + /// + + #[ inline( always ) ] + pub fn storage_fields_none( &self ) -> TokenStream + { + let ident = Some( self.ident.clone() ); + let tokens = qt! { ::core::option::Option::None }; + let ty2 : syn::Type = syn::parse2( tokens ).unwrap(); + + qt! + { + #ident : #ty2 + } + } + + /// + /// Generate field of the former for a field of the structure + /// + /// Used to generate a Collection + /// + /// ### Basic use-case. of output + /// + /// ```ignore + /// pub int_1 : core::option::Option< i32 >, + /// pub string_1 : core::option::Option< String >, + /// pub int_optional_1 : core::option::Option< i32 >, + /// pub string_optional_1 : core::option::Option< String >, + /// ``` + /// + + #[ inline( always ) ] + pub fn storage_field_optional( &self ) -> TokenStream + { + let ident = Some( self.ident.clone() ); + let ty = self.ty.clone(); + + // let ty2 = if is_optional( &ty ) + let ty2 = if self.is_optional + { + qt! { #ty } + } + else + { + qt! { ::core::option::Option< #ty > } + }; + + qt! + { + pub #ident : #ty2 + } + + } + + /// + /// Generate code converting a field of the former to the field of the structure. + /// + /// In simple terms, used on `form()` call to unwrap contained values from the former's storage. + /// Will try to use default values if no values supplied by the former and the type implements `Default` trait. + /// + /// ### Generated code will look similar to this : + /// + /// ```ignore + /// let int_1 : i32 = if self.storage.int_1.is_some() + /// { + /// // if int_1 is optional + /// Some( self.storage.int_1.take().unwrap() ) + /// + /// // if int_1 isn't optional + /// self.storage.int_1.take().unwrap() + /// } + /// else + /// { + /// // if int_1 is optional and has default + /// Some( i32::default().into() ) + /// + /// // if int_1 is optional and doesn't have default + /// None + /// + /// // if int_1 isn't optional and has default + /// i32::default().into() + /// + /// // if int_1 isn't optional and hasn't default + /// panic!( "Field 'int_1' isn't initialized" ) + /// }; + /// ``` + /// + + #[ inline( always ) ] + pub fn storage_field_preform( &self ) -> Result< TokenStream > + { + + if !self.for_formed + { + return Ok( qt!{} ) + } + + let ident = self.ident; + let ty = self.ty; + let default : Option< &syn::Expr > = self.attrs.config.as_ref() + .and_then( | attr | attr.default.ref_internal() ); + + let tokens = if self.is_optional + { + + let _else = match default + { + None => + { + qt! + { + ::core::option::Option::None + } + } + + Some( default_val ) => + { + qt! + { + ::core::option::Option::Some( ::core::convert::Into::into( #default_val ) ) + } + } + }; + + qt! + { + let #ident = if self.#ident.is_some() + { + ::core::option::Option::Some( self.#ident.take().unwrap() ) + } + else + { + #_else + }; + } + + } + else + { + + let _else = match default + { + None => + { + let panic_msg = format!( "Field '{}' isn't initialized", ident ); + qt! + { + { + // By hardly utilizing deref coercion, we achieve conditional trait implementation + trait MaybeDefault< T > + { + fn maybe_default( self : &Self ) -> T { panic!( #panic_msg ) } + } + + // Panic on non-`Default` types + impl< T > MaybeDefault< T > + for &::core::marker::PhantomData< T > + {} + + // Return default value on `Default`` types + impl< T > MaybeDefault< T > + for ::core::marker::PhantomData< T > + where T : ::core::default::Default, + { + fn maybe_default( self : &Self ) -> T + { + T::default() + } + } + + // default if `impl Default`, otherwise - panic + ( &::core::marker::PhantomData::< #ty > ).maybe_default() + } + } + } + Some( default_val ) => + { + qt! + { + ::core::convert::Into::into( #default_val ) + } + } + }; + + qt! + { + let #ident = if self.#ident.is_some() + { + self.#ident.take().unwrap() + } + else + { + #_else + }; + } + + }; + + Ok( tokens ) + } + + /// + /// Extract name of a field out. + /// + + #[ inline( always ) ] + pub fn storage_field_name( &self ) -> TokenStream + { + + if !self.for_formed + { + return qt!{} + } + + let ident = self.ident; + qt!{ #ident, } + + } + + /// Generates former setters for the specified field within a struct or enum. + /// + /// This function is responsible for dynamically creating code that allows for the building + /// or modifying of fields within a `Former`-enabled struct or enum. It supports different + /// types of setters based on the field attributes, such as scalar setters, collection setters, + /// and subform setters. + /// + /// # Returns + /// + /// Returns a pair of `TokenStream` instances: + /// - The first `TokenStream` contains the generated setter functions for the field. + /// - The second `TokenStream` includes additional namespace or supporting code that might + /// be required for the setters to function correctly, such as definitions for end conditions + /// or callbacks used in the formation process. + /// + /// The generation of setters is dependent on the attributes of the field: + /// - **Scalar Setters**: Created for basic data types and simple fields. + /// - **Collection Setters**: Generated when the field is annotated to behave as a collection, + /// supporting operations like adding or replacing elements. + /// - **Subform Setters**: Generated for fields annotated as subforms, allowing for nested + /// forming processes where a field itself can be formed using a dedicated former. + /// + + #[ inline ] + pub fn former_field_setter + ( + &self, + item : &syn::Ident, + original_input : &proc_macro::TokenStream, + struct_generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + former : &syn::Ident, + former_generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + former_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + former_generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + former_storage : &syn::Ident, + ) + -> Result< ( TokenStream, TokenStream ) > + { + + // scalar setter + let namespace_code = qt! {}; + let setters_code = self.scalar_setter + ( + item, + former, + former_storage, + original_input, + ); + + // subform scalar setter + let ( setters_code, namespace_code ) = if self.attrs.subform_scalar.is_some() + { + let ( setters_code2, namespace_code2 ) = self.subform_scalar_setter + ( + item, + former, + former_storage, + former_generics_ty, + struct_generics_impl, + struct_generics_ty, + struct_generics_where, + original_input, + )?; + ( qt! { #setters_code #setters_code2 }, qt! { #namespace_code #namespace_code2 } ) + } + else + { + ( setters_code, namespace_code ) + }; + + // subform collection setter + let ( setters_code, namespace_code ) = if let Some( _ ) = &self.attrs.subform_collection + { + let ( setters_code2, namespace_code2 ) = self.subform_collection_setter + ( + item, + former, + former_storage, + former_generics_impl, + former_generics_ty, + former_generics_where, + original_input, + )?; + ( qt! { #setters_code #setters_code2 }, qt! { #namespace_code #namespace_code2 } ) + } + else + { + ( setters_code, namespace_code ) + }; + + // subform entry setter + let ( setters_code, namespace_code ) = if self.attrs.subform_entry.is_some() + { + let ( setters_code2, namespace_code2 ) = self.subform_entry_setter + ( + item, + former, + former_storage, + former_generics_ty, + struct_generics_impl, + struct_generics_ty, + struct_generics_where, + original_input, + )?; + ( qt! { #setters_code #setters_code2 }, qt! { #namespace_code #namespace_code2 } ) + } + else + { + ( setters_code, namespace_code ) + }; + + // tree_print!( setters_code.as_ref().unwrap() ); + Ok( ( setters_code, namespace_code ) ) + } + + /// + /// Generate a single scalar setter for the 'field_ident' with the 'setter_name' name. + /// + /// Used as a helper function for former_field_setter(), which generates alias setters + /// + /// # Example of generated code + /// + /// ```ignore + /// #[ doc = "Setter for the 'int_1' field." ] + /// #[ inline ] + /// pub fn int_1< Src >( mut self, src : Src ) -> Self + /// where + /// Src : ::core::convert::Into< i32 >, + /// { + /// debug_assert!( self.int_1.is_none() ); + /// self.storage.int_1 = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + /// self + /// } + /// ``` + + #[ inline ] + pub fn scalar_setter + ( + &self, + item : &syn::Ident, + former : &syn::Ident, + former_storage : &syn::Ident, + original_input : &proc_macro::TokenStream, + ) + -> TokenStream + { + let field_ident = self.ident; + let typ = self.non_optional_ty; + let setter_name = self.scalar_setter_name(); + let attr = self.attrs.scalar.as_ref(); + + if attr.is_some() && attr.unwrap().debug.value( false ) + { + let debug = format! + ( + r#" +impl< Definition > {former}< Definition > +where + Definition : former::FormerDefinition< Storage = {former_storage} >, +{{ + #[ inline ] + pub fn {field_ident}< Src >( mut self, src : Src ) -> Self + where + Src : ::core::convert::Into< {0} >, + {{ + debug_assert!( self.storage.{field_ident}.is_none() ); + self.storage.{field_ident} = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + }} +}} + "#, + format!( "{}", qt!{ #typ } ), + ); + let about = format! + ( +r#"derive : Former +item : {item} +field : {field_ident}"#, + ); + diag::report_print( about, original_input, debug ); + } + + if !self.scalar_setter_required() + { + return qt! {}; + } + + let doc = format! + ( + "Scalar setter for the '{}' field.", + field_ident, + ); + + qt! + { + #[ doc = #doc ] + #[ inline ] + pub fn #setter_name< Src >( mut self, src : Src ) -> Self + where + Src : ::core::convert::Into< #typ >, + { + debug_assert!( self.storage.#field_ident.is_none() ); + self.storage.#field_ident = ::core::option::Option::Some( ::core::convert::Into::into( src ) ); + self + } + } + + } + + /// + /// Generate a collection setter for the 'field_ident' with the 'setter_name' name. + /// + /// See `tests/inc/former_tests/subform_collection_manual.rs` for example of generated code. + /// + + #[ inline ] + pub fn subform_collection_setter + ( + &self, + item : &syn::Ident, + former : &syn::Ident, + former_storage : &syn::Ident, + former_generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + former_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + former_generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + original_input : &proc_macro::TokenStream, + ) + -> Result< ( TokenStream, TokenStream ) > + { + let attr = self.attrs.subform_collection.as_ref().unwrap(); + let field_ident = &self.ident; + let field_typ = &self.non_optional_ty; + let params = typ::type_parameters( &field_typ, .. ); + + use convert_case::{ Case, Casing }; + + // example : `ParentSubformCollectionChildrenEnd` + let subform_collection_end = format_ident! + { + "{}SubformCollection{}End", + item, + field_ident.to_string().to_case( Case::Pascal ) + }; + + // example : `_children_subform_collection` + let subform_collection = format_ident! + { + "_{}_subform_collection", + field_ident + }; + // example : `former::VectorDefinition` + let subformer_definition = &attr.definition; + let subformer_definition = if subformer_definition.is_some() + { + qt! + { + #subformer_definition + < + #( #params, )* + Self, + Self, + #subform_collection_end< Definition >, + > + } + // former::VectorDefinition< String, Self, Self, Struct1SubformCollectionVec1End, > + } + else + { + qt! + { + < + #field_typ as former::EntityToDefinition< Self, Self, #subform_collection_end< Definition > > + >::Definition + } + // < Vec< String > as former::EntityToDefinition< Self, Self, Struct1SubformCollectionVec1End > >::Definition + }; + + let doc = format! + ( + "Collection setter for the '{}' field. Method {} unlike method {} accept custom collection subformer.", + field_ident, + subform_collection, + field_ident, + ); + + let setter1 = + qt! + { + + #[ doc = #doc ] + #[ inline( always ) ] + pub fn #subform_collection< Former2 >( self ) -> Former2 + where + Former2 : former::FormerBegin + < + #subformer_definition, + >, + #subformer_definition : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < #field_typ as former::Collection >::Entry >, + Storage = #field_typ, + Context = #former< #former_generics_ty >, + End = #subform_collection_end< Definition >, + >, + { + Former2::former_begin( None, Some( self ), #subform_collection_end::< Definition >::default() ) + } + + // #[ inline( always ) ] + // pub fn _hashset_1_assign< Former2 >( self ) -> Former2 + // where + // Former2 : former::FormerBegin + // < + // former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > >, + // >, + // former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > > : former::FormerDefinition + // < + // Storage : former::CollectionAdd< Entry = < collection_tools::HashSet< String > as former::Collection >::Entry >, + // Context = Struct1Former< Definition >, + // End = Struct1SubformCollectionHashset1End< Definition >, + // >, + // { + // Former2::former_begin( None, Some( self ), Struct1SubformCollectionHashset1End::< Definition >::default() ) + // } + + }; + + let setter_name = self.subform_collection_setter_name(); + let setter2 = if let Some( setter_name ) = setter_name + { + qt! + { + + #[ doc = #doc ] + #[ inline( always ) ] + pub fn #setter_name( self ) -> former::CollectionFormer:: + < + // ( #( #params, )* ), + < #field_typ as former::Collection >::Entry, + #subformer_definition, + > + where + #subformer_definition : former::FormerDefinition + < + // Storage : former::CollectionAdd< Entry = < #field_typ as former::Collection >::Entry >, + Storage = #field_typ, + Context = #former< #former_generics_ty >, + End = #subform_collection_end < Definition >, + >, + { + self.#subform_collection::< former::CollectionFormer:: + < + _, + _, + // ( #( #params, )* ), + // #subformer_definition, + > > () + } + + // #[ inline( always ) ] + // pub fn hashset_1( self ) -> former::CollectionFormer:: + // < + // String, + // former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > >, + // > + // where + // former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > > : former::FormerDefinition + // < + // Storage : former::CollectionAdd< Entry = < collection_tools::HashSet< String > as former::Collection >::Entry >, + // Context = Struct1Former< Definition >, + // End = Struct1SubformCollectionHashset1End< Definition >, + // >, + // { + // self._hashset_1_assign::< former::CollectionFormer:: + // < + // String, + // former::HashSetDefinition< String, Self, Self, Struct1SubformCollectionHashset1End< Definition > >, + // > > () + // } + + } + } + else + { + qt!{} + }; + + if attr.debug.value( false ) + { + let debug = format! + ( + r#" +/// The collection setter provides a collection setter that returns a CollectionFormer tailored for managing a collection of child entities. It employs a generic collection definition to facilitate operations on the entire collection, such as adding or updating elements. + +impl< Definition, > {former}< Definition, > +where + Definition : former::FormerDefinition< Storage = {former_storage} >, +{{ + + #[ inline( always ) ] + pub fn {field_ident}( self ) -> former::CollectionFormer:: + < + ( {0} ), + former::HashMapDefinition< {0} Self, Self, {subform_collection_end}< Definition >, > + // Replace `HashMapDefinition` with definition for your collection + > + {{ + self.{subform_collection}() + }} + +}} + "#, + format!( "{}", qt!{ #( #params, )* } ), + ); + let about = format! + ( +r#"derive : Former +item : {item} +field : {field_ident}"#, + ); + diag::report_print( about, original_input, debug ); + } + + let setters_code = qt! + { + #setter1 + #setter2 + }; + + // example : `former::VectorDefinition`` + let subformer_definition = self.attrs.subform_collection.as_ref().unwrap().definition.ref_internal(); + + let subform_collection_end_doc = format! + ( + r#" +A callback structure to manage the final stage of forming a `{0}` for the `{item}` collection. + +This callback is used to integrate the contents of a temporary `{0}` back into the original `{item}` former +after the subforming process is completed. It replaces the existing content of the `{field_ident}` field in `{item}` +with the new content generated during the subforming process. + "#, + format!( "{}", qt!{ #field_typ } ), + ); + + let subformer_definition_types = if let Some( ref _subformer_definition ) = subformer_definition + { + let subformer_definition_types_string = format!( "{}Types", qt!{ #subformer_definition } ); + let subformer_definition_types : syn::Type = syn::parse_str( &subformer_definition_types_string )?; + qt! + { + #subformer_definition_types + < + #( #params, )* + #former< #former_generics_ty >, + #former< #former_generics_ty >, + > + } + } + else + { + qt! + { + < + #field_typ as former::EntityToDefinitionTypes + < + #former< #former_generics_ty >, + #former< #former_generics_ty >, + > + >::Types + } + }; + + let r = qt! + { + + #[ doc = #subform_collection_end_doc ] + pub struct #subform_collection_end< Definition > + { + _phantom : core::marker::PhantomData< ( Definition, ) >, + } + + impl< Definition > Default + for #subform_collection_end< Definition > + { + + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + + } + + #[ automatically_derived ] + impl< #former_generics_impl > former::FormingEnd + < + // VectorDefinitionTypes + #subformer_definition_types, + > + for #subform_collection_end< Definition > + where + #former_generics_where + { + #[ inline( always ) ] + fn call + ( + &self, + storage : #field_typ, + super_former : Option< #former< #former_generics_ty > >, + ) + -> #former< #former_generics_ty > + { + let mut super_former = super_former.unwrap(); + if let Some( ref mut field ) = super_former.storage.#field_ident + { + former::CollectionAssign::assign( field, storage ); + } + else + { + super_former.storage.#field_ident = Some( storage ); + } + super_former + } + } + + }; + + // tree_print!( r.as_ref().unwrap() ); + let namespace_code = r; + + Ok( ( setters_code, namespace_code ) ) + } + + /// Generates setter functions to subform entries of a collection. + /// + /// This function is a key component of the `former` crate's capability to dynamically create setters for manipulating + /// data within a nested collection structure like a `HashMap` or a `Vec`. The setters facilitate the addition or + /// modification of entries within the collection, directly from the parent former's context. + /// + /// See `tests/inc/former_tests/subform_entry_manual.rs` for example of generated code. + /// + + #[ inline ] + pub fn subform_entry_setter + ( + &self, + item : &syn::Ident, + former : &syn::Ident, + former_storage : &syn::Ident, + former_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + original_input : &proc_macro::TokenStream, + ) + -> Result< ( TokenStream, TokenStream ) > + { + + use convert_case::{ Case, Casing }; + let field_ident = self.ident; + let field_typ = self.non_optional_ty; + let entry_typ : &syn::Type = typ::parameter_first( field_typ )?; + + let attr = self.attrs.subform_entry.as_ref().unwrap(); + // let params = typ::type_parameters( &self.non_optional_ty, .. ); + + // example : `children` + let setter_name = self.subform_entry_setter_name(); + + // example : `ParentSubformEntryChildrenEnd` + let subform_entry_end = format_ident! + { + "{}SubformEntry{}End", + item, + field_ident.to_string().to_case( Case::Pascal ) + }; + + // example : `_children_subform_entry` + let subform_entry = format_ident! + { + "_{}_subform_entry", + field_ident + }; + + let doc = format! + ( + r#" + +Initiates the addition of {field_ident} to the `{item}` entity using a dedicated subformer. + +This method configures and returns a subformer specialized for the `{0}` entities' formation process, +which is part of the `{item}` entity's construction. The subformer is set up with a specific end condition +handled by `{subform_entry_end}`, ensuring that the {field_ident} are properly integrated into the +parent's structure once formed. + +# Returns + +Returns an instance of `Former2`, a subformer ready to begin the formation process for `{0}` entities, +allowing for dynamic and flexible construction of the `{item}` entity's {field_ident}. + + "#, + format!( "{}", qt!{ #field_typ } ), + ); + + let setters_code = qt! + { + + #[ doc = #doc ] + #[ inline( always ) ] + pub fn #subform_entry< Former2, Definition2 >( self ) -> Former2 + where + Definition2 : former::FormerDefinition + < + End = #subform_entry_end< Definition >, + Storage = < < #field_typ as former::Collection >::Val as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Definition2::Types : former::FormerDefinitionTypes + < + Storage = < < #field_typ as former::Collection >::Val as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Former2 : former::FormerBegin< Definition2 >, + { + Former2::former_begin( None, Some( self ), #subform_entry_end::default() ) + } + + }; + + let setters_code = if attr.setter() + { + + let doc = format! + ( + r#" +Provides a user-friendly interface to add an instancce of {field_ident} to the {item}. + +# Returns + +Returns an instance of `Former2`, a subformer ready to begin the formation process for `{0}` entities, +allowing for dynamic and flexible construction of the `{item}` entity's {field_ident}. + + "#, + format!( "{}", qt!{ #field_typ } ), + ); + + qt! + { + #setters_code + + #[ doc = #doc ] + #[ inline( always ) ] + pub fn #setter_name( self ) -> + < < #field_typ as former::Collection >::Val as former::EntityToFormer + < + < + < #field_typ as former::Collection >::Val as former::EntityToDefinition< Self, Self, #subform_entry_end < Definition > > + >::Definition, + > + >::Former + // #as_subformer< Self, impl #as_subformer_end< Self > > + { + self.#subform_entry + ::< < < #field_typ as former::Collection >::Val as former::EntityToFormer< _ > >::Former, _, >() + // ::< #former< _ >, _, >() + } + } + + // #[ inline( always ) ] + // pub fn child( self ) -> + // ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + // { + // self._children_subform_entry + // ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + // } + + } + else + { + setters_code + }; + + if attr.debug.value( false ) + { + let debug = format! + ( + r#" +/// Initializes and configures a subformer for adding named child entities. This method leverages an internal function +/// to create and return a configured subformer instance. It allows for the dynamic addition of children with specific names, +/// integrating them into the formation process of the parent entity. + +impl< Definition > {former}< Definition > +where + Definition : former::FormerDefinition< Storage = {former_storage} >, +{{ + + #[ inline( always ) ] + pub fn {field_ident}( self ) -> {0}AsSubformer< Self, impl {0}AsSubformerEnd< Self > > + {{ + self.{subform_entry}::< {0}Former< _ >, _, >() + }} + // Replace {0} with name of type of entry value. + +}} + "#, + format!( "{}", qt!{ #entry_typ } ), + ); + let about = format! + ( +r#"derive : Former +item : {item} +field : {field_ident}"#, + ); + diag::report_print( about, original_input, debug ); + } + + let doc = format! + ( + r#" + +Implements the `FormingEnd` trait for `{subform_entry_end}` to handle the final +stage of the forming process for a `{item}` collection that contains `{0}` elements. + +This implementation is tailored to manage the transition of {field_ident} elements from a substorage +temporary state into their final state within the `{item}`'s storage. The function ensures +that the `{item}`'s {field_ident} storage is initialized if not already set, and then adds the +preformed elements to this storage. + +# Type Parameters + +- `Types2`: Represents the specific types associated with the `Former` trait being applied, + which include storage, formed type, and context. +- `Definition`: Defines the `FormerDefinition` that outlines the storage structure and + the end conditions for the formation process. + +# Parameters + +- `substorage`: The storage from which {field_ident} elements are preformed and retrieved. +- `super_former`: An optional context which, upon invocation, contains the `{former}` + instance being formed. + +# Returns + +Returns the updated `{former}` instance with newly added {field_ident}, completing the +formation process of the `{item}`. + + "#, + format!( "{}", qt!{ #field_typ } ), + ); + + + let namespace_code = qt! + { + + #[ doc = #doc ] + pub struct #subform_entry_end< Definition > + { + _phantom : core::marker::PhantomData< fn( Definition ) >, + } + + impl< Definition > Default + for #subform_entry_end< Definition > + { + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + } + + impl< #struct_generics_impl Types2, Definition > former::FormingEnd< Types2, > + for #subform_entry_end< Definition > + where + Definition : former::FormerDefinition + < + Storage = < #item < #struct_generics_ty > as former::EntityToStorage >::Storage, + >, + Types2 : former::FormerDefinitionTypes + < + Storage = < < #field_typ as former::Collection >::Val as former::EntityToStorage >::Storage, + Formed = #former< #former_generics_ty >, + Context = #former< #former_generics_ty >, + >, + #struct_generics_where + { + #[ inline( always ) ] + fn call + ( + &self, + substorage : Types2::Storage, + super_former : core::option::Option< Types2::Context >, + ) + -> Types2::Formed + { + let mut super_former = super_former.unwrap(); + if super_former.storage.#field_ident.is_none() + { + super_former.storage.#field_ident = Some( Default::default() ); + } + if let Some( ref mut field ) = super_former.storage.#field_ident + { + former::CollectionAdd::add + ( + field, + < < #field_typ as former::Collection >::Val as former::ValToEntry< #field_typ > > + ::val_to_entry( former::StoragePreform::preform( substorage ) ), + ); + } + super_former + } + } + + }; + + // tree_print!( setters_code.as_ref().unwrap() ); + Ok( ( setters_code, namespace_code ) ) + } + + /// Generates setter functions to subform scalar and all corresponding helpers. + /// + /// See `tests/inc/former_tests/subform_scalar_manual.rs` for example of generated code. + + #[ inline ] + pub fn subform_scalar_setter + ( + &self, + item : &syn::Ident, + former : &syn::Ident, + _former_storage : &syn::Ident, + former_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_impl : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_ty : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + struct_generics_where : &syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + original_input : &proc_macro::TokenStream, + ) + -> Result< ( TokenStream, TokenStream ) > + { + + use convert_case::{ Case, Casing }; + let field_ident = self.ident; + let field_typ = self.non_optional_ty; + let attr = self.attrs.subform_scalar.as_ref().unwrap(); + // let params = typ::type_parameters( &self.non_optional_ty, .. ); + + // example : `children` + let setter_name = self.subform_scalar_setter_name(); + + // example : `ParentSubformScalarChildrenEnd` + let subform_scalar_end = format_ident! + { + "{}SubformScalar{}End", + item, + field_ident.to_string().to_case( Case::Pascal ) + }; + + // example : `_children_subform_scalar` + let subform_scalar = format_ident! + { + "_{}_subform_scalar", + field_ident + }; + + let doc = format! + ( + r#" + +Initiates the scalar subformer for a `{0}` entity within a `{item}`. + +This function creates a subformer specifically for handling scalar values associated with a `{0}` entity, +leveraging a dedicated end structure to integrate the formed value seamlessly back into the `{item}`. + +## Type Parameters + +- `Former2`: Represents the specific former to be returned. +- `Definition2`: Defines the former's setup including its end action and storage specifics. + +## Returns + +- `Former2`: An instance of the former configured to handle the scalar formation of a `{0}`. + +This method prepares the forming context, ensuring that the subforming process for a scalar field in `{item}` +is properly initialized with all necessary configurations, including the default end action for integration. + +## Usage + +This function is typically called internally by a more user-friendly method that abstracts away the complex +generics, providing a cleaner interface for initiating subform operations on scalar fields. + + "#, + format!( "{}", qt!{ #field_typ } ), + ); + + let setters_code = qt! + { + + #[ doc = #doc ] + #[ inline( always ) ] + pub fn #subform_scalar< Former2, Definition2 >( self ) -> + Former2 + where + Definition2 : former::FormerDefinition + < + End = #subform_scalar_end< Definition >, + Storage = < #field_typ as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Definition2::Types : former::FormerDefinitionTypes + < + Storage = < #field_typ as former::EntityToStorage >::Storage, + Formed = Self, + Context = Self, + >, + Former2 : former::FormerBegin< Definition2 >, + { + Former2::former_begin( None, Some( self ), #subform_scalar_end::default() ) + } + + // #[ inline( always ) ] + // pub fn _child_scalar_subformer< Former2, Definition2 >( self ) -> + // Former2 + // where + // Definition2 : former::FormerDefinition + // < + // End = ParentFormerSubformScalarChildEnd< Definition >, + // Storage = < Child as former::EntityToStorage >::Storage, + // Formed = Self, + // Context = Self, + // >, + // Definition2::Types : former::FormerDefinitionTypes + // < + // Storage = < Child as former::EntityToStorage >::Storage, + // Formed = Self, + // Context = Self, + // >, + // Former2 : former::FormerBegin< Definition2 >, + // { + // Former2::former_begin( None, Some( self ), ParentFormerSubformScalarChildEnd::default() ) + // } + + }; + + let setters_code = if attr.setter() + { + + let doc = format! + ( + r#" +Provides a user-friendly interface to begin subforming a scalar `{0}` field within a `{item}`. + +This method abstracts the underlying complex generics involved in setting up the former, simplifying the +user interaction needed to initiate the subform process for a scalar field associated with a `{0}`. + +This method utilizes the more generic `{subform_scalar}` method to set up and return the subformer, +providing a straightforward and type-safe interface for client code. It encapsulates details about the specific +former and end action types, ensuring a seamless developer experience when forming parts of a `{item}`. + + "#, + format!( "{}", qt!{ #field_typ } ), + ); + + qt! + { + #setters_code + + #[ doc = #doc ] + #[ inline( always ) ] + pub fn #setter_name( self ) -> + < #field_typ as former::EntityToFormer + < + < + #field_typ as former::EntityToDefinition< Self, Self, #subform_scalar_end < Definition > > + >::Definition, + > + >::Former + { + self.#subform_scalar + ::< < #field_typ as former::EntityToFormer< _ > >::Former, _, >() + } + + // #[ inline( always ) ] + // pub fn child( self ) -> + // ChildAsSubformer< Self, impl ChildAsSubformerEnd< Self > > + // { + // self._child_scalar_subformer + // ::< < Child as former::EntityToFormer< _ > >::Former, _, >() + // } + + } + + } + else + { + setters_code + }; + + if attr.debug.value( false ) + { + let debug = format! + ( + r#" +/// Extends `{former}` to include a method that initializes and configures a subformer for the '{field_ident}' field. +/// This function demonstrates the dynamic addition of a named {field_ident}, leveraging a subformer to specify detailed properties. + +impl< Definition > {former}< Definition > +where + Definition : former::FormerDefinition< Storage = < {item} as former::EntityToStorage >::Storage >, +{{ + #[ inline( always ) ] + pub fn {field_ident}( self, name : &str ) -> {0}AsSubformer< Self, impl {0}AsSubformerEnd< Self > > + {{ + self._{field_ident}_subform_scalar::< {0}Former< _ >, _, >().name( name ) + }} +}} + "#, + format!( "{}", qt!{ #field_typ } ), + ); + let about = format! + ( +r#"derive : Former +item : {item} +field : {field_ident}"#, + ); + diag::report_print( about, original_input, debug ); + } + + let doc = format! + ( + r#" + +Represents the endpoint for the forming process of a scalar field managed by a subformer within a `{item}` entity. + +This structure is a critical component of the forming process when using a subform scalar setter. It handles +the finalization of the scalar field's value that has been configured through its dedicated subformer. +Essentially, this end action integrates the individually formed scalar value back into the parent structure. + +## Type Parameters + +- `Definition`: The type that defines the former setup for the `{item}` entity, influencing storage and behavior during forming. + +## Parameters of `call` + +- `substorage`: Storage type specific to the `{0}`, containing the newly formed scalar value. +- `super_former`: An optional context of the `{former}`, which will receive the value. The function ensures + that this context is not `None` and inserts the formed value into the designated field within `{item}`'s storage. + + "#, + format!( "{}", qt!{ #field_typ } ), + ); + + let namespace_code = qt! + { + + #[ doc = #doc ] + pub struct #subform_scalar_end< Definition > + { + _phantom : core::marker::PhantomData< fn( Definition ) >, + } + + impl< Definition > Default + for #subform_scalar_end< Definition > + { + #[ inline( always ) ] + fn default() -> Self + { + Self + { + _phantom : core::marker::PhantomData, + } + } + } + + impl< #struct_generics_impl Types2, Definition > former::FormingEnd< Types2, > + for #subform_scalar_end< Definition > + where + Definition : former::FormerDefinition + < + Storage = < #item < #struct_generics_ty > as former::EntityToStorage >::Storage, + >, + Types2 : former::FormerDefinitionTypes + < + Storage = < #field_typ as former::EntityToStorage >::Storage, + Formed = #former< #former_generics_ty >, + Context = #former< #former_generics_ty >, + >, + #struct_generics_where + { + #[ inline( always ) ] + fn call + ( + &self, + substorage : Types2::Storage, + super_former : core::option::Option< Types2::Context >, + ) + -> Types2::Formed + { + let mut super_former = super_former.unwrap(); + debug_assert!( super_former.storage.#field_ident.is_none() ); + super_former.storage.#field_ident = Some( ::core::convert::Into::into( former::StoragePreform::preform( substorage ) ) ); + super_former + } + } + +// pub struct ParentFormerSubformScalarChildEnd< Definition > +// { +// _phantom : core::marker::PhantomData< fn( Definition ) >, +// } +// +// impl< Definition > Default +// for ParentFormerSubformScalarChildEnd< Definition > +// { +// #[ inline( always ) ] +// fn default() -> Self +// { +// Self +// { +// _phantom : core::marker::PhantomData, +// } +// } +// } +// +// impl< Types2, Definition > former::FormingEnd< Types2, > +// for ParentFormerSubformScalarChildEnd< Definition > +// where +// Definition : former::FormerDefinition +// < +// Storage = < Parent as former::EntityToStorage >::Storage, +// >, +// Types2 : former::FormerDefinitionTypes +// < +// Storage = < Child as former::EntityToStorage >::Storage, +// Formed = ParentFormer< Definition >, +// Context = ParentFormer< Definition >, +// >, +// { +// #[ inline( always ) ] +// fn call +// ( +// &self, +// substorage : Types2::Storage, +// super_former : core::option::Option< Types2::Context >, +// ) +// -> Types2::Formed +// { +// let mut super_former = super_former.unwrap(); +// debug_assert!( super_former.storage.child.is_none() ); +// super_former.storage.child = Some( ::core::convert::Into::into( former::StoragePreform::preform( substorage ) ) ); +// super_former +// } +// } + + }; + + // tree_print!( setters_code.as_ref().unwrap() ); + Ok( ( setters_code, namespace_code ) ) + } + + /// Get name of scalar setter. + pub fn scalar_setter_name( &self ) -> &syn::Ident + { + if let Some( ref attr ) = self.attrs.scalar + { + if let Some( ref name ) = attr.name.ref_internal() + { + return name + } + } + return &self.ident; + } + + /// Get name of setter for subform scalar if such setter should be generated. + pub fn subform_scalar_setter_name( &self ) -> Option< &syn::Ident > + { + if let Some( ref attr ) = self.attrs.subform_scalar + { + if attr.setter() + { + if let Some( ref name ) = attr.name.ref_internal() + { + return Some( &name ) + } + else + { + return Some( &self.ident ) + } + } + } + return None; + } + + /// Get name of setter for collection if such setter should be generated. + pub fn subform_collection_setter_name( &self ) -> Option< &syn::Ident > + { + if let Some( ref attr ) = self.attrs.subform_collection + { + if attr.setter() + { + if let Some( ref name ) = attr.name.ref_internal() + { + return Some( &name ) + } + else + { + return Some( &self.ident ) + } + } + } + return None; + } + + /// Get name of setter for subform if such setter should be generated. + pub fn subform_entry_setter_name( &self ) -> Option< &syn::Ident > + { + if let Some( ref attr ) = self.attrs.subform_entry + { + if attr.setter() + { + if let Some( ref name ) = attr.name.as_ref() + { + return Some( &name ) + } + else + { + return Some( &self.ident ) + } + } + } + return None; + } + + /// Is scalar setter required. Does not if collection of subformer setter requested. + pub fn scalar_setter_required( &self ) -> bool + { + + let mut explicit = false; + if let Some( ref attr ) = self.attrs.scalar + { + if let Some( setter ) = attr.setter.internal() + { + if setter == false + { + return false + } + explicit = true; + } + if let Some( ref _name ) = attr.name.ref_internal() + { + explicit = true; + } + } + + if self.attrs.subform_scalar.is_some() && !explicit + { + return false; + } + + if self.attrs.subform_collection.is_some() && !explicit + { + return false; + } + + if self.attrs.subform_entry.is_some() && !explicit + { + return false; + } + + return true; + } + +} diff --git a/module/core/former_meta/src/derive_former/field_attrs.rs b/module/core/former_meta/src/derive_former/field_attrs.rs new file mode 100644 index 0000000000..0dd3cf3edc --- /dev/null +++ b/module/core/former_meta/src/derive_former/field_attrs.rs @@ -0,0 +1,1033 @@ +//! Attributes of a field. + +use super::*; +use macro_tools:: +{ + Result, + AttributeComponent, + AttributePropertyComponent, + AttributePropertyOptionalBoolean, + AttributePropertyOptionalSyn, + AttributePropertyOptionalSingletone, +}; +use former_types::{ Assign, OptionExt }; + +/// +/// Attributes of a field. +/// + +#[ derive( Debug, Default ) ] +pub struct FieldAttributes +{ + /// Configuration attribute for a field. + pub config : Option< AttributeConfig >, + + /// Scalar setter attribute for a field. + pub scalar : Option< AttributeScalarSetter >, + + /// Subform scalar setter attribute for a field. + pub subform_scalar : Option< AttributeSubformScalarSetter >, + + /// Subform collection setter attribute for a field. + pub subform_collection : Option< AttributeSubformCollectionSetter >, + + /// Subform entry setter attribute for a field. + pub subform_entry : Option< AttributeSubformEntrySetter >, +} + +impl FieldAttributes +{ + + /// Creates an instance of `FieldAttributes` from a list of attributes. + /// + /// # Parameters + /// + /// * `attrs`: An iterator over references to `syn::Attribute`. + /// + /// # Returns + /// + /// * `Result< Self >`: A result containing an instance of `FieldAttributes` on success, + /// or a `syn::Error` on failure. + /// + /// This function processes each attribute in the provided iterator and assigns the + /// appropriate attribute type to the respective field in the `FieldAttributes` struct. + /// + pub fn from_attrs< 'a >( attrs : impl Iterator< Item = &'a syn::Attribute > ) -> Result< Self > + { + let mut result = Self::default(); + // Known attributes for error reporting + let known_attributes = const_format::concatcp! + ( + "Known attributes are : ", + "debug", + ", ", AttributeConfig::KEYWORD, + ", ", AttributeScalarSetter::KEYWORD, + ", ", AttributeSubformScalarSetter::KEYWORD, + ", ", AttributeSubformCollectionSetter::KEYWORD, + ", ", AttributeSubformEntrySetter::KEYWORD, + ".", + ); + + // Helper closure to create a syn::Error for unknown attributes + let error = | attr : &syn::Attribute | -> syn::Error + { + syn_err! + ( + attr, + "Expects an attribute of format `#[ attribute( key1 = val1, key2 = val2 ) ]`\n {known_attributes}\n But got:\n `{}`", + qt!{ #attr } + ) + }; + + // Iterate over the provided attributes + for attr in attrs + { + // Get the attribute key as a string + let key_ident = attr.path().get_ident().ok_or_else( || error( attr ) )?; + let key_str = format!( "{}", key_ident ); + + // // Skip standard attributes + // if attr::is_standard( &key_str ) + // { + // continue; + // } + // attributes does not have to be known + + // Match the attribute key and assign to the appropriate field + match key_str.as_ref() + { + AttributeConfig::KEYWORD => result.assign( AttributeConfig::from_meta( attr )? ), + AttributeScalarSetter::KEYWORD => result.assign( AttributeScalarSetter::from_meta( attr )? ), + AttributeSubformScalarSetter::KEYWORD => result.assign( AttributeSubformScalarSetter::from_meta( attr )? ), + AttributeSubformCollectionSetter::KEYWORD => result.assign( AttributeSubformCollectionSetter::from_meta( attr )? ), + AttributeSubformEntrySetter::KEYWORD => result.assign( AttributeSubformEntrySetter::from_meta( attr )? ), + "debug" => {}, + _ => {}, + // _ => return Err( error( attr ) ), + // attributes does not have to be known + } + } + + Ok( result ) + } + +} + +/// +/// Attribute to hold configuration information about the field such as default value. +/// +/// `#[ default( 13 ) ]` +/// + +#[ derive( Debug, Default ) ] +pub struct AttributeConfig +{ + + /// Default value to use for a field. + pub default : AttributePropertyDefault, + +} + +impl AttributeComponent for AttributeConfig +{ + + const KEYWORD : &'static str = "former"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + syn::parse2::< AttributeConfig >( meta_list.tokens.clone() ) + }, + syn::Meta::Path( ref _path ) => + { + syn::parse2::< AttributeConfig >( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format #[ former( default = 13 ) ].\nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< AttributeConfig, IntoT > for FieldAttributes +where + IntoT : Into< AttributeConfig >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component : AttributeConfig = component.into(); + self.config.option_assign( component ); + } +} + +impl< IntoT > Assign< AttributeConfig, IntoT > for AttributeConfig +where + IntoT : Into< AttributeConfig >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.default.assign( component.default ); + } +} + +impl< IntoT > Assign< AttributePropertyDefault, IntoT > for AttributeConfig +where + IntoT : Into< AttributePropertyDefault >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + // panic!( "" ); + self.default.assign( component.into() ); + } +} + +impl syn::parse::Parse for AttributeConfig +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeConfig::KEYWORD, " are : ", + AttributePropertyDefault::KEYWORD, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ former( default = 13 ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + AttributePropertyDefault::KEYWORD => result.assign( AttributePropertyDefault::parse( input )? ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +#[ derive( Debug, Default ) ] +pub struct AttributeScalarSetter +{ + /// Optional identifier for naming the setter. + pub name : AttributePropertyName, + /// Controls the generation of a setter method. If false, a setter method is not generated. + pub setter : AttributePropertySetter, + /// Specifies whether to provide a sketch of the subform setter as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub debug : AttributePropertyDebug, +} + +impl AttributeScalarSetter +{ + + /// Should setter be generated or not? + #[ allow( dead_code ) ] + pub fn setter( &self ) -> bool + { + self.setter.is_none() || self.setter.unwrap() + } + +} + +impl AttributeComponent for AttributeScalarSetter +{ + + const KEYWORD : &'static str = "scalar"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + syn::parse2::< AttributeScalarSetter >( meta_list.tokens.clone() ) + }, + syn::Meta::Path( ref _path ) => + { + syn::parse2::< AttributeScalarSetter >( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format `#[ scalar( setter = false ) ]` or `#[ scalar( setter = true, name = my_name ) ]`. \nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< AttributeScalarSetter, IntoT > for FieldAttributes +where + IntoT : Into< AttributeScalarSetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.scalar.option_assign( component ); + } +} + +impl< IntoT > Assign< AttributeScalarSetter, IntoT > for AttributeScalarSetter +where + IntoT : Into< AttributeScalarSetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.name.assign( component.name ); + self.setter.assign( component.setter ); + self.debug.assign( component.debug ); + } +} + +impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeScalarSetter +where + IntoT : Into< AttributePropertyName >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.name = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeScalarSetter +where + IntoT : Into< AttributePropertySetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.setter = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeScalarSetter +where + IntoT : Into< AttributePropertyDebug >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.debug = component.into(); + } +} + +impl syn::parse::Parse for AttributeScalarSetter +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeScalarSetter::KEYWORD, " are : ", + AttributePropertyName::KEYWORD, + ", ", AttributePropertySetter::KEYWORD, + ", ", AttributePropertyDebug::KEYWORD, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ scalar( name = myName, setter = true ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + AttributePropertyName::KEYWORD => result.assign( AttributePropertyName::parse( input )? ), + AttributePropertySetter::KEYWORD => result.assign( AttributePropertySetter::parse( input )? ), + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +/// +/// Attribute to enable/disable scalar setter generation. +/// +/// ## Example Input +/// +/// A typical input to parse might look like the following: +/// +/// ```ignore +/// name = field_name, setter = true +/// ``` +/// + +#[ derive( Debug, Default ) ] + +pub struct AttributeSubformScalarSetter +{ + /// Optional identifier for naming the setter. + pub name : AttributePropertyName, + /// Controls the generation of a setter method. If false, a setter method is not generated. + pub setter : AttributePropertySetter, + /// Specifies whether to provide a sketch of the subform setter as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub debug : AttributePropertyDebug, +} + +impl AttributeSubformScalarSetter +{ + + /// Should setter be generated or not? + pub fn setter( &self ) -> bool + { + self.setter.is_none() || self.setter.unwrap() + } + +} + +impl AttributeComponent for AttributeSubformScalarSetter +{ + + const KEYWORD : &'static str = "subform_scalar"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + syn::parse2::< AttributeSubformScalarSetter >( meta_list.tokens.clone() ) + }, + syn::Meta::Path( ref _path ) => + { + syn::parse2::< AttributeSubformScalarSetter >( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format `#[ subform_scalar( setter = false ) ]` or `#[ subform_scalar( setter = true, name = my_name ) ]`. \nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< AttributeSubformScalarSetter, IntoT > for FieldAttributes +where + IntoT : Into< AttributeSubformScalarSetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.subform_scalar.option_assign( component ); + } +} + +impl< IntoT > Assign< AttributeSubformScalarSetter, IntoT > for AttributeSubformScalarSetter +where + IntoT : Into< AttributeSubformScalarSetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.name.assign( component.name ); + self.setter.assign( component.setter ); + self.debug.assign( component.debug ); + } +} + +impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeSubformScalarSetter +where + IntoT : Into< AttributePropertyName >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.name = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeSubformScalarSetter +where + IntoT : Into< AttributePropertySetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.setter = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeSubformScalarSetter +where + IntoT : Into< AttributePropertyDebug >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.debug = component.into(); + } +} + +impl syn::parse::Parse for AttributeSubformScalarSetter +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeSubformScalarSetter::KEYWORD, " are : ", + AttributePropertyName::KEYWORD, + ", ", AttributePropertySetter::KEYWORD, + ", ", AttributePropertyDebug::KEYWORD, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ subform_scalar( name = myName, setter = true ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + AttributePropertyName::KEYWORD => result.assign( AttributePropertyName::parse( input )? ), + AttributePropertySetter::KEYWORD => result.assign( AttributePropertySetter::parse( input )? ), + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +/// Represents an attribute for configuring collection setter generation. +/// +/// This struct is part of a meta-programming approach to enable detailed configuration of nested structs or collections such as `Vec< E >, HashMap< K, E >` and so on. +/// It allows the customization of setter methods and the specification of the collection's behavior through meta attributes. +/// +/// ## Example Input +/// +/// The following is an example of a token stream that this struct can parse: +/// ```ignore +/// name = "custom_setter", setter = true, definition = former::VectorDefinition +/// ``` +/// + +#[ derive( Debug, Default ) ] +pub struct AttributeSubformCollectionSetter +{ + /// Optional identifier for naming the setter. + pub name : AttributePropertyName, + /// Controls the generation of a setter method. If false, a setter method is not generated. + pub setter : AttributePropertySetter, + /// Specifies whether to provide a sketch of the subform setter as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub debug : AttributePropertyDebug, + /// Definition of the collection former to use, e.g., `former::VectorFormer`. + pub definition : AttributePropertyDefinition, +} + +impl AttributeSubformCollectionSetter +{ + + /// Should setter be generated or not? + pub fn setter( &self ) -> bool + { + self.setter.is_none() || self.setter.unwrap() + } + +} + +impl AttributeComponent for AttributeSubformCollectionSetter +{ + + const KEYWORD : &'static str = "subform_collection"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + syn::parse2::< AttributeSubformCollectionSetter >( meta_list.tokens.clone() ) + }, + syn::Meta::Path( ref _path ) => + { + syn::parse2::< AttributeSubformCollectionSetter >( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format `#[ subform_collection ]` or `#[ subform_collection( definition = former::VectorDefinition ) ]` if you want to use default collection defition. \nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< AttributeSubformCollectionSetter, IntoT > for FieldAttributes +where + IntoT : Into< AttributeSubformCollectionSetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.subform_collection.option_assign( component ); + } +} + +impl< IntoT > Assign< AttributeSubformCollectionSetter, IntoT > for AttributeSubformCollectionSetter +where + IntoT : Into< AttributeSubformCollectionSetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.name.assign( component.name ); + self.setter.assign( component.setter ); + self.debug.assign( component.debug ); + self.definition.assign( component.definition ); + } +} + +impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeSubformCollectionSetter +where + IntoT : Into< AttributePropertyName >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.name = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeSubformCollectionSetter +where + IntoT : Into< AttributePropertySetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.setter = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertyDefinition, IntoT > for AttributeSubformCollectionSetter +where + IntoT : Into< AttributePropertyDefinition >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.definition = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeSubformCollectionSetter +where + IntoT : Into< AttributePropertyDebug >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.debug = component.into(); + } +} + +impl syn::parse::Parse for AttributeSubformCollectionSetter +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeSubformCollectionSetter::KEYWORD, " are : ", + AttributePropertyName::KEYWORD, + ", ", AttributePropertySetter::KEYWORD, + ", ", AttributePropertyDebug::KEYWORD, + ", ", AttributePropertyDefinition::KEYWORD, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ subform_collection( name = myName, setter = true, debug, definition = MyDefinition ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + AttributePropertyName::KEYWORD => result.assign( AttributePropertyName::parse( input )? ), + AttributePropertySetter::KEYWORD => result.assign( AttributePropertySetter::parse( input )? ), + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + AttributePropertyDefinition::KEYWORD => result.assign( AttributePropertyDefinition::parse( input )? ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +/// Represents a subform attribute to control subform setter generation. +/// Used to specify extra options for using one former as subformer of another one. +/// For example name of setter could be customized. +/// +/// ## Example Input +/// +/// A typical input to parse might look like the following: +/// +/// ```ignore +/// name = field_name, setter = true +/// ``` +/// +/// or simply: +/// +/// ```ignore +/// mame = field_name +/// ``` + +#[ derive( Debug, Default ) ] +pub struct AttributeSubformEntrySetter +{ + /// An optional identifier that names the setter. It is parsed from inputs + /// like `name = my_field`. + pub name : AttributePropertyName, + /// Disable generation of setter. + /// It still generate `_field_subform_entry` method, so it could be used to make a setter with custom arguments. + pub setter : AttributePropertySetter, + /// Specifies whether to provide a sketch of the subform setter as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub debug : AttributePropertyDebug, +} + +impl AttributeSubformEntrySetter +{ + + /// Should setter be generated or not? + pub fn setter( &self ) -> bool + { + self.setter.as_ref().is_none() || self.setter.as_ref().unwrap() + } + +} + +impl AttributeComponent for AttributeSubformEntrySetter +{ + + const KEYWORD : &'static str = "subform_entry"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + syn::parse2::< AttributeSubformEntrySetter >( meta_list.tokens.clone() ) + }, + syn::Meta::Path( ref _path ) => + { + syn::parse2::< AttributeSubformEntrySetter >( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format `#[ subform_entry ]` or `#[ subform_entry( name : child )` ], \nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< AttributeSubformEntrySetter, IntoT > for FieldAttributes +where + IntoT : Into< AttributeSubformEntrySetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.subform_entry.option_assign( component ); + } +} + +impl< IntoT > Assign< AttributeSubformEntrySetter, IntoT > for AttributeSubformEntrySetter +where + IntoT : Into< AttributeSubformEntrySetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.name.assign( component.name ); + self.setter.assign( component.setter ); + self.debug.assign( component.debug ); + } +} + +impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeSubformEntrySetter +where + IntoT : Into< AttributePropertyName >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.name = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeSubformEntrySetter +where + IntoT : Into< AttributePropertySetter >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.setter = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeSubformEntrySetter +where + IntoT : Into< AttributePropertyDebug >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.debug = component.into(); + } +} + +impl syn::parse::Parse for AttributeSubformEntrySetter +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeSubformEntrySetter::KEYWORD, " are : ", + AttributePropertyName::KEYWORD, + ", ", AttributePropertySetter::KEYWORD, + ", ", AttributePropertyDebug::KEYWORD, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ subform( name = myName, setter = true ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + AttributePropertyName::KEYWORD => result.assign( AttributePropertyName::parse( input )? ), + AttributePropertySetter::KEYWORD => result.assign( AttributePropertySetter::parse( input )? ), + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +// == attribute properties + +// = + +/// Marker type for attribute property to specify whether to provide a sketch as a hint. +/// Defaults to `false`, which means no hint is provided unless explicitly requested. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct DebugMarker; + +/// Specifies whether to provide a sketch as a hint. +/// Defaults to `false`, which means no hint is provided unless explicitly requested. +impl AttributePropertyComponent for DebugMarker +{ + const KEYWORD : &'static str = "debug"; +} + +/// Specifies whether to provide a sketch as a hint. +/// Defaults to `false`, which means no hint is provided unless explicitly requested. +pub type AttributePropertyDebug = AttributePropertyOptionalSingletone< DebugMarker >; + +// = + +/// Disable generation of setter. +/// Attributes still might generate some helper methods to reuse by custom setter. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct SetterMarker; + +impl AttributePropertyComponent for SetterMarker +{ + const KEYWORD : &'static str = "setter"; +} + +/// Disable generation of setter. +/// Attributes still might generate some helper methods to reuse by custom setter. +pub type AttributePropertySetter = AttributePropertyOptionalBoolean< SetterMarker >; + +// = + +/// Marker type for attribute property of optional identifier that names the setter. It is parsed from inputs +/// like `name = my_field`. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct NameMarker; + +impl AttributePropertyComponent for NameMarker +{ + const KEYWORD : &'static str = "name"; +} + +/// An optional identifier that names the setter. It is parsed from inputs +/// like `name = my_field`. +pub type AttributePropertyName = AttributePropertyOptionalSyn< syn::Ident, NameMarker >; + +// = + +/// Marker type for default value to use for a field. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct DefaultMarker; + +impl AttributePropertyComponent for DefaultMarker +{ + const KEYWORD : &'static str = "default"; +} + +/// An optional identifier that names the setter. It is parsed from inputs +/// like `name = my_field`. +pub type AttributePropertyDefault = AttributePropertyOptionalSyn< syn::Expr, DefaultMarker >; + +// = + +/// Marker type for definition of the collection former to use, e.g., `former::VectorFormer`. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct DefinitionMarker; + +impl AttributePropertyComponent for DefinitionMarker +{ + const KEYWORD : &'static str = "definition"; +} + +/// Definition of the collection former to use, e.g., `former::VectorFormer`. +pub type AttributePropertyDefinition = AttributePropertyOptionalSyn< syn::Type, DefinitionMarker >; diff --git a/module/core/former_meta/src/derive_former/struct_attrs.rs b/module/core/former_meta/src/derive_former/struct_attrs.rs new file mode 100644 index 0000000000..44e8273292 --- /dev/null +++ b/module/core/former_meta/src/derive_former/struct_attrs.rs @@ -0,0 +1,483 @@ +//! +//! Attributes of the whole item. +//! + +use super::*; + +use macro_tools:: +{ + Result, + AttributeComponent, + AttributePropertyComponent, + AttributePropertyOptionalSingletone, +}; + +use former_types::{ Assign, OptionExt }; + +/// Represents the attributes of a struct, including storage fields, mutator, and perform attributes. + +#[ derive( Debug, Default ) ] +pub struct ItemAttributes +{ + /// Optional attribute for storage-specific fields. + /// This field is used to specify fields that should be part of the storage but not the final formed structure. + pub storage_fields : Option< AttributeStorageFields >, + + /// Attribute for customizing the mutation process in a forming operation. + /// The `mutator` attribute allows for specifying whether a custom mutator should be used or if a sketch should be provided as a hint. + pub mutator : AttributeMutator, + + /// Optional attribute for specifying a method to call after forming. + /// This attribute can hold information about a method that should be invoked after the form operation is complete. + pub perform : Option< AttributePerform >, +} + +impl ItemAttributes +{ + + pub fn from_attrs< 'a >( attrs : impl Iterator< Item = &'a syn::Attribute > ) -> Result< Self > + { + let mut result = Self::default(); + + let error = | attr : &syn::Attribute | -> syn::Error + { + let known_attributes = const_format::concatcp! + ( + "Known attirbutes are : ", + "debug", + ", ", AttributeStorageFields::KEYWORD, + ", ", AttributeMutator::KEYWORD, + ", ", AttributePerform::KEYWORD, + ".", + ); + syn_err! + ( + attr, + "Expects an attribute of format '#[ attribute( key1 = val1, key2 = val2 ) ]'\n {known_attributes}\n But got: '{}'", + qt!{ #attr } + ) + }; + + for attr in attrs + { + + let key_ident = attr.path().get_ident().ok_or_else( || error( attr ) )?; + let key_str = format!( "{}", key_ident ); + + // attributes does not have to be known + // if attr::is_standard( &key_str ) + // { + // continue; + // } + + match key_str.as_ref() + { + AttributeStorageFields::KEYWORD => result.assign( AttributeStorageFields::from_meta( attr )? ), + AttributeMutator::KEYWORD => result.assign( AttributeMutator::from_meta( attr )? ), + AttributePerform::KEYWORD => result.assign( AttributePerform::from_meta( attr )? ), + "debug" => {} + _ => {}, + // _ => return Err( error( attr ) ), + // attributes does not have to be known + } + } + + Ok( result ) + } + + /// + /// Generate parts, used for generating `perform()`` method. + /// + /// Similar to `form()`, but will also invoke function from `perform` attribute, if specified. + /// + /// # Example of returned tokens : + /// + /// ## perform : + /// return result; + /// + /// ## perform_output : + /// < T : ::core::default::Default > + /// + /// ## perform_generics : + /// Vec< T > + /// + + pub fn performer( &self ) + -> Result< ( TokenStream, TokenStream, TokenStream ) > + { + + let mut perform = qt! + { + return result; + }; + let mut perform_output = qt!{ Definition::Formed }; + let mut perform_generics = qt!{}; + + if let Some( ref attr ) = self.perform + { + + // let attr_perform = syn::parse2::< AttributePerform >( meta_list.tokens.clone() )?; + let signature = &attr.signature; + let generics = &signature.generics; + perform_generics = qt!{ #generics }; + let perform_ident = &signature.ident; + let output = &signature.output; + if let syn::ReturnType::Type( _, boxed_type ) = output + { + perform_output = qt!{ #boxed_type }; + } + perform = qt! + { + return result.#perform_ident(); + }; + + } + + Ok( ( perform, perform_output, perform_generics ) ) + } + + /// Returns an iterator over the fields defined in the `storage_fields` attribute. + /// + /// This function provides an iterator that yields `syn::Field` objects. If `storage_fields` is set, + /// it clones and iterates over its fields. If `storage_fields` is `None`, it returns an empty iterator. + /// + + // pub fn storage_fields( &self ) -> impl Iterator< Item = syn::Field > + pub fn storage_fields( &self ) -> &syn::punctuated::Punctuated< syn::Field, syn::token::Comma > + { + + self.storage_fields.as_ref().map_or_else + ( + || &*Box::leak( Box::new( syn::punctuated::Punctuated::new() ) ), + | attr | &attr.fields + ) + + // qqq : find better solutioin + + // self.storage_fields + // .as_ref() + // .map_or_else( + // || syn::punctuated::Punctuated::< syn::Field, syn::token::Comma >::new().into_iter(), + // | attr | attr.fields.clone().into_iter() + // // Clone and create an iterator when storage_fields is Some + // ) + } + +} + +/// +/// Attribute to hold storage-specific fields. +/// Useful if formed structure should not have such fields. +/// +/// `#[ storage_fields( a : i32, b : Option< String > ) ]` +/// + +#[ derive( Debug, Default ) ] +pub struct AttributeStorageFields +{ + pub fields : syn::punctuated::Punctuated< syn::Field, syn::token::Comma >, +} + +impl AttributeComponent for AttributeStorageFields +{ + + const KEYWORD : &'static str = "storage_fields"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + return syn::parse2::< AttributeStorageFields >( meta_list.tokens.clone() ); + }, + _ => return_syn_err!( attr, "Expects an attribute of format #[ storage_fields( a : i32, b : Option< String > ) ] +.\nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< AttributeStorageFields, IntoT > for ItemAttributes +where + IntoT : Into< AttributeStorageFields >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.storage_fields.option_assign( component ); + } +} + +impl< IntoT > Assign< AttributeStorageFields, IntoT > for AttributeStorageFields +where + IntoT : Into< AttributeStorageFields >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.fields = component.fields; + } +} + +impl syn::parse::Parse for AttributeStorageFields +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + + let fields : syn::punctuated::Punctuated< syn::Field, syn::Token![ , ] > = + input.parse_terminated( syn::Field::parse_named, Token![ , ] )?; + + Ok( Self + { + fields, + }) + } +} + +/// Represents attributes for customizing the mutation process in a forming operation. +/// +/// `AttributeMutator` allows specifying whether a custom mutator should be used or a sketch should be provided +/// as a hint for developing a custom mutator. This is crucial for advanced scenarios where the entity's state +/// might require conditional modifications which are not handled by the standard `FormingEnd`. +/// +/// ## Example of code +/// ```ignore +/// custom, debug +/// ``` + +#[ derive( Debug, Default ) ] +pub struct AttributeMutator +{ + /// Indicates whether a custom mutator should be generated. + /// Defaults to `false`, meaning no custom mutator is generated unless explicitly requested. + pub custom : AttributePropertyCustom, + /// Specifies whether to provide a sketch of the mutator as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub debug : AttributePropertyDebug, +} + +impl AttributeComponent for AttributeMutator +{ + const KEYWORD : &'static str = "mutator"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + return syn::parse2::< AttributeMutator >( meta_list.tokens.clone() ); + }, + syn::Meta::Path( ref _path ) => + { + return Ok( Default::default() ) + }, + _ => return_syn_err!( attr, "Expects an attribute of format `#[ mutator( custom ) ]`. \nGot: {}", qt!{ #attr } ), + } + } + +} + +impl< IntoT > Assign< AttributeMutator, IntoT > for ItemAttributes +where + IntoT : Into< AttributeMutator >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.mutator.assign( component ); + } +} + +impl< IntoT > Assign< AttributeMutator, IntoT > for AttributeMutator +where + IntoT : Into< AttributeMutator >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.custom.assign( component.custom ); + self.debug.assign( component.debug ); + } +} + +impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeMutator +where + IntoT : Into< AttributePropertyDebug >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.debug = component.into(); + } +} + +impl< IntoT > Assign< AttributePropertyCustom, IntoT > for AttributeMutator +where + IntoT : Into< AttributePropertyCustom >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + self.custom = component.into(); + } +} + +impl syn::parse::Parse for AttributeMutator +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : &syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeMutator::KEYWORD, " are : ", + AttributePropertyCustom::KEYWORD, + ", ", AttributePropertyDebug::KEYWORD, + ".", + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ mutator( custom ) ]' + {known} + But got: '{}' +"#, + qt!{ #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + AttributePropertyCustom::KEYWORD => result.assign( AttributePropertyCustom::from( true ) ), + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + _ => return Err( error( &ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![ , ] ) + { + input.parse::< syn::Token![ , ] >()?; + } + } + + Ok( result ) + } +} + +/// +/// Attribute to hold information about method to call after form. +/// +/// `#[ perform( fn after1< 'a >() -> Option< &'a str > ) ]` +/// + +#[ derive( Debug ) ] +pub struct AttributePerform +{ + pub signature : syn::Signature, +} + +impl AttributeComponent for AttributePerform +{ + const KEYWORD : &'static str = "perform"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + return syn::parse2::< AttributePerform >( meta_list.tokens.clone() ); + }, + _ => return_syn_err!( attr, "Expects an attribute of format #[ perform( fn parse( mut self ) -> Request ) ] +.\nGot: {}", qt!{ #attr } ), + } + } + +} + +impl syn::parse::Parse for AttributePerform +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self > + { + Ok( Self + { + signature : input.parse()?, + }) + } +} + +impl< IntoT > Assign< AttributePerform, IntoT > for ItemAttributes +where + IntoT : Into< AttributePerform >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.perform.option_assign( component ); + } +} + +impl< IntoT > Assign< AttributePerform, IntoT > for AttributePerform +where + IntoT : Into< AttributePerform >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + self.signature = component.signature; + } +} + +// == attribute properties + +/// Marker type for attribute property to specify whether to provide a sketch as a hint. +/// Defaults to `false`, which means no hint is provided unless explicitly requested. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct DebugMarker; + +impl AttributePropertyComponent for DebugMarker +{ + const KEYWORD : &'static str = "debug"; +} + +/// Specifies whether to provide a sketch as a hint. +/// Defaults to `false`, which means no hint is provided unless explicitly requested. +pub type AttributePropertyDebug = AttributePropertyOptionalSingletone< DebugMarker >; + +// = + +/// Marker type for attribute property to indicates whether a custom code should be generated. +/// Defaults to `false`, meaning no custom code is generated unless explicitly requested. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct CustomMarker; + +impl AttributePropertyComponent for CustomMarker +{ + const KEYWORD : &'static str = "custom"; +} + +/// Indicates whether a custom code should be generated. +/// Defaults to `false`, meaning no custom code is generated unless explicitly requested. +pub type AttributePropertyCustom = AttributePropertyOptionalSingletone< CustomMarker >; diff --git a/module/core/former_meta/src/lib.rs b/module/core/former_meta/src/lib.rs new file mode 100644 index 0000000000..3a4d6af4d0 --- /dev/null +++ b/module/core/former_meta/src/lib.rs @@ -0,0 +1,616 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/former_derive_meta/latest/former_derive_meta/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use macro_tools::prelude::*; + +#[ cfg( feature = "derive_former" ) ] +mod derive_former; + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_components" ) ] +mod component +{ + + //! + //! Implement couple of derives of general-purpose. + //! + + #[ allow( unused_imports ) ] + use macro_tools::prelude::*; + + #[ cfg( feature = "derive_component_from" ) ] + pub mod component_from; + #[ cfg( feature = "derive_from_components" ) ] + pub mod from_components; + #[ cfg( feature = "derive_component_assign" ) ] + pub mod component_assign; + #[ cfg( all( feature = "derive_component_assign", feature = "derive_components_assign" ) ) ] + pub mod components_assign; + +} + +/// Derive macro for generating a `Former` struct, applying a Builder Pattern to the annotated struct. +/// +/// This macro simplifies the construction of complex objects by automatically generating a builder (former) for +/// the specified struct. It supports extensive customization through attributes that control defaults, setter generation, +/// and field customization, allowing for flexible and fluent object construction. +/// +/// # Struct Attributes +/// +/// - `debug`: Enables debug mode which can be used to print or log the internal state of the builder for debugging purposes. +/// - `perform`: Specifies a custom method to be invoked automatically at the end of the build process. +/// - `storage_fields`: Specifies fields that should be treated as part of the storage for the former. +/// - `mutator`: Defines a custom mutator class or function to manipulate the data just before the object is finalized. +/// +/// # Field Attributes +/// +/// - `former`: General attribute to specify various options like defaults or inclusion in the former. +/// - `scalar`: Indicates that the field is a scalar value, enabling direct assignment without the need for a sub-former. +/// - `collection`: Marks the field as a collection that can use specific former methods to manage its contents. +/// - `subform`: Specifies that the field should utilize a nested former, facilitating the construction of complex nested structures. +/// +/// # Usage Example +/// +/// Below is a typical usage example where the macro is applied to a struct: +/// +/// ```rust +/// +/// # #[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +/// # fn main() +/// # { +/// use former::Former; +/// +/// // Use attribute debug to print expanded code. +/// #[ derive( Debug, PartialEq, Former ) ] +/// // Uncomment to see what derive expand into +/// // #[ debug ] +/// pub struct UserProfile +/// { +/// age : i32, +/// username : String, +/// bio_optional : Option< String >, // Fields could be optional +/// } +/// +/// let profile = UserProfile::former() +/// .age( 30 ) +/// .username( "JohnDoe".to_string() ) +/// .bio_optional( "Software Developer".to_string() ) // Optionally provide a bio +/// .form(); +/// +/// dbg!( &profile ); +/// // Expected output: +/// // &profile = UserProfile { +/// // age: 30, +/// // username: "JohnDoe", +/// // bio_optional: Some("Software Developer"), +/// // } +/// +/// # } +/// +/// ``` +/// +/// This pattern enables fluent and customizable construction of `UserProfile` instances, allowing for easy setting and modification of its fields. + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_former" ) ] +#[ + proc_macro_derive + ( + Former, + attributes + ( + debug, perform, storage_fields, mutator, // struct attributes + former, scalar, subform_scalar, subform_collection, subform_entry, // field attributes + ) + ) +] +pub fn former( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive_former::former( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// Macro to implement `From` for each component (field) of a structure. +/// This macro simplifies the creation of `From` trait implementations for struct fields, +/// enabling easy conversion from a struct reference to its field types. +/// +/// # Features +/// +/// - Requires the `derive_component_from` feature to be enabled for use. +/// - The `ComponentFrom` derive macro can be applied to structs to automatically generate +/// `From` implementations for each field. +/// +/// # Attributes +/// +/// - `debug` : Optional attribute to enable debug-level output during the macro expansion process. +/// +/// # Examples +/// +/// Assuming the `derive_component_from` feature is enabled in your `Cargo.toml`, you can use the macro as follows : +/// +/// ```rust +/// # fn main() +/// # { +/// #[ derive( former::ComponentFrom ) ] +/// struct Person +/// { +/// pub age : i32, +/// pub name : String, +/// } +/// +/// let my_struct = Person { age : 10, name : "Hello".into() }; +/// let age : i32 = From::from( &my_struct ); +/// let name : String = From::from( &my_struct ); +/// dbg!( age ); +/// dbg!( name ); +/// // > age = 10 +/// // > name = "Hello" +/// # } +/// ``` +/// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_component_from" ) ] +#[ proc_macro_derive( ComponentFrom, attributes( debug ) ) ] +pub fn component_from( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = component::component_from::component_from( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// Derives the `Assign` trait for struct fields, allowing each field to be set +/// with a value that can be converted into the field's type. +/// +/// This macro facilitates the automatic implementation of the `Assign` trait for all +/// fields within a struct, leveraging the power of Rust's type system to ensure type safety +/// and conversion logic. It is particularly useful for builder patterns or mutating instances +/// of data structures in a fluent and ergonomic manner. +/// +/// # Attributes +/// +/// - `debug` : An optional attribute to enable debugging of the trait derivation process. +/// +/// # Conditions +/// +/// - This macro is only enabled when the `derive_component_assign` feature is active in your `Cargo.toml`. +/// +/// # Input Code Example +/// +/// Given a struct definition annotated with `#[ derive( Assign ) ]` : +/// +/// ```rust +/// use former::Assign; +/// +/// #[ derive( Default, PartialEq, Debug, former::Assign ) ] +/// struct Person +/// { +/// age : i32, +/// name : String, +/// } +/// +/// let mut person : Person = Default::default(); +/// person.assign( 13 ); +/// person.assign( "John" ); +/// assert_eq!( person, Person { age : 13, name : "John".to_string() } ); +/// ``` +/// +/// # Generated Code Example +/// +/// The procedural macro generates the following implementations for `Person` : +/// +/// ```rust +/// use former::Assign; +/// +/// #[ derive( Default, PartialEq, Debug ) ] +/// struct Person +/// { +/// age : i32, +/// name : String, +/// } +/// +/// impl< IntoT > Assign< i32, IntoT > for Person +/// where +/// IntoT : Into< i32 >, +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.age = component.into(); +/// } +/// } +/// +/// impl< IntoT > Assign< String, IntoT > for Person +/// where +/// IntoT : Into< String >, +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.name = component.into(); +/// } +/// } +/// +/// let mut person : Person = Default::default(); +/// person.assign( 13 ); +/// person.assign( "John" ); +/// assert_eq!( person, Person { age : 13, name : "John".to_string() } ); +/// ``` +/// This allows any type that can be converted into an `i32` or `String` to be set as +/// the value of the `age` or `name` fields of `Person` instances, respectively. + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_component_assign" ) ] +#[ proc_macro_derive( Assign, attributes( debug ) ) ] +pub fn component_assign( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = component::component_assign::component_assign( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// +/// Derives the `ComponentsAssign` trait for a struct, enabling `components_assign` which set all fields at once. +/// +/// This will work only if every field can be acquired from the passed value. +/// In other words, the type passed as an argument to `components_assign` must implement Into for each field type. +/// +/// # Attributes +/// +/// - `debug` : An optional attribute to enable debugging of the trait derivation process. +/// +/// # Conditions +/// +/// - This macro is only enabled when the `derive_components_assign` feature is active in your `Cargo.toml`. +/// - The type must implement `Assign` (`derive( Assign )`) +/// +/// # Limitations +/// This trait cannot be derived, if the struct has fields with identical types +/// +/// # Input Code Example +/// +/// An example when we encapsulate parameters passed to a function in a struct. +/// +/// ```rust +/// use former::{ Assign, ComponentsAssign }; +/// +/// #[ derive( Default, Assign, ComponentsAssign ) ] +/// struct BigOpts +/// { +/// cond : bool, +/// int : i32, +/// str : String, +/// } +/// +/// #[ derive( Default, Assign, ComponentsAssign ) ] +/// struct SmallerOpts +/// { +/// cond: bool, +/// int: i32, +/// } +/// +/// impl From< &BigOpts > for bool +/// { +/// fn from( value : &BigOpts ) -> Self +/// { +/// value.cond +/// } +/// } +/// +/// impl From< &BigOpts > for i32 +/// { +/// fn from( value: &BigOpts ) -> Self +/// { +/// value.int +/// } +/// } +/// +/// fn take_big_opts( options : &BigOpts ) -> &String +/// { +/// &options.str +/// } +/// +/// fn take_smaller_opts( options : &SmallerOpts ) -> bool +/// { +/// !options.cond +/// } +/// +/// let options1 = BigOpts +/// { +/// cond : true, +/// int : -14, +/// ..Default::default() +/// }; +/// take_big_opts( &options1 ); +/// +/// let mut options2 = SmallerOpts::default(); +/// options2.smaller_opts_assign( &options1 ); +/// take_smaller_opts( &options2 ); +/// ``` +/// +/// Which expands approximately into : +/// +/// ```rust +/// use former::{ Assign, ComponentsAssign }; +/// +/// #[derive(Default)] +/// struct BigOpts +/// { +/// cond : bool, +/// int : i32, +/// str : String, +/// } +/// +/// impl< IntoT > Assign< bool, IntoT > for BigOpts +/// where +/// IntoT : Into< bool >, +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.cond = component.into(); +/// } +/// } +/// +/// impl< IntoT > Assign< i32, IntoT > for BigOpts +/// where +/// IntoT : Into< i32 >, +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.int = component.into(); +/// } +/// } +/// +/// impl< IntoT > Assign< String, IntoT > for BigOpts +/// where +/// IntoT : Into< String >, +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.str = component.into(); +/// } +/// } +/// +/// pub trait BigOptsComponentsAssign< IntoT > +/// where +/// IntoT : Into< bool >, +/// IntoT : Into< i32 >, +/// IntoT : Into< String >, +/// IntoT : Clone, +/// { +/// fn components_assign( &mut self, component : IntoT ); +/// } +/// +/// impl< T, IntoT > BigOptsComponentsAssign< IntoT > for T +/// where +/// T : former::Assign< bool, IntoT >, +/// T : former::Assign< i32, IntoT >, +/// T : former::Assign< String, IntoT >, +/// IntoT : Into< bool >, +/// IntoT : Into< i32 >, +/// IntoT : Into< String >, +/// IntoT : Clone, +/// { +/// fn components_assign( &mut self, component : IntoT ) +/// { +/// former::Assign::< bool, _ >::assign( self, component.clone() ); +/// former::Assign::< i32, _ >::assign( self, component.clone() ); +/// former::Assign::< String, _ >::assign( self, component.clone() ); +/// } +/// } +/// +/// #[derive(Default)] +/// struct SmallerOpts +/// { +/// cond : bool, +/// int : i32, +/// } +/// +/// impl< IntoT > Assign< bool, IntoT > for SmallerOpts +/// where +/// IntoT : Into< bool >, +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.cond = component.into(); +/// } +/// } +/// +/// impl< IntoT > Assign< i32, IntoT > for SmallerOpts +/// where +/// IntoT : Into< i32 >, +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.int = component.into(); +/// } +/// } +/// +/// pub trait SmallerOptsComponentsAssign< IntoT > +/// where +/// IntoT : Into< bool >, +/// IntoT : Into< i32 >, +/// IntoT : Clone, +/// { +/// fn smaller_opts_assign( &mut self, component : IntoT ); +/// } +/// +/// impl< T, IntoT > SmallerOptsComponentsAssign< IntoT > for T +/// where +/// T : former::Assign< bool, IntoT >, +/// T : former::Assign< i32, IntoT >, +/// IntoT : Into< bool >, +/// IntoT : Into< i32 >, +/// IntoT : Clone, +/// { +/// fn smaller_opts_assign( &mut self, component : IntoT ) +/// { +/// former::Assign::< bool, _ >::assign( self, component.clone() ); +/// former::Assign::< i32, _ >::assign( self, component.clone() ); +/// } +/// } +/// +/// impl From< &BigOpts > for bool +/// { +/// fn from( value : &BigOpts ) -> Self +/// { +/// value.cond +/// } +/// } +/// +/// impl From< &BigOpts > for i32 +/// { +/// fn from( value : &BigOpts ) -> Self +/// { +/// value.int +/// } +/// } +/// +/// fn take_big_opts( options : &BigOpts ) -> &String +/// { +/// &options.str +/// } +/// +/// fn take_smaller_opts( options : &SmallerOpts ) -> bool +/// { +/// !options.cond +/// } +/// +/// let options1 = BigOpts +/// { +/// cond : true, +/// int : -14, +/// ..Default::default() +/// }; +/// take_big_opts( &options1 ); +/// let mut options2 = SmallerOpts::default(); +/// options2.smaller_opts_assign( &options1 ); +/// take_smaller_opts( &options2 ); +/// ``` +/// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( all( feature = "derive_component_assign", feature = "derive_components_assign" ) ) ] +#[ proc_macro_derive( ComponentsAssign, attributes( debug ) ) ] +pub fn components_assign( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = component::components_assign::components_assign( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/// A procedural macro to automatically derive the `From` trait implementation for a struct, +/// enabling instances of one type to be converted from instances of another type. +/// +/// It is part of type-based forming approach which requires each field having an unique type. Each field +/// of the target struct must be capable of being individually converted from the source type `T`. +/// This macro simplifies the implementation of type conversions, particularly useful for +/// constructing a struct from another type with compatible fields. The source type `T` must +/// implement `Into< FieldType >` for each field type of the target struct. +/// +/// # Attributes +/// +/// - `debug`: Optional. Enables debug printing during macro expansion. +/// +/// # Requirements +/// +/// - Available only when the feature flags `enabled` and `derive_from_components` +/// are activated in your Cargo.toml. It's activated by default. +/// +/// # Examples +/// +/// Given the structs `Options1` and `Options2`, where `Options2` is a subset of `Options1`: +/// +/// ```rust +/// use former::FromComponents; +/// +/// #[ derive( Debug, Default, PartialEq ) ] +/// pub struct Options1 +/// { +/// field1 : i32, +/// field2 : String, +/// field3 : f32, +/// } +/// +/// impl From< &Options1 > for i32 +/// { +/// #[ inline( always ) ] +/// fn from( src : &Options1 ) -> Self +/// { +/// src.field1.clone() +/// } +/// } +/// +/// impl From< &Options1 > for String +/// { +/// #[ inline( always ) ] +/// fn from( src : &Options1 ) -> Self +/// { +/// src.field2.clone() +/// } +/// } +/// +/// impl From< &Options1 > for f32 +/// { +/// #[ inline( always ) ] +/// fn from( src : &Options1 ) -> Self +/// { +/// src.field3.clone() +/// } +/// } +/// +/// #[ derive( Debug, Default, PartialEq, FromComponents ) ] +/// pub struct Options2 +/// { +/// field1 : i32, +/// field2 : String, +/// } +/// +/// let o1 = Options1 { field1 : 42, field2 : "Hello, world!".to_string(), field3 : 13.01 }; +/// +/// // Demonstrating conversion from Options1 to Options2 +/// let o2 : Options2 = Into::< Options2 >::into( &o1 ); +/// let expected = Options2 { field1 : 42, field2 : "Hello, world!".to_string() }; +/// assert_eq!( o2, expected ); +/// +/// // Alternative way using `.into()` +/// let o2 : Options2 = ( &o1 ).into(); +/// assert_eq!( o2, expected ); +/// +/// // Alternative way using `.from()` +/// let o2 = Options2::from( &o1 ); +/// assert_eq!( o2, expected ); +/// ``` +/// +/// This demonstrates how `Options2` can be derived from `Options1` using the `FromComponents` macro, +/// automatically generating the necessary `From< &Options1 >` implementation for `Options2`, facilitating +/// an easy conversion between these types based on their compatible fields. +/// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_from_components" ) ] +#[ proc_macro_derive( FromComponents, attributes( debug ) ) ] +pub fn from_components( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = component::from_components::from_components( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} diff --git a/module/core/former_meta/tests/smoke_test.rs b/module/core/former_meta/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/former_meta/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/former_types/Cargo.toml b/module/core/former_types/Cargo.toml new file mode 100644 index 0000000000..d6b6ca5fb3 --- /dev/null +++ b/module/core/former_types/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "former_types" +version = "2.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/former" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/former" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/former" +description = """ +A flexible and extensible implementation of the builder pattern. Its compile-time structures and traits that are not generated but reused. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] + +no_std = [ "collection_tools/no_std" ] +use_alloc = [ "no_std", "collection_tools/use_alloc" ] + +default = [ + "enabled", + "derive_former", + "types_components", + "types_component_assign", +] +full = [ + "enabled", + "derive_former", + "types_components", + "types_component_assign", +] +enabled = [ "collection_tools/enabled" ] + +derive_former = [] +types_components = [] +types_component_assign = [ "types_components" ] + + +[dependencies] +collection_tools = { workspace = true, features = [ "collection_constructors" ] } +# qqq : optimize also make sure collection_tools expose enough features + + +[dev-dependencies] +test_tools = { workspace = true, features = [ "full" ] } diff --git a/module/core/former_types/License b/module/core/former_types/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/former_types/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/former_types/Readme.md b/module/core/former_types/Readme.md new file mode 100644 index 0000000000..42346b3bc0 --- /dev/null +++ b/module/core/former_types/Readme.md @@ -0,0 +1,70 @@ + + +# Module :: former_types + + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml) [![docs.rs](https://img.shields.io/docsrs/former_types?color=e3e8f0&logo=docs.rs)](https://docs.rs/former_types) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer_types%2Fexamples%2Fformer_types_trivial.rs,RUN_POSTFIX=--example%20former_types_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +A flexible and extensible implementation of the builder pattern. Its compile-time structures and traits that are not generated but reused. + +## Example: Using Trait Assign + +Demonstrates setting various components (fields) of a struct. + +The `former_types` crate provides a generic interface for setting components on an object. This example defines a `Person` struct +and implements the `Assign` trait for its fields. It shows how to use these implementations to set the fields of a `Person` +instance using different types that can be converted into the required types. + +```rust +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former_types::Assign; + + #[ derive( Default, PartialEq, Debug ) ] + struct Person + { + age : i32, + name : String, + } + + impl< IntoT > Assign< i32, IntoT > for Person + where + IntoT : Into< i32 >, + { + fn assign( &mut self, component : IntoT ) + { + self.age = component.into(); + } + } + + impl< IntoT > Assign< String, IntoT > for Person + where + IntoT : Into< String >, + { + fn assign( &mut self, component : IntoT ) + { + self.name = component.into(); + } + } + + let mut got : Person = Default::default(); + got.assign( 13 ); + got.assign( "John" ); + assert_eq!( got, Person { age : 13, name : "John".to_string() } ); + dbg!( got ); + // > Person { + // > age: 13, + // > name: "John", + // > } + +} +``` + +Try out `cargo run --example former_types_trivial`. +
    +[See code](./examples/former_types_trivial.rs). diff --git a/module/core/former_types/examples/former_types_trivial.rs b/module/core/former_types/examples/former_types_trivial.rs new file mode 100644 index 0000000000..c379293640 --- /dev/null +++ b/module/core/former_types/examples/former_types_trivial.rs @@ -0,0 +1,68 @@ +//! +//! ## Example: Using Trait Assign +//! +//! Demonstrates setting various components (fields) of a struct. +//! +//! The `former_types` crate provides a generic interface for setting components on an object. This example defines a `Person` struct +//! and implements the `Assign` trait for its fields. It shows how to use these implementations to set the fields of a `Person` +//! instance using different types that can be converted into the required types. +//! +//! ## Explanation +//! +//! - **Person Struct**: The `Person` struct has two fields: `age` (an integer) and `name` (a string). The `Default` and `PartialEq` traits are derived to facilitate default construction and comparison. +//! +//! - **Assign Implementations**: The `Assign` trait is implemented for the `age` and `name` fields of the `Person` struct. +//! - For `age`: The trait is implemented for any type that can be converted into an `i32`. +//! - For `name`: The trait is implemented for any type that can be converted into a `String`. +//! +//! - **Usage**: An instance of `Person` is created using the default constructor, and then the `assign` method is used to set the `age` and `name` fields. +//! - `got.assign( 13 )`: Assigns the integer `13` to the `age` field. +//! - `got.assign( "John" )`: Assigns the string `"John"` to the `name` field. +//! + +#[ cfg( any( not( feature = "derive_former" ), not( feature = "enabled" ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "derive_former", feature = "enabled" ) ) ] +fn main() +{ + use former_types::Assign; + + #[ derive( Default, PartialEq, Debug ) ] + struct Person + { + age : i32, + name : String, + } + + impl< IntoT > Assign< i32, IntoT > for Person + where + IntoT : Into< i32 >, + { + fn assign( &mut self, component : IntoT ) + { + self.age = component.into(); + } + } + + impl< IntoT > Assign< String, IntoT > for Person + where + IntoT : Into< String >, + { + fn assign( &mut self, component : IntoT ) + { + self.name = component.into(); + } + } + + let mut got : Person = Default::default(); + got.assign( 13 ); + got.assign( "John" ); + assert_eq!( got, Person { age : 13, name : "John".to_string() } ); + dbg!( got ); + // > Person { + // > age: 13, + // > name: "John", + // > } + +} diff --git a/module/core/former_types/src/axiomatic.rs b/module/core/former_types/src/axiomatic.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/core/former_types/src/collection.rs b/module/core/former_types/src/collection.rs new file mode 100644 index 0000000000..eac724c018 --- /dev/null +++ b/module/core/former_types/src/collection.rs @@ -0,0 +1,579 @@ +//! +//! This module defines traits and structures that facilitate the management and manipulation +//! of collection data structures within a builder pattern context. It provides a comprehensive +//! interface for adding, managing, and converting elements within various types of collections, +//! such as vectors, hash maps, and custom collection implementations. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + use crate::*; + + /// Facilitates the conversion of collection entries to their corresponding value representations. + /// + /// This trait is utilized to transform an entry of a collection into a value, abstracting the operation of collections + /// like vectors or hash maps. It ensures that even in complex collection structures, entries can be seamlessly managed + /// and manipulated as values. + pub trait EntryToVal< Collection > + { + /// The type of values stored in the collection. This might be distinct from `Entry` in complex collections. + /// For example, in a `HashMap`, while `Entry` might be a ( key, value ) tuple, `Val` might only be the value part. + type Val; + + /// Converts an entry into a value representation specific to the type of collection. This conversion is crucial + /// for handling operations on entries, especially when they need to be treated or accessed as individual values, + /// such as retrieving the value part from a key-value pair in a hash map. + fn entry_to_val( self ) -> Self::Val; + } + + impl< C, E > EntryToVal< C > for E + where + C : Collection< Entry = E >, + { + type Val = C::Val; + + fn entry_to_val( self ) -> Self::Val + { + C::entry_to_val( self ) + } + } + + /// Provides a mechanism for transforming a value back into a collection-specific entry format. + /// + /// This trait is particularly valuable in scenarios where the operations on a collection require + /// not just the manipulation of values but also the re-integration of these values as entries. + /// It is especially crucial in complex data structures, such as `HashMap`s, where entries + /// often involve a key-value pair, and simple values need to be restructured to fit this model + /// for operations like insertion or update. + + pub trait CollectionValToEntry< Val > + { + /// The specific type of entry that corresponds to the value within the collection. + /// For example, in a `HashMap`, this might be a tuple of a key and a value. + type Entry; + + /// Converts a value into a collection-specific entry, facilitating operations that modify + /// the collection. This method is key for ensuring that values can be correctly integrated + /// back into the collection, particularly when the entry type is more complex than the value. + /// + /// # Parameters + /// * `val` - The value to be converted into an entry. + /// + /// # Returns + /// Returns the entry constructed from the provided value, ready for insertion or other modifications. + /// + /// # Example + /// ``` + /// use former_types::CollectionValToEntry; // use crate `former` instead of crate `former_types` unless you need to use crate `former_types` directly + /// + /// struct PairMap; + /// + /// impl CollectionValToEntry< ( i32, i32 ) > for PairMap + /// { + /// type Entry = ( String, i32 ); + /// + /// fn val_to_entry( val : ( i32, i32 ) ) -> Self::Entry + /// { + /// (val.0.to_string(), val.1) + /// } + /// } + /// ``` + fn val_to_entry( val : Val ) -> Self::Entry; + } + + /// Facilitates the conversion of values back into entries for specific collection types. + /// + /// This trait wraps the functionality of `CollectionValToEntry`, providing a more ergonomic + /// interface for converting values directly within the type they pertain to. It is useful + /// in maintaining the integrity of collection operations, especially when dealing with + /// sophisticated structures that separate the concept of values and entries, such as `HashMap`s + /// and other associative collections. + pub trait ValToEntry< Collection > + { + /// Represents the type of entry that corresponds to the value within the collection. + type Entry; + + /// Transforms the instance (value) into an entry compatible with the specified collection. + /// This conversion is essential for operations like insertion or modification within the collection, + /// where the value needs to be formatted as an entry. + /// + /// # Returns + /// Returns the entry constructed from the instance of the value, ready for integration into the collection. + /// + /// # Example + /// ``` + /// use former_types::ValToEntry; // use crate `former` instead of crate `former_types` unless you need to use crate `former_types` directly + /// + /// struct PairMap; + /// + /// impl ValToEntry< PairMap > for (i32, i32) + /// { + /// type Entry = ( String, i32 ); + /// + /// fn val_to_entry( self ) -> Self::Entry + /// { + /// (self.0.to_string(), self.1) + /// } + /// } + /// ``` + fn val_to_entry( self ) -> Self::Entry; + } + + impl< C, Val > ValToEntry< C > for Val + where + C : CollectionValToEntry< Val >, + { + type Entry = C::Entry; + + /// Invokes the `val_to_entry` function of the `CollectionValToEntry` trait to convert the value to an entry. + fn val_to_entry( self ) -> C::Entry + { + C::val_to_entry( self ) + } + } + + /// Represents a collection by defining the types of entries and values it handles. + /// + /// This trait abstracts the nature of collections in data structures, facilitating the handling of contained + /// entries and values, especially in scenarios where the structure of the collection allows for complex relationships, + /// such as `HashMap`s. It not only identifies what constitutes an entry and a value in the context of the collection + /// but also provides utility for converting between these two, which is critical in operations involving entry manipulation + /// and value retrieval. + + pub trait Collection + { + /// The type of entries that can be added to the collection. This type can differ from `Val` in collections like `HashMap`, + /// where an entry might represent a key-value pair, and `Val` could represent just the value or the key. + type Entry; + + /// The type of values stored in the collection. This might be distinct from `Entry` in complex collections. + /// For example, in a `HashMap`, while `Entry` might be a ( key, value ) tuple, `Val` might only be the value part. + type Val; + + /// Converts an entry to its corresponding value within the collection. This function is essential for abstracting + /// the collection's internal representation from the values it manipulates. + fn entry_to_val( e : Self::Entry ) -> Self::Val; + } + + /// Provides functionality to add individual entries to a collection. + /// + /// This trait extends the basic `Collection` trait by introducing a method to add entries to a collection. + /// It is designed to handle the collection's specific requirements and rules for adding entries, such as + /// managing duplicates, maintaining order, or handling capacity constraints. + pub trait CollectionAdd : Collection + { + /// Adds an entry to the collection and returns a boolean indicating the success of the operation. + /// + /// Implementations should ensure that the entry is added according to the rules of the collection, + /// which might involve checking for duplicates, ordering, or capacity limits. + /// + /// # Parameters + /// + /// * `e`: The entry to be added to the collection, where the type `Entry` is defined by the `Collection` trait. + /// + /// # Returns + /// + /// Returns `true` if the entry was successfully added, or `false` if not added due to reasons such as + /// the entry already existing in the collection or the collection reaching its capacity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ```rust + /// + /// use former_types::{ Collection, CollectionAdd }; // use crate `former` instead of crate `former_types` unless you need to use crate `former_types` directly + /// + /// struct MyCollection + /// { + /// entries : Vec< i32 >, + /// } + /// + /// impl Collection for MyCollection + /// { + /// type Entry = i32; + /// type Val = i32; + /// + /// #[ inline( always ) ] + /// fn entry_to_val( e : Self::Entry ) -> Self::Val + /// { + /// e + /// } + /// + /// } + /// + /// impl CollectionAdd for MyCollection + /// { + /// fn add( &mut self, e : Self::Entry ) -> bool + /// { + /// if self.entries.contains( &e ) + /// { + /// false + /// } + /// else + /// { + /// self.entries.push( e ); + /// true + /// } + /// } + /// } + /// + /// let mut collection = MyCollection { entries : vec![] }; + /// assert!( collection.add( 10 ) ); // Returns true, entry added + /// assert!( !collection.add( 10 ) ); // Returns false, entry already exists + /// ``` + fn add( &mut self, e : Self::Entry ) -> bool; + } + + /// Defines the capability to replace all entries in a collection with a new set of entries. + /// + /// This trait extends the `Collection` trait by providing a method to replace the existing entries in + /// the collection with a new set. This can be useful for resetting the collection's contents or bulk-updating + /// them based on external criteria or operations. + pub trait CollectionAssign : Collection + where + Self : IntoIterator< Item = Self::Entry >, + { + /// Replaces all entries in the collection with the provided entries and returns the count of new entries added. + /// + /// This method clears the existing entries and populates the collection with new ones provided by an iterator. + /// It is ideal for scenarios where the collection needs to be refreshed or updated with a new batch of entries. + /// + /// # Parameters + /// + /// * `entries` : An iterator over the entries to be added to the collection. The entries must conform to + /// the `Entry` type defined by the `Collection` trait. + /// + /// # Returns + /// + /// Returns the number of entries successfully added to the collection. This count may differ from the total + /// number of entries in the iterator if the collection imposes restrictions such as capacity limits or duplicate + /// handling. + /// + /// # Examples + /// + /// ```rust + /// use former_types::{ Collection, CollectionAssign }; // use crate `former` instead of crate `former_types` unless you need to use crate `former_types` directly + /// + /// struct MyCollection + /// { + /// entries : Vec< i32 >, + /// } + /// + /// impl Collection for MyCollection + /// { + /// type Entry = i32; + /// type Val = i32; + /// + /// #[ inline( always ) ] + /// fn entry_to_val( e : Self::Entry ) -> Self::Val + /// { + /// e + /// } + /// + /// } + /// + /// impl IntoIterator for MyCollection + /// { + /// type Item = i32; + /// // type IntoIter = std::vec::IntoIter< i32 >; + /// type IntoIter = collection_tools::vec::IntoIter< i32 >; + /// // qqq : zzz : make sure collection_tools has itearators -- done + /// + /// fn into_iter( self ) -> Self::IntoIter + /// { + /// self.entries.into_iter() // Create an iterator from the internal HashSet. + /// } + /// } + /// + /// impl CollectionAssign for MyCollection + /// { + /// fn assign< Entries >( &mut self, entries : Entries ) -> usize + /// where + /// Entries : IntoIterator< Item = Self::Entry >, + /// { + /// self.entries.clear(); + /// self.entries.extend( entries ); + /// self.entries.len() + /// } + /// } + /// + /// let mut collection = MyCollection { entries : vec![ 1, 2, 3 ] }; + /// let new_elements = vec![ 4, 5, 6 ]; + /// assert_eq!( collection.assign( new_elements ), 3 ); // Collection now contains [ 4, 5, 6 ] + /// ``` + fn assign< Entries >( &mut self, entries : Entries ) -> usize + where + Entries : IntoIterator< Item = Self::Entry >; + } + + // = + + /// A builder structure for constructing collections with a fluent and flexible interface. + #[ derive( Default ) ] + pub struct CollectionFormer< E, Definition > + where + Definition : FormerDefinition, + Definition::Storage : CollectionAdd< Entry = E >, + { + storage : Definition::Storage, + context : core::option::Option< Definition::Context >, + on_end : core::option::Option< Definition::End >, + } + + use core::fmt; + impl< E, Definition > fmt::Debug for CollectionFormer< E, Definition > + where + Definition : FormerDefinition, + Definition::Storage : CollectionAdd< Entry = E >, + { + fn fmt( &self, f : &mut fmt::Formatter< '_ > ) -> fmt::Result + { + f + .debug_struct( "CollectionFormer" ) + .field( "storage", &"Storage Present" ) + .field( "context", &self.context.as_ref().map( |_| "Context Present" ) ) + .field( "on_end", &self.on_end.as_ref().map( |_| "End Present" ) ) + .finish() + } + } + + impl< E, Definition > CollectionFormer< E, Definition > + where + Definition : FormerDefinition, + Definition::Storage : CollectionAdd< Entry = E >, + { + /// Begins the construction process of a collection with optional initial storage and context, + /// setting up an `on_end` completion handler to finalize the collection's construction. + #[ inline( always ) ] + pub fn begin + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : Definition::End, + ) + -> Self + { + if storage.is_none() + { + storage = Some( core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context, + on_end : Some( on_end ), + } + } + + /// Provides a variation of the `begin` method allowing for coercion of the end handler, + /// facilitating ease of integration with different end conditions. + #[ inline( always ) ] + pub fn begin_coercing< IntoEnd > + ( + mut storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : IntoEnd, + ) + -> Self + where + IntoEnd : Into< Definition::End >, + { + if storage.is_none() + { + storage = Some( core::default::Default::default() ); + } + Self + { + storage : storage.unwrap(), + context, + on_end : Some( on_end.into() ), + } + } + + /// Finalizes the building process, returning the formed or a context incorporating it. + #[ inline( always ) ] + pub fn end( mut self ) -> Definition::Formed + { + let on_end = self.on_end.take().unwrap(); + let context = self.context.take(); + on_end.call( self.storage, context ) + } + + /// Alias for the `end` method to align with typical builder pattern terminologies. + #[ inline( always ) ] + pub fn form( self ) -> Definition::Formed + { + self.end() + } + + /// Replaces the current storage with a provided storage, allowing for resetting or + /// redirection of the building process. + #[ inline( always ) ] + pub fn replace( mut self, storage : Definition::Storage ) -> Self + { + self.storage = storage; + self + } + } + + impl< E, Storage, Formed, Definition > CollectionFormer< E, Definition > + where + Definition : FormerDefinition< Context = (), Storage = Storage, Formed = Formed >, + Definition::Storage : CollectionAdd< Entry = E >, + { + /// Constructs a new `CollectionFormer` instance, starting with an empty storage. + /// This method serves as the entry point for the builder pattern, facilitating the + /// creation of a new collection. + #[ inline( always ) ] + pub fn new( end : Definition::End ) -> Self + { + Self::begin + ( + None, + None, + end, + ) + } + + /// Variant of the `new` method allowing for end condition coercion, providing flexibility + /// in specifying different types of end conditions dynamically. + #[ inline( always ) ] + pub fn new_coercing< IntoEnd >( end : IntoEnd ) -> Self + where + IntoEnd : Into< Definition::End >, + { + Self::begin + ( + None, + None, + end.into(), + ) + } + } + + impl< E, Definition > CollectionFormer< E, Definition > + where + Definition : FormerDefinition, + Definition::Storage : CollectionAdd< Entry = E >, + { + + /// Appends an entry to the end of the storage, expanding the internal collection. + #[ inline( always ) ] + pub fn add< IntoElement >( mut self, entry : IntoElement ) -> Self + where IntoElement : core::convert::Into< E >, + { + CollectionAdd::add( &mut self.storage, entry.into() ); + self + } + + } + + // + + impl< E, Definition > FormerBegin< Definition > + for CollectionFormer< E, Definition > + where + Definition : FormerDefinition, + Definition::Storage : CollectionAdd< Entry = E >, + { + + #[ inline( always ) ] + fn former_begin + ( + storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : Definition::End, + ) + -> Self + { + Self::begin( storage, context, on_end ) + } + + } + +} + +/// Former of a binary tree map. +mod btree_map; +/// Former of a binary tree set. +mod btree_set; +/// Former of a binary heap. +mod binary_heap; +/// Former of a hash map. +mod hash_map; +/// Former of a hash set. +mod hash_set; +/// Former of a linked list. +mod linked_list; +/// Former of a vector. +mod vector; +/// Former of a vector deque. +mod vector_deque; + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + + EntryToVal, + CollectionValToEntry, + ValToEntry, + + Collection, + CollectionAdd, + CollectionAssign, + CollectionFormer, + + }; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + btree_map::*, + btree_set::*, + binary_heap::*, + hash_map::*, + hash_set::*, + linked_list::*, + vector::*, + vector_deque::*, + }; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/former_types/src/collection/binary_heap.rs b/module/core/former_types/src/collection/binary_heap.rs new file mode 100644 index 0000000000..6652fe0c4e --- /dev/null +++ b/module/core/former_types/src/collection/binary_heap.rs @@ -0,0 +1,255 @@ +//! This module provides a comprehensive approach to applying the builder pattern to `BinaryHeap` collections. +//! +//! By leveraging traits such as `Collection`, `CollectionAdd`, `CollectionAssign`, and `CollectionValToEntry`, +//! this module abstracts the operations on binary heap-like data structures, making them more flexible and easier to integrate as +//! as subformer, enabling fluid and intuitive manipulation of binary heaps via builder patterns. +//! + +use crate::*; +#[ allow( unused ) ] +use collection_tools::BinaryHeap; + +impl< E > Collection for BinaryHeap< E > +{ + type Entry = E; + type Val = E; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e + } + +} + +impl< E > CollectionAdd for BinaryHeap< E > +where + E : Ord +{ + + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.push( e ); + true + } + +} + +impl< E > CollectionAssign for BinaryHeap< E > +where + E : Ord +{ + #[ inline( always ) ] + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } + +} + +impl< E > CollectionValToEntry< E > for BinaryHeap< E > +{ + type Entry = E; + #[ inline( always ) ] + fn val_to_entry( val : E ) -> Self::Entry + { + val + } +} + +// = storage + +impl< E > Storage +for BinaryHeap< E > +where + E : Ord +{ + type Preformed = BinaryHeap< E >; +} + +impl< E > StoragePreform +for BinaryHeap< E > +where + E : Ord +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a binary heap-like collection within the former framework. +/// +/// This structure defines the necessary parameters and relationships needed to form a binary heap-like collection, +/// including its storage, context, the result of the formation process, and the behavior at the end of the formation. +/// +/// # Type Parameters +/// - `E`: The element type of the binary heap. +/// - `Context`: The context needed for the formation, can be provided externally. +/// - `Formed`: The type formed at the end of the formation process, typically a `BinaryHeap`. +/// - `End`: A trait determining the behavior at the end of the formation process. +/// + +#[ derive( Debug, Default ) ] +pub struct BinaryHeapDefinition< E, Context, Formed, End > +where + E : Ord, + End : FormingEnd< BinaryHeapDefinitionTypes< E, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed, End ) >, +} + +impl< E, Context, Formed, End > FormerDefinition +for BinaryHeapDefinition< E, Context, Formed, End > +where + E : Ord, + End : FormingEnd< BinaryHeapDefinitionTypes< E, Context, Formed > >, +{ + type Storage = BinaryHeap< E >; + type Context = Context; + type Formed = Formed; + + type Types = BinaryHeapDefinitionTypes< E, Context, Formed >; + type End = End; +} + +// = definition type + +/// Holds the generic parameters for the `BinaryHeapDefinition`. +/// +/// This struct acts as a companion to `BinaryHeapDefinition`, providing a concrete definition of types used +/// in the formation process. It is crucial for linking the type parameters with the operational mechanics +/// of the formation and ensuring type safety and correctness throughout the formation lifecycle. +/// +/// # Type Parameters +/// +/// - `E`: The element type of the binary heap. +/// - `Context`: The context in which the binary heap is formed. +/// - `Formed`: The type produced as a result of the formation process. + +#[ derive( Debug, Default ) ] +pub struct BinaryHeapDefinitionTypes< E, Context = (), Formed = BinaryHeap< E > > +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed ) >, +} + +impl< E, Context, Formed > FormerDefinitionTypes +for BinaryHeapDefinitionTypes< E, Context, Formed > +where + E : Ord +{ + type Storage = BinaryHeap< E >; + type Context = Context; + type Formed = Formed; +} + +// = mutator + +impl< E, Context, Formed > FormerMutator +for BinaryHeapDefinitionTypes< E, Context, Formed > +where + E : Ord +{ +} + +// = Entity To + +impl< E, Definition > EntityToFormer< Definition > +for BinaryHeap< E > +where + E : Ord, + Definition : FormerDefinition + < + Storage = BinaryHeap< E >, + Types = BinaryHeapDefinitionTypes + < + E, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = BinaryHeapFormer< E, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< E > crate::EntityToStorage +for BinaryHeap< E > +{ + type Storage = BinaryHeap< E >; +} + +impl< E, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for BinaryHeap< E > +where + E : Ord, + End : crate::FormingEnd< BinaryHeapDefinitionTypes< E, Context, Formed > >, +{ + type Definition = BinaryHeapDefinition< E, Context, Formed, End >; + type Types = BinaryHeapDefinitionTypes< E, Context, Formed >; +} + +impl< E, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for BinaryHeap< E > +where + E : Ord +{ + type Types = BinaryHeapDefinitionTypes< E, Context, Formed >; +} + +// = subformer + +/// Provides a streamlined builder interface for constructing binary heap-like collections. +/// +/// `BinaryHeapFormer` is a type alias that configures the `CollectionFormer` for use specifically with binary heaps. +/// It integrates the `BinaryHeapDefinition` to facilitate the fluent and dynamic construction of binary heaps, leveraging +/// predefined settings to reduce boilerplate code. This approach enhances readability and simplifies the use of +/// binary heaps in custom data structures where builder patterns are desired. +/// +/// The alias encapsulates complex generic parameters, making the construction process more accessible and maintainable. +/// It is particularly useful in scenarios where binary heaps are repeatedly used or configured in similar ways across different +/// parts of an application. +/// + +pub type BinaryHeapFormer< E, Context, Formed, End > = +CollectionFormer::< E, BinaryHeapDefinition< E, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for binary heaps to facilitate the use of the builder pattern. +/// +/// This trait extends the `BinaryHeap` type, enabling it to use the `BinaryHeapFormer` interface directly. +/// This allows for fluent, expressive construction and manipulation of binary heaps, integrating seamlessly +/// with the builder pattern provided by the `former` framework. It's a convenience trait that simplifies +/// creating configured binary heap builders with default settings. +/// +pub trait BinaryHeapExt< E > : sealed::Sealed +where + E : Ord +{ + /// Initializes a builder pattern for `BinaryHeap` using a default `BinaryHeapFormer`. + fn former() -> BinaryHeapFormer< E, (), BinaryHeap< E >, ReturnStorage >; +} + +impl< E > BinaryHeapExt< E > for BinaryHeap< E > +where + E : Ord +{ + fn former() -> BinaryHeapFormer< E, (), BinaryHeap< E >, ReturnStorage > + { + BinaryHeapFormer::< E, (), BinaryHeap< E >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + pub trait Sealed {} + impl< E > Sealed for super::BinaryHeap< E > {} +} diff --git a/module/core/former_types/src/collection/btree_map.rs b/module/core/former_types/src/collection/btree_map.rs new file mode 100644 index 0000000000..d1d97bfde8 --- /dev/null +++ b/module/core/former_types/src/collection/btree_map.rs @@ -0,0 +1,252 @@ +//! This module provides a comprehensive approach to applying the builder pattern to `BTreeMap` collections. +//! +//! By leveraging traits such as `Collection`, `CollectionAdd`, `CollectionAssign`, and `CollectionValToEntry`, +//! this module abstracts the operations on binary tree map-like data structures, making them more flexible and easier to integrate as +//! as subformer, enabling fluid and intuitive manipulation of binary tree maps via builder patterns. +//! + +use crate::*; +use collection_tools::BTreeMap; + +impl< K, V > Collection for BTreeMap< K, V > +where + K : Ord, +{ + type Entry = ( K, V ); + type Val = V; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e.1 + } + +} + +impl< K, V > CollectionAdd for BTreeMap< K, V > +where + K : Ord, +{ + + #[ inline( always ) ] + fn add( &mut self, ( k, v ) : Self::Entry ) -> bool + { + self.insert( k, v ).map_or_else( || true, | _ | false ) + } + +} + +impl< K, V > CollectionAssign for BTreeMap< K, V > +where + K : Ord, +{ + + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } +} + +// = storage + +impl< K, E > Storage +for BTreeMap< K, E > +where + K : Ord, +{ + type Preformed = BTreeMap< K, E >; +} + +impl< K, E > StoragePreform +for BTreeMap< K, E > +where + K : Ord, +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a hash map-like collection within the former framework. +/// +/// This structure defines the essential elements required to form a hash map-like collection, detailing +/// the key and value types, the contextual environment during formation, the final formed type, and the +/// behavior at the end of the formation process. It facilitates customization and extension of hash map +/// formation within any system that implements complex data management operations. +/// +/// # Type Parameters +/// - `K`: The key type of the hash map. +/// - `E`: The value type of the hash map. +/// - `Context`: The optional context provided during the formation process. +/// - `Formed`: The type of the entity produced, typically a `BTreeMap`. +/// - `End`: A trait defining the end behavior of the formation process, managing how the hash map is finalized. +/// + +#[ derive( Debug, Default ) ] +pub struct BTreeMapDefinition< K, E, Context = (), Formed = BTreeMap< K, E >, End = ReturnStorage > +where + K : Ord, + End : FormingEnd< BTreeMapDefinitionTypes< K, E, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( K, E, Context, Formed, End ) >, +} + +impl< K, E, Context, Formed, End > FormerDefinition +for BTreeMapDefinition< K, E, Context, Formed, End > +where + K : Ord, + End : FormingEnd< BTreeMapDefinitionTypes< K, E, Context, Formed > >, +{ + + type Storage = BTreeMap< K, E >; + type Formed = Formed; + type Context = Context; + + type Types = BTreeMapDefinitionTypes< K, E, Context, Formed >; + type End = End; + +} + +// = definition types + +/// Holds the generic parameters for the `BTreeMapDefinition`. +/// +/// This companion struct to `BTreeMapDefinition` defines the storage type and the context, along with the +/// type that is ultimately formed through the process. It is crucial for maintaining the integrity and +/// consistency of type relations throughout the former lifecycle. +/// +/// # Type Parameters +/// - `K`: The key type of the hash map. +/// - `E`: The value type of the hash map. +/// - `Context`: The operational context in which the hash map is formed. +/// - `Formed`: The type produced, typically mirroring the structure of a `BTreeMap`. + +#[ derive( Debug, Default ) ] +pub struct BTreeMapDefinitionTypes< K, E, Context = (), Formed = BTreeMap< K, E > > +{ + _phantom : core::marker::PhantomData< ( K, E, Context, Formed ) >, +} + +impl< K, E, Context, Formed > FormerDefinitionTypes +for BTreeMapDefinitionTypes< K, E, Context, Formed > +where + K : Ord, +{ + type Storage = BTreeMap< K, E >; + type Formed = Formed; + type Context = Context; +} + +// = mutator + +impl< K, E, Context, Formed > FormerMutator +for BTreeMapDefinitionTypes< K, E, Context, Formed > +where + K : Ord, +{ +} + +// = Entity To + +impl< K, E, Definition > EntityToFormer< Definition > for BTreeMap< K, E > +where + K : Ord, + Definition : FormerDefinition + < + Storage = BTreeMap< K, E >, + Types = BTreeMapDefinitionTypes + < + K, + E, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = BTreeMapFormer< K, E, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< K, E > crate::EntityToStorage +for BTreeMap< K, E > +where + K : Ord, +{ + type Storage = BTreeMap< K, E >; +} + +impl< K, E, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for BTreeMap< K, E > +where + K : Ord, + End : crate::FormingEnd< BTreeMapDefinitionTypes< K, E, Context, Formed > >, +{ + type Definition = BTreeMapDefinition< K, E, Context, Formed, End >; + type Types = BTreeMapDefinitionTypes< K, E, Context, Formed >; +} + +impl< K, E, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for BTreeMap< K, E > +where + K : Ord, +{ + type Types = BTreeMapDefinitionTypes< K, E, Context, Formed >; +} + +// = subformer + +/// Provides a streamlined builder interface for constructing hash map-like collections. +/// +/// `BTreeMapFormer` is a type alias that configures the `CollectionFormer` specifically for hash maps, +/// facilitating a more intuitive and flexible way to build and manipulate hash maps within custom data structures. +/// This type alias simplifies the usage of hash maps in builder patterns by encapsulating complex generic parameters +/// and leveraging the `BTreeMapDefinition` to handle the construction logic. It supports fluent chaining of key-value +/// insertions and can be customized with various end actions to finalize the hash map upon completion. +/// +/// The alias helps reduce boilerplate code and enhances readability, making the construction of hash maps in +/// a builder pattern both efficient and expressive. + +pub type BTreeMapFormer< K, E, Context, Formed, End > = +CollectionFormer::< ( K, E ), BTreeMapDefinition< K, E, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for hash maps to facilitate the use of the builder pattern. +/// +/// This trait extends the `BTreeMap` type, enabling it to use the `BTreeMapFormer` interface directly. +/// It allows for fluent, expressive construction and manipulation of hash maps, integrating seamlessly +/// with the builder pattern provided by the `former` framework. It's a convenience trait that simplifies +/// creating configured hash map builders with default settings. +/// + +pub trait BTreeMapExt< K, E > : sealed::Sealed +where + K : Ord, +{ + /// Initializes a builder pattern for `BTreeMap` using a default `BTreeMapFormer`. + fn former() -> BTreeMapFormer< K, E, (), BTreeMap< K, E >, ReturnStorage >; +} + +impl< K, E > BTreeMapExt< K, E > for BTreeMap< K, E > +where + K : Ord, +{ + fn former() -> BTreeMapFormer< K, E, (), BTreeMap< K, E >, ReturnStorage > + { + BTreeMapFormer::< K, E, (), BTreeMap< K, E >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + use super::BTreeMap; + pub trait Sealed {} + impl< K, E > Sealed for BTreeMap< K, E > {} +} diff --git a/module/core/former_types/src/collection/btree_set.rs b/module/core/former_types/src/collection/btree_set.rs new file mode 100644 index 0000000000..360c9484ae --- /dev/null +++ b/module/core/former_types/src/collection/btree_set.rs @@ -0,0 +1,243 @@ +//! This module provides a comprehensive approach to applying the builder pattern to `BTreeSet` collections. +//! +//! By leveraging traits such as `Collection`, `CollectionAdd`, `CollectionAssign`, and `CollectionValToEntry`, +//! this module abstracts the operations on binary tree set-like data structures, making them more flexible and easier to integrate as +//! as subformer, enabling fluid and intuitive manipulation of binary tree sets via builder patterns. +//! + +use crate::*; +#[ allow( unused ) ] +use collection_tools::BTreeSet; + +impl< E > Collection for BTreeSet< E > +{ + type Entry = E; + type Val = E; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e + } + +} + +impl< E > CollectionAdd for BTreeSet< E > +where + E : Ord +{ + + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.insert( e ); + true + } + +} + +impl< E > CollectionAssign for BTreeSet< E > +where + E : Ord +{ + #[ inline( always ) ] + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } + +} + +impl< E > CollectionValToEntry< E > for BTreeSet< E > +where +{ + type Entry = E; + #[ inline( always ) ] + fn val_to_entry( val : E ) -> Self::Entry + { + val + } +} + +// = storage + +impl< E > Storage +for BTreeSet< E > +{ + type Preformed = BTreeSet< E >; +} + +impl< E > StoragePreform +for BTreeSet< E > +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a binary tree set-like collection within the former framework. +/// +/// This structure defines the necessary parameters and relationships needed to form a binary tree set-like collection, +/// including its storage, context, the result of the formation process, and the behavior at the end of the formation. +/// +/// # Type Parameters +/// - `E`: The element type of the binary tree set. +/// - `Context`: The context needed for the formation, can be provided externally. +/// - `Formed`: The type formed at the end of the formation process, typically a `BTreeSet`. +/// - `End`: A trait determining the behavior at the end of the formation process. +/// + +#[ derive( Debug, Default ) ] +pub struct BTreeSetDefinition< E, Context, Formed, End > +where + End : FormingEnd< BTreeSetDefinitionTypes< E, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed, End ) >, +} + +impl< E, Context, Formed, End > FormerDefinition +for BTreeSetDefinition< E, Context, Formed, End > +where + End : FormingEnd< BTreeSetDefinitionTypes< E, Context, Formed > >, +{ + type Storage = BTreeSet< E >; + type Context = Context; + type Formed = Formed; + + type Types = BTreeSetDefinitionTypes< E, Context, Formed >; + type End = End; +} + +// = definition type + +/// Holds the generic parameters for the `BTreeSetDefinition`. +/// +/// This struct acts as a companion to `BTreeSetDefinition`, providing a concrete definition of types used +/// in the formation process. It is crucial for linking the type parameters with the operational mechanics +/// of the formation and ensuring type safety and correctness throughout the formation lifecycle. +/// +/// # Type Parameters +/// +/// - `E`: The element type of the binary tree set. +/// - `Context`: The context in which the binary tree set is formed. +/// - `Formed`: The type produced as a result of the formation process. + +#[ derive( Debug, Default ) ] +pub struct BTreeSetDefinitionTypes< E, Context = (), Formed = BTreeSet< E > > +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed ) >, +} + +impl< E, Context, Formed > FormerDefinitionTypes +for BTreeSetDefinitionTypes< E, Context, Formed > +{ + type Storage = BTreeSet< E >; + type Context = Context; + type Formed = Formed; +} + +// = mutator + +impl< E, Context, Formed > FormerMutator +for BTreeSetDefinitionTypes< E, Context, Formed > +{ +} + +// = Entity To + +impl< E, Definition > EntityToFormer< Definition > +for BTreeSet< E > +where + E : Ord, + Definition : FormerDefinition + < + Storage = BTreeSet< E >, + Types = BTreeSetDefinitionTypes + < + E, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = BTreeSetFormer< E, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< E > crate::EntityToStorage +for BTreeSet< E > +{ + type Storage = BTreeSet< E >; +} + +impl< E, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for BTreeSet< E > +where + End : crate::FormingEnd< BTreeSetDefinitionTypes< E, Context, Formed > >, +{ + type Definition = BTreeSetDefinition< E, Context, Formed, End >; + type Types = BTreeSetDefinitionTypes< E, Context, Formed >; +} + +impl< E, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for BTreeSet< E > +{ + type Types = BTreeSetDefinitionTypes< E, Context, Formed >; +} + +// = subformer + +/// Provides a streamlined builder interface for constructing binary tree set-like collections. +/// +/// `BTreeSetFormer` is a type alias that configures the `CollectionFormer` for use specifically with binary tree sets. +/// It integrates the `BTreeSetDefinition` to facilitate the fluent and dynamic construction of binary tree sets, leveraging +/// predefined settings to reduce boilerplate code. This approach enhances readability and simplifies the use of +/// binary tree sets in custom data structures where builder patterns are desired. +/// +/// The alias encapsulates complex generic parameters, making the construction process more accessible and maintainable. +/// It is particularly useful in scenarios where binary tree sets are repeatedly used or configured in similar ways across different +/// parts of an application. +/// + +pub type BTreeSetFormer< E, Context, Formed, End > = +CollectionFormer::< E, BTreeSetDefinition< E, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for binary tree sets to facilitate the use of the builder pattern. +/// +/// This trait extends the `BTreeSet` type, enabling it to use the `BTreeSetFormer` interface directly. +/// This allows for fluent, expressive construction and manipulation of binary tree sets, integrating seamlessly +/// with the builder pattern provided by the `former` framework. It's a convenience trait that simplifies +/// creating configured binary tree set builders with default settings. +/// +pub trait BTreeSetExt< E > : sealed::Sealed +where + E : Ord +{ + /// Initializes a builder pattern for `BTreeSet` using a default `BTreeSetFormer`. + fn former() -> BTreeSetFormer< E, (), BTreeSet< E >, ReturnStorage >; +} + +impl< E > BTreeSetExt< E > for BTreeSet< E > +where + E : Ord +{ + fn former() -> BTreeSetFormer< E, (), BTreeSet< E >, ReturnStorage > + { + BTreeSetFormer::< E, (), BTreeSet< E >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + pub trait Sealed {} + impl< E > Sealed for super::BTreeSet< E > {} +} diff --git a/module/core/former_types/src/collection/hash_map.rs b/module/core/former_types/src/collection/hash_map.rs new file mode 100644 index 0000000000..f6d6f1b58d --- /dev/null +++ b/module/core/former_types/src/collection/hash_map.rs @@ -0,0 +1,252 @@ +//! This module provides a comprehensive approach to applying the builder pattern to `HashMap` collections. +//! +//! By leveraging traits such as `Collection`, `CollectionAdd`, `CollectionAssign`, and `CollectionValToEntry`, +//! this module abstracts the operations on hashmap-like data structures, making them more flexible and easier to integrate as +//! as subformer, enabling fluid and intuitive manipulation of hashmaps via builder patterns. +//! + +use crate::*; +use collection_tools::HashMap; + +impl< K, V > Collection for HashMap< K, V > +where + K : core::cmp::Eq + core::hash::Hash, +{ + type Entry = ( K, V ); + type Val = V; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e.1 + } + +} + +impl< K, V > CollectionAdd for HashMap< K, V > +where + K : core::cmp::Eq + core::hash::Hash, +{ + + #[ inline( always ) ] + fn add( &mut self, ( k, v ) : Self::Entry ) -> bool + { + self.insert( k, v ).map_or_else( || true, | _ | false ) + } + +} + +impl< K, V > CollectionAssign for HashMap< K, V > +where + K : core::cmp::Eq + core::hash::Hash, +{ + + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } +} + +// = storage + +impl< K, E > Storage +for HashMap< K, E > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Preformed = HashMap< K, E >; +} + +impl< K, E > StoragePreform +for HashMap< K, E > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a hash map-like collection within the former framework. +/// +/// This structure defines the essential elements required to form a hash map-like collection, detailing +/// the key and value types, the contextual environment during formation, the final formed type, and the +/// behavior at the end of the formation process. It facilitates customization and extension of hash map +/// formation within any system that implements complex data management operations. +/// +/// # Type Parameters +/// - `K`: The key type of the hash map. +/// - `E`: The value type of the hash map. +/// - `Context`: The optional context provided during the formation process. +/// - `Formed`: The type of the entity produced, typically a `HashMap`. +/// - `End`: A trait defining the end behavior of the formation process, managing how the hash map is finalized. +/// + +#[ derive( Debug, Default ) ] +pub struct HashMapDefinition< K, E, Context = (), Formed = HashMap< K, E >, End = ReturnStorage > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : FormingEnd< HashMapDefinitionTypes< K, E, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( K, E, Context, Formed, End ) >, +} + +impl< K, E, Context, Formed, End > FormerDefinition +for HashMapDefinition< K, E, Context, Formed, End > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : FormingEnd< HashMapDefinitionTypes< K, E, Context, Formed > >, +{ + + type Storage = HashMap< K, E >; + type Formed = Formed; + type Context = Context; + + type Types = HashMapDefinitionTypes< K, E, Context, Formed >; + type End = End; + +} + +// = definition types + +/// Holds the generic parameters for the `HashMapDefinition`. +/// +/// This companion struct to `HashMapDefinition` defines the storage type and the context, along with the +/// type that is ultimately formed through the process. It is crucial for maintaining the integrity and +/// consistency of type relations throughout the former lifecycle. +/// +/// # Type Parameters +/// - `K`: The key type of the hash map. +/// - `E`: The value type of the hash map. +/// - `Context`: The operational context in which the hash map is formed. +/// - `Formed`: The type produced, typically mirroring the structure of a `HashMap`. + +#[ derive( Debug, Default ) ] +pub struct HashMapDefinitionTypes< K, E, Context = (), Formed = HashMap< K, E > > +{ + _phantom : core::marker::PhantomData< ( K, E, Context, Formed ) >, +} + +impl< K, E, Context, Formed > FormerDefinitionTypes +for HashMapDefinitionTypes< K, E, Context, Formed > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Storage = HashMap< K, E >; + type Formed = Formed; + type Context = Context; +} + +// = mutator + +impl< K, E, Context, Formed > FormerMutator +for HashMapDefinitionTypes< K, E, Context, Formed > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ +} + +// = Entity To + +impl< K, E, Definition > EntityToFormer< Definition > for HashMap< K, E > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + Definition : FormerDefinition + < + Storage = HashMap< K, E >, + Types = HashMapDefinitionTypes + < + K, + E, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = HashMapFormer< K, E, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< K, E > crate::EntityToStorage +for HashMap< K, E > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Storage = HashMap< K, E >; +} + +impl< K, E, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for HashMap< K, E > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : crate::FormingEnd< HashMapDefinitionTypes< K, E, Context, Formed > >, +{ + type Definition = HashMapDefinition< K, E, Context, Formed, End >; + type Types = HashMapDefinitionTypes< K, E, Context, Formed >; +} + +impl< K, E, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for HashMap< K, E > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Types = HashMapDefinitionTypes< K, E, Context, Formed >; +} + +// = subformer + +/// Provides a streamlined builder interface for constructing hash map-like collections. +/// +/// `HashMapFormer` is a type alias that configures the `CollectionFormer` specifically for hash maps, +/// facilitating a more intuitive and flexible way to build and manipulate hash maps within custom data structures. +/// This type alias simplifies the usage of hash maps in builder patterns by encapsulating complex generic parameters +/// and leveraging the `HashMapDefinition` to handle the construction logic. It supports fluent chaining of key-value +/// insertions and can be customized with various end actions to finalize the hash map upon completion. +/// +/// The alias helps reduce boilerplate code and enhances readability, making the construction of hash maps in +/// a builder pattern both efficient and expressive. + +pub type HashMapFormer< K, E, Context, Formed, End > = +CollectionFormer::< ( K, E ), HashMapDefinition< K, E, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for hash maps to facilitate the use of the builder pattern. +/// +/// This trait extends the `HashMap` type, enabling it to use the `HashMapFormer` interface directly. +/// It allows for fluent, expressive construction and manipulation of hash maps, integrating seamlessly +/// with the builder pattern provided by the `former` framework. It's a convenience trait that simplifies +/// creating configured hash map builders with default settings. +/// + +pub trait HashMapExt< K, E > : sealed::Sealed +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + /// Initializes a builder pattern for `HashMap` using a default `HashMapFormer`. + fn former() -> HashMapFormer< K, E, (), HashMap< K, E >, ReturnStorage >; +} + +impl< K, E > HashMapExt< K, E > for HashMap< K, E > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + fn former() -> HashMapFormer< K, E, (), HashMap< K, E >, ReturnStorage > + { + HashMapFormer::< K, E, (), HashMap< K, E >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + use super::HashMap; + pub trait Sealed {} + impl< K, E > Sealed for HashMap< K, E > {} +} diff --git a/module/core/former_types/src/collection/hash_set.rs b/module/core/former_types/src/collection/hash_set.rs new file mode 100644 index 0000000000..16d5dec6c0 --- /dev/null +++ b/module/core/former_types/src/collection/hash_set.rs @@ -0,0 +1,278 @@ +//! This module provides a builder pattern implementation (`HashSetFormer`) for `HashSet`-like collections. It is designed to extend the builder pattern, allowing for fluent and dynamic construction of sets within custom data structures. + +use crate::*; +use collection_tools::HashSet; + +impl< K > Collection for HashSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + type Entry = K; + type Val = K; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e + } + +} + +impl< K > CollectionAdd for HashSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + // type Entry = K; + // type Val = K; + + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.insert( e ) + } + +} + +impl< K > CollectionAssign for HashSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + // type Entry = K; + + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } +} + +impl< K > CollectionValToEntry< K > for HashSet< K > +where + K : core::cmp::Eq + core::hash::Hash, +{ + type Entry = K; + #[ inline( always ) ] + fn val_to_entry( val : K ) -> Self::Entry + { + val + } +} + +// /// A trait for collections behaving like a `HashSet`, allowing insertion operations. +// /// +// /// Implementing this trait enables the associated formed to be used with `HashSetFormer`, +// /// facilitating a builder pattern that is both intuitive and concise. +// /// +// /// # Example Implementation +// /// +// /// Implementing `HashSetLike` for `std::collections::HashSet`: +// /// +// +// pub trait HashSetLike< K > +// where +// K : core::cmp::Eq + core::hash::Hash, +// { +// /// Inserts a key-value pair into the map. +// fn insert( &mut self, element : K ) -> Option< K >; +// } +// +// // impl< K > HashSetLike< K > for HashSet< K > +// // where +// // K : core::cmp::Eq + core::hash::Hash, +// // { +// // fn insert( &mut self, element : K ) -> Option< K > +// // { +// // HashSet::replace( self, element ) +// // } +// // } + +// = storage + +impl< K > Storage +for HashSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + // type Formed = HashSet< K >; + type Preformed = HashSet< K >; +} + +impl< K > StoragePreform +for HashSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + // type Preformed = HashSet< K >; + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a hash set-like collection within the former framework. +/// +/// This structure defines the essential elements required to form a hash set-like collection, detailing +/// the type of elements, the contextual environment during formation, the final formed type, and the +/// behavior at the end of the formation process. It is designed to support the construction and configuration +/// of hash set collections with dynamic characteristics and behaviors. +/// +/// # Type Parameters +/// - `K`: The type of elements in the hash set. +/// - `Context`: The optional context provided during the formation process. +/// - `Formed`: The type of the entity produced, typically a `HashSet`. +/// - `End`: A trait defining the end behavior of the formation process, managing how the hash set is finalized. +/// + +#[ derive( Debug, Default ) ] +pub struct HashSetDefinition< K, Context = (), Formed = HashSet< K >, End = ReturnStorage > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : FormingEnd< HashSetDefinitionTypes< K, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( K, Context, Formed, End ) >, +} + +impl< K, Context, Formed, End > FormerDefinition +for HashSetDefinition< K, Context, Formed, End > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : FormingEnd< HashSetDefinitionTypes< K, Context, Formed > >, +{ + type Storage = HashSet< K >; + type Formed = Formed; + type Context = Context; + + type Types = HashSetDefinitionTypes< K, Context, Formed >; + type End = End; +} + +// = definition types + +/// Holds the generic parameters for the `HashSetDefinition`. +/// +/// This struct encapsulates the type relationships and characteristics essential for the formation process +/// of a `HashSet`, including the storage type, the context, and the type ultimately formed. It ensures that +/// these elements are congruent and coherent throughout the lifecycle of the hash set formation. +/// + +#[ derive( Debug, Default ) ] +pub struct HashSetDefinitionTypes< K, Context = (), Formed = HashSet< K > > +{ + _phantom : core::marker::PhantomData< ( K, Context, Formed ) >, +} + +impl< K, Context, Formed > FormerDefinitionTypes +for HashSetDefinitionTypes< K, Context, Formed > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Storage = HashSet< K >; + type Formed = Formed; + type Context = Context; +} + +// = mutator + +impl< K, Context, Formed > FormerMutator +for HashSetDefinitionTypes< K, Context, Formed > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ +} + +// = entity to + +impl< K, Definition > EntityToFormer< Definition > for HashSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + Definition : FormerDefinition + < + Storage = HashSet< K >, + Types = HashSetDefinitionTypes + < + K, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = HashSetFormer< K, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< K > crate::EntityToStorage +for HashSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Storage = HashSet< K >; +} + +impl< K, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for HashSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, + End : crate::FormingEnd< HashSetDefinitionTypes< K, Context, Formed > >, +{ + type Definition = HashSetDefinition< K, Context, Formed, End >; + type Types = HashSetDefinitionTypes< K, Context, Formed >; +} + +impl< K, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for HashSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + type Types = HashSetDefinitionTypes< K, Context, Formed >; +} + +// = subformer + +/// Provides a concise alias for `CollectionFormer` configured specifically for `HashSet`-like collections. +/// +/// `HashSetFormer` simplifies the creation of `HashSet` collections within builder patterns by leveraging +/// the `CollectionFormer` with predefined settings. This approach minimizes boilerplate code and enhances +/// readability, making it ideal for fluent and expressive construction of set collections within custom data structures. +/// + +pub type HashSetFormer< K, Context, Formed, End > = +CollectionFormer::< K, HashSetDefinition< K, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for `HashSet` to facilitate the use of the builder pattern. +/// +/// This trait extends `HashSet`, enabling direct use of the `HashSetFormer` interface for fluent and expressive +/// set construction. It simplifies the process of building `HashSet` instances by providing a straightforward +/// way to start the builder pattern with default context and termination behavior. +/// + +pub trait HashSetExt< K > : sealed::Sealed +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + /// Initializes a builder pattern for `HashSet` using a default `HashSetFormer`. + fn former() -> HashSetFormer< K, (), HashSet< K >, ReturnStorage >; +} + +impl< K > HashSetExt< K > for HashSet< K > +where + K : ::core::cmp::Eq + ::core::hash::Hash, +{ + fn former() -> HashSetFormer< K, (), HashSet< K >, ReturnStorage > + { + HashSetFormer::< K, (), HashSet< K >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + use super::HashSet; + pub trait Sealed {} + impl< K > Sealed for HashSet< K > {} +} diff --git a/module/core/former_types/src/collection/linked_list.rs b/module/core/former_types/src/collection/linked_list.rs new file mode 100644 index 0000000000..abdb327074 --- /dev/null +++ b/module/core/former_types/src/collection/linked_list.rs @@ -0,0 +1,234 @@ +//! This module provides a comprehensive approach to applying the builder pattern to `LinkedList` collections. +//! +//! By leveraging traits such as `Collection`, `CollectionAdd`, `CollectionAssign`, and `CollectionValToEntry`, +//! this module abstracts the operations on list-like data structures, making them more flexible and easier to integrate as +//! as subformer, enabling fluid and intuitive manipulation of lists via builder patterns. +//! + +use crate::*; +#[ allow( unused ) ] +use collection_tools::LinkedList; + +impl< E > Collection for LinkedList< E > +{ + type Entry = E; + type Val = E; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e + } + +} + +impl< E > CollectionAdd for LinkedList< E > +{ + + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.push_back( e ); + true + } + +} + +impl< E > CollectionAssign for LinkedList< E > +{ + #[ inline( always ) ] + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } + +} + +impl< E > CollectionValToEntry< E > for LinkedList< E > +where +{ + type Entry = E; + #[ inline( always ) ] + fn val_to_entry( val : E ) -> Self::Entry + { + val + } +} + +// = storage + +impl< E > Storage +for LinkedList< E > +{ + type Preformed = LinkedList< E >; +} + +impl< E > StoragePreform +for LinkedList< E > +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a list-like collection within the former framework. +/// +/// This structure defines the necessary parameters and relationships needed to form a list-like collection, +/// including its storage, context, the result of the formation process, and the behavior at the end of the formation. +/// +/// # Type Parameters +/// - `E`: The element type of the list. +/// - `Context`: The context needed for the formation, can be provided externally. +/// - `Formed`: The type formed at the end of the formation process, typically a `LinkedList`. +/// - `End`: A trait determining the behavior at the end of the formation process. +/// + +#[ derive( Debug, Default ) ] +pub struct LinkedListDefinition< E, Context, Formed, End > +where + End : FormingEnd< LinkedListDefinitionTypes< E, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed, End ) >, +} + +impl< E, Context, Formed, End > FormerDefinition +for LinkedListDefinition< E, Context, Formed, End > +where + End : FormingEnd< LinkedListDefinitionTypes< E, Context, Formed > >, +{ + type Storage = LinkedList< E >; + type Context = Context; + type Formed = Formed; + + type Types = LinkedListDefinitionTypes< E, Context, Formed >; + type End = End; +} + +// = definition type + +/// Holds the generic parameters for the `LinkedListDefinition`. +/// +/// This struct acts as a companion to `LinkedListDefinition`, providing a concrete definition of types used +/// in the formation process. It is crucial for linking the type parameters with the operational mechanics +/// of the formation and ensuring type safety and correctness throughout the formation lifecycle. +/// +/// # Type Parameters +/// +/// - `E`: The element type of the list. +/// - `Context`: The context in which the list is formed. +/// - `Formed`: The type produced as a result of the formation process. + +#[ derive( Debug, Default ) ] +pub struct LinkedListDefinitionTypes< E, Context = (), Formed = LinkedList< E > > +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed ) >, +} + +impl< E, Context, Formed > FormerDefinitionTypes +for LinkedListDefinitionTypes< E, Context, Formed > +{ + type Storage = LinkedList< E >; + type Context = Context; + type Formed = Formed; +} + +// = mutator + +impl< E, Context, Formed > FormerMutator +for LinkedListDefinitionTypes< E, Context, Formed > +{ +} + +// = Entity To + +impl< E, Definition > EntityToFormer< Definition > +for LinkedList< E > +where + Definition : FormerDefinition + < + Storage = LinkedList< E >, + Types = LinkedListDefinitionTypes + < + E, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = LinkedListFormer< E, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< E > crate::EntityToStorage +for LinkedList< E > +{ + type Storage = LinkedList< E >; +} + +impl< E, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for LinkedList< E > +where + End : crate::FormingEnd< LinkedListDefinitionTypes< E, Context, Formed > >, +{ + type Definition = LinkedListDefinition< E, Context, Formed, End >; + type Types = LinkedListDefinitionTypes< E, Context, Formed >; +} + +impl< E, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for LinkedList< E > +{ + type Types = LinkedListDefinitionTypes< E, Context, Formed >; +} + +// = subformer + +/// Provides a streamlined builder interface for constructing list-like collections. +/// +/// `LinkedListFormer` is a type alias that configures the `CollectionFormer` for use specifically with lists. +/// It integrates the `LinkedListDefinition` to facilitate the fluent and dynamic construction of lists, leveraging +/// predefined settings to reduce boilerplate code. This approach enhances readability and simplifies the use of +/// lists in custom data structures where builder patterns are desired. +/// +/// The alias encapsulates complex generic parameters, making the construction process more accessible and maintainable. +/// It is particularly useful in scenarios where lists are repeatedly used or configured in similar ways across different +/// parts of an application. +/// + +pub type LinkedListFormer< E, Context, Formed, End > = +CollectionFormer::< E, LinkedListDefinition< E, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for lists to facilitate the use of the builder pattern. +/// +/// This trait extends the `LinkedList` type, enabling it to use the `LinkedListFormer` interface directly. +/// This allows for fluent, expressive construction and manipulation of lists, integrating seamlessly +/// with the builder pattern provided by the `former` framework. It's a convenience trait that simplifies +/// creating configured list builders with default settings. +/// +pub trait LinkedListExt< E > : sealed::Sealed +{ + /// Initializes a builder pattern for `LinkedList` using a default `LinkedListFormer`. + fn former() -> LinkedListFormer< E, (), LinkedList< E >, ReturnStorage >; +} + +impl< E > LinkedListExt< E > for LinkedList< E > +{ + fn former() -> LinkedListFormer< E, (), LinkedList< E >, ReturnStorage > + { + LinkedListFormer::< E, (), LinkedList< E >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + pub trait Sealed {} + impl< E > Sealed for super::LinkedList< E > {} +} diff --git a/module/core/former_types/src/collection/vector.rs b/module/core/former_types/src/collection/vector.rs new file mode 100644 index 0000000000..96f7e577f1 --- /dev/null +++ b/module/core/former_types/src/collection/vector.rs @@ -0,0 +1,234 @@ +//! This module provides a comprehensive approach to applying the builder pattern to `Vec` collections. +//! +//! By leveraging traits such as `Collection`, `CollectionAdd`, `CollectionAssign`, and `CollectionValToEntry`, +//! this module abstracts the operations on vector-like data structures, making them more flexible and easier to integrate as +//! as subformer, enabling fluid and intuitive manipulation of vectors via builder patterns. +//! + +use crate::*; +#[ allow( unused ) ] +use collection_tools::Vec; + +impl< E > Collection for Vec< E > +{ + type Entry = E; + type Val = E; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e + } + +} + +impl< E > CollectionAdd for Vec< E > +{ + + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.push( e ); + true + } + +} + +impl< E > CollectionAssign for Vec< E > +{ + #[ inline( always ) ] + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } + +} + +impl< E > CollectionValToEntry< E > for Vec< E > +where +{ + type Entry = E; + #[ inline( always ) ] + fn val_to_entry( val : E ) -> Self::Entry + { + val + } +} + +// = storage + +impl< E > Storage +for Vec< E > +{ + type Preformed = Vec< E >; +} + +impl< E > StoragePreform +for Vec< E > +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a vector-like collection within the former framework. +/// +/// This structure defines the necessary parameters and relationships needed to form a vector-like collection, +/// including its storage, context, the result of the formation process, and the behavior at the end of the formation. +/// +/// # Type Parameters +/// - `E`: The element type of the vector. +/// - `Context`: The context needed for the formation, can be provided externally. +/// - `Formed`: The type formed at the end of the formation process, typically a `Vec`. +/// - `End`: A trait determining the behavior at the end of the formation process. +/// + +#[ derive( Debug, Default ) ] +pub struct VectorDefinition< E, Context, Formed, End > +where + End : FormingEnd< VectorDefinitionTypes< E, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed, End ) >, +} + +impl< E, Context, Formed, End > FormerDefinition +for VectorDefinition< E, Context, Formed, End > +where + End : FormingEnd< VectorDefinitionTypes< E, Context, Formed > >, +{ + type Storage = Vec< E >; + type Context = Context; + type Formed = Formed; + + type Types = VectorDefinitionTypes< E, Context, Formed >; + type End = End; +} + +// = definition type + +/// Holds the generic parameters for the `VectorDefinition`. +/// +/// This struct acts as a companion to `VectorDefinition`, providing a concrete definition of types used +/// in the formation process. It is crucial for linking the type parameters with the operational mechanics +/// of the formation and ensuring type safety and correctness throughout the formation lifecycle. +/// +/// # Type Parameters +/// +/// - `E`: The element type of the vector. +/// - `Context`: The context in which the vector is formed. +/// - `Formed`: The type produced as a result of the formation process. + +#[ derive( Debug, Default ) ] +pub struct VectorDefinitionTypes< E, Context = (), Formed = Vec< E > > +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed ) >, +} + +impl< E, Context, Formed > FormerDefinitionTypes +for VectorDefinitionTypes< E, Context, Formed > +{ + type Storage = Vec< E >; + type Context = Context; + type Formed = Formed; +} + +// = mutator + +impl< E, Context, Formed > FormerMutator +for VectorDefinitionTypes< E, Context, Formed > +{ +} + +// = Entity To + +impl< E, Definition > EntityToFormer< Definition > +for Vec< E > +where + Definition : FormerDefinition + < + Storage = Vec< E >, + Types = VectorDefinitionTypes + < + E, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = VectorFormer< E, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< E > crate::EntityToStorage +for Vec< E > +{ + type Storage = Vec< E >; +} + +impl< E, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for Vec< E > +where + End : crate::FormingEnd< VectorDefinitionTypes< E, Context, Formed > >, +{ + type Definition = VectorDefinition< E, Context, Formed, End >; + type Types = VectorDefinitionTypes< E, Context, Formed >; +} + +impl< E, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for Vec< E > +{ + type Types = VectorDefinitionTypes< E, Context, Formed >; +} + +// = subformer + +/// Provides a streamlined builder interface for constructing vector-like collections. +/// +/// `VectorFormer` is a type alias that configures the `CollectionFormer` for use specifically with vectors. +/// It integrates the `VectorDefinition` to facilitate the fluent and dynamic construction of vectors, leveraging +/// predefined settings to reduce boilerplate code. This approach enhances readability and simplifies the use of +/// vectors in custom data structures where builder patterns are desired. +/// +/// The alias encapsulates complex generic parameters, making the construction process more accessible and maintainable. +/// It is particularly useful in scenarios where vectors are repeatedly used or configured in similar ways across different +/// parts of an application. +/// + +pub type VectorFormer< E, Context, Formed, End > = +CollectionFormer::< E, VectorDefinition< E, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for vectors to facilitate the use of the builder pattern. +/// +/// This trait extends the `Vec` type, enabling it to use the `VectorFormer` interface directly. +/// This allows for fluent, expressive construction and manipulation of vectors, integrating seamlessly +/// with the builder pattern provided by the `former` framework. It's a convenience trait that simplifies +/// creating configured vector builders with default settings. +/// +pub trait VecExt< E > : sealed::Sealed +{ + /// Initializes a builder pattern for `Vec` using a default `VectorFormer`. + fn former() -> VectorFormer< E, (), Vec< E >, ReturnStorage >; +} + +impl< E > VecExt< E > for Vec< E > +{ + fn former() -> VectorFormer< E, (), Vec< E >, ReturnStorage > + { + VectorFormer::< E, (), Vec< E >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + pub trait Sealed {} + impl< E > Sealed for super::Vec< E > {} +} diff --git a/module/core/former_types/src/collection/vector_deque.rs b/module/core/former_types/src/collection/vector_deque.rs new file mode 100644 index 0000000000..f3b08c6c01 --- /dev/null +++ b/module/core/former_types/src/collection/vector_deque.rs @@ -0,0 +1,234 @@ +//! This module provides a comprehensive approach to applying the builder pattern to `VecDeque` collections. +//! +//! By leveraging traits such as `Collection`, `CollectionAdd`, `CollectionAssign`, and `CollectionValToEntry`, +//! this module abstracts the operations on vector deque-like data structures, making them more flexible and easier to integrate as +//! as subformer, enabling fluid and intuitive manipulation of vector deques via builder patterns. +//! + +use crate::*; +#[ allow( unused ) ] +use collection_tools::VecDeque; + +impl< E > Collection for VecDeque< E > +{ + type Entry = E; + type Val = E; + + #[ inline( always ) ] + fn entry_to_val( e : Self::Entry ) -> Self::Val + { + e + } + +} + +impl< E > CollectionAdd for VecDeque< E > +{ + + #[ inline( always ) ] + fn add( &mut self, e : Self::Entry ) -> bool + { + self.push_back( e ); + true + } + +} + +impl< E > CollectionAssign for VecDeque< E > +{ + #[ inline( always ) ] + fn assign< Elements >( &mut self, elements : Elements ) -> usize + where + Elements : IntoIterator< Item = Self::Entry > + { + let initial_len = self.len(); + self.extend( elements ); + self.len() - initial_len + } + +} + +impl< E > CollectionValToEntry< E > for VecDeque< E > +where +{ + type Entry = E; + #[ inline( always ) ] + fn val_to_entry( val : E ) -> Self::Entry + { + val + } +} + +// = storage + +impl< E > Storage +for VecDeque< E > +{ + type Preformed = VecDeque< E >; +} + +impl< E > StoragePreform +for VecDeque< E > +{ + fn preform( self ) -> Self::Preformed + { + self + } +} + +// = definition + +/// Represents the formation definition for a vector deque-like collection within the former framework. +/// +/// This structure defines the necessary parameters and relationships needed to form a vector deque-like collection, +/// including its storage, context, the result of the formation process, and the behavior at the end of the formation. +/// +/// # Type Parameters +/// - `E`: The element type of the vector deque. +/// - `Context`: The context needed for the formation, can be provided externally. +/// - `Formed`: The type formed at the end of the formation process, typically a `VecDeque`. +/// - `End`: A trait determining the behavior at the end of the formation process. +/// + +#[ derive( Debug, Default ) ] +pub struct VecDequeDefinition< E, Context, Formed, End > +where + End : FormingEnd< VecDequeDefinitionTypes< E, Context, Formed > >, +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed, End ) >, +} + +impl< E, Context, Formed, End > FormerDefinition +for VecDequeDefinition< E, Context, Formed, End > +where + End : FormingEnd< VecDequeDefinitionTypes< E, Context, Formed > >, +{ + type Storage = VecDeque< E >; + type Context = Context; + type Formed = Formed; + + type Types = VecDequeDefinitionTypes< E, Context, Formed >; + type End = End; +} + +// = definition type + +/// Holds the generic parameters for the `VecDequeDefinition`. +/// +/// This struct acts as a companion to `VecDequeDefinition`, providing a concrete definition of types used +/// in the formation process. It is crucial for linking the type parameters with the operational mechanics +/// of the formation and ensuring type safety and correctness throughout the formation lifecycle. +/// +/// # Type Parameters +/// +/// - `E`: The element type of the vector deque. +/// - `Context`: The context in which the vector deque is formed. +/// - `Formed`: The type produced as a result of the formation process. + +#[ derive( Debug, Default ) ] +pub struct VecDequeDefinitionTypes< E, Context = (), Formed = VecDeque< E > > +{ + _phantom : core::marker::PhantomData< ( E, Context, Formed ) >, +} + +impl< E, Context, Formed > FormerDefinitionTypes +for VecDequeDefinitionTypes< E, Context, Formed > +{ + type Storage = VecDeque< E >; + type Context = Context; + type Formed = Formed; +} + +// = mutator + +impl< E, Context, Formed > FormerMutator +for VecDequeDefinitionTypes< E, Context, Formed > +{ +} + +// = Entity To + +impl< E, Definition > EntityToFormer< Definition > +for VecDeque< E > +where + Definition : FormerDefinition + < + Storage = VecDeque< E >, + Types = VecDequeDefinitionTypes + < + E, + < Definition as definition::FormerDefinition >::Context, + < Definition as definition::FormerDefinition >::Formed, + >, + >, + Definition::End : forming::FormingEnd< Definition::Types >, +{ + type Former = VecDequeFormer< E, Definition::Context, Definition::Formed, Definition::End >; +} + +impl< E > crate::EntityToStorage +for VecDeque< E > +{ + type Storage = VecDeque< E >; +} + +impl< E, Context, Formed, End > crate::EntityToDefinition< Context, Formed, End > +for VecDeque< E > +where + End : crate::FormingEnd< VecDequeDefinitionTypes< E, Context, Formed > >, +{ + type Definition = VecDequeDefinition< E, Context, Formed, End >; + type Types = VecDequeDefinitionTypes< E, Context, Formed >; +} + +impl< E, Context, Formed > crate::EntityToDefinitionTypes< Context, Formed > +for VecDeque< E > +{ + type Types = VecDequeDefinitionTypes< E, Context, Formed >; +} + +// = subformer + +/// Provides a streamlined builder interface for constructing vector deque-like collections. +/// +/// `VecDequeFormer` is a type alias that configures the `CollectionFormer` for use specifically with vector deques. +/// It integrates the `VecDequeDefinition` to facilitate the fluent and dynamic construction of vector deques, leveraging +/// predefined settings to reduce boilerplate code. This approach enhances readability and simplifies the use of +/// vector deques in custom data structures where builder patterns are desired. +/// +/// The alias encapsulates complex generic parameters, making the construction process more accessible and maintainable. +/// It is particularly useful in scenarios where vector deques are repeatedly used or configured in similar ways across different +/// parts of an application. +/// + +pub type VecDequeFormer< E, Context, Formed, End > = +CollectionFormer::< E, VecDequeDefinition< E, Context, Formed, End > >; + +// = extension + +/// Provides an extension method for vector deques to facilitate the use of the builder pattern. +/// +/// This trait extends the `VecDeque` type, enabling it to use the `VecDequeFormer` interface directly. +/// This allows for fluent, expressive construction and manipulation of vector deques, integrating seamlessly +/// with the builder pattern provided by the `former` framework. It's a convenience trait that simplifies +/// creating configured vector deque builders with default settings. +/// +pub trait VecDequeExt< E > : sealed::Sealed +{ + /// Initializes a builder pattern for `VecDeque` using a default `VecDequeFormer`. + fn former() -> VecDequeFormer< E, (), VecDeque< E >, ReturnStorage >; +} + +impl< E > VecDequeExt< E > for VecDeque< E > +{ + fn former() -> VecDequeFormer< E, (), VecDeque< E >, ReturnStorage > + { + VecDequeFormer::< E, (), VecDeque< E >, ReturnStorage >::new( ReturnStorage::default() ) + } +} + +mod sealed +{ + pub trait Sealed {} + impl< E > Sealed for super::VecDeque< E > {} +} diff --git a/module/core/former_types/src/component.rs b/module/core/former_types/src/component.rs new file mode 100644 index 0000000000..21398497d8 --- /dev/null +++ b/module/core/former_types/src/component.rs @@ -0,0 +1,198 @@ +/// Provides a generic interface for setting a component of a certain type on an object. +/// +/// This trait abstracts the action of setting or replacing a component, where a component +/// can be any part or attribute of an object, such as a field value. It is designed to be +/// generic over the type of the component being set (`T`) and the type that can be converted +/// into the component (`IntoT`). This design allows for flexible implementations that can +/// accept various types that can then be converted into the required component type. +/// +/// # Type Parameters +/// +/// - `T`: The type of the component to be set on the implementing object. This type represents +/// the final form of the component as it should be stored or represented in the object. +/// - `IntoT`: The type that can be converted into `T`. This allows the `assign` method to accept +/// different types that are capable of being transformed into the required component type `T`, +/// providing greater flexibility in setting the component. +/// +/// # Examples +/// +/// Implementing `Assign` to set a name string on a struct: +/// +/// ```rust +/// use former_types::Assign; // use crate `former` instead of crate `former_types` unless you need to use crate `former_types` directly +/// +/// struct MyStruct { +/// name: String, +/// } +/// +/// impl< IntoT : Into< String > > Assign< String, IntoT > for MyStruct +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.name = component.into(); +/// } +/// } +/// +/// let mut obj = MyStruct { name : String::new() }; +/// obj.assign( "New Name" ); +/// assert_eq!( obj.name, "New Name" ); +/// ``` +#[ cfg( any( feature = "types_component_assign" ) ) ] +pub trait Assign< T, IntoT > +where + IntoT : Into< T >, +{ + /// Sets or replaces the component on the object with the given value. + /// + /// This method takes ownership of the given value (`component`), which is of type `IntoT`. + /// `component` is then converted into type `T` and set as the component of the object. + fn assign( &mut self, component : IntoT ); +} + +/// Extension trait to provide a method for setting a component on an `Option` +/// if the `Option` is currently `None`. If the `Option` is `Some`, the method will +/// delegate to the `Assign` trait's `assign` method. +/// +/// # Type Parameters +/// +/// - `T`: The type of the component to be set on the implementing object. This type represents +/// the final form of the component as it should be stored or represented in the object. +/// +/// # Examples +/// +/// Using `option_assign` to set a component on an `Option`: +/// +/// ```rust +/// use former_types::{ Assign, OptionExt }; // use crate `former` instead of crate `former_types` unless you need to use crate `former_types` directly +/// +/// struct MyStruct +/// { +/// name : String, +/// } +/// +/// impl< IntoT : Into< MyStruct > > Assign< MyStruct, IntoT > for MyStruct +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.name = component.into().name; +/// } +/// } +/// +/// let mut opt_struct: Option< MyStruct > = None; +/// opt_struct.option_assign( MyStruct { name: "New Name".to_string() } ); +/// assert_eq!( opt_struct.unwrap().name, "New Name" ); +/// ``` +#[ cfg( any( feature = "types_component_assign" ) ) ] +pub trait OptionExt< T > : sealed::Sealed +where + T : Sized + Assign< T, T >, +{ + /// Sets the component on the `Option` if it is `None`. + /// + /// If the `Option` is `Some`, the `assign` method is called to update the existing value. + /// + /// # Parameters + /// + /// - `src`: The value to assign to the `Option`. + fn option_assign( & mut self, src : T ); +} + +#[ cfg( any( feature = "types_component_assign" ) ) ] +impl< T > OptionExt< T > for Option< T > +where + T : Sized + Assign< T, T >, +{ + #[ inline( always ) ] + fn option_assign( & mut self, src : T ) + { + match self + { + Some( self_ref ) => Assign::assign( self_ref, Into::< T >::into( src ) ), + None => * self = Some( src ), + } + } +} + +#[ cfg( any( feature = "types_component_assign" ) ) ] +mod sealed +{ + pub trait Sealed {} + impl< T > Sealed for Option< T > + where + T : Sized + super::Assign< T, T >, + {} +} + +/// The `AssignWithType` trait provides a mechanism to set a component on an object, +/// utilizing the type information explicitly. This trait extends the functionality of `Assign` +/// by allowing implementers to specify the component's type at the method call site, +/// enhancing expressiveness in code that manipulates object states. +/// +/// # Type Parameters +/// +/// - `T`: The type of the component to be set on the implementing object. This specifies +/// the exact type expected by the object as its component. +/// - `IntoT`: A type that can be converted into `T`, providing flexibility in the types of values +/// that can be used to set the component. +/// +/// # Examples +/// +/// Implementing `AssignWithType` to set a username on a struct: +/// +/// ```rust +/// use former_types::{ Assign, AssignWithType }; // use crate `former` instead of crate `former_types` unless you need to use crate `former_types` directly +/// +/// struct UserProfile +/// { +/// username : String, +/// } +/// +/// impl< IntoT : Into< String > > Assign< String, IntoT > for UserProfile +/// { +/// fn assign( &mut self, component : IntoT ) +/// { +/// self.username = component.into(); +/// } +/// } +/// +/// let mut user_profile = UserProfile { username : String::new() }; +/// user_profile.assign_with_type::< String, _ >("john_doe"); +/// +/// assert_eq!( user_profile.username, "john_doe" ); +/// ``` +#[ cfg( any( feature = "types_component_assign" ) ) ] +pub trait AssignWithType +{ + /// Sets the value of a component by its type. + /// + /// This method allows an implementer of `AssignWithType` to set a component on `self` + /// where the component's type is `T`, and the input value is of type `IntoT`, which can be + /// converted into `T`. This method bridges the gap between dynamic type usage and static type + /// enforcement, providing a flexible yet type-safe interface for modifying object states. + /// + /// # Parameters + /// + /// - `component`: The value to assign to the component. + /// + /// # Type Parameters + /// + /// - `T`: The type of the component to be set on the implementing object. + /// - `IntoT`: A type that can be converted into `T`. + fn assign_with_type< T, IntoT >( & mut self, component : IntoT ) + where + IntoT : Into< T >, + Self : Assign< T, IntoT >; +} + +#[ cfg( any( feature = "types_component_assign" ) ) ] +impl< S > AssignWithType for S +{ + #[ inline( always ) ] + fn assign_with_type< T, IntoT >( & mut self, component : IntoT ) + where + IntoT : Into< T >, + Self : Assign< T, IntoT >, + { + Assign::< T, IntoT >::assign( self, component ); + } +} diff --git a/module/core/former_types/src/definition.rs b/module/core/former_types/src/definition.rs new file mode 100644 index 0000000000..38563df0e8 --- /dev/null +++ b/module/core/former_types/src/definition.rs @@ -0,0 +1,100 @@ +//! Module `definition` +//! +//! Provides traits for defining the relationships between entities and their formation mechanisms. +//! These traits are central to the implementation of a flexible and extensible formation system, +//! enabling entities to be constructed using various configurations and complex logic. +//! +//! Key aspects of the module include: +//! - **Entity to Definition Mapping**: Linking entities to their specific formation definitions, +//! which detail how they are to be constructed. +//! - **Entity to Former Mapping**: Associating entities with formers that handle their construction +//! process. +//! - **Entity to Storage Mapping**: Defining the storage structures that maintain the state of an +//! entity during its formation. +//! - **Definition Traits**: Specifying the properties and ending conditions of the formation +//! process to ensure entities are formed according to specified rules and logic. +//! + +/// Maps a type of entity to its corresponding former definition. +/// This trait provides a linkage between the entity and its definition, +/// allowing the formation logic to understand what definition to apply +/// during the formation process. +pub trait EntityToDefinition< Context, Formed, End > +{ + /// The specific [`FormerDefinition`] associated with this entity. + type Definition : FormerDefinition; + /// The specific [`FormerDefinitionTypes`] associated with this entity. + type Types : FormerDefinitionTypes; +} + +/// Provides a mapping between a type of entity and its associated formation type definitions. +pub trait EntityToDefinitionTypes< Context, Formed > +{ + /// Specifies the `FormerDefinitionTypes` that define the storage, formed entity, and context types used during formation. + /// This association is essential for ensuring that the formation process is carried out with the correct type-specific logic. + type Types : FormerDefinitionTypes; +} + +/// Maps a type of entity to its corresponding former. +/// This trait binds an entity type to a specific former, facilitating the use +/// of custom formers in complex formation scenarios. +pub trait EntityToFormer< Definition > +where + Definition : FormerDefinition, +{ + /// The type of the former used for building the entity. + type Former; + + /// A placeholder function to reference the definition without operational logic to calm compiler. + fn __f(_: &Definition) {} +} + +/// Maps a type of entity to its storage type. +/// This trait defines what storage structure is used to hold the interim state +/// of an entity during its formation. +pub trait EntityToStorage +{ + /// The storage type used for forming the entity. + type Storage; +} + +/// Defines the fundamental components involved in the formation of an entity. +/// This trait specifies the types of storage, the formed entity, and the context +/// used during the formation process. +pub trait FormerDefinitionTypes : Sized +{ + /// The type of storage used to maintain the state during formation. + type Storage : Default; + + /// The type of the entity once fully formed. + type Formed; + + /// The contextual information used during formation, if any. + type Context; +} + +/// Expands on `FormerDefinitionTypes` by incorporating an ending mechanism for the formation process. +/// This trait connects the formation types with a specific endpoint, defining +/// how the formation process concludes, including any necessary transformations +/// or validations. +pub trait FormerDefinition : Sized +{ + /// Encapsulates the types related to the formation process including any mutators. + type Types : crate::FormerDefinitionTypes< Storage = Self::Storage, Formed = Self::Formed, Context = Self::Context > + + crate::FormerMutator; + + /// Defines the ending condition or operation of the formation process. + type End: crate::FormingEnd< Self::Types >; + + /// The storage type used during the formation. + type Storage : Default; + + /// The type of the entity being formed. It is + /// generally the structure for which the `Former` trait is derived, representing the fully formed + /// state of the entity. However, it can differ if a custom `FormingEnd` or a different `Formed` type + /// is defined to handle specific forming logic or requirements. + type Formed; + + /// The context used during the formation process. + type Context; +} diff --git a/module/core/former_types/src/forming.rs b/module/core/former_types/src/forming.rs new file mode 100644 index 0000000000..d95bea8666 --- /dev/null +++ b/module/core/former_types/src/forming.rs @@ -0,0 +1,286 @@ +//! Module `forming` +//! +//! This module defines a collection of traits that are crucial for implementing a structured and extensible builder pattern. +//! The traits provided manage the various stages of the forming process, handling the initiation, mutation, and completion +//! of constructing complex data structures. These traits facilitate the creation of flexible and maintainable formation +//! logic that can accommodate complex construction scenarios, including nested and conditional formations. + +/// Provides a mechanism for mutating the context and storage just before the forming process is completed. +/// +/// The `FormerMutator` trait allows for the implementation of custom mutation logic on the internal state +/// of an entity (context and storage) just before the final forming operation is completed. This mutation +/// occurs immediately before the `FormingEnd` callback is invoked. +/// +/// #### Differences from `FormingEnd` +/// +/// Unlike `FormingEnd`, which is responsible for integrating and finalizing the formation process of a field within +/// a parent former, `form_mutation` directly pertains to the entity itself. This method is designed to be independent +/// of whether the forming process is occurring within the context of a superformer or if the structure is a standalone +/// or nested field. This makes `form_mutation` suitable for entity-specific transformations that should not interfere +/// with the hierarchical forming logic managed by `FormingEnd`. +/// +/// #### Use Cases +/// +/// - Applying last-minute changes to the data being formed. +/// - Setting or modifying properties that depend on the final state of the storage or context. +/// - Storage-specific fields which are not present in formed structure. +/// +/// Look example `former_custom_mutator.rs` + +pub trait FormerMutator +where + Self : crate::FormerDefinitionTypes, +{ + /// Mutates the context and storage of the entity just before the formation process completes. + /// + /// This function is invoked immediately prior to the `FormingEnd` callback during the forming process. + /// It provides a hook for implementing custom logic that modifies the internal state (storage and context) + /// of the entity. `form_mutation` is particularly useful for adjustments or updates that need to reflect + /// in the entity just before it is finalized and returned. + /// + #[ inline ] + fn form_mutation( _storage : &mut Self::Storage, _context : &mut ::core::option::Option< Self::Context > ) + { + } +} + +// impl< Definition > crate::FormerMutator +// for Definition +// where +// Definition : crate::FormerDefinitionTypes, +// { +// } + +/// Defines a handler for the end of a subforming process, enabling the return of the original context. +/// +/// This trait is designed to be flexible, allowing for various end-of-forming behaviors in builder patterns. +/// Implementors can define how to transform or pass through the context during the forming process's completion. +/// +/// # Parameters +/// - `Storage`: The type of the collection being processed. +/// - `Context`: The type of the context that might be altered or returned upon completion. + +pub trait FormingEnd< Definition : crate::FormerDefinitionTypes > +{ + /// Called at the end of the subforming process to return the modified or original context. + /// + /// # Parameters + /// - `collection`: The collection being processed. + /// - `context`: Optional context to be transformed or returned. + /// + /// # Returns + /// Returns the transformed or original context based on the implementation. + fn call( &self, storage : Definition::Storage, context : core::option::Option< Definition::Context > ) -> Definition::Formed; +} + +impl< Definition, F > FormingEnd< Definition > for F +where + F : Fn( Definition::Storage, core::option::Option< Definition::Context > ) -> Definition::Formed, + Definition : crate::FormerDefinitionTypes, +{ + #[ inline( always ) ] + fn call( &self, storage : Definition::Storage, context : core::option::Option< Definition::Context > ) -> Definition::Formed + { + self( storage, context ) + } +} + +/// A `FormingEnd` implementation that directly returns the formed collection as the final product of the forming process. +/// +/// This struct is particularly useful when the end result of the forming process is simply the formed collection itself, +/// without needing to integrate or process additional contextual information. It's ideal for scenarios where the final +/// entity is directly derived from the storage state without further transformations or context-dependent adjustments. +#[ derive( Debug, Default ) ] +pub struct ReturnPreformed; + +impl< Definition > FormingEnd< Definition > +for ReturnPreformed +where + Definition::Storage : crate::StoragePreform< Preformed = Definition::Formed >, + Definition : crate::FormerDefinitionTypes, +{ + /// Transforms the storage into its final formed state and returns it, bypassing context processing. + #[ inline( always ) ] + fn call( &self, storage : Definition::Storage, _context : core::option::Option< Definition::Context > ) -> Definition::Formed + { + crate::StoragePreform::preform( storage ) + } +} + +/// A `FormingEnd` implementation that returns the storage itself as the formed entity, disregarding any contextual data. +/// +/// This struct is suited for straightforward forming processes where the storage already represents the final state of the +/// entity, and no additional processing or transformation of the storage is required. It simplifies use cases where the +/// storage does not undergo a transformation into a different type at the end of the forming process. + +#[ derive( Debug, Default ) ] +pub struct ReturnStorage; + +impl< Definition, T > FormingEnd< Definition > +for ReturnStorage +where + Definition : crate::FormerDefinitionTypes< Context = (), Storage = T, Formed = T >, +{ + /// Returns the storage as the final product of the forming process, ignoring any additional context. + #[ inline( always ) ] + fn call( &self, storage : Definition::Storage, _context : core::option::Option< () > ) -> Definition::Formed + { + storage + } +} + +/// A placeholder `FormingEnd` used when no end operation is required or applicable. +/// +/// This implementation is useful in generic or templated scenarios where a `FormingEnd` is required by the interface, +/// but no meaningful end operation is applicable. It serves a role similar to `core::marker::PhantomData` by filling +/// generic parameter slots without contributing operational logic. +#[ derive( Debug, Default ) ] +pub struct NoEnd; + +impl< Definition > FormingEnd< Definition > +for NoEnd +where + Definition : crate::FormerDefinitionTypes, +{ + /// Intentionally causes a panic if called, as its use indicates a configuration error. + #[ inline( always ) ] + fn call( &self, _storage : Definition::Storage, _context : core::option::Option< Definition::Context > ) -> Definition::Formed + { + unreachable!(); + } +} + +#[ allow( unused_extern_crates ) ] +#[ cfg( all( feature = "no_std", feature = "use_alloc" ) ) ] +extern crate alloc; +#[ cfg( all( feature = "no_std", feature = "use_alloc" ) ) ] +use alloc::boxed::Box; + +/// A wrapper around a closure to be used as a `FormingEnd`. +/// +/// This struct allows for dynamic dispatch of a closure that matches the +/// `FormingEnd` trait's `call` method signature. It is useful for cases where +/// a closure needs to be stored or passed around as an object implementing +/// `FormingEnd`. +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +pub struct FormingEndClosure< Definition : crate::FormerDefinitionTypes > +{ + closure : Box< dyn Fn( Definition::Storage, Option< Definition::Context > ) -> Definition::Formed >, + _marker : core::marker::PhantomData< Definition::Storage >, +} + +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +impl< T, Definition > From< T > for FormingEndClosure< Definition > +where + T : Fn( Definition::Storage, Option< Definition::Context > ) -> Definition::Formed + 'static, + Definition : crate::FormerDefinitionTypes, +{ + #[ inline( always ) ] + fn from( closure : T ) -> Self + { + Self + { + closure : Box::new( closure ), + _marker : core::marker::PhantomData + } + } +} + +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +impl< Definition : crate::FormerDefinitionTypes > FormingEndClosure< Definition > +{ + /// Constructs a new `FormingEndClosure` with the provided closure. + /// + /// # Parameters + /// + /// * `closure` - A closure that matches the expected signature for transforming a collection + /// and context into a new context. This closure is stored and called by the + /// `call` method of the `FormingEnd` trait implementation. + /// + /// # Returns + /// + /// Returns an instance of `FormingEndClosure` encapsulating the provided closure. + pub fn new( closure : impl Fn( Definition::Storage, Option< Definition::Context > ) -> Definition::Formed + 'static ) -> Self + { + Self + { + closure : Box::new( closure ), + _marker : core::marker::PhantomData + } + } +} + +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +use core::fmt; +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +impl< Definition : crate::FormerDefinitionTypes > fmt::Debug for FormingEndClosure< Definition > +{ + fn fmt( &self, f : &mut fmt::Formatter< '_ > ) -> fmt::Result + { + f.debug_struct( "FormingEndClosure" ) + .field( "closure", &format_args!{ "- closure -" } ) + .field( "_marker", &self._marker ) + .finish() + } +} + +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +impl< Definition : crate::FormerDefinitionTypes > FormingEnd< Definition > +for FormingEndClosure< Definition > +{ + fn call( &self, storage : Definition::Storage, context : Option< Definition::Context > ) -> Definition::Formed + { + ( self.closure )( storage, context ) + } +} + +/// A trait for initiating a structured subforming process with contextual and intermediary storage linkage. +/// +/// This trait is crucial for the `derive(Former)` macro implementation, where it facilitates the creation +/// of a subformer that integrates seamlessly within a builder pattern chain. It handles intermediary storage +/// to accumulate state or data before finally transforming it into the final `Formed` structure. +/// +/// `FormerBegin` is particularly important in scenarios where complex, hierarchical structures are formed, +/// allowing a former to be reused within another former. This reusability and the ability to maintain both transient +/// state (`Storage`) and contextual information (`Context`) are essential for multi-step construction or transformation +/// processes that culminate in the generation of a final product (`Formed`). +/// +/// During code generation via the `derive(Former)` macro, `FormerBegin` provides the necessary scaffolding to +/// initiate the subforming process. This setup is critical for ensuring that all elements involved in the formation +/// are aligned from the onset, particularly when one former is nested within another, facilitating the creation +/// of complex hierarchical data structures. +/// + +pub trait FormerBegin< Definition : > +where + Definition : crate::FormerDefinition, +{ + + /// Launches the subforming process with an initial storage and context, setting up an `on_end` completion handler. + /// + /// This method initializes the formation process by providing the foundational elements necessary for + /// building the entity. It allows for the configuration of initial states and contextual parameters, which + /// are critical for accurately reflecting the intended final state of the entity. + /// + /// # Parameters + /// + /// * `storage` - An optional initial state for the intermediary storage structure. This parameter allows + /// for the pre-configuration of storage, which can be crucial for entities requiring specific initial states. + /// * `context` - An optional initial setting providing contextual information for the subforming process. + /// This context can influence how the formation process progresses, especially in complex forming scenarios. + /// * `on_end` - A completion handler responsible for transforming the accumulated `Storage` into the final `Formed` structure. + /// This parameter is vital for ensuring that the transition from `Storage` to `Formed` is handled correctly, + /// incorporating any last-minute adjustments or validations necessary for the entity's integrity. + /// + /// # Returns + /// + /// Returns an instance of Former. + /// + fn former_begin + ( + storage : core::option::Option< Definition::Storage >, + context : core::option::Option< Definition::Context >, + on_end : Definition::End, + ) -> Self; + +} diff --git a/module/core/former_types/src/lib.rs b/module/core/former_types/src/lib.rs new file mode 100644 index 0000000000..51cfc78eab --- /dev/null +++ b/module/core/former_types/src/lib.rs @@ -0,0 +1,101 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/former_types/latest/former_types/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Axiomatic things. +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_former" ) ] +mod axiomatic; +/// Definition of former. +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_former" ) ] +mod definition; +/// Forming process. +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_former" ) ] +mod forming; +/// Storage. +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_former" ) ] +mod storage; + +/// Interface for collections. +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +#[ cfg( feature = "derive_former" ) ] +mod collection; + +/// Component-based forming. +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( feature = "types_component_assign" ) ) ] +mod component; + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::collection_tools; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "derive_former" ) ] + pub use super:: + { + axiomatic::*, + definition::*, + forming::*, + storage::*, + }; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + #[ cfg( feature = "derive_former" ) ] + pub use super::collection::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( any( feature = "types_component_assign" ) ) ] + pub use super::component::*; +} diff --git a/module/core/former_types/src/storage.rs b/module/core/former_types/src/storage.rs new file mode 100644 index 0000000000..02e20e78d5 --- /dev/null +++ b/module/core/former_types/src/storage.rs @@ -0,0 +1,49 @@ +//! Module `storage` +//! +//! Provides traits that define the storage mechanics used during the formation of entities in a builder pattern. +//! This module is critical for managing the state of entities as they are constructed, ensuring that all +//! interim data is handled appropriately before finalizing the entity's construction. +//! +//! Key components of the module include: +//! - **Storage Interface**: Defines the essential interface for any storage type used in the formation +//! process. It ensures that each storage type can be initialized to a default state. +//! - **Storage Preformation**: Outlines the method for transitioning storage from a mutable, intermediate +//! state to a finalized, immutable state of the entity. This is pivotal for concluding the formation process +//! with integrity and accuracy. +//! + +/// Defines the storage interface for entities being constructed using a forming pattern. +/// +/// This trait is required for any storage type that temporarily holds data during the construction +/// of an entity. It mandates the implementation of `Default`, ensuring that storage can be initialized +/// to a default state at the start of the forming process. +pub trait Storage : ::core::default::Default +{ + /// The type of the entity as it should appear once preformed. It could, but does not have to be the same type as `Formed`. + type Preformed; + // /// The type of the fully formed entity that results from the forming process. + // type Formed; +} + +/// Provides a mechanism to finalize the forming process by converting storage into its final formed state. +/// +/// This trait is crucial for transitioning the mutable, intermediate storage state into the final, +/// immutable state of an entity. The transformation is typically performed once all configurations +/// and modifications are applied to the storage during the forming process. The type `Preformed` and `Formed` is +/// generally the structure for which the `Former` trait is derived, representing the fully formed +/// state of the entity. However, it can differ if a custom `FormingEnd` or a different `Formed` type +/// is defined to handle specific forming logic or requirements. +/// But even if `Formed` is custom `Preformed` is always that structure. +pub trait StoragePreform : Storage +{ + // /// The type of the entity as it should appear once fully formed. + // type Preformed; + + /// Transforms the storage into the final formed state of the entity. + /// + /// This function is called at the conclusion of the forming process to finalize the entity's state, + /// effectively turning the mutable storage state into the immutable, fully formed entity. This transition + /// reflects the culmination of the forming process where the temporary, modifiable attributes of the + /// storage are solidified into the permanent attributes of the formed entity. + fn preform( self ) -> Self::Preformed; +} diff --git a/module/core/former_types/tests/inc/mod.rs b/module/core/former_types/tests/inc/mod.rs new file mode 100644 index 0000000000..59fea4b027 --- /dev/null +++ b/module/core/former_types/tests/inc/mod.rs @@ -0,0 +1,51 @@ +// #![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use super::*; + +#[ cfg( feature = "derive_former" ) ] +#[ path = "../../../former/tests/inc/former_tests" ] +mod former_tests +{ + #[ allow( unused_imports ) ] + use super::*; + + // = basic + + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod a_basic_manual; + mod a_primitives_manual; + + #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] + mod subform_collection_basic_manual; + + // = parametrization + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + mod parametrized_struct_manual; + mod parametrized_slice_manual; + +} + +#[ cfg( feature = "types_components" ) ] +#[ path = "../../../former/tests/inc/components_tests" ] +mod components_tests +{ + use super::*; + + #[ cfg( feature = "types_component_from" ) ] + mod component_from_manual; + + #[ cfg( feature = "types_component_assign" ) ] + mod component_assign_manual; + + #[ cfg( all( feature = "types_component_assign" ) ) ] + mod components_assign_manual; + + // #[ cfg( all( feature = "derive_from_components" ) ) ] + mod from_components_manual; + + #[ cfg( all( feature = "types_component_assign" ) ) ] + mod composite_manual; + +} diff --git a/module/core/former_types/tests/smoke_test.rs b/module/core/former_types/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/former_types/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/former_types/tests/tests.rs b/module/core/former_types/tests/tests.rs new file mode 100644 index 0000000000..caea26275c --- /dev/null +++ b/module/core/former_types/tests/tests.rs @@ -0,0 +1,12 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use former_types as the_module; +#[ allow( unused_imports ) ] +use former_types as former; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/core/fs_tools/Cargo.toml b/module/core/fs_tools/Cargo.toml new file mode 100644 index 0000000000..c50503253a --- /dev/null +++ b/module/core/fs_tools/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "fs_tools" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/fs_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/fs_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/fs_tools" +description = """ +Tools to manipulate files. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "testing" ] + +[lints] +workspace = true + +[lib] +path = "src/fs/lib.rs" + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/fs_tools/License b/module/core/fs_tools/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/fs_tools/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/fs_tools/Readme.md b/module/core/fs_tools/Readme.md new file mode 100644 index 0000000000..a443261de2 --- /dev/null +++ b/module/core/fs_tools/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: fs_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_fs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_fs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/fs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/fs_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools to manipulate files. + +### To add to your project + +```sh +cargo add fs_tools --dev +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/test_trivial +cargo run +``` + + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/test_trivial +cargo run +``` diff --git a/module/core/fs_tools/src/fs/fs.rs b/module/core/fs_tools/src/fs/fs.rs new file mode 100644 index 0000000000..eb6f6508de --- /dev/null +++ b/module/core/fs_tools/src/fs/fs.rs @@ -0,0 +1,87 @@ +/// Internal namespace. +pub( crate ) mod private +{ + +// #[ derive( Debug ) ] +// pub struct TempDir +// { +// pub base_path : std::path::PathBuf, +// pub prefix_path : std::path::PathBuf, +// pub postfix_path : std::path::PathBuf, +// } +// +// impl Drop for TempDir +// { +// +// fn drop( &mut self ) +// { +// self.clean(); +// } +// +// } +// +// impl TempDir +// { +// pub fn new() -> Self +// { +// Self +// { +// base_path : "".into(), +// prefix_path : "".into(), +// postfix_path : "".into(), +// } +// } +// +// pub fn clean( &self ) -> Result< (), &'static str > +// { +// let result = std::fs::remove_dir_all( &self.test_path ); +// result.or_else( | err | format!( "Cannot remove temporary directory {}.", &self.test_path.display() ) ); +// Ok( () ) +// } +// +// pub fn path_dir_for( &self, file_path : AsRef< &str > ) -> std::path::PathBuf +// { +// let result = std::path::PathBuf::new(); +// result::push( self.base_path ); +// result::push( format!( "{}", self.prefix_path, file_path.as_str(), self.postfix_path ); +// result +// } +// +// } + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Shared with parent namespace of the module +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + // use super::private::TempDir; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/fs_tools/src/fs/lib.rs b/module/core/fs_tools/src/fs/lib.rs new file mode 100644 index 0000000000..1789116600 --- /dev/null +++ b/module/core/fs_tools/src/fs/lib.rs @@ -0,0 +1,57 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/fs_tools/latest/fs_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Collection of primal data types. +pub mod fs; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::fs::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Shared with parent namespace of the module +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::fs::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::fs::prelude::*; +} diff --git a/module/core/fs_tools/tests/inc/basic_test.rs b/module/core/fs_tools/tests/inc/basic_test.rs new file mode 100644 index 0000000000..60c9a81cfb --- /dev/null +++ b/module/core/fs_tools/tests/inc/basic_test.rs @@ -0,0 +1,7 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn basic() +{ +} diff --git a/module/core/fs_tools/tests/inc/mod.rs b/module/core/fs_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..dde9de6f94 --- /dev/null +++ b/module/core/fs_tools/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic_test; diff --git a/module/core/fs_tools/tests/smoke_test.rs b/module/core/fs_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/fs_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/fs_tools/tests/tests.rs b/module/core/fs_tools/tests/tests.rs new file mode 100644 index 0000000000..4fd56e927f --- /dev/null +++ b/module/core/fs_tools/tests/tests.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use fs_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/core/implements/Cargo.toml b/module/core/implements/Cargo.toml new file mode 100644 index 0000000000..77f0b3ac2d --- /dev/null +++ b/module/core/implements/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "implements" +version = "0.8.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/implements" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/implements" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/implements" +description = """ +Macro to answer the question: does it implement a trait? +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/implements/License b/module/core/implements/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/implements/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/implements/Readme.md b/module/core/implements/Readme.md new file mode 100644 index 0000000000..8fe784a119 --- /dev/null +++ b/module/core/implements/Readme.md @@ -0,0 +1,39 @@ + + +# Module :: implements + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml) [![docs.rs](https://img.shields.io/docsrs/implements?color=e3e8f0&logo=docs.rs)](https://docs.rs/implements) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimplements%2Fexamples%2Fimplements_trivial.rs,RUN_POSTFIX=--example%20implements_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Macro to answer the question: does it implement a trait? + +This solution has a limitation: + +- In case entity is a function and trait is `Fn`/`FnMut`/`FnOnce` which current entity does not implement you will get compile-time error instead of `false`. + +### Basic use-case + + + +``` rust +use implements::*; + +dbg!( implements!( 13_i32 => Copy ) ); +// < implements!( 13_i32 => Copy ) : true +dbg!( implements!( Box::new( 13_i32 ) => Copy ) ); +// < implements!( 13_i32 => Copy ) : false +``` + +### To add to your project + +```sh +cargo add implements +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example implements_trivial +``` diff --git a/module/core/implements/examples/implements_trivial.rs b/module/core/implements/examples/implements_trivial.rs new file mode 100644 index 0000000000..6cd0dfabe5 --- /dev/null +++ b/module/core/implements/examples/implements_trivial.rs @@ -0,0 +1,10 @@ +//! qqq : write proper description +pub use implements::*; + +fn main() +{ + dbg!( implements!( 13_i32 => Copy ) ); + // < implements!( 13_i32 => Copy ) : true + dbg!( implements!( Box::new( 13_i32 ) => Copy ) ); + // < implements!( 13_i32 => Copy ) : false +} diff --git a/module/core/implements/src/implements_impl.rs b/module/core/implements/src/implements_impl.rs new file mode 100644 index 0000000000..cf6ea20ac1 --- /dev/null +++ b/module/core/implements/src/implements_impl.rs @@ -0,0 +1,36 @@ +#[ doc( hidden ) ] +#[ macro_export ] +macro_rules! _implements +{ + ( $V : expr => $( $Traits : tt )+ ) => + {{ + use ::core::marker::PhantomData; + + trait False + { + fn get( self : &'_ Self ) -> bool { false } + } + + impl< T > False + for &'_ PhantomData< T > + where T : ?Sized, + {} + + trait True + { + fn get( self : &'_ Self ) -> bool { true } + } + + impl< T > True + for PhantomData< T > + where T : $( $Traits )+ + ?Sized, + {} + + fn does< T : Sized >( _ : &T ) -> PhantomData< T > + { + PhantomData + } + ( &does( &$V ) ).get() + + }}; +} diff --git a/module/core/implements/src/lib.rs b/module/core/implements/src/lib.rs new file mode 100644 index 0000000000..92cdcaa96e --- /dev/null +++ b/module/core/implements/src/lib.rs @@ -0,0 +1,115 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/implements/latest/implements/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Macro to answer the question: does it implement a trait? +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// #[ macro_use ] +#[ cfg( feature = "enabled" ) ] +mod implements_impl; + +/// Internal namespace. +#[ cfg( feature = "enabled" ) ] +pub( crate ) mod private +{ + + /// + /// Macro `implements` to answer the question: does it implement a trait? + /// + /// ### Basic use-case. + /// ``` + /// use implements::*; + /// + /// dbg!( implements!( 13_i32 => Copy ) ); + /// // < implements!( 13_i32 => Copy ) : true + /// dbg!( implements!( Box::new( 13_i32 ) => Copy ) ); + /// // < implements!( 13_i32 => Copy ) : false + /// ``` + + #[ macro_export ] + macro_rules! implements + { + ( $( $arg : tt )+ ) => + { + $crate::_implements!( $( $arg )+ ); + } + } + + /// + /// Macro `instance_of` to answer the question: does it implement a trait? Alias of the macro `implements`. + /// + /// ### Basic use-case. + /// ``` + /// use implements::instance_of; + /// + /// dbg!( instance_of!( 13_i32 => Copy ) ); + /// // < instance_of!( 13_i32 => Copy ) : true + /// dbg!( instance_of!( Box::new( 13_i32 ) => Copy ) ); + /// // < instance_of!( 13_i32 => Copy ) : false + /// ``` + + #[ macro_export ] + macro_rules! instance_of + { + ( $( $arg : tt )+ ) => + { + $crate::_implements!( $( $arg )+ ); + } + } + + pub use implements; + pub use instance_of; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + implements, + instance_of, + }; +} diff --git a/module/core/implements/tests/implements_tests.rs b/module/core/implements/tests/implements_tests.rs new file mode 100644 index 0000000000..d51c4b2b7d --- /dev/null +++ b/module/core/implements/tests/implements_tests.rs @@ -0,0 +1,10 @@ +// #![cfg_attr(docsrs, feature(doc_cfg))] +// #![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] +#![ cfg_attr( feature = "nightly", feature( trace_macros ) ) ] +#![ cfg_attr( feature = "nightly", feature( meta_idents_concat ) ) ] + +use test_tools::exposed::*; + +use implements as the_module; + +mod inc; diff --git a/module/core/implements/tests/inc/implements_test.rs b/module/core/implements/tests/inc/implements_test.rs new file mode 100644 index 0000000000..24f39c32d7 --- /dev/null +++ b/module/core/implements/tests/inc/implements_test.rs @@ -0,0 +1,223 @@ +// use test_tools::exposed::*; +use super::*; + +// + +tests_impls! +{ + + #[ test ] + fn implements_basic() + { + + trait Trait1 {} + fn impl_trait1( _ : &impl Trait1 ) -> bool { true } + + impl< T : Sized > Trait1 for &[ T ] {} + impl< T : Sized, const N : usize > Trait1 for [ T; N ] {} + impl< T : Sized, const N : usize > Trait1 for &[ T; N ] {} + let src : &[ i32 ] = &[ 1, 2, 3 ]; + a_id!( the_module::implements!( src => Trait1 ), true ); + a_id!( impl_trait1( &src ), true ); + a_id!( the_module::implements!( &[ 1, 2, 3 ] => Trait1 ), true ); + a_id!( impl_trait1( &[ 1, 2, 3 ] ), true ); + a_id!( the_module::implements!( [ 1, 2, 3 ] => Trait1 ), true ); + + impl< T : Sized > Trait1 for Vec< T > {} + a_id!( the_module::implements!( vec!( 1, 2, 3 ) => Trait1 ), true ); + + impl Trait1 for f32 {} + a_id!( the_module::implements!( 13_f32 => Trait1 ), true ); + + a_id!( the_module::implements!( true => Copy ), true ); + a_id!( the_module::implements!( true => Clone ), true ); + + let src = true; + a_id!( the_module::implements!( src => Copy ), true ); + a_id!( the_module::implements!( src => Clone ), true ); + + let src = Box::new( true ); + a_id!( the_module::implements!( src => Copy ), false ); + a_id!( the_module::implements!( src => Clone ), true ); + + a_id!( the_module::implements!( Box::new( true ) => std::marker::Copy ), false ); + a_id!( the_module::implements!( Box::new( true ) => std::clone::Clone ), true ); + + } + + // + + #[ test ] + fn instance_of_basic() + { + + let src = Box::new( true ); + a_id!( the_module::instance_of!( src => Copy ), false ); + a_id!( the_module::instance_of!( src => Clone ), true ); + + } + + // + + #[ test ] + fn implements_functions() + { + + let _f = || + { + println!( "hello" ); + }; + + let fn_context = vec!( 1, 2, 3 ); + let _fn = || + { + println!( "hello {:?}", fn_context ); + }; + + let mut fn_mut_context = vec!( 1, 2, 3 ); + let _fn_mut = || + { + fn_mut_context[ 0 ] = 3; + println!( "{:?}", fn_mut_context ); + }; + + let mut fn_once_context = vec!( 1, 2, 3 ); + let _fn_once = || + { + fn_once_context[ 0 ] = 3; + let x = fn_once_context; + println!( "{:?}", x ); + }; + + /* */ + + a_id!( the_module::implements!( _fn => Copy ), true ); + a_id!( the_module::implements!( _fn => Clone ), true ); + a_id!( the_module::implements!( _fn => core::ops::Not ), false ); + let _ = _fn.clone(); + + /* */ + + // a_id!( the_module::implements!( function1 => fn() -> () ), true ); + // a_id!( the_module::implements!( &function1 => Fn() -> () ), true ); + // a_id!( the_module::implements!( &function1 => FnMut() -> () ), true ); + // a_id!( the_module::implements!( &function1 => FnOnce() -> () ), true ); + + // a_id!( the_module::implements!( _fn => fn() -> () ), true ); + a_id!( the_module::implements!( _fn => Fn() -> () ), true ); + a_id!( the_module::implements!( _fn => FnMut() -> () ), true ); + a_id!( the_module::implements!( _fn => FnOnce() -> () ), true ); + + // a_id!( the_module::implements!( _fn_mut => fn() -> () ), false ); + // a_id!( the_module::implements!( _fn_mut => Fn() -> () ), false ); + a_id!( the_module::implements!( _fn_mut => FnMut() -> () ), true ); + a_id!( the_module::implements!( _fn_mut => FnOnce() -> () ), true ); + + // a_id!( the_module::implements!( _fn_once => fn() -> () ), false ); + // a_id!( the_module::implements!( _fn_once => Fn() -> () ), false ); + // a_id!( the_module::implements!( _fn_once => FnMut() -> () ), false ); + a_id!( the_module::implements!( _fn_once => FnOnce() -> () ), true ); + + // fn is_f < R > ( _x : fn() -> R ) -> bool { true } + // fn is_fn < R, F : Fn() -> R > ( _x : &F ) -> bool { true } + // fn is_fn_mut < R, F : FnMut() -> R > ( _x : &F ) -> bool { true } + // fn is_fn_once < R, F : FnOnce() -> R > ( _x : &F ) -> bool { true } + // fn function1() -> bool { true } + + } + + // + + #[ test ] + fn pointer_experiment() + { + + let pointer_size = std::mem::size_of::< &u8 >(); + dbg!( &pointer_size ); + a_id!( 2 * pointer_size, std::mem::size_of::< &[ u8 ] >() ); + a_id!( 2 * pointer_size, std::mem::size_of::< *const [ u8 ] >() ); + a_id!( 2 * pointer_size, std::mem::size_of::< Box< [ u8 ] > >() ); + a_id!( 2 * pointer_size, std::mem::size_of::< std::rc::Rc< [ u8 ] > >() ); + a_id!( 1 * pointer_size, std::mem::size_of::< &[ u8 ; 20 ] >() ); + + } + + // + + #[ test ] + fn fn_experiment() + { + + fn function1() -> bool { true } + + let _f = || + { + println!( "hello" ); + }; + + let fn_context = vec!( 1, 2, 3 ); + let _fn = || + { + println!( "hello {:?}", fn_context ); + }; + + let mut fn_mut_context = vec!( 1, 2, 3 ); + let _fn_mut = || + { + fn_mut_context[ 0 ] = 3; + println!( "{:?}", fn_mut_context ); + }; + + let mut fn_once_context = vec!( 1, 2, 3 ); + let _fn_once = || + { + fn_once_context[ 0 ] = 3; + let x = fn_once_context; + println!( "{:?}", x ); + }; + + a_id!( is_f( function1 ), true ); + a_id!( is_fn( &function1 ), true ); + a_id!( is_fn_mut( &function1 ), true ); + a_id!( is_fn_once( &function1 ), true ); + + a_id!( is_f( _f ), true ); + a_id!( is_fn( &_f ), true ); + a_id!( is_fn_mut( &_f ), true ); + a_id!( is_fn_once( &_f ), true ); + + // a_id!( is_f( _fn ), true ); + a_id!( is_fn( &_fn ), true ); + a_id!( is_fn_mut( &_fn ), true ); + a_id!( is_fn_once( &_fn ), true ); + + // a_id!( is_f( _fn_mut ), true ); + // a_id!( is_fn( &_fn_mut ), true ); + a_id!( is_fn_mut( &_fn_mut ), true ); + a_id!( is_fn_once( &_fn_mut ), true ); + + // a_id!( is_f( _fn_once ), true ); + // a_id!( is_fn( &_fn_once ), true ); + // a_id!( is_fn_mut( &_fn_once ), true ); + a_id!( is_fn_once( &_fn_once ), true ); + + // type Routine< R > = fn() -> R; + fn is_f < R > ( _x : fn() -> R ) -> bool { true } + // fn is_f < R > ( _x : Routine< R > ) -> bool { true } + fn is_fn < R, F : Fn() -> R > ( _x : &F ) -> bool { true } + fn is_fn_mut < R, F : FnMut() -> R > ( _x : &F ) -> bool { true } + fn is_fn_once < R, F : FnOnce() -> R > ( _x : &F ) -> bool { true } + } + +} + +// + +tests_index! +{ + implements_basic, + instance_of_basic, + implements_functions, + pointer_experiment, + fn_experiment, +} diff --git a/module/core/implements/tests/inc/mod.rs b/module/core/implements/tests/inc/mod.rs new file mode 100644 index 0000000000..2567faba36 --- /dev/null +++ b/module/core/implements/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod implements_test; diff --git a/module/core/implements/tests/smoke_test.rs b/module/core/implements/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/implements/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/impls_index/Cargo.toml b/module/core/impls_index/Cargo.toml new file mode 100644 index 0000000000..ea67dfa107 --- /dev/null +++ b/module/core/impls_index/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "impls_index" +version = "0.7.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/impls_index" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/impls_index" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/impls_index" +description = """ +Several of macros to put each function under a named macro to index every function in a class. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [ "impls_index_meta/enabled" ] + +[dependencies] +impls_index_meta = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } +tempdir = { version = "0.3.7" } diff --git a/module/core/impls_index/License b/module/core/impls_index/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/impls_index/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/impls_index/Readme.md b/module/core/impls_index/Readme.md new file mode 100644 index 0000000000..39573c49bd --- /dev/null +++ b/module/core/impls_index/Readme.md @@ -0,0 +1,50 @@ + + +# Module :: impls_index + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml) [![docs.rs](https://img.shields.io/docsrs/impls_index?color=e3e8f0&logo=docs.rs)](https://docs.rs/impls_index) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimpls_index%2Fexamples%2Fimpls_index_trivial.rs,RUN_POSTFIX=--example%20impls_index_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Several of macros to put each function under a named macro to index every function in a class. + +It encourages writing better code, having index of components stripped of details of implementation is very important for comprehension of the code and ability to see the big picture. + +### Basic use-case + + + +```rust +use ::impls_index::*; + +impls1! +{ + fn f1() -> i32 + { + println!( "f1() : 13" ); + 13 + } +}; + +index! +{ + f1, +} + +assert_eq!( f1(), 13 ); +/* print : f1() : 13 */ +``` + +### To add to your project + +```sh +cargo add impls_index_meta +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/impls_index_trivial +cargo run +``` diff --git a/module/core/impls_index/examples/impls_index_trivial.rs b/module/core/impls_index/examples/impls_index_trivial.rs new file mode 100644 index 0000000000..20f1de0781 --- /dev/null +++ b/module/core/impls_index/examples/impls_index_trivial.rs @@ -0,0 +1,22 @@ +//! This example demonstrates the usage of macros `impls1!` and `index!` for defining and indexing functions. +fn main() +{ + use ::impls_index::*; + + impls1! + { + fn f1() -> i32 + { + println!( "f1() : 13" ); + 13 + } + } + + index! + { + f1, + } + assert_eq!( f1(), 13 ); + /* print : f1() : 13 */ +} + diff --git a/module/core/impls_index/src/impls_index/func.rs b/module/core/impls_index/src/impls_index/func.rs new file mode 100644 index 0000000000..cf9bed4e69 --- /dev/null +++ b/module/core/impls_index/src/impls_index/func.rs @@ -0,0 +1,259 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Get name of a function. + /// + + #[ macro_export ] + macro_rules! fn_name + { + + ( + fn $Name : ident + $( $Rest : tt )* + ) + => + { + $Name + }; + + ( + $First : tt + $( $Rest : tt )* + ) + => + { + $crate::fn_name!( $( $Rest )* ); + }; + + } + + /// + /// Macro to rename function. + /// + + #[ macro_export ] + macro_rules! fn_rename + { + + ( + @Prefix { $( $Prefix : tt )* } + @Name { $Name : ident } + @Postfix + { + fn $OldName : ident + $( $Postfix : tt )* + } + ) + => + { + $( $Prefix )* + fn $Name + $( $Postfix )* + }; + + ( + @Prefix { $( $Prefix : tt )* } + @Name { $Name : ident } + @Postfix + { + $First : tt + $( $Postfix : tt )* + } + ) + => + { + $crate::fn_rename! + { + @Prefix { $( $Prefix )* } + @Name { $Name } + @Postfix { $( $Postfix )* } + } + }; + + ( + @Name { $Name : ident } + @Fn { $( $Fn : tt )* } + ) + => + { + $crate::fn_rename! + { + @Prefix {} + @Name { $Name } + @Postfix { $( $Fn )* } + } + }; + + } + + /// + /// Split functions. + /// + + #[ macro_export ] + macro_rules! fns + { + + ( + @Callback { $Callback : path } + @Rest + { + $( #[ $Meta : meta ] )* + $Vis : vis + fn $Name : ident + $( < $( $ParamName : ident $( : $ParamType : path )? ),* $(,)? > )? + ( $( $In : tt )* ) + $( -> $Out : ty )? + $( where $( $WhereParamName : ident $( : $WhereParamType : path )? ),* $(,)? )? + $Block : block + + $( $Rest : tt )* + } + ) + => + { + $Callback! + { + $( #[ $Meta ] )* + $Vis + fn $Name + $( < $( $ParamName $( : $ParamType )? ),* > )? + ( $( $In )* ) + $( -> $Out )? + $( where $( $WhereParamName $( : $WhereParamType )? ),* )? + $Block + } + $crate::fns! + { + @Callback { $Callback } + @Rest + { + $( $Rest )* + } + } + }; + + ( + @Callback { $Callback : path } + @Rest {} + ) + => + { + }; + + ( + @Callback { $Callback : path } + @Rest { $( $Rest : tt )* } + ) + => + { + compile_error!( concat!( "= Cant parse function\n", stringify!( $( $Rest )* ) ) ); + }; + + ( + @Callback { $Callback : path } + @Fns { $( $Fns : tt )* } + ) + => + { + $crate::fns! + { + @Callback { $Callback } + // @Current {} + @Rest { $( $Fns )* } + } + }; + + } + + /// + /// Split functions. + /// + + #[ macro_export ] + macro_rules! fns2 + { + + ( + @Callback { $Callback : path } + @Rest + { + $( $Item : item )* + } + ) + => + { + $( + $Callback! + { + $Item + } + )* + }; + + ( + @Callback { $Callback : path } + @Rest {} + ) + => + { + }; + + ( + @Callback { $Callback : path } + @Rest { $( $Rest : tt )* } + ) + => + { + compile_error!( concat!( "= Cant parse function\n", stringify!( $( $Rest )* ) ) ); + }; + + ( + @Callback { $Callback : path } + @Fns { $( $Fns : tt )* } + ) + => + { + $crate::fns2! + { + @Callback { $Callback } + @Rest { $( $Fns )* } + } + }; + + } + + pub use fn_rename; + pub use fn_name; + pub use fns; + pub use fns2; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::fn_rename; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::fn_name; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::fns; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::fns2; + // pub use super::private::ignore_macro; +} diff --git a/module/core/impls_index/src/impls_index/impls.rs b/module/core/impls_index/src/impls_index/impls.rs new file mode 100644 index 0000000000..2d07e37d9c --- /dev/null +++ b/module/core/impls_index/src/impls_index/impls.rs @@ -0,0 +1,409 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Index of items. + /// + + #[ macro_export ] + macro_rules! index + { + + () => { }; + + ( + $Name : ident as $Alias : ident, + $( , $( $Rest : tt )* )? + ) + => + { + $Name!( as $Alias ); + $crate::index!( $( $( $Rest )* )? ); + }; + + ( + $Name : ident + $( , $( $Rest : tt )* )? + ) + => + { + $Name!(); + $crate::index!( $( $( $Rest )* )? ); + }; + + } + + /// + /// Define implementation putting each function under a macro. + /// + + #[ macro_export ] + macro_rules! impls1 + { + + () => {}; + ( + $( #[ $Meta : meta ] )* + $Vis : vis + fn $Name : ident + $( $Rest : tt )* + ) + => + { + $crate::impls1! + { + @DefineFn + @Meta{ $( #[ $Meta ] )* } + @Vis{ $Vis } + @Name{ $Name } + @Rest + $( #[ $Meta ] )* + $Vis fn $Name + $( $Rest )* + } + }; + + ( + @DefineFn + @Meta{ $( #[ $Meta : meta ] )* } + @Vis{ $Vis : vis } + @Name{ $Name : ident } + @Rest + $Item : item + $( $Rest : tt )* + ) + => + { + #[ deny( unused_macros ) ] + macro_rules! $Name + { + () => + { + $Item + }; + } + + $crate::impls1! + { + $( $Rest )* + } + }; + + } + + // qqq : cover by tests + // qqq : document the idea and module + // qqq : add section idea to each module + + /// + /// Define implementation putting each function under a macro. + /// + /// Use [index!] to generate code for each elment. + /// Unlike elements of [impls_optional!], elements of [impls] are mandatory to be used in [index!]. + /// + + #[ macro_export ] + macro_rules! impls_optional + { + + () => {}; + ( + $( #[ $Meta : meta ] )* + $Vis : vis + fn $Name : ident + $( $Rest : tt )* + ) + => + { + $crate::impls_optional! + { + @DefineFn + @Meta{ $( #[ $Meta ] )* } + @Vis{ $Vis } + @Name{ $Name } + @Rest + $( #[ $Meta ] )* + $Vis fn $Name + $( $Rest )* + } + }; + + ( + @DefineFn + @Meta{ $( #[ $Meta : meta ] )* } + @Vis{ $Vis : vis } + @Name{ $Name : ident } + @Rest + $Item : item + $( $Rest : tt )* + ) + => + { + #[ allow( unused_macros ) ] + macro_rules! $Name + { + () => + { + $Item + }; + } + + $crate::impls_optional! + { + $( $Rest )* + } + }; + + } + /// + /// Define implementation putting each function under a macro and adding attribute `#[ test ]`. + /// + /// Use [index!] to generate code for each elment. + /// Unlike elements of [test_impls_optional!], elements of [test_impls] are mandatory to be used in [index!]. + /// + + #[ macro_export ] + macro_rules! tests_impls + { + + // empty + + // () => { type X = i32; }; + + // empty + + () => {}; + + // entry + + ( + $( #[ $Meta : meta ] )* + $Vis : vis + fn $Name : ident + $( $Rest : tt )* + ) + => + { + $crate::tests_impls! + { + @DefineFn + @Meta{ $( #[ $Meta ] )* } + @Vis{ $Vis } + @Name{ $Name } + @Rest + $( #[ $Meta ] )* + $Vis fn $Name + $( $Rest )* + } + }; + + // parsed + + ( + @DefineFn + @Meta{ $( #[ $Meta : meta ] )* } + @Vis{ $Vis : vis } + @Name{ $Name : ident } + @Rest + $Item : item + $( $Rest : tt )* + ) + => + { + #[ deny( unused_macros ) ] + macro_rules! $Name + { + () => + { + #[ test ] + $Item + }; + } + + $crate::tests_impls! + { + $( $Rest )* + } + }; + + } + + /// + /// Define implementation putting each function under a macro and adding attribute `#[ test ]`. + /// + /// Use [index!] to generate code for each elment. + /// Unlike elements of [test_impls!], elements of [test_impls_optional] are optional to be used in [index!]. + /// + + #[ macro_export ] + macro_rules! tests_impls_optional + { + + // empty + + // () => { type X = i32; }; + + // empty + + () => {}; + + // entry + + ( + $( #[ $Meta : meta ] )* + $Vis : vis + fn $Name : ident + $( $Rest : tt )* + ) + => + { + $crate::tests_impls_optional! + { + @DefineFn + @Meta{ $( #[ $Meta ] )* } + @Vis{ $Vis } + @Name{ $Name } + @Rest + $( #[ $Meta ] )* + $Vis fn $Name + $( $Rest )* + } + }; + + // parsed + + ( + @DefineFn + @Meta{ $( #[ $Meta : meta ] )* } + @Vis{ $Vis : vis } + @Name{ $Name : ident } + @Rest + $Item : item + $( $Rest : tt )* + ) + => + { + #[ allow( unused_macros ) ] + macro_rules! $Name + { + () => + { + #[ test ] + $Item + }; + } + + $crate::tests_impls_optional! + { + $( $Rest )* + } + }; + + } + + /// + /// Define implementation putting each function under a macro. + /// + + #[ macro_export ] + macro_rules! impls2 + { + + ( + $( $Rest : tt )* + ) + => + { + $crate::fns! + { + @Callback { $crate::_impls_callback } + @Fns { $( $Rest )* } + } + }; + + } + + /// + /// Internal impls1 macro. Don't use. + /// + + #[ macro_export ] + macro_rules! _impls_callback + { + + ( + $( #[ $Meta : meta ] )* + $Vis : vis + fn $Name : ident + $( $Rest : tt )* + ) => + { + #[ deny( unused_macros ) ] + macro_rules! $Name + { + ( as $Name2 : ident ) => + { + $crate::fn_rename!{ @Name { $Name2 } @Fn + { + $( #[ $Meta ] )* + $Vis + fn $Name + $( $Rest )* + }} + }; + () => + { + $( #[ $Meta ] )* + $Vis + fn $Name + $( $Rest )* + }; + } + }; + + } + + pub use index; + pub use index as tests_index; + pub use impls1; + pub use impls_optional; /* qqq : write negative test. discuss please */ + pub use tests_impls; + pub use tests_impls_optional; /* qqq : write negative test. discuss please */ + pub use impls2; + pub use _impls_callback; + +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + index, + tests_index, + impls1, + impls_optional, + tests_impls, + tests_impls_optional, + impls2, + _impls_callback, + }; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::impls_index_meta::impls3; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use impls3 as impls; +} diff --git a/module/core/impls_index/src/impls_index/mod.rs b/module/core/impls_index/src/impls_index/mod.rs new file mode 100644 index 0000000000..3fa0ed3c93 --- /dev/null +++ b/module/core/impls_index/src/impls_index/mod.rs @@ -0,0 +1,71 @@ +/// Internal namespace. +pub( crate ) mod private +{ + +} + +/// Several macro on functions. +pub mod func; +/// Several macro to encourage to write indexed code to improve readibility. +pub mod impls; + +/* zzz : use name protected */ +/* zzz : use for implementing of macro mod_interface */ + +// /// Namespace with dependencies. +// #[ cfg( feature = "enabled" ) ] +// pub mod dependency +// { +// // #[ cfg( any( feature = "meta", feature = "impls_index_meta" ) ) ] +// pub use ::impls_index_meta; +// } + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Shared with parent namespace of the module +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + // pub use super::dependency; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::impls::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::func::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::impls::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::func::prelude::*; + // #[ cfg( any( feature = "meta", feature = "impls_index_meta" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::impls_index_meta::*; +} diff --git a/module/core/impls_index/src/lib.rs b/module/core/impls_index/src/lib.rs new file mode 100644 index 0000000000..f70d8cc177 --- /dev/null +++ b/module/core/impls_index/src/lib.rs @@ -0,0 +1,64 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/impls_index/latest/impls_index/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Collection of general purpose meta tools. +#[ cfg( feature = "enabled" ) ] +pub mod impls_index; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::impls_index_meta; +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::impls_index::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::impls_index::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::impls_index::prelude::*; +} diff --git a/module/core/impls_index/tests/experiment.rs b/module/core/impls_index/tests/experiment.rs new file mode 100644 index 0000000000..85e51cf468 --- /dev/null +++ b/module/core/impls_index/tests/experiment.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use impls_index as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ path = "inc/impls3_test.rs" ] +mod inc; diff --git a/module/core/impls_index/tests/inc/func_test.rs b/module/core/impls_index/tests/inc/func_test.rs new file mode 100644 index 0000000000..7408b5b3ff --- /dev/null +++ b/module/core/impls_index/tests/inc/func_test.rs @@ -0,0 +1,362 @@ +#![ deny( unused_imports ) ] + +use super::*; +#[ allow ( unused_imports ) ] +use the_module::prelude::*; +// use test_tools::exposed::*; + +// + +#[ test ] +fn fn_name() +{ + let f1 = 13; + + let f2 = fn_name! + { + fn f1() + { + } + }; + + dbg!( f2 ); + a_id!( f2, 13 ); +} + +// + +#[ test ] +fn fn_rename() +{ + + fn_rename! + { + @Name { f2 } + @Fn + { + fn f1() -> i32 + { + 13 + } + } + }; + + a_id!( f2(), 13 ); + +} + +// + +#[ test ] +fn fns() +{ + +// // test.case( "several, trivial syntax" ); +// { +// let mut counter = 0; +// +// macro_rules! count +// { +// ( $( $Tts : tt )* ) => +// { +// dbg!( stringify!( $( $Tts )* ) ); +// counter += 1; +// $( $Tts )* +// }; +// } +// +// fns2! +// { +// @Callback { count } +// @Fns +// { +// fn f1() +// { +// println!( "f1" ); +// } +// fn f2() +// { +// println!( "f2" ); +// } +// } +// }; +// +// a_id!( counter, 2 ); +// f1(); +// f2(); +// } + + // test.case( "several, trivial syntax" ); + { + let mut counter = 0; + + macro_rules! count + { + ( $( $Tts : tt )* ) => + { + dbg!( stringify!( $( $Tts )* ) ); + counter += 1; + $( $Tts )* + }; + } + + fns! + { + @Callback { count } + @Fns + { + fn f1() + { + println!( "f1" ); + } + fn f2() + { + println!( "f2" ); + } + } + }; + + a_id!( counter, 2 ); + f1(); + f2(); + } + + // test.case( "several, complex syntax" ); + { + let mut counter = 0; + + macro_rules! count + { + ( $( $Tts : tt )* ) => + { + dbg!( stringify!( $( $Tts )* ) ); + counter += 1; + $( $Tts )* + }; + } + + fns! + { + @Callback { count } + @Fns + { + fn f1( src : i32 ) -> i32 + { + println!( "f1" ); + src + } + fn f2( src : i32 ) -> i32 + { + println!( "f2" ); + src + } + } + }; + + a_id!( counter, 2 ); + f1( 1 ); + f2( 2 ); + } + + // test.case( "several, parametrized syntax" ); + { + let mut counter = 0; + + macro_rules! count + { + ( $( $Tts : tt )* ) => + { + dbg!( stringify!( $( $Tts )* ) ); + counter += 1; + $( $Tts )* + }; + } + + fns! + { + @Callback { count } + @Fns + { + fn f1< T : Copy >( src : T ) -> T + { + println!( "f1" ); + src + } + } + }; + + a_id!( counter, 1 ); + f1( 1 ); + } + + + // test.case( "several, visibility" ); + { + let mut counter = 0; + + macro_rules! count + { + ( $( $Tts : tt )* ) => + { + dbg!( stringify!( $( $Tts )* ) ); + counter += 1; + $( $Tts )* + }; + } + + fns! + { + @Callback { count } + @Fns + { + pub fn f1( src : i32 ) -> i32 + { + println!( "f1" ); + src + } + } + }; + + a_id!( counter, 1 ); + f1( 1 ); + } + + // test.case( "several, where with comma" ); + { + let mut counter = 0; + + macro_rules! count + { + ( $( $Tts : tt )* ) => + { + dbg!( stringify!( $( $Tts )* ) ); + counter += 1; + $( $Tts )* + }; + } + + fns! + { + @Callback { count } + @Fns + { + fn f1< T, >( src : T ) -> T + where + T : Copy, + { + println!( "f1" ); + src + } + } + }; + + a_id!( counter, 1 ); + f1( 1 ); + } + + // test.case( "several, where without comma" ); + { + let mut counter = 0; + + macro_rules! count + { + ( $( $Tts : tt )* ) => + { + dbg!( stringify!( $( $Tts )* ) ); + counter += 1; + $( $Tts )* + }; + } + + fns! + { + @Callback { count } + @Fns + { + fn f1< T >( src : T ) -> T + where + T : Copy + { + println!( "f1" ); + src + } + } + }; + + a_id!( counter, 1 ); + f1( 1 ); + } + +// // test.case( "several, complex parameter" ); +// { +// let mut counter = 0; +// +// macro_rules! count +// { +// ( $( $Tts : tt )* ) => +// { +// dbg!( stringify!( $( $Tts )* ) ); +// counter += 1; +// }; +// } +// +// fns! +// { +// @Callback { count } +// @Fns +// { +// fn f1< T >( src : T ) -> T +// where +// T : < Self as From< X > >::Type +// { +// println!( "f1" ); +// src +// } +// } +// }; +// +// a_id!( counter, 1 ); +// } + + // test.case( "several, complex syntax" ); + { + let mut counter = 0; + + macro_rules! count + { + ( $( $Tts : tt )* ) => + { + dbg!( stringify!( $( $Tts )* ) ); + counter += 1; + $( $Tts )* + }; + } + + // trace_macros!( true ); + fns! + { + @Callback { count } + @Fns + { + fn f1< T >( src : T ) -> T + where + T : Copy, + { + println!( "f1" ); + src + } + fn f2< T : Copy >( src : T ) -> T + { + println!( "f2" ); + src + } + } + }; + // trace_macros!( false ); + + a_id!( counter, 2 ); + f1( 1 ); + f2( 2 ); + } + +} diff --git a/module/core/impls_index/tests/inc/impls1_test.rs b/module/core/impls_index/tests/inc/impls1_test.rs new file mode 100644 index 0000000000..c8df2ca220 --- /dev/null +++ b/module/core/impls_index/tests/inc/impls1_test.rs @@ -0,0 +1,120 @@ +// use test_tools::exposed::*; +use super::*; +use the_module::prelude::impls1; + +// + +tests_impls! +{ + + fn impls_basic() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() + { + println!( "f1" ); + } + pub fn f2() + { + println!( "f2" ); + } + }; + + // trace_macros!( true ); + f1!(); + f2!(); + // trace_macros!( false ); + + f1(); + f2(); + + } + + // // test.case( "impls1 as" ); + // { + // + // impls1! + // { + // fn f1() + // { + // println!( "f1" ); + // } + // pub fn f2() + // { + // println!( "f2" ); + // } + // }; + // + // // trace_macros!( true ); + // f1!( as f1b ); + // f2!( as f2b ); + // // trace_macros!( false ); + // + // f1b(); + // f2b(); + // + // } + // + // // test.case( "impls1 as index" ); + // { + // + // impls1! + // { + // fn f1() + // { + // println!( "f1" ); + // } + // pub fn f2() + // { + // println!( "f2" ); + // } + // }; + // + // // trace_macros!( true ); + // index! + // { + // f1, + // f2 as f2b, + // } + // // trace_macros!( false ); + // + // f1(); + // f2b(); + // + // } + + // test.case( "macro" ); + { + + impls1! + { + fn f1() + { + macro_rules! macro1 + { + ( $( $Arg : tt )* ) => { }; + } + macro1!(); + } + } + + // trace_macros!( true ); + f1!(); + // trace_macros!( false ); + + } + + } +} + +// + +tests_index! +{ + impls_basic, +} diff --git a/module/core/impls_index/tests/inc/impls2_test.rs b/module/core/impls_index/tests/inc/impls2_test.rs new file mode 100644 index 0000000000..bb5d16eaab --- /dev/null +++ b/module/core/impls_index/tests/inc/impls2_test.rs @@ -0,0 +1,121 @@ +// use test_tools::exposed::*; +use super::*; +use the_module::prelude::impls2; + +// + +tests_impls! +{ + + fn impls_basic() + { + + // test.case( "impls2 basic" ); + { + + impls2! + { + fn f1() + { + println!( "f1" ); + } + pub fn f2() + { + println!( "f2" ); + } + }; + + // trace_macros!( true ); + f1!(); + f2!(); + // trace_macros!( false ); + + f1(); + f2(); + + } + + // test.case( "impls2 as" ); + { + + impls2! + { + fn f1() + { + println!( "f1" ); + } + pub fn f2() + { + println!( "f2" ); + } + }; + + // trace_macros!( true ); + f1!( as f1b ); + f2!( as f2b ); + // trace_macros!( false ); + + f1b(); + f2b(); + + } + + // test.case( "impls2 as index" ); + { + + impls2! + { + fn f1() + { + println!( "f1" ); + } + pub fn f2() + { + println!( "f2" ); + } + }; + + // trace_macros!( true ); + index! + { + f1, + f2 as f2b, + } + // trace_macros!( false ); + + f1(); + f2b(); + + } + + // test.case( "macro" ); + { + + impls2! + { + fn f1() + { + macro_rules! macro1 + { + ( $( $Arg : tt )* ) => { }; + } + macro1!(); + } + } + + // trace_macros!( true ); + f1!(); + // trace_macros!( false ); + + } + + } +} + +// + +tests_index! +{ + // fns, + impls_basic, +} diff --git a/module/core/impls_index/tests/inc/impls3_test.rs b/module/core/impls_index/tests/inc/impls3_test.rs new file mode 100644 index 0000000000..860acd126a --- /dev/null +++ b/module/core/impls_index/tests/inc/impls3_test.rs @@ -0,0 +1,119 @@ +use super::*; +use the_module::prelude::impls3; + +// + +#[ test ] +fn basic() +{ + + impls! + { + fn f1() + { + println!( "f1" ); + // panic!( "x" ); + } + pub fn f2() + { + // panic!( "x" ); + println!( "f2" ); + } + }; + + // trace_macros!( true ); + f1!(); + f2!(); + // trace_macros!( false ); + + f1(); + f2(); + +} + +// + +#[ test ] +fn impl_index() +{ + + impls3! + { + fn f1() + { + println!( "f1" ); + } + pub fn f2() + { + println!( "f2" ); + } + }; + + // trace_macros!( true ); + index! + { + f1, + f2, + } + // trace_macros!( false ); + + f1(); + f2(); + +} + +#[ test ] +fn impl_as() +{ + + impls3! + { + fn f1() + { + println!( "f1" ); + // panic!( "x" ); + } + pub fn f2() + { + println!( "f2" ); + } + }; + + // trace_macros!( true ); + f1!( as f1b ); + f2!( as f2b ); + // trace_macros!( false ); + + f1b(); + f2b(); +} + +#[ test ] +fn impl_index_as() +{ + + impls3! + { + fn f1() + { + println!( "f1" ); + // panic!( "x" ); + } + pub fn f2() + { + println!( "f2" ); + } + }; + + // trace_macros!( true ); + index! + { + f1, + f2 as f2b, + } + // trace_macros!( false ); + + f1(); + f2b(); + +} diff --git a/module/core/impls_index/tests/inc/impls_basic_test.rs b/module/core/impls_index/tests/inc/impls_basic_test.rs new file mode 100644 index 0000000000..c488aec5a2 --- /dev/null +++ b/module/core/impls_index/tests/inc/impls_basic_test.rs @@ -0,0 +1,51 @@ +use super::*; +#[ allow( unused_imports ) ] +use the_module::prelude::*; + +// trace_macros!( true ); +tests_impls! +{ + + fn pass1_test() + { + a_id!( true, true ); + } + + // + + fn fail1_test() + { + // a_id!( true, false ); + } + + // + + #[cfg(any())] + fn never_test() + { + println!( "never_test" ); + } + + // + + #[cfg(all())] + fn always_test() + { + println!( "always_test" ); + } +} +// trace_macros!( false ); + +// trace_macros!( true ); +// pass1_test!(); +// trace_macros!( false ); + +// trace_macros!( true ); +tests_index! +{ + pass1_test, + fail1_test, + never_test, + always_test, +} +// trace_macros!( false ); diff --git a/module/core/impls_index/tests/inc/index_test.rs b/module/core/impls_index/tests/inc/index_test.rs new file mode 100644 index 0000000000..de1ed0d9be --- /dev/null +++ b/module/core/impls_index/tests/inc/index_test.rs @@ -0,0 +1,155 @@ +// use test_tools::exposed::*; +use super::*; +use the_module::prelude::impls1; + +// + +tests_impls! +{ + + + fn empty_with_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1!(); + index!(); + + } + + } + + + fn empty_without_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + }; + + index! + { + } + + } + + } + + + fn with_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + index! + { + f1, + } + + a_id!( f1(), 13 ); + } + + } + + + fn without_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + index! + { + f1 + } + + a_id!( f1(), 13 ); + } + + } + + + fn parentheses_with_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + index!( f1, ); + + a_id!( f1(), 13 ); + } + + } + + + fn parentheses_without_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + index!( f1 ); + + a_id!( f1(), 13 ); + } + + } + +} + +// + +tests_index! +{ + + empty_with_comma, + empty_without_comma, + with_comma, + without_comma, + parentheses_with_comma, + parentheses_without_comma, + +} diff --git a/module/core/impls_index/tests/inc/mod.rs b/module/core/impls_index/tests/inc/mod.rs new file mode 100644 index 0000000000..d7b9687e2f --- /dev/null +++ b/module/core/impls_index/tests/inc/mod.rs @@ -0,0 +1,36 @@ + +use super::*; + +mod func_test; +mod impls_basic_test; +mod impls1_test; +mod impls2_test; +mod impls3_test; + +mod index_test; +mod tests_index_test; + +only_for_terminal_module! +{ + + // stable have different information about error + // that's why these tests are active only for nightly + #[ test_tools::nightly ] + #[ cfg( feature = "enabled" ) ] + #[ test ] + fn former_trybuild() + { + + println!( "current_dir : {:?}", std::env::current_dir().unwrap() ); + let t = test_tools::compiletime::TestCases::new(); + // xxx : enable and use process::run + + // t.compile_fail( "tests/inc/compiletime/former_bad_attr.rs" ); + // t.pass( "tests/inc/compiletime/former_hashmap_without_parameter.rs" ); + // t.pass( "tests/inc/compiletime/former_vector_without_parameter.rs" ); + + //t.compile_fail( "tests/inc/compiletime/components_component_from_debug.rs" ); + + } + +} diff --git a/module/core/impls_index/tests/inc/tests_index_test.rs b/module/core/impls_index/tests/inc/tests_index_test.rs new file mode 100644 index 0000000000..9c684d5a68 --- /dev/null +++ b/module/core/impls_index/tests/inc/tests_index_test.rs @@ -0,0 +1,155 @@ +// use test_tools::exposed::*; +use super::*; +use the_module::prelude::impls1; + +// + +tests_impls! +{ + + + fn empty_with_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1!(); + tests_index!(); + + } + + } + + + fn empty_without_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + }; + + tests_index! + { + } + + } + + } + + + fn with_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + tests_index! + { + f1, + } + + a_id!( f1(), 13 ); + } + + } + + + fn without_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + tests_index! + { + f1 + } + + a_id!( f1(), 13 ); + } + + } + + + fn parentheses_with_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + tests_index!( f1, ); + + a_id!( f1(), 13 ); + } + + } + + + fn parentheses_without_comma() + { + + // test.case( "impls1 basic" ); + { + + impls1! + { + fn f1() -> i32 + { + println!( "f1" ); + 13 + } + }; + + tests_index!( f1 ); + + a_id!( f1(), 13 ); + } + + } + +} + +// + +tests_index! +{ + + empty_with_comma, + empty_without_comma, + with_comma, + without_comma, + parentheses_with_comma, + parentheses_without_comma, + +} diff --git a/module/core/impls_index/tests/smoke_test.rs b/module/core/impls_index/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/impls_index/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/impls_index/tests/tests.rs b/module/core/impls_index/tests/tests.rs new file mode 100644 index 0000000000..7d4038e715 --- /dev/null +++ b/module/core/impls_index/tests/tests.rs @@ -0,0 +1,9 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use impls_index as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/core/impls_index_meta/Cargo.toml b/module/core/impls_index_meta/Cargo.toml new file mode 100644 index 0000000000..d3b1c21a9f --- /dev/null +++ b/module/core/impls_index_meta/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "impls_index_meta" +version = "0.7.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/impls_index_meta" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/impls_index_meta" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/impls_index_meta" +description = """ +Several of macros to put each function under a named macro to index every function in a class. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [ "macro_tools/enabled" ] + +[lib] +proc-macro = true + +[dependencies] +macro_tools = { workspace = true } + +[dev-dependencies] diff --git a/module/core/impls_index_meta/License b/module/core/impls_index_meta/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/impls_index_meta/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/impls_index_meta/Readme.md b/module/core/impls_index_meta/Readme.md new file mode 100644 index 0000000000..30f90c0634 --- /dev/null +++ b/module/core/impls_index_meta/Readme.md @@ -0,0 +1,18 @@ + + +# Module :: impls_index_meta + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_meta_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_meta_push.yml) [![docs.rs](https://img.shields.io/docsrs/impls_index_meta?color=e3e8f0&logo=docs.rs)](https://docs.rs/impls_index_meta) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Several of macros to put each function under a named macro to index every function in a class. + +It encourages writing better code, having index of components stripped of details of implementation is very important for comprehension of the code and ability to see the big picture. + +Not intended to be used without runtime. This module and runtime is aggregate in module::impls_index is [here](https://github.com/Wandalen/wTools/tree/master/module/core/impls_index). + +### To add to your project + +```sh +cargo add impls_index +``` diff --git a/module/core/impls_index_meta/src/impls.rs b/module/core/impls_index_meta/src/impls.rs new file mode 100644 index 0000000000..1ae6c3ee9b --- /dev/null +++ b/module/core/impls_index_meta/src/impls.rs @@ -0,0 +1,130 @@ + +use macro_tools::{ Result, Many, AsMuchAsPossibleNoDelimiter }; +use macro_tools::prelude::*; + +/// +/// Module-specific item. +/// + +#[ derive( Debug ) ] +pub struct Item2 +{ + pub optional : Option< Token![ ? ] >, + pub func : syn::Item, +} + +impl AsMuchAsPossibleNoDelimiter for Item2 {} + +// + +impl syn::parse::Parse for Item2 +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self > + { + let optional = input.parse()?; + let func = input.parse()?; + Ok( Self{ optional, func } ) + } +} + +// + +impl quote::ToTokens for Item2 +{ + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.optional.to_tokens( tokens ); + self.func.to_tokens( tokens ); + } +} + +// + +#[ derive( Debug ) ] +pub struct Items2 +( + pub Many< Item2 >, +); + +// + +impl syn::parse::Parse for Items2 +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self > + { + let many = input.parse()?; + Ok( Self( many ) ) + } +} + +// + +impl quote::ToTokens for Items2 +{ + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.0.iter().for_each( | e | + { + let func = &e.func; + + let declare_aliased = qt! + { + ( as $Name2 : ident ) => + { + ::impls_index::fn_rename! + { + @Name { $Name2 } + @Fn + { + #func + } + } + }; + }; + + let mut mandatory = qt! + { + #[ allow( unused_macros ) ] + }; + + if e.optional.is_none() + { + mandatory = qt! + { + #[ deny( unused_macros ) ] + } + } + + let name_str = func.name(); + let name_ident = syn::Ident::new( &name_str[ .. ], proc_macro2::Span::call_site() ); + let result = qt! + { + #mandatory + macro_rules! #name_ident + { + #declare_aliased + () => + { + #func + }; + } + }; + // tree_print!( result ); + result.to_tokens( tokens ) + }); + } +} + +// + +pub fn impls( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let items2 = syn::parse::< Items2 >( input )?; + + let result = qt! + { + #items2 + }; + + Ok( result ) +} diff --git a/module/core/impls_index_meta/src/lib.rs b/module/core/impls_index_meta/src/lib.rs new file mode 100644 index 0000000000..8b1f3394da --- /dev/null +++ b/module/core/impls_index_meta/src/lib.rs @@ -0,0 +1,25 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/impls_index_meta/latest/impls_index_meta/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +mod impls; + +/// +/// Macros to put each function under a named macro to index every function in a class. +/// + +// xxx : make it default impls implementation +#[ cfg( feature = "enabled" ) ] +#[ proc_macro ] +pub fn impls3( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = impls::impls( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} diff --git a/module/core/include_md/Cargo.toml b/module/core/include_md/Cargo.toml new file mode 100644 index 0000000000..410d16c21b --- /dev/null +++ b/module/core/include_md/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "include_md" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/include_md" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/include_md" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/move/include_md" +description = """ +Include markdown file or its section. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/_blank", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "include_md" +path = "src/_blank/standard_lib.rs" + +# [[test]] +# name = "include_md_test" +# path = "tests/include_md/include_md_tests.rs" + +# [[test]] +# name = "include_md_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +# [[example]] +# name = "include_md_trivial" +# path = "sample/move/include_md_trivial/src/main.rs" + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/include_md/License b/module/core/include_md/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/include_md/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/include_md/Readme.md b/module/core/include_md/Readme.md new file mode 100644 index 0000000000..eebef4e63f --- /dev/null +++ b/module/core/include_md/Readme.md @@ -0,0 +1,32 @@ + + +# Module :: include_md + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_include_md_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_include_md_push.yml) [![docs.rs](https://img.shields.io/docsrs/include_md?color=e3e8f0&logo=docs.rs)](https://docs.rs/include_md) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Include markdown file or its section. + +### Basic use-case + + + +```rust +use include_md::*; + +``` + +### To add to your project + +```shell +cargo add include_md +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd sample/move/include_md_trivial +cargo run +``` diff --git a/module/core/include_md/src/_blank/empty_lib.rs b/module/core/include_md/src/_blank/empty_lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/core/include_md/src/_blank/standard_lib.rs b/module/core/include_md/src/_blank/standard_lib.rs new file mode 100644 index 0000000000..d335841385 --- /dev/null +++ b/module/core/include_md/src/_blank/standard_lib.rs @@ -0,0 +1,53 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/_blank/latest/_blank/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! ___. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Parented namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/include_md/tests/smoke_test.rs b/module/core/include_md/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/include_md/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/inspect_type/Cargo.toml b/module/core/inspect_type/Cargo.toml new file mode 100644 index 0000000000..8c55f439ac --- /dev/null +++ b/module/core/inspect_type/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "inspect_type" +version = "0.10.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/inspect_type" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/inspect_type" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/inspect_type" +description = """ +Diagnostic-purpose tools to inspect type of a variable and its size. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "diagnostic-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] +# nightly = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } + +[build-dependencies] +rustc_version = "0.4" diff --git a/module/core/inspect_type/License b/module/core/inspect_type/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/inspect_type/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/inspect_type/Readme.md b/module/core/inspect_type/Readme.md new file mode 100644 index 0000000000..e45df40b25 --- /dev/null +++ b/module/core/inspect_type/Readme.md @@ -0,0 +1,40 @@ + + +# Module :: inspect_type + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml) [![docs.rs](https://img.shields.io/docsrs/inspect_type?color=e3e8f0&logo=docs.rs)](https://docs.rs/inspect_type) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finspect_type%2Fexamples%2Finspect_type_trivial.rs,RUN_POSTFIX=--example%20inspect_type_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Diagnostic-purpose tools to inspect type of a variable and its size. + +### Basic use-case + + + +```rust +// #![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] +pub use inspect_type::*; + +#[ cfg( feature = "nightly" ) ] +{ + inspect_type_of!( &[ 1, 2, 3 ][ .. ] ); + // < sizeof( &[1, 2, 3][..] : &[i32] ) = 16 + inspect_type_of!( &[ 1, 2, 3 ] ); + // < sizeof( &[1, 2, 3] : &[i32; 3] ) = 8 +} + +``` + +### To add to your project + +```sh +cargo add inspect_type +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example inspect_type_trivial +``` diff --git a/module/core/inspect_type/build.rs b/module/core/inspect_type/build.rs new file mode 100644 index 0000000000..43860208a5 --- /dev/null +++ b/module/core/inspect_type/build.rs @@ -0,0 +1,31 @@ +//! To have information about channel of Rust compiler. + +use rustc_version::{ version, version_meta, Channel }; + +fn main() +{ + // Assert we haven't travelled back in time + assert!( version().unwrap().major >= 1 ); + + // Set cfg flags depending on release channel + match version_meta().unwrap().channel + { + Channel::Stable => + { + println!("cargo:rustc-cfg=RUSTC_IS_STABLE"); + } + Channel::Beta => + { + println!("cargo:rustc-cfg=RUSTC_IS_BETA"); + } + Channel::Nightly => + { + println!("cargo:rustc-cfg=RUSTC_IS_NIGHTLY"); + } + Channel::Dev => + { + println!("cargo:rustc-cfg=RUSTC_IS_DEV"); + } + } + +} \ No newline at end of file diff --git a/module/core/inspect_type/examples/inspect_type_trivial.rs b/module/core/inspect_type/examples/inspect_type_trivial.rs new file mode 100644 index 0000000000..9f616a8204 --- /dev/null +++ b/module/core/inspect_type/examples/inspect_type_trivial.rs @@ -0,0 +1,42 @@ +//! qqq : write proper description +#![ cfg_attr( feature = "type_name_of_val", feature( type_name_of_val ) ) ] + +// // #![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] +// #![ rustversion::attr( nightly, feature( type_name_of_val ) ) ] + +// +// To run this sample, please make sure you are on nightly rustc and switched on feature "nightly" +// +// To switch to nightly rustc run: +// ``` +// rustup default nightly && rustup update +// ``` +// +// To run the sample with switched on feature "nightly" run: +// ``` +// cargo run --features nightly +// ``` +// + +pub use inspect_type::*; + +// #[ rustversion::nightly ] +fn main() +{ + // #[ cfg( feature = "nightly" ) ] + // { + // inspect_type_of!( &[ 1, 2, 3 ][ .. ] ); + // // < sizeof( &[1, 2, 3][..] : &[i32] ) = 16 + // inspect_type_of!( &[ 1, 2, 3 ] ); + // // < sizeof( &[1, 2, 3] : &[i32; 3] ) = 8 + // } + // #[ cfg( not( feature = "nightly" ) ) ] + // { + // println!( "\nTo run sample correctly, run sample on nightly rustup channel. To change channel run :" ); + // println!( "rustup default nightly\n" ); + // println!( "The command from the root of the sample :" ); + // println!( "cargo run --features nightly\n" ); + // println!( "The command from the root of module :" ); + // println!( "cargo run --example inspect_type_trivial --features nightly" ); + // } +} diff --git a/module/core/inspect_type/src/lib.rs b/module/core/inspect_type/src/lib.rs new file mode 100644 index 0000000000..046f3332f9 --- /dev/null +++ b/module/core/inspect_type/src/lib.rs @@ -0,0 +1,118 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/inspect_type/latest/inspect_type/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ cfg( rustversion::nightly ) ] +// #![ feature( type_name_of_val ) ] +// #![ cfg_attr( feature = "type_name_of_val", feature( type_name_of_val ) ) ] + +// #![ cfg_attr( RUSTC_IS_NIGHTLY, feature( type_name_of_val ) ) ] + +//! +//! Diagnostic-purpose tools to inspect type of a variable and its size. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + + +// #[ cfg( not( feature = "no_std" ) ) ] +// /// Little experiment. +// #[ derive( Debug ) ] +// pub struct Experimental( i32 ); + +// #[ cfg( feature = "nightly" ) ] +// #[ cfg( feature = "type_name_of_val" ) ] +// #[ rustversion::nightly ] +#[ cfg( RUSTC_IS_NIGHTLY ) ] +mod nightly +{ + + /// + /// Macro to inspect type of a variable and its size exporting it as a string. + /// + + #[ macro_export ] + // #[ cfg_attr( feature = "nightly1", macro_export ) ] + macro_rules! inspect_to_str_type_of + { + ( $src : expr ) => + {{ + let mut result = String::new(); + let stringified = stringify!( $src ); + + let size = &std::mem::size_of_val( &$src ).to_string()[ .. ]; + let type_name = std::any::type_name_of_val( &$src ); + result.push_str( &format!( "sizeof( {} : {} ) = {}", stringified, type_name, size )[ .. ] ); + + result + }}; + ( $( $src : expr ),+ $(,)? ) => + { + ( $( $crate::dbg!( $src ) ),+ ) + }; + } + + /// + /// Macro to inspect type of a variable and its size printing into stdout and exporting it as a string. + /// + + #[ macro_export ] + // #[ cfg_attr( feature = "nightly1", macro_export ) ] + macro_rules! inspect_type_of + { + ( $src : expr ) => + {{ + let result = $crate::inspect_to_str_type_of!( $src ); + println!( "{}", result ); + result + }} + } + + pub use inspect_to_str_type_of; + pub use inspect_type_of; +} + + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + // #[ cfg( feature = "nightly" ) ] + // #[ rustversion::nightly ] + // #[ cfg( feature = "type_name_of_val" ) ] + #[ cfg( RUSTC_IS_NIGHTLY ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::nightly::*; +} diff --git a/module/core/inspect_type/tests/inc/inspect_type_test.rs b/module/core/inspect_type/tests/inc/inspect_type_test.rs new file mode 100644 index 0000000000..a066e82bf9 --- /dev/null +++ b/module/core/inspect_type/tests/inc/inspect_type_test.rs @@ -0,0 +1,51 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +// #[ test_tools::nightly ] +// #[ cfg( feature = "nightly" ) ] +#[ cfg( RUSTC_IS_NIGHTLY ) ] +tests_impls! +{ + + fn inspect_to_str_type_of_test() + { + + let exp = "sizeof( &[1, 2, 3][..] : &[i32] ) = 16".to_string(); + let got = the_module::inspect_to_str_type_of!( &[ 1, 2, 3 ][ .. ] ); + a_id!( got, exp ); + + let exp = "sizeof( &[1, 2, 3] : &[i32; 3] ) = 8".to_string(); + let got = the_module::inspect_to_str_type_of!( &[ 1, 2, 3 ] ); + a_id!( got, exp ); + + } + + // + + fn inspect_type_of_macro() + { + + let exp = "sizeof( &[1, 2, 3][..] : &[i32] ) = 16".to_string(); + let got = the_module::inspect_type_of!( &[ 1, 2, 3 ][ .. ] ); + a_id!( got, exp ); + + let exp = "sizeof( &[1, 2, 3] : &[i32; 3] ) = 8".to_string(); + let got = the_module::inspect_type_of!( &[ 1, 2, 3 ] ); + a_id!( got, exp ); + + } + +} + +// + +// #[ test_tools::nightly ] +// #[ cfg( feature = "nightly" ) ] +#[ cfg( RUSTC_IS_NIGHTLY ) ] +tests_index! +{ + inspect_to_str_type_of_test, + inspect_type_of_macro, +} diff --git a/module/core/inspect_type/tests/inc/mod.rs b/module/core/inspect_type/tests/inc/mod.rs new file mode 100644 index 0000000000..d8be619a97 --- /dev/null +++ b/module/core/inspect_type/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod inspect_type_test; diff --git a/module/core/inspect_type/tests/smoke_test.rs b/module/core/inspect_type/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/inspect_type/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/inspect_type/tests/tests.rs b/module/core/inspect_type/tests/tests.rs new file mode 100644 index 0000000000..e24b02720c --- /dev/null +++ b/module/core/inspect_type/tests/tests.rs @@ -0,0 +1,18 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +// #![ cfg( custom_inner_attributes ) ] +// #![ test_tools::nightly ] +// #![ cfg_attr( feature = "type_name_of_val", feature( type_name_of_val ) ) ] +// #![ cfg_attr( rustversion::nightly, feature( type_name_of_val ) ) ] +// #![cfg_attr(docsrs, feature(doc_cfg))] +// // #![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] +// #![ cfg_attr( feature = "nightly", feature( trace_macros ) ) ] +// #![ cfg_attr( feature = "nightly", feature( meta_idents_concat ) ) ] + +// #![ cfg_attr( RUSTC_IS_NIGHTLY, feature( type_name_of_val ) ) ] + +#[ allow( unused_imports ) ] +use inspect_type as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/core/interval_adapter/Cargo.toml b/module/core/interval_adapter/Cargo.toml new file mode 100644 index 0000000000..f08b7f12a0 --- /dev/null +++ b/module/core/interval_adapter/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "interval_adapter" +version = "0.21.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/interval_adapter" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/interval_adapter" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/interval_adapter" +description = """ +Interval adapter for both open/closed implementations of intervals ( ranges ). +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/interval_adapter/License b/module/core/interval_adapter/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/interval_adapter/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/interval_adapter/Readme.md b/module/core/interval_adapter/Readme.md new file mode 100644 index 0000000000..19cfc05f9e --- /dev/null +++ b/module/core/interval_adapter/Readme.md @@ -0,0 +1,101 @@ + + +# Module :: interval_adapter + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml) [![docs.rs](https://img.shields.io/docsrs/interval_adapter?color=e3e8f0&logo=docs.rs)](https://docs.rs/interval_adapter) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finterval_adapter%2Fexamples%2Finterval_adapter_trivial.rs,RUN_POSTFIX=--example%20interval_adapter_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Integer interval adapter for both Range and RangeInclusive. + +Let's assume you have a function which should accept Interval. But you don't want to limit caller of the function to either half-open interval `core::ops::Range` or closed one `core::ops::RangeInclusive` you want allow to use anyone of iterable interval. To make that work smoothly use `IterableInterval`. Both `core::ops::Range` and `core::ops::RangeInclusive` implement the trait, also it's possible to work with non-iterable intervals, like ( -Infinity .. +Infinity ). + +### Basic use-case + +```rust + +use interval_adapter::IterableInterval; + +fn f1( interval : impl IterableInterval ) +{ + for i in interval + { + println!( "{i}" ); + } +} + +// Calling the function either with +// half-open interval `core::ops::Range`. +f1( 0..=3 ); +// Or closed one `core::ops::RangeInclusive`. +f1( 0..4 ); + +``` + +### More flexibility + +If you need more flexibility in defining intervals, you can convert a tuple of endpoints to an interval. + +```rust + +use interval_adapter::{ IterableInterval, IntoInterval, Bound }; + +fn f1( interval : impl IterableInterval ) +{ + for i in interval + { + println!( "{i}" ); + } +} + +// Calling the function either with +// half-open interval `core::ops::Range`. +f1( 0..=3 ); +// Or closed one `core::ops::RangeInclusive`. +f1( 0..4 ); +// Alternatively you construct your custom interval from a tuple. +f1( ( 0, 3 ).into_interval() ); +f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); +// All the calls to the function `f1`` perform the same task, +// and the output is exactly identical. + +``` + +### Non-iterable intervals + +You may also use the crate to specify non-iterable intervals. Non-iterable intervals have either one or several unbound endpoints. For example, interval `core::ops::RangeFull` has no bounds and represents the range from minus infinity to plus infinity. + +```rust + +use interval_adapter::{ NonIterableInterval, IntoInterval, Bound }; + +fn f1( interval : impl NonIterableInterval ) +{ + println!( "Do something with this {:?} .. {:?} interval", interval.left(), interval.right() ); +} + +// Iterable/bound interval from tuple. +f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); +// Non-iterable/unbound interval from tuple. +f1( ( Bound::Included( 0 ), Bound::Unbounded ).into_interval() ); +// Non-iterable/unbound interval from `core::ops::RangeFrom`. +f1( 0.. ); +// Non-iterable/unbound interval from `core::ops::RangeFull` +// what is ( -Infinity .. +Infinity ). +f1( .. ); + +``` + +### To add to your project + +```sh +cargo add interval_adaptor +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example interval_adapter_trivial +``` + diff --git a/module/core/interval_adapter/examples/interval_adapter_more.rs b/module/core/interval_adapter/examples/interval_adapter_more.rs new file mode 100644 index 0000000000..df05085c1a --- /dev/null +++ b/module/core/interval_adapter/examples/interval_adapter_more.rs @@ -0,0 +1,29 @@ +//! qqq : write proper description +fn main() +{ + use interval_adapter::{ IterableInterval, IntoInterval, Bound }; + + // + // Let's assume you have a function which should accept Interval. + // But you don't want to limit caller of the function to use either half-open interval `core::ops::Range` or closed one `core::ops::RangeInclusive`. + // To make that work smoothly use `IterableInterval`. + // Both `core::ops::Range` and `core::ops::RangeInclusive` implement the trait. + // + fn f1( interval : impl IterableInterval ) + { + for i in interval + { + println!( "{i}" ); + } + } + + // Calling the function either with half-open interval `core::ops::Range`. + f1( 0..=3 ); + // Or closed one `core::ops::RangeInclusive`. + f1( 0..4 ); + // Alternatively you construct your custom interval from a tuple. + f1( ( 0, 3 ).into_interval() ); + f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); + // All the calls to the function `f1`` perform the same task, and the output is exactly identical. + +} diff --git a/module/core/interval_adapter/examples/interval_adapter_non_iterable.rs b/module/core/interval_adapter/examples/interval_adapter_non_iterable.rs new file mode 100644 index 0000000000..a28a16e1da --- /dev/null +++ b/module/core/interval_adapter/examples/interval_adapter_non_iterable.rs @@ -0,0 +1,20 @@ +//! qqq : write proper description +fn main() +{ + use interval_adapter::{ NonIterableInterval, IntoInterval, Bound }; + + fn f1( interval : impl NonIterableInterval ) + { + println!( "Do something with this {:?} .. {:?} interval", interval.left(), interval.right() ); + } + + // Iterable/bound interval from tuple. + f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); + // Non-iterable/unbound interval from tuple. + f1( ( Bound::Included( 0 ), Bound::Unbounded ).into_interval() ); + // Non-iterable/unbound interval from `core::ops::RangeFrom`. + f1( 0.. ); + // Non-iterable/unbound interval from `core::ops::RangeFull` + // what is ( -Infinity .. +Infinity ). + f1( .. ); +} diff --git a/module/core/interval_adapter/examples/interval_adapter_trivial.rs b/module/core/interval_adapter/examples/interval_adapter_trivial.rs new file mode 100644 index 0000000000..5a1ae85716 --- /dev/null +++ b/module/core/interval_adapter/examples/interval_adapter_trivial.rs @@ -0,0 +1,25 @@ +//! qqq : write proper description +fn main() +{ + use interval_adapter::IterableInterval; + + // + // Let's assume you have a function which should accept Interval. + // But you don't want to limit caller of the function to use either half-open interval `core::ops::Range` or closed one `core::ops::RangeInclusive`. + // To make that work smoothly use `IterableInterval`. + // Both `core::ops::Range` and `core::ops::RangeInclusive` implement the trait. + // + fn f1( interval : impl IterableInterval ) + { + for i in interval + { + println!( "{i}" ); + } + } + + // Calling the function either with half-open interval `core::ops::Range`. + f1( 0..=3 ); + // Or closed one `core::ops::RangeInclusive`. + f1( 0..4 ); + +} diff --git a/module/core/interval_adapter/src/lib.rs b/module/core/interval_adapter/src/lib.rs new file mode 100644 index 0000000000..8391104eda --- /dev/null +++ b/module/core/interval_adapter/src/lib.rs @@ -0,0 +1,651 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/winterval/latest/winterval/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( step_trait ) ] + +/* zzz : consider https://doc.rust-lang.org/std/ops/trait.RangeBounds.html */ +/* zzz : implement iterator */ + +//! +//! Interval adapter for both open/closed implementations of intervals ( ranges ). +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Internal namespace. +#[ cfg( feature = "enabled" ) ] +pub( crate ) mod private +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use core::ops::Bound; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use core::ops::RangeBounds; + + use core::cmp::{ PartialEq, Eq }; + use core::ops::{ Sub, Add }; + + // xxx : seal it + + /// Extend bound adding few methods. + pub trait BoundExt< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + /// Convert bound to an integer to resemble left bound of a closed interval. + fn into_left_closed( &self ) -> T; + /// Convert bound to an integer to resemble right bound of a closed interval. + fn into_right_closed( &self ) -> T; + } + + impl< T > BoundExt< T > for Bound< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn into_left_closed( &self ) -> T + { + match self + { + Bound::Included( v ) => *v, + Bound::Excluded( v ) => *v + 1.into(), + Bound::Unbounded => 0.into(), + // Bound::Unbounded => isize::MIN.into(), + } + } + #[ inline( always ) ] + fn into_right_closed( &self ) -> T + { + match self + { + Bound::Included( v ) => *v, + Bound::Excluded( v ) => *v - 1.into(), + Bound::Unbounded => isize::MAX.into(), + } + } + } + + /// Enpoint of an interval, aka bound of a range. + /// Special trait to avoid repeating all the bound on endpoint. + pub trait EndPointTrait< T > + where + Self : core::cmp::PartialOrd + Sub< Output = T > + Add< Output = T > + Clone + Copy + Sized, + { + } + + impl< T, All > EndPointTrait< T > for All + where + Self : core::cmp::PartialOrd + Sub< Output = T > + Add< Output = T > + Clone + Copy + Sized, + { + } + + /// + /// Interval adapter. Interface to interval-like structures. + /// + /// `NonIterableInterval` it does not implement iterator unlike `IterableInterval`. + /// `IterableInterval` inherits all methods of `NonIterableInterval`. + /// + /// Non-iterable intervals have either one or several unbound endpoints. + /// For example, interval `core::ops::RangeFull` has no bounds and represents the range from minus infinity to plus infinity. + /// + pub trait NonIterableInterval< T = isize > + where + // Self : IntoIterator< Item = T >, + T : EndPointTrait< T >, + isize : Into< T >, + { + + /// The left endpoint of the interval, as is. + fn left( &self ) -> Bound< T >; + /// The right endpoint of the interval, as is. + fn right( &self ) -> Bound< T >; + /// Interval in closed format as pair of numbers. + /// To convert open endpoint to closed add or subtract one. + #[ inline( always ) ] + fn bounds( &self ) -> ( Bound< T >, Bound< T > ) + { + ( self.left(), self.right() ) + } + + /// The left endpoint of the interval, converting interval into closed one. + #[ inline( always ) ] + fn closed_left( &self ) -> T + { + self.left().into_left_closed() + } + /// The right endpoint of the interval, converting interval into closed one. + #[ inline( always ) ] + fn closed_right( &self ) -> T + { + self.right().into_right_closed() + } + /// Length of the interval, converting interval into closed one. + #[ inline( always ) ] + fn closed_len( &self ) -> T + { + let one : T = 1.into(); + self.closed_right() - self.closed_left() + one + } + /// Interval in closed format as pair of numbers, converting interval into closed one. + #[ inline( always ) ] + fn closed( &self ) -> ( T, T ) + { + ( self.closed_left(), self.closed_right() ) + } + + /// Convert to interval in canonical format. + #[ inline( always ) ] + fn canonical( &self ) -> Interval< T > + { + Interval::new( self.left(), self.right() ) + } + + } + + /// + /// Interval adapter. Interface to interval-like structures. + /// + /// `NonIterableInterval` it does not implement iterator unlike `IterableInterval`. + /// `IterableInterval` inherits all methods of `NonIterableInterval`. + /// + + pub trait IterableInterval< T = isize > + where + Self : IntoIterator< Item = T > + NonIterableInterval< T >, + T : EndPointTrait< T >, + isize : Into< T >, + { + } + + impl< T, NonIterableIntervalType > IterableInterval< T > + for NonIterableIntervalType + where + NonIterableIntervalType : NonIterableInterval< T >, + Self : IntoIterator< Item = T > + NonIterableInterval< T >, + T : EndPointTrait< T >, + isize : Into< T >, + { + } + + /// + /// Canonical implementation of interval. Other implementations of interval is convertible to it. + /// + /// Both [core::ops::Range], [core::ops::RangeInclusive] are convertable to [crate::Interval] + /// + + #[ derive( PartialEq, Eq, Debug, Clone, Copy ) ] + pub struct Interval< T = isize > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + _left : Bound< T >, + _right : Bound< T >, + } + + impl< T > Interval< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + /// Constructor of an interval. Expects closed interval in arguments. + pub fn new( left : Bound< T >, right : Bound< T > ) -> Self + { + Self { _left : left, _right : right } + } + /// Convert to interval in canonical format. + #[ inline( always ) ] + pub fn iter< It >( &self ) -> impl Iterator< Item = T > + { + ( &self ).into_iter() + } + } + + // = + // IntoIterator for Interval + // = + + impl< T > IntoIterator for Interval< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + type Item = T; + type IntoIter = IntervalIterator< T >; + #[ inline( always ) ] + fn into_iter( self ) -> Self::IntoIter + { + IntervalIterator::new( self ) + } + } + + impl< T > IntoIterator for &Interval< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + type Item = T; + type IntoIter = IntervalIterator< T >; + #[ inline( always ) ] + fn into_iter( self ) -> Self::IntoIter + { + IntervalIterator::new( *self ) + } + } + + #[ derive( Debug ) ] + pub struct IntervalIterator< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + current : T, + right : T, + } + + impl< T > IntervalIterator< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + /// Constructor. + pub fn new( ins : Interval< T > ) -> Self + { + let current = ins._left.into_left_closed(); + let right = ins._right.into_right_closed(); + Self { current, right } + } + } + + impl< T > Iterator for IntervalIterator< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + type Item = T; + #[ inline( always ) ] + fn next( &mut self ) -> Option< Self::Item > + { + if self.current <= self.right + { + let result = Some( self.current ); + self.current = self.current + 1.into(); + result + } + else + { + None + } + } + } + + // + // impl IterableInterval + // + + // impl< T, All > NonIterableInterval< T > for All + // where + // T : EndPointTrait< T >, + // isize : Into< T >, + // Interval< T > : From< Self >, + // All : Clone, + // { + // #[ inline( always ) ] + // fn left( &self ) -> Bound< T > + // { + // Interval::from( self.clone() )._left + // } + // #[ inline( always ) ] + // fn right( &self ) -> Bound< T > + // { + // Interval::from( self.clone() )._right + // } + // } + + impl< T > NonIterableInterval< T > + for Interval< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + self._left + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + self._right + } + } + + impl< T > NonIterableInterval< T > + for core::ops::Range< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Included( self.start ) + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Excluded( self.end ) + } + } + + impl< T > NonIterableInterval< T > + for core::ops::RangeInclusive< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Included( *self.start() ) + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Included( *self.end() ) + } + } + + impl< T > NonIterableInterval< T > + for core::ops::RangeTo< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Unbounded + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Excluded( self.end ) + } + } + + impl< T > NonIterableInterval< T > + for core::ops::RangeToInclusive< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Unbounded + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Included( self.end ) + } + } + + impl< T > NonIterableInterval< T > + for core::ops::RangeFrom< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Included( self.start ) + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Unbounded + } + } + + impl< T > NonIterableInterval< T > + for core::ops::RangeFull + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Unbounded + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Unbounded + } + } + + impl< T > NonIterableInterval< T > + for ( T, T ) + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Included( self.0 ) + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Included( self.1 ) + } + } + + impl< T > NonIterableInterval< T > + for ( Bound< T >, Bound< T > ) + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + self.0 + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + self.1 + } + } + + impl< T > NonIterableInterval< T > + for [ T ; 2 ] + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + Bound::Included( self[ 0 ] ) + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + Bound::Included( self[ 1 ] ) + } + } + + impl< T > NonIterableInterval< T > + for [ Bound< T > ; 2 ] + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn left( &self ) -> Bound< T > + { + self[ 0 ] + } + #[ inline( always ) ] + fn right( &self ) -> Bound< T > + { + self[ 1 ] + } + } + + // = + // from for std + // = + + macro_rules! impl_interval_from + { + {} => {}; + { + $Type : ty + } + => + { + impl< T > From< $Type > + for Interval< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + #[ inline( always ) ] + fn from( src : $Type ) -> Self + { + let _left = NonIterableInterval::left( &src ); + let _right = NonIterableInterval::right( &src ); + Self { _left, _right } + } + } + }; + { + $Type : ty + , $( $Rest : tt )* + } + => + { + impl_interval_from!{ $Type } + impl_interval_from!{ $( $Rest )* } + }; + } + + impl_interval_from! + { + core::ops::Range< T >, + core::ops::RangeInclusive< T >, + core::ops::RangeTo< T >, + core::ops::RangeToInclusive< T >, + core::ops::RangeFrom< T >, + core::ops::RangeFull, + ( T, T ), + ( Bound< T >, Bound< T > ), + [ T ; 2 ], + [ Bound< T > ; 2 ], + } + + /// Convert it into canonical interval. + pub trait IntoInterval< T > + where + T : EndPointTrait< T >, + isize : Into< T >, + { + /// Convert it into canonical interval. + fn into_interval( self ) -> Interval< T >; + } + + impl< T, All > IntoInterval< T > for All + where + T : EndPointTrait< T >, + isize : Into< T >, + Interval< T > : From< Self >, + { + fn into_interval( self ) -> Interval< T > + { + From::from( self ) + } + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +// #[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Bound, + BoundExt, + EndPointTrait, + Interval, + // IterableInterval, + // NonIterableInterval, + // IntoInterval, + }; +} + +// #[ doc( inline ) ] +#[ allow( unused_imports ) ] +// #[ cfg( feature = "enabled" ) ] +// #[ allow( unused_imports ) ] +// pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + IterableInterval, + NonIterableInterval, + IntoInterval, + }; +} diff --git a/module/core/interval_adapter/tests/inc/mod.rs b/module/core/interval_adapter/tests/inc/mod.rs new file mode 100644 index 0000000000..0014f67a76 --- /dev/null +++ b/module/core/interval_adapter/tests/inc/mod.rs @@ -0,0 +1,248 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + + // + + fn info_from() + { + use the_module::*; + let exp = Interval::new( the_module::Bound::Included( 0 ), the_module::Bound::Included( 3 ) ); + + let got : Interval< _ > = ( the_module::Bound::Included( 0 ), the_module::Bound::Included( 3 ) ).into(); + a_id!( got, exp ); + let got = ( the_module::Bound::Included( 0 ), the_module::Bound::Included( 3 ) ).into_interval(); + a_id!( got, exp ); + + let got : Interval< _ > = ( 0, 3 ).into(); + a_id!( got, exp ); + let got = ( 0, 3 ).into_interval(); + a_id!( got, exp ); + + let got : Interval< _ > = [ the_module::Bound::Included( 0 ), the_module::Bound::Included( 3 ) ].into(); + a_id!( got, exp ); + let got = [ the_module::Bound::Included( 0 ), the_module::Bound::Included( 3 ) ].into_interval(); + a_id!( got, exp ); + + let got : Interval< _ > = [ 0, 3 ].into(); + a_id!( got, exp ); + let got = [ 0, 3 ].into_interval(); + a_id!( got, exp ); + + // assert( false ); + + } + + // + + fn from_std() + { + use the_module::*; + + let exp = Interval::new( the_module::Bound::Included( 0 ), the_module::Bound::Excluded( 4 ) ); + let got = ( 0..4 ).into_interval(); + a_id!( got, exp ); + let exp = ( the_module::Bound::Included( 0 ), the_module::Bound::Excluded( 4 ) ); + let got = ( 0..4 ).bounds(); + a_id!( got, exp ); + + let exp = Interval::new( the_module::Bound::Included( 0 ), the_module::Bound::Included( 4 ) ); + let got = ( 0..=4 ).into_interval(); + a_id!( got, exp ); + let exp = ( the_module::Bound::Included( 0 ), the_module::Bound::Included( 4 ) ); + let got = ( 0..=4 ).bounds(); + a_id!( got, exp ); + + let exp = Interval::new( the_module::Bound::Unbounded, the_module::Bound::Excluded( 4 ) ); + let got = ( ..4 ).into_interval(); + a_id!( got, exp ); + let exp = ( the_module::Bound::Unbounded, the_module::Bound::Excluded( 4 ) ); + let got = ( ..4 ).bounds(); + a_id!( got, exp ); + + let exp = Interval::new( the_module::Bound::Unbounded, the_module::Bound::Included( 4 ) ); + let got = ( ..=4 ).into_interval(); + a_id!( got, exp ); + let exp = ( the_module::Bound::Unbounded, the_module::Bound::Included( 4 ) ); + let got = ( ..=4 ).bounds(); + a_id!( got, exp ); + + let exp = Interval::new( the_module::Bound::Included( 4 ), the_module::Bound::Unbounded ); + let got = ( 4.. ).into_interval(); + a_id!( got, exp ); + let exp = ( the_module::Bound::Included( 4 ), the_module::Bound::Unbounded ); + let got = ( 4.. ).bounds(); + a_id!( got, exp ); + + let exp = Interval::< isize >::new( the_module::Bound::Unbounded, the_module::Bound::Unbounded ); + let got = ( .. ).into_interval(); + a_id!( got, exp ); + let exp = ( the_module::Bound::< isize >::Unbounded, the_module::Bound::< isize >::Unbounded ); + let got = ( .. ).bounds(); + a_id!( got, exp ); + + } + + // + + // #[ cfg( not( feature = "no_std" ) ) ] + fn adapter_basic() + { + use the_module::*; + let src = Interval::new( the_module::Bound::Included( 2 ), the_module::Bound::Included( 4 ) ); + + a_id!( NonIterableInterval::left( &src ), the_module::Bound::Included( 2 ) ); + a_id!( NonIterableInterval::right( &src ), the_module::Bound::Included( 4 ) ); + a_id!( NonIterableInterval::bounds( &src ), ( the_module::Bound::Included( 2 ), the_module::Bound::Included( 4 ) ) ); + a_id!( NonIterableInterval::closed_left( &src ), 2 ); + a_id!( NonIterableInterval::closed_right( &src ), 4 ); + a_id!( NonIterableInterval::closed_len( &src ), 3 ); + a_id!( NonIterableInterval::closed( &src ), ( 2, 4 ) ); + + a_id!( src.left(), the_module::Bound::Included( 2 ) ); + a_id!( src.right(), the_module::Bound::Included( 4 ) ); + a_id!( src.bounds(), ( the_module::Bound::Included( 2 ), the_module::Bound::Included( 4 ) ) ); + a_id!( src.closed_left(), 2 ); + a_id!( src.closed_right(), 4 ); + a_id!( src.closed_len(), 3 ); + a_id!( src.closed(), ( 2, 4 ) ); + + } + + // + + // #[ cfg( not( feature = "no_std" ) ) ] + fn adapter_std_closed_open() + { + use the_module::*; + + // test.case( "basic" ); + + let src = 2..5; + + a_id!( src.left(), the_module::Bound::Included( 2 ) ); + a_id!( src.right(), the_module::Bound::Excluded( 5 ) ); + a_id!( src.bounds(), ( the_module::Bound::Included( 2 ), the_module::Bound::Excluded( 5 ) ) ); + a_id!( src.closed_left(), 2 ); + a_id!( src.closed_right(), 4 ); + a_id!( src.closed_len(), 3 ); + a_id!( src.closed(), ( 2, 4 ) ); + + } + + // + + // #[ cfg( not( feature = "no_std" ) ) ] + fn adapter_std_closed() + { + use the_module::*; + + // test.case( "basic" ); + + let src = 2..=4; + + a_id!( src.left(), the_module::Bound::Included( 2 ) ); + a_id!( src.right(), the_module::Bound::Included( 4 ) ); + a_id!( src.bounds(), ( the_module::Bound::Included( 2 ), the_module::Bound::Included( 4 ) ) ); + a_id!( src.closed_left(), 2 ); + a_id!( src.closed_right(), 4 ); + a_id!( src.closed_len(), 3 ); + a_id!( src.closed(), ( 2, 4 ) ); + + } + + // + + // #[ cfg( not( feature = "no_std" ) ) ] + fn into_interval() + { + use the_module::*; + + // test.case( "from closed open std interval" ); + + let src : Interval = ( 2..5 ).into(); + a_id!( src.closed(), ( 2, 4 ) ); + let src = Interval::from( 2..5 ); + a_id!( src.closed(), ( 2, 4 ) ); + + // test.case( "from closed std interval" ); + + let src : Interval = ( 2..=4 ).into(); + a_id!( src.closed(), ( 2, 4 ) ); + let src = Interval::from( 2..=4 ); + a_id!( src.closed(), ( 2, 4 ) ); + + } + + // + + // #[ cfg( not( feature = "no_std" ) ) ] + fn impl_interval() + { + use the_module::{ NonIterableInterval, IterableInterval, IntoInterval, Bound }; + + // + // Let's assume you have a function which should accept Interval. + // But you don't want to limit caller of the function to use either half-open interval `core::ops::Range` or closed one `core::ops::RangeInclusive`. + // To make that work smoothly use `IterableInterval`. + // Both `core::ops::Range` and `core::ops::RangeInclusive` implement the trait. + // + fn f1( interval : impl IterableInterval ) + { + for i in interval + { + println!( "{i}" ); + } + } + + // Calling the function either with + // half-open interval `core::ops::Range`. + f1( 0..=3 ); + // Or closed one `core::ops::RangeInclusive`. + f1( 0..4 ); + // Alternatively you construct your custom interval from a tuple. + f1( ( 0, 3 ).into_interval() ); + f1( ( the_module::Bound::Included( 0 ), the_module::Bound::Included( 3 ) ).into_interval() ); + // All the calls to the function `f1`` perform the same task, + // and the output is exactly identical. + + } + + fn non_interable_smoke() + { + use the_module::{ NonIterableInterval, IntoInterval }; + + fn f1( interval : impl NonIterableInterval ) + { + println!( "Do something with this {:?} .. {:?} interval", interval.left(), interval.right() ); + } + + // Iterable/bound interval from tuple. + f1( ( the_module::Bound::Included( 0 ), the_module::Bound::Included( 3 ) ).into_interval() ); + // Non-iterable/unbound interval from tuple. + f1( ( the_module::Bound::Included( 0 ), the_module::Bound::Unbounded ).into_interval() ); + // Non-iterable/unbound interval from `core::ops::RangeFrom`. + f1( 0.. ); + // Non-iterable/unbound interval from `core::ops::RangeFull` + // what is ( -Infinity .. +Infinity ). + f1( .. ); + } + +} + +// + +tests_index! +{ + info_from, + from_std, + adapter_basic, + adapter_std_closed, + adapter_std_closed_open, + into_interval, + impl_interval, + non_interable_smoke, +} +// zzz : qqq : fix problem of wrong line diff --git a/module/core/interval_adapter/tests/interval_tests.rs b/module/core/interval_adapter/tests/interval_tests.rs new file mode 100644 index 0000000000..8b71381bfb --- /dev/null +++ b/module/core/interval_adapter/tests/interval_tests.rs @@ -0,0 +1,6 @@ +#[ allow( unused_imports ) ] +use interval_adapter as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/core/interval_adapter/tests/smoke_test.rs b/module/core/interval_adapter/tests/smoke_test.rs new file mode 100644 index 0000000000..663dd6fb9f --- /dev/null +++ b/module/core/interval_adapter/tests/smoke_test.rs @@ -0,0 +1,12 @@ + +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/is_slice/Cargo.toml b/module/core/is_slice/Cargo.toml new file mode 100644 index 0000000000..b3cb822caa --- /dev/null +++ b/module/core/is_slice/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "is_slice" +version = "0.9.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/is_slice" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/is_slice" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/is_slice" +description = """ +Macro to answer the question: is it a slice? +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/is_slice/License b/module/core/is_slice/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/is_slice/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/is_slice/Readme.md b/module/core/is_slice/Readme.md new file mode 100644 index 0000000000..cd6d9eadac --- /dev/null +++ b/module/core/is_slice/Readme.md @@ -0,0 +1,38 @@ + + +# Module :: is_slice + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml) [![docs.rs](https://img.shields.io/docsrs/is_slice?color=e3e8f0&logo=docs.rs)](https://docs.rs/is_slice) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fis_slice%2Fexamples%2Fis_slice_trivial.rs,RUN_POSTFIX=--example%20is_slice_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Macro to answer the question: is it a slice? + +### Basic use-case + + + +```rust +use is_slice::*; + +dbg!( is_slice!( Box::new( true ) ) ); +// < is_slice!(Box :: new(true)) = false +dbg!( is_slice!( &[ 1, 2, 3 ] ) ); +// < is_slice!(& [1, 2, 3]) = false +dbg!( is_slice!( &[ 1, 2, 3 ][ .. ] ) ); +// < is_slice!(& [1, 2, 3] [..]) = true +``` + +### To add to your project + +```sh +cargo add is_slice +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/is_slice_trivial +cargo run +``` diff --git a/module/core/is_slice/examples/is_slice_trivial.rs b/module/core/is_slice/examples/is_slice_trivial.rs new file mode 100644 index 0000000000..80b5b21aa3 --- /dev/null +++ b/module/core/is_slice/examples/is_slice_trivial.rs @@ -0,0 +1,15 @@ +//! qqq : write proper descriptionuse is_slice::*; + +use is_slice::is_slice; + +fn main() +{ + + dbg!( is_slice!( Box::new( true ) ) ); + // < is_slice!(Box :: new(true)) = false + dbg!( is_slice!( &[ 1, 2, 3 ] ) ); + // < is_slice!(& [1, 2, 3]) = false + dbg!( is_slice!( &[ 1, 2, 3 ][ .. ] ) ); + // < is_slice!(& [1, 2, 3] [..]) = true + +} diff --git a/module/core/is_slice/src/lib.rs b/module/core/is_slice/src/lib.rs new file mode 100644 index 0000000000..eea3ea5978 --- /dev/null +++ b/module/core/is_slice/src/lib.rs @@ -0,0 +1,127 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/inspect_type/latest/inspect_type/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Diagnostic-purpose tools to inspect type of a variable and its size. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +pub( crate ) mod private +{ + + /// Macro to answer the question: is it a slice? + /// + /// ### Basic use-case. + /// ``` + /// use is_slice::*; + /// + /// fn main() + /// { + /// dbg!( is_slice!( Box::new( true ) ) ); + /// // < is_slice!(Box :: new(true)) = false + /// dbg!( is_slice!( &[ 1, 2, 3 ] ) ); + /// // < is_slice!(& [1, 2, 3]) = false + /// dbg!( is_slice!( &[ 1, 2, 3 ][ .. ] ) ); + /// // < is_slice!(& [1, 2, 3] [..]) = true + /// } + /// ``` + + #[ macro_export ] + macro_rules! is_slice + { + ( $V : expr ) => + {{ + use ::core::marker::PhantomData; + + trait NotSlice + { + fn is_slice( self : &'_ Self ) -> bool { false } + } + + impl< T > NotSlice + for &'_ PhantomData< T > + where T : ?Sized, + {} + + trait Slice + { + fn is_slice( self : &'_ Self ) -> bool { true } + } + + impl< 'a, T > Slice for PhantomData< &'a &[ T ] > + {} + + fn does< T : Sized >( _ : &T ) -> PhantomData< &T > + { + PhantomData + } + + ( &does( &$V ) ).is_slice() + + }} + } + + pub use is_slice; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +#[ cfg( feature = "enabled" ) ] +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // pub use super::private:: + // { + // }; + + #[ cfg( feature = "nightly" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::nightly::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + is_slice, + }; +} diff --git a/module/core/is_slice/tests/inc/is_slice_test.rs b/module/core/is_slice/tests/inc/is_slice_test.rs new file mode 100644 index 0000000000..19d026fde5 --- /dev/null +++ b/module/core/is_slice/tests/inc/is_slice_test.rs @@ -0,0 +1,34 @@ +use super::*; + +// + +tests_impls! +{ + #[ test ] + fn is_slice_basic() + { + let src : &[ i32 ] = &[ 1, 2, 3 ]; + a_id!( the_module::is_slice!( src ), true ); + a_id!( the_module::is_slice!( &[ 1, 2, 3 ][ .. ] ), true ); + a_id!( the_module::is_slice!( &[ 1, 2, 3 ] ), false ); + + // the_module::inspect_type_of!( &[ 1, 2, 3 ][ .. ] ); + // the_module::inspect_type_of!( &[ 1, 2, 3 ] ); + + a_id!( the_module::is_slice!( vec!( 1, 2, 3 ) ), false ); + a_id!( the_module::is_slice!( 13_f32 ), false ); + a_id!( the_module::is_slice!( true ), false ); + let src = false; + a_id!( the_module::is_slice!( src ), false ); + a_id!( the_module::is_slice!( Box::new( true ) ), false ); + let src = Box::new( true ); + a_id!( the_module::is_slice!( src ), false ); + } +} + +// + +tests_index! +{ + is_slice_basic, +} diff --git a/module/core/is_slice/tests/inc/mod.rs b/module/core/is_slice/tests/inc/mod.rs new file mode 100644 index 0000000000..f2b9dec7e1 --- /dev/null +++ b/module/core/is_slice/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod is_slice_test; diff --git a/module/core/is_slice/tests/is_slice_tests.rs b/module/core/is_slice/tests/is_slice_tests.rs new file mode 100644 index 0000000000..6aad89f853 --- /dev/null +++ b/module/core/is_slice/tests/is_slice_tests.rs @@ -0,0 +1,11 @@ +// #![cfg_attr(docsrs, feature(doc_cfg))] +// #![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] +// #![ feature( meta_idents_concat ) ] + +use test_tools::exposed::*; +use is_slice as the_module; + +// #[ path = "./inc.rs" ] +mod inc; diff --git a/module/core/is_slice/tests/smoke_test.rs b/module/core/is_slice/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/is_slice/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/iter_tools/Cargo.toml b/module/core/iter_tools/Cargo.toml new file mode 100644 index 0000000000..233ac33f5b --- /dev/null +++ b/module/core/iter_tools/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "iter_tools" +version = "0.17.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/iter_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/iter_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/iter_tools" +description = """ +Collection of general purpose tools to iterate. Currently it simply reexports itertools. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "itertools/use_alloc" ] +enabled = [] + +[dependencies] +itertools = { version = "~0.11.0", features = [ "use_std" ] } +# qqq : update + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/iter_tools/License b/module/core/iter_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/iter_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/iter_tools/Readme.md b/module/core/iter_tools/Readme.md new file mode 100644 index 0000000000..4aaebd7c0f --- /dev/null +++ b/module/core/iter_tools/Readme.md @@ -0,0 +1,62 @@ + + +# Module :: iter_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/iter_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/iter_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fiter_tools%2Fexamples%2Fiter_tools_trivial.rs,RUN_POSTFIX=--example%20iter_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose tools to iterate. Currently it simply reexports itertools. + +### Basic use-case + + + +```rust +# #[ cfg( feature = "itertools" ) ] +# { + use iter_tools::*; + + /* standard functions */ + let vec = vec![ 5, 1, -2 ]; + let min = min( &vec ); + assert_eq!( *min.unwrap(), -2 ); + + /* non standard functions */ + let vec = vec![ 5, 1, -2 ]; + let added = vec![ "a", "b", "c" ]; + let mut result = vec![]; + let zipped = zip( &vec, &added ); + for ( left, right ) in zipped + { + result.push( ( *left, *right ) ); + } + assert_eq!( result, vec![ ( 5, "a" ), ( 1, "b" ), ( -2, "c" ) ] ); +# } +``` + + + +### To add to your project + +```sh +cargo add iter_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/iter_tools_trivial +cargo run +``` +` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/iter_tools_trivial +cargo run +``` diff --git a/module/core/iter_tools/examples/iter_tools_trivial.rs b/module/core/iter_tools/examples/iter_tools_trivial.rs new file mode 100644 index 0000000000..01ed1630e7 --- /dev/null +++ b/module/core/iter_tools/examples/iter_tools_trivial.rs @@ -0,0 +1,35 @@ +//! This example demonstrates the usage of some standard and non-standard functions +//! from the `iter_tools` crate. The `iter_tools` crate provides additional iterator +//! methods beyond those provided by the standard library. +#[ cfg( not( feature = "enabled" ) ) ] +fn main() {} + +#[ cfg( feature = "enabled" ) ] +fn main() +{ + // Importing functions from the `iter_tools` crate + use iter_tools::*; + + /* standard functions */ + // Creating a vector + let vec = vec![ 5, 1, -2 ]; + // Finding the minimum value in the vector + let min = min( &vec ); + assert_eq!( *min.unwrap(), -2 ); + + /* non standard functions */ + // Creating another vector + let vec = vec![ 5, 1, -2 ]; + // Initializing an empty vector to store the result + let mut result = vec![]; + // Reversing the vector using the `rev` function from `iter_tools` + let reversed = rev( &vec ); + // Iterating over the reversed vector + for v in reversed + { + // Pushing the dereferenced value into the result vector + result.push( *v ); + } + assert_eq!( result, vec![ -2, 1, 5, ] ); + +} diff --git a/module/core/iter_tools/src/iter.rs b/module/core/iter_tools/src/iter.rs new file mode 100644 index 0000000000..3a9218186f --- /dev/null +++ b/module/core/iter_tools/src/iter.rs @@ -0,0 +1,168 @@ + +#[ cfg( not( feature = "no_std" ) ) ] +pub( crate ) mod private +{ + use ::itertools::process_results; + + // fn collect_results< I, T, E >( iter : I ) -> core::result::Result< Vec< T >, E > + // where + // I : Iterator< Item = core::result::Result< T, E > > + Clone, + // E : core::fmt::Debug, + // { + // for e in iter.clone() + // { + // if e.is_err() + // { + // e?; + // } + // } + // Ok( iter.map( | e | e.unwrap() ).collect() ) + // } + + /// Extension of iterator. + + pub trait IterExt + where + Self : core::iter::Iterator, + { + /// Iterate each element and return `core::Result::Err` if any element is error. + fn map_result< F, RE, El >( self, f : F ) -> core::result::Result< Vec< El >, RE > + where + Self : Sized + Clone, + // Self : Sized, + F : FnMut( < Self as core::iter::Iterator >::Item ) -> core::result::Result< El, RE >, + RE : core::fmt::Debug, + // El : Clone, + // core::result::Result< El, RE > : Clone, + ; + } + + impl< Iterator > IterExt for Iterator + where + Iterator : core::iter::Iterator, + { + fn map_result< F, RE, El >( self, f : F ) -> core::result::Result< Vec< El >, RE > + where + Self : Sized + Clone, + F : FnMut( < Self as core::iter::Iterator >::Item ) -> core::result::Result< El, RE >, + RE : core::fmt::Debug, + // El : Clone, + // core::result::Result< El, RE > : Clone, + { + let vars_maybe = self.map( f ); + let vars : Vec< _ > = process_results( vars_maybe, | iter | iter.collect() )?; + // let vars = collect_results( vars_maybe.clone() )?; + Ok( vars ) + // let result : ( Vec< _ >, Vec< _ >, Vec< _ > ) + // = vars.into_iter().multiunzip(); + // Ok( result ) + } + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::itertools:: + { + all, + any, + assert_equal, + chain, + cloned, + concat, + cons_tuples, + diff_with, + enumerate, + equal, + fold, + interleave, + intersperse, + intersperse_with, + iterate, + join, + kmerge, + kmerge_by, + max, + merge, + merge_join_by, + min, + multipeek, + multiunzip, + multizip, + partition, + peek_nth, + process_results, + put_back, + put_back_n, + rciter, + repeat_n, + rev, + sorted, + unfold, + // zip, + zip_eq, + }; + + #[ cfg( not( feature = "no_std" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use std::iter::zip; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::itertools:: + { + Diff, + Either, + EitherOrBoth, + FoldWhile, + MinMaxResult, + Position, + Itertools, + /*MultiUnzip,*/ + PeekingNext, + }; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( not( feature = "no_std" ) ) ] + pub use super::private::IterExt; + +} diff --git a/module/core/iter_tools/src/lib.rs b/module/core/iter_tools/src/lib.rs new file mode 100644 index 0000000000..043285af78 --- /dev/null +++ b/module/core/iter_tools/src/lib.rs @@ -0,0 +1,71 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/iter_tools/latest/iter_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Collection of general purpose tools to iterate. Currently it simply reexports itertools. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Core module. +#[ cfg( feature = "enabled" ) ] +pub mod iter; + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::itertools; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::iter::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::iter::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::iter::prelude::*; +} diff --git a/module/core/iter_tools/tests/inc/basic_test.rs b/module/core/iter_tools/tests/inc/basic_test.rs new file mode 100644 index 0000000000..13fb1cc545 --- /dev/null +++ b/module/core/iter_tools/tests/inc/basic_test.rs @@ -0,0 +1,21 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use the_module::*; + +// + +#[ test ] +#[ cfg( feature = "enabled" ) ] +fn basic() +{ + // test.case( "basic" ); + let src = vec![ 1, 2, 3 ]; + let exp = ( vec![ 2, 3, 4 ], vec![ 0, 1, 2 ] ); + let got : ( Vec< _ >, Vec< _ > ) = src.iter().map( | e | + {( + e + 1, + e - 1, + )}).multiunzip(); + a_id!( got, exp ); +} diff --git a/module/core/iter_tools/tests/inc/mod.rs b/module/core/iter_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..69082d0200 --- /dev/null +++ b/module/core/iter_tools/tests/inc/mod.rs @@ -0,0 +1,4 @@ + +use super::*; + +pub mod basic_test; diff --git a/module/core/iter_tools/tests/smoke_test.rs b/module/core/iter_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/iter_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/iter_tools/tests/tests.rs b/module/core/iter_tools/tests/tests.rs new file mode 100644 index 0000000000..1fbd9150ca --- /dev/null +++ b/module/core/iter_tools/tests/tests.rs @@ -0,0 +1,6 @@ + +use iter_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +pub mod inc; diff --git a/module/core/macro_tools/Cargo.toml b/module/core/macro_tools/Cargo.toml new file mode 100644 index 0000000000..7b960db025 --- /dev/null +++ b/module/core/macro_tools/Cargo.toml @@ -0,0 +1,50 @@ +[package] +name = "macro_tools" +version = "0.28.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/macro_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/macro_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/macro_tools" +description = """ +Tools for writing procedural macroses. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [ "former_types/enabled", "interval_adapter/enabled" ] + +# qqq : put all files under features: macro_attr, macro_container_kind, ... + +[dependencies] + +## external +proc-macro2 = { version = "~1.0.78", features = [] } +quote = { version = "~1.0.35", features = [] } +syn = { version = "~2.0.52", features = [ "full", "extra-traits" ] } + +# qqq : optimize features list + +## internal +interval_adapter = { workspace = true, features = [] } +former_types = { workspace = true, features = [ "types_component_assign" ] } + +[dev-dependencies] +test_tools = { workspace = true } +const_format = { version = "0.2.32" } diff --git a/module/core/macro_tools/License b/module/core/macro_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/macro_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/macro_tools/Readme.md b/module/core/macro_tools/Readme.md new file mode 100644 index 0000000000..62e2e0013a --- /dev/null +++ b/module/core/macro_tools/Readme.md @@ -0,0 +1,360 @@ + + +# Module :: proc_macro_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/macro_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/macro_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmacro_tools%2Fexamples%2Fmacro_tools_trivial.rs,RUN_POSTFIX=--example%20macro_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools for writing procedural macros. + +### Example: Trivial One + + + +The purpose of `typ::type_parameters` is to extract type parameters from a given Rust type. +In this example, we generate a type `core::option::Option` and extract its type parameters. + +```rust +#[ cfg( not( feature = "enabled" ) ) ] +fn main(){} +#[ cfg( feature = "enabled" ) ] +fn main() +{ + // Import necessary macros and modules from the `macro_tools` crate. + use macro_tools::{ typ, qt }; + + // Generate a token stream representing the type `core::option::Option`. + let code = qt!( core::option::Option< i8, i16, i32, i64 > ); + + // Parse the generated token stream into a `syn::Type` object. + // `syn::Type` is a syntax tree node representing a Rust type. + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + + // Extract type parameters from the parsed type. + // `typ::type_parameters` takes a reference to a `syn::Type` and a range. + // It returns a vector of type parameters within the specified range. + // Here, `0..=2` specifies that we are interested in the first three type parameters. + let got = typ::type_parameters( &tree_type, 0..=2 ); + + // Iterate over the extracted type parameters and print each one. + // The `qt!` macro is used to convert the type parameter back to a token stream for printing. + got.iter().for_each( | e | println!( "{}", qt!( #e ) ) ); + + /* Expected output: + i8 + i16 + i32 + */ +} +``` + +Try out `cargo run --example macro_tools_trivial`. +
    +[See code](./examples/macro_tools_trivial.rs). + +### Example: Attribute Properties + +This example demonstrates an approach to parsing attributes and their properties. +The attributes are collected into a struct that aggregates them, and attribute properties +are parsed using reusable components from a library. The example shows how to use +`AttributePropertyBoolean` for parsing boolean properties and the roles of the traits +`AttributePropertyComponent` and `AttributeComponent`. The `Assign` trait is +also used to simplify the logic of assigning fields. + +Attributes are collected into a `ItemAttributes` struct, and attribute properties are parsed +using reusable components like `AttributePropertyBoolean`. + +- `AttributeComponent`: A trait that defines how an attribute should be parsed from a `syn::Attribute`. +- `AttributePropertyComponent`: A trait that defines a marker for attribute properties. +- `Assign`: A trait that simplifies the logic of assigning fields to a struct. Using a +component-based approach requires each field to have a unique type, which aligns with the +strengths of strongly-typed languages. This method ensures that the logic of +assigning values to fields is encapsulated within the fields themselves, promoting modularity +and reusability. + +The reusable property components from the library come with parameters that distinguish +different properties of the same type. This is useful when an attribute has multiple boolean +properties, for instance. Such an approach helps to avoid limitations where it is +always possible to define traits for custom types, while it may not be possible for types +defined in other crates. + +```rust + +#[ cfg( not( all( feature = "enabled", debug_assertions ) ) ) ] +fn main(){} +#[ cfg( all( feature = "enabled", debug_assertions ) ) ] +fn main() +{ + + use macro_tools:: + { + attr, + syn_err, + return_syn_err, + qt, + Result, + AttributeComponent, + AttributePropertyComponent, + AttributePropertyBoolean, + AttributePropertySingletone, + }; + use former_types::Assign; + + /// Represents the attributes of a struct. Aggregates all its attributes. + #[ derive( Debug, Default ) ] + pub struct ItemAttributes + { + /// Attribute for customizing the mutation process. + pub mutator : AttributeMutator, + } + + impl ItemAttributes + { + /// Constructs a `ItemAttributes` instance from an iterator of attributes. + /// + /// This function parses the provided attributes and assigns them to the + /// appropriate fields in the `ItemAttributes` struct. + pub fn from_attrs< 'a >( attrs : impl Iterator< Item = & 'a syn::Attribute > ) -> Result< Self > + { + let mut result = Self::default(); + + // Closure to generate an error message for unknown attributes. + let error = | attr : & syn::Attribute | -> syn::Error + { + let known_attributes = const_format::concatcp! + ( + "Known attributes are: ", + "debug", + ", ", AttributeMutator::KEYWORD, + "." + ); + syn_err! + ( + attr, + "Expects an attribute of format '#[ attribute( key1 = val1, key2 = val2 ) ]'\n {known_attributes}\n But got: '{}'", + qt! { #attr } + ) + }; + + for attr in attrs + { + let key_ident = attr.path().get_ident().ok_or_else( || error( attr ) )?; + let key_str = format!( "{}", key_ident ); + match key_str.as_ref() + { + AttributeMutator::KEYWORD => result.assign( AttributeMutator::from_meta( attr )? ), + "debug" => {}, + _ => {}, + } + } + + Ok( result ) + } + } + + /// Represents attributes for customizing the mutation process in a forming operation. + /// + /// ## Example of code + /// + /// ```ignore + /// #[ mutator( custom = true, debug = true ) ] + /// ``` + #[ derive( Debug, Default ) ] + pub struct AttributeMutator + { + /// Indicates whether a custom mutator should be generated. + /// Defaults to `false`, meaning no custom mutator is generated unless explicitly requested. + pub custom : AttributePropertyCustom, + /// Specifies whether to print code generated for the field. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub debug : AttributePropertyDebug, + } + + impl AttributeComponent for AttributeMutator + { + const KEYWORD : & 'static str = "mutator"; + + /// Parses a `syn::Attribute` into an `AttributeMutator`. + fn from_meta( attr : & syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + return syn::parse2::< AttributeMutator >( meta_list.tokens.clone() ); + }, + syn::Meta::Path( ref _path ) => + { + return Ok( Default::default() ) + }, + _ => return_syn_err! + ( + attr, + "Expects an attribute of format `#[ mutator( custom = true ) ]`. \nGot: {}", + qt! { #attr } + ), + } + } + } + + // Implement `Assign` trait to allow assigning `AttributeMutator` to `ItemAttributes`. + impl< IntoT > Assign< AttributeMutator, IntoT > for ItemAttributes + where + IntoT : Into< AttributeMutator >, + { + #[ inline( always ) ] + fn assign( & mut self, component : IntoT ) + { + self.mutator = component.into(); + } + } + + // Implement `Assign` trait to allow assigning `AttributePropertyDebug` to `AttributeMutator`. + impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeMutator + where + IntoT : Into< AttributePropertyDebug >, + { + #[ inline( always ) ] + fn assign( & mut self, component : IntoT ) + { + self.debug = component.into(); + } + } + + // Implement `Assign` trait to allow assigning `AttributePropertyCustom` to `AttributeMutator`. + impl< IntoT > Assign< AttributePropertyCustom, IntoT > for AttributeMutator + where + IntoT : Into< AttributePropertyCustom >, + { + #[ inline( always ) ] + fn assign( & mut self, component : IntoT ) + { + self.custom = component.into(); + } + } + + impl syn::parse::Parse for AttributeMutator + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : & syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeMutator::KEYWORD, " are: ", + AttributePropertyCustom::KEYWORD, + ", ", AttributePropertyDebug::KEYWORD, + "." + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ mutator( custom = false ) ]' + {known} + But got: '{}' + "#, + qt! { #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + + match ident.to_string().as_str() + { + AttributePropertyCustom::KEYWORD => result.assign( AttributePropertyCustom::parse( input )? ), + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + _ => return Err( error( & ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![,] ) + { + input.parse::< syn::Token![,] >()?; + } + } + + Ok( result ) + } + } + + // == Attribute properties + + /// Marker type for attribute property to specify whether to provide a sketch as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + #[ derive( Debug, Default, Clone, Copy ) ] + pub struct AttributePropertyDebugMarker; + + impl AttributePropertyComponent for AttributePropertyDebugMarker + { + const KEYWORD : & 'static str = "debug"; + } + + /// Specifies whether to provide a sketch as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub type AttributePropertyDebug = AttributePropertySingletone< AttributePropertyDebugMarker >; + + // == + + /// Marker type for attribute property to indicate whether a custom code should be generated. + /// Defaults to `false`, meaning no custom code is generated unless explicitly requested. + #[ derive( Debug, Default, Clone, Copy ) ] + pub struct AttributePropertyCustomMarker; + + impl AttributePropertyComponent for AttributePropertyCustomMarker + { + const KEYWORD : & 'static str = "custom"; + } + + /// Indicates whether a custom code should be generated. + /// Defaults to `false`, meaning no custom code is generated unless explicitly requested. + pub type AttributePropertyCustom = AttributePropertyBoolean< AttributePropertyCustomMarker >; + + // == test code + + // Parse an attribute and construct a `ItemAttributes` instance. + let input : syn::Attribute = syn::parse_quote!( #[ mutator( custom = true ) ] ); + let attrs : ItemAttributes = ItemAttributes::from_attrs( std::iter::once( & input ) ).unwrap(); + println!( "{:?}", attrs ); + + // Test `AttributePropertyBoolean` functionality. + let attr : AttributePropertyBoolean< AttributePropertyDebugMarker > = AttributePropertyBoolean::default(); + assert_eq!( attr.internal(), false ); + let attr : AttributePropertyBoolean< AttributePropertyDebugMarker > = true.into(); + assert_eq!( attr.internal(), true ); + let attr : AttributePropertyBoolean< AttributePropertyDebugMarker > = false.into(); + assert_eq!( attr.internal(), false ); + +} + +``` + +Try out `cargo run --example macro_tools_attr_prop`. +
    +[See code](./examples/macro_tools_attr_prop.rs). + +### To add to your project + +```sh +cargo add proc_macro_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/macro_tools_trivial +cargo run +``` diff --git a/module/core/macro_tools/examples/macro_tools_attr_prop.rs b/module/core/macro_tools/examples/macro_tools_attr_prop.rs new file mode 100644 index 0000000000..4625e15154 --- /dev/null +++ b/module/core/macro_tools/examples/macro_tools_attr_prop.rs @@ -0,0 +1,290 @@ +//! +//! ### Example: Attribute Properties +//! +//! This example demonstrates an approach to parsing attributes and their properties. +//! The attributes are collected into a struct that aggregates them, and attribute properties +//! are parsed using reusable components from a library. The example shows how to use +//! `AttributePropertyBoolean` for parsing boolean properties and the roles of the traits +//! `AttributePropertyComponent` and `AttributeComponent`. The `Assign` trait is +//! also used to simplify the logic of assigning fields. +//! +//! Attributes are collected into a `ItemAttributes` struct, and attribute properties are parsed +//! using reusable components like `AttributePropertyBoolean`. +//! +//! - `AttributeComponent`: A trait that defines how an attribute should be parsed from a `syn::Attribute`. +//! - `AttributePropertyComponent`: A trait that defines a marker for attribute properties. +//! - `Assign`: A trait that simplifies the logic of assigning fields to a struct. Using a +//! component-based approach requires each field to have a unique type, which aligns with the +//! strengths of strongly-typed languages. This method ensures that the logic of +//! assigning values to fields is encapsulated within the fields themselves, promoting modularity +//! and reusability. +//! +//! The reusable property components from the library come with parameters that distinguish +//! different properties of the same type. This is useful when an attribute has multiple boolean +//! properties, for instance. Such an approach helps to avoid limitations where it is +//! always possible to define traits for custom types, while it may not be possible for types +//! defined in other crates. +//! + +#[ cfg( not( all( feature = "enabled", debug_assertions ) ) ) ] +fn main(){} +#[ cfg( all( feature = "enabled", debug_assertions ) ) ] +fn main() +{ + + use macro_tools:: + { + attr, + syn_err, + return_syn_err, + qt, + Result, + AttributeComponent, + AttributePropertyComponent, + AttributePropertyBoolean, + AttributePropertySingletone, + }; + use former_types::Assign; + + /// Represents the attributes of a struct. Aggregates all its attributes. + #[ derive( Debug, Default ) ] + pub struct ItemAttributes + { + /// Attribute for customizing the mutation process. + pub mutator : AttributeMutator, + } + + impl ItemAttributes + { + /// Constructs a `ItemAttributes` instance from an iterator of attributes. + /// + /// This function parses the provided attributes and assigns them to the + /// appropriate fields in the `ItemAttributes` struct. + pub fn from_attrs< 'a >( attrs : impl Iterator< Item = & 'a syn::Attribute > ) -> Result< Self > + { + let mut result = Self::default(); + + // Closure to generate an error message for unknown attributes. + let error = | attr : & syn::Attribute | -> syn::Error + { + let known_attributes = const_format::concatcp! + ( + "Known attributes are: ", + "debug", + ", ", AttributeMutator::KEYWORD, + "." + ); + syn_err! + ( + attr, + "Expects an attribute of format '#[ attribute( key1 = val1, key2 = val2 ) ]'\n {known_attributes}\n But got: '{}'", + qt! { #attr } + ) + }; + + for attr in attrs + { + let key_ident = attr.path().get_ident().ok_or_else( || error( attr ) )?; + let key_str = format!( "{}", key_ident ); + // if attr::is_standard( & key_str ) + // { + // continue; + // } + match key_str.as_ref() + { + AttributeMutator::KEYWORD => result.assign( AttributeMutator::from_meta( attr )? ), + "debug" => {}, + _ => {}, + // _ => return Err( error( attr ) ), + } + } + + Ok( result ) + } + } + + /// Represents attributes for customizing the mutation process in a forming operation. + /// + /// ## Example of code + /// + /// ```ignore + /// #[ mutator( custom = true, debug = true ) ] + /// ``` + #[ derive( Debug, Default ) ] + pub struct AttributeMutator + { + /// Indicates whether a custom mutator should be generated. + /// Defaults to `false`, meaning no custom mutator is generated unless explicitly requested. + pub custom : AttributePropertyCustom, + /// Specifies whether to print code generated for the field. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub debug : AttributePropertyDebug, + } + + impl AttributeComponent for AttributeMutator + { + const KEYWORD : & 'static str = "mutator"; + + /// Parses a `syn::Attribute` into an `AttributeMutator`. + fn from_meta( attr : & syn::Attribute ) -> Result< Self > + { + match attr.meta + { + syn::Meta::List( ref meta_list ) => + { + return syn::parse2::< AttributeMutator >( meta_list.tokens.clone() ); + }, + syn::Meta::Path( ref _path ) => + { + return Ok( Default::default() ) + }, + _ => return_syn_err! + ( + attr, + "Expects an attribute of format `#[ mutator( custom = true ) ]`. \nGot: {}", + qt! { #attr } + ), + } + } + } + + // Implement `Assign` trait to allow assigning `AttributeMutator` to `ItemAttributes`. + impl< IntoT > Assign< AttributeMutator, IntoT > for ItemAttributes + where + IntoT : Into< AttributeMutator >, + { + #[ inline( always ) ] + fn assign( & mut self, component : IntoT ) + { + self.mutator = component.into(); + } + } + + // Implement `Assign` trait to allow assigning `AttributePropertyDebug` to `AttributeMutator`. + impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeMutator + where + IntoT : Into< AttributePropertyDebug >, + { + #[ inline( always ) ] + fn assign( & mut self, component : IntoT ) + { + self.debug = component.into(); + } + } + + // Implement `Assign` trait to allow assigning `AttributePropertyCustom` to `AttributeMutator`. + impl< IntoT > Assign< AttributePropertyCustom, IntoT > for AttributeMutator + where + IntoT : Into< AttributePropertyCustom >, + { + #[ inline( always ) ] + fn assign( & mut self, component : IntoT ) + { + self.custom = component.into(); + } + } + + impl syn::parse::Parse for AttributeMutator + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut result = Self::default(); + + let error = | ident : & syn::Ident | -> syn::Error + { + let known = const_format::concatcp! + ( + "Known entries of attribute ", AttributeMutator::KEYWORD, " are: ", + AttributePropertyCustom::KEYWORD, + ", ", AttributePropertyDebug::KEYWORD, + "." + ); + syn_err! + ( + ident, + r#"Expects an attribute of format '#[ mutator( custom = false ) ]' + {known} + But got: '{}' + "#, + qt! { #ident } + ) + }; + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + + match ident.to_string().as_str() + { + AttributePropertyCustom::KEYWORD => result.assign( AttributePropertyCustom::parse( input )? ), + AttributePropertyDebug::KEYWORD => result.assign( AttributePropertyDebug::from( true ) ), + _ => return Err( error( & ident ) ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![,] ) + { + input.parse::< syn::Token![,] >()?; + } + } + + Ok( result ) + } + } + + // == Attribute properties + + /// Marker type for attribute property to specify whether to provide a sketch as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + #[ derive( Debug, Default, Clone, Copy ) ] + pub struct AttributePropertyDebugMarker; + + impl AttributePropertyComponent for AttributePropertyDebugMarker + { + const KEYWORD : & 'static str = "debug"; + } + + /// Specifies whether to provide a sketch as a hint. + /// Defaults to `false`, which means no hint is provided unless explicitly requested. + pub type AttributePropertyDebug = AttributePropertySingletone< AttributePropertyDebugMarker >; + + // == + + /// Marker type for attribute property to indicate whether a custom code should be generated. + /// Defaults to `false`, meaning no custom code is generated unless explicitly requested. + #[ derive( Debug, Default, Clone, Copy ) ] + pub struct AttributePropertyCustomMarker; + + impl AttributePropertyComponent for AttributePropertyCustomMarker + { + const KEYWORD : & 'static str = "custom"; + } + + /// Indicates whether a custom code should be generated. + /// Defaults to `false`, meaning no custom code is generated unless explicitly requested. + pub type AttributePropertyCustom = AttributePropertyBoolean< AttributePropertyCustomMarker >; + + // == test code + + // Parse an attribute and construct a `ItemAttributes` instance. + let input : syn::Attribute = syn::parse_quote!( #[ mutator( custom = true ) ] ); + let attrs : ItemAttributes = ItemAttributes::from_attrs( std::iter::once( & input ) ).unwrap(); + println!( "{:?}", attrs ); + + // Test `AttributePropertyBoolean` functionality. + let attr : AttributePropertyBoolean< AttributePropertyDebugMarker > = AttributePropertyBoolean::default(); + assert_eq!( attr.internal(), false ); + let attr : AttributePropertyBoolean< AttributePropertyDebugMarker > = true.into(); + assert_eq!( attr.internal(), true ); + let attr : AttributePropertyBoolean< AttributePropertyDebugMarker > = false.into(); + assert_eq!( attr.internal(), false ); + +} diff --git a/module/core/macro_tools/examples/macro_tools_trivial.rs b/module/core/macro_tools/examples/macro_tools_trivial.rs new file mode 100644 index 0000000000..e92559b193 --- /dev/null +++ b/module/core/macro_tools/examples/macro_tools_trivial.rs @@ -0,0 +1,39 @@ +//! This example demonstrates the use of `typ::type_parameters` from the `macro_tools` crate. +//! +//! ### Example: Trivial One +//! +//! The purpose of `typ::type_parameters` is to extract type parameters from a given Rust type. +//! In this example, we generate a type `core::option::Option` and extract its type parameters. +//! + +#[ cfg( not( feature = "enabled" ) ) ] +fn main(){} +#[ cfg( feature = "enabled" ) ] +fn main() +{ + // Import necessary macros and modules from the `macro_tools` crate. + use macro_tools::{ typ, qt }; + + // Generate a token stream representing the type `core::option::Option`. + let code = qt!( core::option::Option< i8, i16, i32, i64 > ); + + // Parse the generated token stream into a `syn::Type` object. + // `syn::Type` is a syntax tree node representing a Rust type. + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + + // Extract type parameters from the parsed type. + // `typ::type_parameters` takes a reference to a `syn::Type` and a range. + // It returns a vector of type parameters within the specified range. + // Here, `0..=2` specifies that we are interested in the first three type parameters. + let got = typ::type_parameters( &tree_type, 0..=2 ); + + // Iterate over the extracted type parameters and print each one. + // The `qt!` macro is used to convert the type parameter back to a token stream for printing. + got.iter().for_each( | e | println!( "{}", qt!( #e ) ) ); + + /* Expected output: + i8 + i16 + i32 + */ +} diff --git a/module/core/macro_tools/src/attr.rs b/module/core/macro_tools/src/attr.rs new file mode 100644 index 0000000000..4524ded53e --- /dev/null +++ b/module/core/macro_tools/src/attr.rs @@ -0,0 +1,477 @@ +//! +//! Attributes analyzys and manipulation. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// Checks if the given iterator of attributes contains an attribute named `debug`. + /// + /// This function iterates over an input sequence of `syn::Attribute`, typically associated with a struct, + /// enum, or other item in a Rust Abstract Syntax Tree ( AST ), and determines whether any of the attributes + /// is exactly named `debug`. + /// + /// # Parameters + /// - `attrs` : An iterator over `syn::Attribute`. This could be obtained from parsing Rust code + /// with the `syn` crate, where the iterator represents attributes applied to a Rust item ( like a struct or function ). + /// + /// # Returns + /// - `Ok( true )` if the `debug` attribute is present. + /// - `Ok( false )` if the `debug` attribute is not found. + /// - `Err( syn::Error )` if an unknown or improperly formatted attribute is encountered. + /// + /// # Example + /// + /// Suppose you have the following struct definition in a procedural macro input: + /// + /// ```rust, ignore + /// #[ derive( SomeDerive ) ] + /// #[ debug ] + /// struct MyStruct + /// { + /// field : i32, + /// } + /// ``` + /// + /// You can use `has_debug` to check for the presence of the `debug` attribute: + /// + /// ```rust + /// use macro_tools::exposed::*; + /// + /// // Example struct attribute + /// let attrs : Vec< syn::Attribute > = vec![ syn::parse_quote!( #[ debug ] ) ]; + /// + /// // Checking for 'debug' attribute + /// let contains_debug = attr::has_debug( ( &attrs ).into_iter() ).unwrap(); + /// + /// assert!( contains_debug, "Expected to find 'debug' attribute" ); + /// ``` + /// + + pub fn has_debug< 'a >( attrs : impl Iterator< Item = &'a syn::Attribute > ) -> Result< bool > + { + for attr in attrs + { + if let Some( ident ) = attr.path().get_ident() + { + let ident_string = format!( "{}", ident ); + if ident_string == "debug" + { + return Ok( true ) + } + } + else + { + return_syn_err!( "Unknown structure attribute:\n{}", qt!{ attr } ); + } + } + return Ok( false ) + } + + /// Checks if the given attribute name is a standard Rust attribute. + /// + /// Standard Rust attributes are those which are recognized and processed + /// directly by the Rust compiler. They influence various aspects of compilation, + /// including but not limited to conditional compilation, optimization hints, + /// code visibility, and procedural macro behavior. + /// + /// This function is useful when developing tools that need to interact with or + /// understand the significance of specific attributes in Rust source code, such + /// as linters, code analyzers, or procedural macros. + /// + /// This function does not cover all possible attributes but includes many of the + /// common ones that are relevant to most Rust projects. Developers are encouraged + /// to update this function as needed to suit more specialized needs, especially + /// when dealing with nightly-only compiler attributes or deprecated ones. + /// + /// # Parameters + /// - `attr_name`: A string slice that holds the name of the attribute to check. + /// + /// # Returns + /// Returns `true` if `attr_name` is a recognized standard Rust attribute. Otherwise, + /// returns `false`. + /// + /// # Examples + /// + /// Standard attributes: + /// + /// ``` + /// assert_eq!( macro_tools::attr::is_standard( "cfg" ), true ); + /// assert_eq!( macro_tools::attr::is_standard( "inline" ), true ); + /// assert_eq!( macro_tools::attr::is_standard( "derive" ), true ); + /// ``` + /// + /// Non-standard or custom attributes: + /// + /// ``` + /// assert_eq!( macro_tools::attr::is_standard( "custom_attr" ), false ); + /// assert_eq!( macro_tools::attr::is_standard( "my_attribute" ), false ); + /// ``` + /// + + pub fn is_standard<'a>( attr_name : &'a str ) -> bool + { + match attr_name + { + // Conditional compilation + "cfg" | "cfg_attr" => true, + + // Compiler instructions and optimizations + "inline" | "repr" | "derive" | "allow" | "warn" | "deny" | "forbid" => true, + + // Testing attributes + "test" | "bench" => true, + + // Documentation attributes + "doc" => true, + + // Visibility and accessibility + "pub" => true, // This would typically need context to be accurate + + // Safety and ABI + "unsafe" | "no_mangle" | "extern" => true, + + // Module and Crate configuration + "path" | "macro_use" | "crate_type" | "crate_name" => true, + + // Linking + "link" | "link_name" | "link_section" => true, + + // Usage warnings + "must_use" => true, + + // Other attributes + "cold" | "export_name" | "global_allocator" => true, + + // Module handling + "used" | "unused" => true, + + // Procedural macros and hygiene + "proc_macro" | "proc_macro_derive" | "proc_macro_attribute" => true, + + // Stability attributes + "stable" | "unstable" | "rustc_const_unstable" | "rustc_const_stable" | + "rustc_diagnostic_item" | "rustc_deprecated" | "rustc_legacy_const_generics" => true, + + // Special compiler attributes + "feature" | "non_exhaustive" => true, + + // Future compatibility + "rustc_paren_sugar" | "rustc_insignificant_dtor" => true, + + // Type system extensions + "opaque" => true, + + // Miscellaneous + "track_caller" => true, + + // Default case + _ => false, + } + } + + /// + /// Attribute which is inner. + /// + /// For example: `// #![ deny( missing_docs ) ]`. + /// + + #[ derive( Debug, PartialEq, Eq, Clone, Default ) ] + pub struct AttributesInner( pub Vec< syn::Attribute > ); + + impl From< Vec< syn::Attribute > > for AttributesInner + { + #[ inline( always ) ] + fn from( src : Vec< syn::Attribute > ) -> Self + { + Self( src ) + } + } + + impl From< AttributesInner > for Vec< syn::Attribute > + { + #[ inline( always ) ] + fn from( src : AttributesInner ) -> Self + { + src.0 + } + } + + impl AttributesInner + { + /// Iterator + pub fn iter( &self ) -> core::slice::Iter< '_, syn::Attribute > + { + self.0.iter() + } + } + + impl syn::parse::Parse + for AttributesInner + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + // let mut result : Self = from!(); + let mut result : Self = Default::default(); + loop + { + if !input.peek( Token![ # ] ) || !input.peek2( Token![ ! ] ) + { + break; + } + let input2; + let element = syn::Attribute + { + pound_token : input.parse()?, + style : syn::AttrStyle::Inner( input.parse()? ), + bracket_token : bracketed!( input2 in input ), + // path : input2.call( syn::Path::parse_mod_style )?, + // tokens : input2.parse()?, + meta : input2.parse()?, + }; + result.0.push( element ); + } + Ok( result ) + } + } + + impl quote::ToTokens + for AttributesInner + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + use crate::quote::TokenStreamExt; + tokens.append_all( self.0.iter() ); + } + } + + /// Represents a collection of outer attributes. + /// + /// This struct wraps a `Vec< syn::Attribute >`, providing utility methods for parsing, + /// converting, and iterating over outer attributes. Outer attributes are those that + /// appear outside of an item, such as `#[ ... ]` annotations in Rust. + /// + #[ derive( Debug, PartialEq, Eq, Clone, Default ) ] + pub struct AttributesOuter( pub Vec< syn::Attribute > ); + + impl From< Vec< syn::Attribute > > for AttributesOuter + { + #[ inline( always ) ] + fn from( src : Vec< syn::Attribute > ) -> Self + { + Self( src ) + } + } + + impl From< AttributesOuter > for Vec< syn::Attribute > + { + #[ inline( always ) ] + fn from( src : AttributesOuter ) -> Self + { + src.0 + } + } + + impl AttributesOuter + { + /// Iterator + pub fn iter( &self ) -> core::slice::Iter< '_, syn::Attribute > + { + self.0.iter() + } + } + + impl syn::parse::Parse + for AttributesOuter + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + let mut result : Self = Default::default(); + loop + { + if !input.peek( Token![ # ] ) || input.peek2( Token![ ! ] ) + { + break; + } + let input2; + let element = syn::Attribute + { + pound_token : input.parse()?, + style : syn::AttrStyle::Outer, + bracket_token : bracketed!( input2 in input ), + // path : input2.call( syn::Path::parse_mod_style )?, + // tokens : input2.parse()?, + meta : input2.parse()?, + }; + result.0.push( element ); + } + Ok( result ) + } + } + + impl quote::ToTokens + for AttributesOuter + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + use crate::quote::TokenStreamExt; + tokens.append_all( self.0.iter() ); + } + } + + /// Trait for components of a structure aggregating attributes that can be constructed from a meta attribute. + /// + /// The `AttributeComponent` trait defines the interface for components that can be created + /// from a `syn::Attribute` meta item. Implementors of this trait are required to define + /// a constant `KEYWORD` that identifies the type of the component and a method `from_meta` + /// that handles the construction of the component from the given attribute. + /// + /// This trait is designed to facilitate modular and reusable parsing of attributes applied + /// to structs, enums, or other constructs. By implementing this trait, you can create specific + /// components from attributes and then aggregate these components into a larger structure. + /// + /// # Example + /// + /// ```rust + /// use macro_tools::{ AttributeComponent, Result }; + /// use syn::{ Attribute, Error }; + /// + /// struct MyComponent; + /// + /// impl AttributeComponent for MyComponent + /// { + /// const KEYWORD : &'static str = "my_component"; + /// + /// fn from_meta( attr : &Attribute ) -> Result + /// { + /// // Parsing logic here + /// // Return Ok(MyComponent) if parsing is successful + /// // Return Err(Error::new_spanned(attr, "error message")) if parsing fails + /// Ok( MyComponent ) + /// } + /// } + /// ``` + /// + /// # Parameters + /// + /// - `attr` : A reference to the `syn::Attribute` from which the component is to be constructed. + /// + /// # Returns + /// + /// A `Result` containing the constructed component if successful, or an error if the parsing fails. + /// + pub trait AttributeComponent + where + Self : Sized, + { + /// The keyword that identifies the component. + /// + /// This constant is used to match the attribute to the corresponding component. + /// Each implementor of this trait must provide a unique keyword for its type. + const KEYWORD : &'static str; + + /// Constructs the component from the given meta attribute. + /// + /// This method is responsible for parsing the provided `syn::Attribute` and + /// returning an instance of the component. If the attribute cannot be parsed + /// into the component, an error should be returned. + /// + /// # Parameters + /// + /// - `attr` : A reference to the `syn::Attribute` from which the component is to be constructed. + /// + /// # Returns + /// + /// A `Result` containing the constructed component if successful, or an error if the parsing fails. + fn from_meta( attr : &syn::Attribute ) -> Result< Self >; + } + + /// Trait for properties of an attribute component that can be identified by a keyword. + /// + /// The `AttributePropertyComponent` trait defines the interface for attribute properties + /// that can be identified by a specific keyword. Implementors of this trait are required + /// to define a constant `KEYWORD` that identifies the type of the property. + /// + /// This trait is useful in scenarios where attributes may have multiple properties + /// that need to be parsed and handled separately. By defining a unique keyword for each property, + /// the parsing logic can accurately identify and process each property. + /// + /// # Example + /// + /// ```rust + /// use macro_tools::AttributePropertyComponent; + /// + /// struct MyProperty; + /// + /// impl AttributePropertyComponent for MyProperty + /// { + /// const KEYWORD : &'static str = "my_property"; + /// } + /// ``` + /// + pub trait AttributePropertyComponent + where + Self : Sized, + { + /// The keyword that identifies the component. + /// + /// This constant is used to match the attribute to the corresponding property. + /// Each implementor of this trait must provide a unique keyword for its type. + const KEYWORD : &'static str; + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + // equation, + has_debug, + is_standard, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as attr; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + AttributesInner, + AttributesOuter, + + AttributeComponent, + AttributePropertyComponent, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/attr_prop.rs b/module/core/macro_tools/src/attr_prop.rs new file mode 100644 index 0000000000..4e5020eff2 --- /dev/null +++ b/module/core/macro_tools/src/attr_prop.rs @@ -0,0 +1,168 @@ +//! +//! Attribute's properties. Reuse them to define how to parse properties of an attribute. +//! +//! # Example +//! +//! ```rust +//! use macro_tools::AttributePropertyBoolean; +//! +//! #[ derive( Debug, Default, Clone, Copy ) ] +//! pub struct DebugMarker; +//! +//! #[ derive( Debug, Default, Clone, Copy ) ] +//! pub struct EnabledMarker; +//! +//! pub trait AttributePropertyComponent +//! { +//! const KEYWORD : &'static str; +//! } +//! +//! impl AttributePropertyComponent for DebugMarker +//! { +//! const KEYWORD : &'static str = "debug"; +//! } +//! +//! impl AttributePropertyComponent for EnabledMarker +//! { +//! const KEYWORD : &'static str = "enabled"; +//! } +//! +//! #[ derive( Debug, Default ) ] +//! struct MyAttributes +//! { +//! pub debug : AttributePropertyBoolean< DebugMarker >, +//! pub enabled : AttributePropertyBoolean< EnabledMarker >, +//! } +//! +//! impl syn::parse::Parse for MyAttributes +//! { +//! fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > +//! { +//! let mut debug = AttributePropertyBoolean::< DebugMarker >::default(); +//! let mut enabled = AttributePropertyBoolean::< EnabledMarker >::default(); +//! +//! while !input.is_empty() +//! { +//! let lookahead = input.lookahead1(); +//! if lookahead.peek( syn::Ident ) +//! { +//! let ident : syn::Ident = input.parse()?; +//! match ident.to_string().as_str() +//! { +//! DebugMarker::KEYWORD => debug = input.parse()?, +//! EnabledMarker::KEYWORD => enabled = input.parse()?, +//! _ => return Err( lookahead.error() ), +//! } +//! } +//! else +//! { +//! return Err( lookahead.error() ); +//! } +//! +//! // Optional comma handling +//! if input.peek( syn::Token![,] ) +//! { +//! input.parse::< syn::Token![,] >()?; +//! } +//! } +//! +//! Ok( MyAttributes { debug, enabled } ) +//! } +//! } +//! +//! let input : syn::Attribute = syn::parse_quote!( #[ attribute( enabled = true ) ] ); +//! let meta = match input.meta +//! { +//! syn::Meta::List( meta_list ) => meta_list, +//! _ => panic!( "Expected a Meta::List" ), +//! }; +//! +//! let nested_meta_stream : proc_macro2::TokenStream = meta.tokens; +//! let attrs : MyAttributes = syn::parse2( nested_meta_stream ).unwrap(); +//! println!( "{:?}", attrs ); +//! ``` +//! +//! In this example, the `AttributePropertyBoolean` struct is used to define attributes with boolean properties. +//! The `DebugMarker` and `EnabledMarker` structs act as markers to distinguish between different boolean attributes. +//! The `MyAttributes` struct aggregates these boolean attributes. +//! +//! The `Parse` implementation for `MyAttributes` iterates through the attribute's key-value pairs, +//! identifying each by its marker's keyword and parsing the boolean value. +//! It uses the `ParseStream` to parse identifiers and their associated values, +//! matching them to the appropriate marker's keyword. +//! If an unrecognized identifier is encountered, it returns an error. +//! +//! The `parse_quote!` macro is used to create a `syn::Attribute` instance with the attribute syntax, +//! which is then parsed into the `MyAttributes` struct. The resulting `MyAttributes` instance is printed to the console. + +mod singletone; +mod singletone_optional; +mod boolean; +mod boolean_optional; +mod syn; +mod syn_optional; + +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::*; + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as attr_prop; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + + singletone::AttributePropertySingletone, + singletone::AttributePropertySingletoneMarker, + singletone_optional::AttributePropertyOptionalSingletone, + singletone_optional::AttributePropertyOptionalSingletoneMarker, + boolean::AttributePropertyBoolean, + boolean::AttributePropertyBooleanMarker, + boolean_optional::AttributePropertyOptionalBoolean, + boolean_optional::AttributePropertyOptionalBooleanMarker, + syn::AttributePropertySyn, + syn::AttributePropertySynMarker, + syn_optional::AttributePropertyOptionalSyn, + syn_optional::AttributePropertyOptionalSynMarker, + + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/attr_prop/boolean.rs b/module/core/macro_tools/src/attr_prop/boolean.rs new file mode 100644 index 0000000000..4472b3ae42 --- /dev/null +++ b/module/core/macro_tools/src/attr_prop/boolean.rs @@ -0,0 +1,196 @@ +//! +//! A generic boolean attribute property. +//! Defaults to `false`. +//! + +use crate::*; +use former_types::Assign; + +/// Default marker for `AttributePropertyBoolean`. +/// Used if no marker is defined as parameter. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyBooleanMarker; + +/// A generic boolean attribute property. +/// Defaults to `false`. +/// +/// # Example +/// +/// ```rust +/// use macro_tools::AttributePropertyBoolean; +/// +/// #[ derive( Debug, Default, Clone, Copy ) ] +/// pub struct DebugMarker; +/// +/// #[ derive( Debug, Default, Clone, Copy ) ] +/// pub struct EnabledMarker; +/// +/// pub trait AttributePropertyComponent +/// { +/// const KEYWORD : &'static str; +/// } +/// +/// impl AttributePropertyComponent for DebugMarker +/// { +/// const KEYWORD : &'static str = "debug"; +/// } +/// +/// impl AttributePropertyComponent for EnabledMarker +/// { +/// const KEYWORD : &'static str = "enabled"; +/// } +/// +/// #[ derive( Debug, Default ) ] +/// struct MyAttributes +/// { +/// pub debug : AttributePropertyBoolean< DebugMarker >, +/// pub enabled : AttributePropertyBoolean< EnabledMarker >, +/// } +/// +/// impl syn::parse::Parse for MyAttributes +/// { +/// fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > +/// { +/// let mut debug = AttributePropertyBoolean::< DebugMarker >::default(); +/// let mut enabled = AttributePropertyBoolean::< EnabledMarker >::default(); +/// +/// while !input.is_empty() +/// { +/// let lookahead = input.lookahead1(); +/// if lookahead.peek( syn::Ident ) +/// { +/// let ident : syn::Ident = input.parse()?; +/// match ident.to_string().as_str() +/// { +/// DebugMarker::KEYWORD => debug = input.parse()?, +/// EnabledMarker::KEYWORD => enabled = input.parse()?, +/// _ => return Err( lookahead.error() ), +/// } +/// } +/// else +/// { +/// return Err( lookahead.error() ); +/// } +/// +/// // Optional comma handling +/// if input.peek( syn::Token![,] ) +/// { +/// input.parse::< syn::Token![,] >()?; +/// } +/// } +/// +/// Ok( MyAttributes { debug, enabled } ) +/// } +/// } +/// +/// let input : syn::Attribute = syn::parse_quote!( #[ attribute( enabled = true ) ] ); +/// let meta = match input.meta +/// { +/// syn::Meta::List( meta_list ) => meta_list, +/// _ => panic!( "Expected a Meta::List" ), +/// }; +/// +/// let nested_meta_stream : proc_macro2::TokenStream = meta.tokens; +/// let attrs : MyAttributes = syn::parse2( nested_meta_stream ).unwrap(); +/// println!( "{:?}", attrs ); +/// ``` +/// +/// In this example, the `AttributePropertyBoolean` struct is used to define attributes with boolean properties. +/// The `DebugMarker` and `EnabledMarker` structs act as markers to distinguish between different boolean attributes. +/// The `MyAttributes` struct aggregates these boolean attributes. +/// +/// The `Parse` implementation for `MyAttributes` iterates through the attribute's key-value pairs, +/// identifying each by its marker's keyword and parsing the boolean value. +/// It uses the `ParseStream` to parse identifiers and their associated values, +/// matching them to the appropriate marker's keyword. +/// If an unrecognized identifier is encountered, it returns an error. +/// +/// The `parse_quote!` macro is used to create a `syn::Attribute` instance with the attribute syntax, +/// which is then parsed into the `MyAttributes` struct. The resulting `MyAttributes` instance is printed to the console. + +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyBoolean< Marker = AttributePropertyBooleanMarker >( bool, ::core::marker::PhantomData< Marker > ); + +impl< Marker > AttributePropertyBoolean< Marker > +{ + /// Just unwraps and returns the internal data. + #[ inline( always ) ] + pub fn internal( self ) -> bool + { + self.0 + } + + /// Returns a reference to the internal boolean value. + #[ inline( always ) ] + pub fn ref_internal( &self ) -> &bool + { + &self.0 + } +} + +impl< Marker, IntoT > Assign< AttributePropertyBoolean< Marker >, IntoT > +for AttributePropertyBoolean< Marker > +where + IntoT : Into< AttributePropertyBoolean< Marker > >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + *self = component.into(); + } +} + +impl< Marker > AttributePropertyComponent for AttributePropertyBoolean< Marker > +where + Marker : AttributePropertyComponent, +{ + const KEYWORD : &'static str = Marker::KEYWORD; +} + +impl< Marker > syn::parse::Parse for AttributePropertyBoolean< Marker > +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + input.parse::< syn::Token![ = ] >()?; + let value : syn::LitBool = input.parse()?; + Ok( value.value.into() ) + } +} + +impl< Marker > From< bool > for AttributePropertyBoolean< Marker > +{ + #[ inline( always ) ] + fn from( src : bool ) -> Self + { + Self( src, Default::default() ) + } +} + +impl< Marker > From< AttributePropertyBoolean< Marker > > for bool +{ + #[ inline( always ) ] + fn from( src : AttributePropertyBoolean< Marker > ) -> Self + { + src.0 + } +} + +impl< Marker > core::ops::Deref for AttributePropertyBoolean< Marker > +{ + type Target = bool; + + #[ inline( always ) ] + fn deref( &self ) -> &bool + { + &self.0 + } +} + +impl< Marker > AsRef< bool > for AttributePropertyBoolean< Marker > +{ + #[ inline( always ) ] + fn as_ref( &self ) -> &bool + { + &self.0 + } +} diff --git a/module/core/macro_tools/src/attr_prop/boolean_optional.rs b/module/core/macro_tools/src/attr_prop/boolean_optional.rs new file mode 100644 index 0000000000..680803f4c8 --- /dev/null +++ b/module/core/macro_tools/src/attr_prop/boolean_optional.rs @@ -0,0 +1,117 @@ +//! +//! A generic optional boolean attribute property: `Option< bool >`. +//! Defaults to `false`. +//! + +use crate::*; +use former_types::Assign; + +/// Default marker for `AttributePropertyOptionalSingletone`. +/// Used if no marker is defined as parameter. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyOptionalBooleanMarker; + +/// A generic optional boolean attribute property: `Option< bool >`. +/// Defaults to `false`. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyOptionalBoolean< Marker = AttributePropertyOptionalBooleanMarker >( Option< bool >, ::core::marker::PhantomData< Marker > ); + +impl< Marker > AttributePropertyOptionalBoolean< Marker > +{ + /// Just unwraps and returns the internal data. + #[ inline( always ) ] + pub fn internal( self ) -> Option< bool > + { + self.0 + } + + /// Returns a reference to the internal optional boolean value. + #[ inline( always ) ] + pub fn ref_internal( &self ) -> Option< &bool > + { + self.0.as_ref() + } + +} + +impl< Marker, IntoT > Assign< AttributePropertyOptionalBoolean< Marker >, IntoT > +for AttributePropertyOptionalBoolean< Marker > +where + IntoT : Into< AttributePropertyOptionalBoolean< Marker > >, +{ + /// Inserts value of another instance into the option if it is None, then returns a mutable reference to the contained value. + /// If another instance does is None then do nothing. + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + match component.0 + { + Some( val ) => { self.0 = Some( val ); }, + None => {}, + } + } +} + +impl< Marker > AttributePropertyComponent for AttributePropertyOptionalBoolean< Marker > +where + Marker : AttributePropertyComponent, +{ + const KEYWORD : &'static str = Marker::KEYWORD; +} + +impl< Marker > syn::parse::Parse for AttributePropertyOptionalBoolean< Marker > +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + input.parse::< syn::Token![ = ] >()?; + let value : syn::LitBool = input.parse()?; + Ok( value.value.into() ) + } +} + +impl< Marker > From< bool > for AttributePropertyOptionalBoolean< Marker > +{ + #[ inline( always ) ] + fn from( src : bool ) -> Self + { + Self( Some( src ), Default::default() ) + } +} + +impl< Marker > From< Option< bool > > for AttributePropertyOptionalBoolean< Marker > +{ + #[ inline( always ) ] + fn from( src : Option< bool > ) -> Self + { + Self( src, Default::default() ) + } +} + +impl< Marker > From< AttributePropertyOptionalBoolean< Marker > > for Option< bool > +{ + #[ inline( always ) ] + fn from( src : AttributePropertyOptionalBoolean< Marker > ) -> Self + { + src.0 + } +} + +impl< Marker > core::ops::Deref for AttributePropertyOptionalBoolean< Marker > +{ + type Target = Option< bool >; + #[ inline( always ) ] + fn deref( &self ) -> &Option< bool > + { + &self.0 + } +} + +impl< Marker > AsRef< Option< bool > > for AttributePropertyOptionalBoolean< Marker > +{ + #[ inline( always ) ] + fn as_ref( &self ) -> &Option< bool > + { + &self.0 + } +} diff --git a/module/core/macro_tools/src/attr_prop/singletone.rs b/module/core/macro_tools/src/attr_prop/singletone.rs new file mode 100644 index 0000000000..1d55d9ac7c --- /dev/null +++ b/module/core/macro_tools/src/attr_prop/singletone.rs @@ -0,0 +1,108 @@ +//! A generic `bool` attribute property which consists of only keyword. +//! Defaults to `None`. +//! +//! This property can have two states: `true`, or `false`. +//! +//! # Example +//! +//! ```ignore +//! #[ attribute( some ) ] +//! ``` +//! +//! This is useful for attributes that need to enable or disable features or flags. + +use crate::*; +use former_types::Assign; + +/// Default marker for `AttributePropertySingletone`. +/// Used if no marker is defined as parameter. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertySingletoneMarker; + +/// A generic boolean attribute property which consists of only keyword. +/// This property can have two states: `true`, or `false`. +/// Defaults to `false`. +/// +/// Unlike other properties, it does not implement parse, because it consists only of keyword which should be parsed outside of the property. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertySingletone< Marker = AttributePropertySingletoneMarker > +( + bool, + ::core::marker::PhantomData< Marker >, +); + +impl< Marker > AttributePropertySingletone< Marker > +{ + + /// Unwraps and returns the internal optional boolean value. + #[ inline( always ) ] + pub fn internal( self ) -> bool + { + self.0 + } + + /// Returns a reference to the internal optional boolean value. + #[ inline( always ) ] + pub fn ref_internal( &self ) -> &bool + { + &self.0 + } + +} + +impl< Marker, IntoT > Assign< AttributePropertySingletone< Marker >, IntoT > +for AttributePropertySingletone< Marker > +where + IntoT : Into< AttributePropertySingletone< Marker > >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + *self = component.into(); + } +} + +impl< Marker > AttributePropertyComponent for AttributePropertySingletone< Marker > +where + Marker : AttributePropertyComponent, +{ + const KEYWORD : &'static str = Marker::KEYWORD; +} + +impl< Marker > From< bool > for AttributePropertySingletone< Marker > +{ + #[ inline( always ) ] + fn from( src : bool ) -> Self + { + Self( src, Default::default() ) + } +} + +impl< Marker > From< AttributePropertySingletone< Marker > > for bool +{ + #[ inline( always ) ] + fn from( src : AttributePropertySingletone< Marker > ) -> Self + { + src.0 + } +} + +impl< Marker > core::ops::Deref for AttributePropertySingletone< Marker > +{ + type Target = bool; + + #[ inline( always ) ] + fn deref( &self ) -> &bool + { + &self.0 + } +} + +impl< Marker > AsRef< bool > for AttributePropertySingletone< Marker > +{ + #[ inline( always ) ] + fn as_ref( &self ) -> &bool + { + &self.0 + } +} diff --git a/module/core/macro_tools/src/attr_prop/singletone_optional.rs b/module/core/macro_tools/src/attr_prop/singletone_optional.rs new file mode 100644 index 0000000000..39c3dd9940 --- /dev/null +++ b/module/core/macro_tools/src/attr_prop/singletone_optional.rs @@ -0,0 +1,139 @@ +//! A generic `Option< bool >` attribute property which consists of only keyword. +//! Defaults to `None`. +//! +//! This property can have three states: `None`, `Some( true )`, or `Some( false )`. +//! It parses `on` and `off` keywords to represent `Some( true )` and `Some( false )` respectively. +//! +//! # Example +//! +//! ```ignore +//! #[ attribute( on) ] +//! #[ attribute( off ) ] +//! ``` +//! +//! This is useful for attributes that need to enable or disable features or flags. + +use crate::*; +use former_types::Assign; + +/// Default marker for `AttributePropertyOptionalSingletone`. +/// Used if no marker is defined as parameter. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyOptionalSingletoneMarker; + +/// A generic attribute property for switching on/off. +/// Has 3 states: `None`, `Some( true )`, `Some( false )`. +/// Defaults to `None`. +/// +/// Unlike [`AttributePropertyOptionalBoolean`], it "understands" `on`, `off` keywords during parsing. +/// For example: `#[ attribute( on ) ]` and `#[ attribute( off )]`. +/// As a consequence, the property has two keywords. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyOptionalSingletone< Marker = AttributePropertyOptionalSingletoneMarker > +( + Option< bool >, + ::core::marker::PhantomData< Marker >, +); + +impl< Marker > AttributePropertyOptionalSingletone< Marker > +{ + + /// Return bool value: on/off, use argument as default if it's `None`. + #[ inline ] + pub fn value( self, default : bool ) -> bool + { + if self.0.is_none() + { + return default; + } + self.0.unwrap() + } + + /// Unwraps and returns the internal optional boolean value. + #[ inline( always ) ] + pub fn internal( self ) -> Option< bool > + { + self.0 + } + + /// Returns a reference to the internal optional boolean value. + #[ inline( always ) ] + pub fn ref_internal( &self ) -> Option< &bool > + { + self.0.as_ref() + } + +} + +impl< Marker, IntoT > Assign< AttributePropertyOptionalSingletone< Marker >, IntoT > +for AttributePropertyOptionalSingletone< Marker > +where + IntoT : Into< AttributePropertyOptionalSingletone< Marker > >, +{ + /// Inserts value of another instance into the option if it is None, then returns a mutable reference to the contained value. + /// If another instance does is None then do nothing. + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + match component.0 + { + Some( val ) => { self.0 = Some( val ); }, + None => {}, + } + } +} + +impl< Marker > AttributePropertyComponent for AttributePropertyOptionalSingletone< Marker > +where + Marker : AttributePropertyComponent, +{ + const KEYWORD : &'static str = Marker::KEYWORD; +} + +impl< Marker > From< bool > for AttributePropertyOptionalSingletone< Marker > +{ + #[ inline( always ) ] + fn from( src : bool ) -> Self + { + Self( Some( src ), Default::default() ) + } +} + +impl< Marker > From< Option< bool > > for AttributePropertyOptionalSingletone< Marker > +{ + #[ inline( always ) ] + fn from( src : Option< bool > ) -> Self + { + Self( src, Default::default() ) + } +} + +impl< Marker > From< AttributePropertyOptionalSingletone< Marker > > for Option< bool > +{ + #[ inline( always ) ] + fn from( src : AttributePropertyOptionalSingletone< Marker > ) -> Self + { + src.0 + } +} + +impl< Marker > core::ops::Deref for AttributePropertyOptionalSingletone< Marker > +{ + type Target = Option< bool >; + + #[ inline( always ) ] + fn deref( &self ) -> &Option< bool > + { + &self.0 + } +} + +impl< Marker > AsRef< Option< bool > > for AttributePropertyOptionalSingletone< Marker > +{ + #[ inline( always ) ] + fn as_ref( &self ) -> &Option< bool > + { + &self.0 + } +} diff --git a/module/core/macro_tools/src/attr_prop/syn.rs b/module/core/macro_tools/src/attr_prop/syn.rs new file mode 100644 index 0000000000..c60a21cfdd --- /dev/null +++ b/module/core/macro_tools/src/attr_prop/syn.rs @@ -0,0 +1,115 @@ +//! +//! Property of an attribute which simply wraps one of the standard `syn` types. +//! + +use crate::*; +use former_types::Assign; + +/// Default marker for `AttributePropertySyn`. +/// Used if no marker is defined as parameter. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertySynMarker; + +/// +/// Property of an attribute which simply wraps one of the standard `syn` types. +/// + +#[ derive( Debug, Clone ) ] +pub struct AttributePropertySyn< T, Marker = AttributePropertySynMarker >( T, ::core::marker::PhantomData< Marker > ) +where + T : syn::parse::Parse + quote::ToTokens; + +impl< T, Marker > AttributePropertySyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, +{ + /// Just unwraps and returns the internal data. + // #[ allow( dead_code ) ] + #[ inline( always ) ] + pub fn internal( self ) -> T + { + self.0 + } + + /// Returns a reference to the internal data. + // #[ allow( dead_code ) ] + #[ inline( always ) ] + pub fn ref_internal( &self ) -> &T + { + &self.0 + } +} + +impl< T, Marker, IntoT > Assign< AttributePropertySyn< T, Marker >, IntoT > +for AttributePropertySyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, + IntoT : Into< AttributePropertySyn< T, Marker > >, +{ + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + *self = component.into(); + } +} + +impl< T, Marker > AttributePropertyComponent for AttributePropertySyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, + Marker : AttributePropertyComponent, +{ + const KEYWORD : &'static str = Marker::KEYWORD; +} + +impl< T, Marker > syn::parse::Parse for AttributePropertySyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + input.parse::< syn::Token![ = ] >()?; + let value : T = input.parse()?; + Ok( value.into() ) + } +} + +impl< T, Marker > quote::ToTokens for AttributePropertySyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, +{ + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.0.to_tokens( tokens ); + } +} + +impl< T, Marker > core::ops::Deref for AttributePropertySyn< T, Marker > +where T : syn::parse::Parse + quote::ToTokens +{ + type Target = T; + #[ inline( always ) ] + fn deref( &self ) -> &T + { + &self.0 + } +} + +impl< T, Marker > AsRef< T > for AttributePropertySyn< T, Marker > +where T : syn::parse::Parse + quote::ToTokens +{ + #[ inline( always ) ] + fn as_ref( &self ) -> &T + { + &self.0 + } +} + +impl< T, Marker > From< T > for AttributePropertySyn< T, Marker > +where T : syn::parse::Parse + quote::ToTokens +{ + #[ inline( always ) ] + fn from( src : T ) -> Self + { + Self( src, Default::default() ) + } +} diff --git a/module/core/macro_tools/src/attr_prop/syn_optional.rs b/module/core/macro_tools/src/attr_prop/syn_optional.rs new file mode 100644 index 0000000000..d595e9496a --- /dev/null +++ b/module/core/macro_tools/src/attr_prop/syn_optional.rs @@ -0,0 +1,160 @@ +//! +//! Property of an attribute which simply wraps one of the standard `syn` types and keeps it optional. +//! + +use crate::*; +use former_types::Assign; + +/// Default marker for `AttributePropertyOptionalSyn`. +/// Used if no marker is defined as parameter. +#[ derive( Debug, Default, Clone, Copy ) ] +pub struct AttributePropertyOptionalSynMarker; + +/// +/// Property of an attribute which simply wraps one of the standard `syn` types and keeps it optional. +/// + +#[ derive( Debug, Clone ) ] +pub struct AttributePropertyOptionalSyn< T, Marker = AttributePropertyOptionalSynMarker >( Option< T >, ::core::marker::PhantomData< Marker > ) +where + T : syn::parse::Parse + quote::ToTokens; + +impl< T, Marker > AttributePropertyOptionalSyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, +{ + /// Just unwraps and returns the internal data. + #[ inline( always ) ] + pub fn internal( self ) -> Option< T > + { + self.0 + } + + /// Returns an Option reference to the internal data. + #[ inline( always ) ] + pub fn ref_internal( &self ) -> Option< &T > + { + self.0.as_ref() + } +} + +impl< T, Marker, IntoT > Assign< AttributePropertyOptionalSyn< T, Marker >, IntoT > +for AttributePropertyOptionalSyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, + IntoT : Into< AttributePropertyOptionalSyn< T, Marker > >, +{ + /// Inserts value of another instance into the option if it is None, then returns a mutable reference to the contained value. + /// If another instance does is None then do nothing. + #[ inline( always ) ] + fn assign( &mut self, component : IntoT ) + { + let component = component.into(); + match component.0 + { + Some( val ) => { self.0 = Some( val ); }, + None => {}, + } + } +} + +impl< T, Marker > AttributePropertyComponent for AttributePropertyOptionalSyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, + Marker : AttributePropertyComponent, +{ + const KEYWORD : &'static str = Marker::KEYWORD; +} + +impl< T, Marker > Default for AttributePropertyOptionalSyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, +{ + fn default() -> Self + { + Self( None, Default::default() ) + } +} + +impl< T, Marker > syn::parse::Parse for AttributePropertyOptionalSyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, +{ + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + input.parse::< syn::Token![ = ] >()?; + let value : T = input.parse()?; + Ok( value.into() ) + } +} + +impl< T, Marker > quote::ToTokens for AttributePropertyOptionalSyn< T, Marker > +where + T : syn::parse::Parse + quote::ToTokens, +{ + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.0.to_tokens( tokens ); + } +} + +impl< T, Marker > core::ops::Deref for AttributePropertyOptionalSyn< T, Marker > +where T : syn::parse::Parse + quote::ToTokens +{ + type Target = Option< T >; + #[ inline( always ) ] + fn deref( &self ) -> &Option< T > + { + &self.0 + } +} + +impl< T, Marker > AsRef< Option< T > > for AttributePropertyOptionalSyn< T, Marker > +where T : syn::parse::Parse + quote::ToTokens +{ + #[ inline( always ) ] + fn as_ref( &self ) -> &Option< T > + { + &self.0 + } +} + +impl< T, Marker > From< T > for AttributePropertyOptionalSyn< T, Marker > +where T : syn::parse::Parse + quote::ToTokens +{ + #[ inline( always ) ] + fn from( src : T ) -> Self + { + Self( Some( src ), Default::default() ) + } +} + +impl< T, Marker > From< Option< T > > for AttributePropertyOptionalSyn< T, Marker > +where T : syn::parse::Parse + quote::ToTokens +{ + #[ inline( always ) ] + fn from( src : Option< T > ) -> Self + { + Self( src, Default::default() ) + } +} + +impl< T, Marker > From< AttributePropertyOptionalSyn< T, Marker > > for Option< T > +where T : syn::parse::Parse + quote::ToTokens +{ + #[ inline( always ) ] + fn from( src : AttributePropertyOptionalSyn< T, Marker > ) -> Self + { + src.0 + } +} + +impl< 'a, T, Marker > From< &'a AttributePropertyOptionalSyn< T, Marker > > for Option< &'a T > +where T : syn::parse::Parse + quote::ToTokens +{ + #[ inline( always ) ] + fn from( src : &'a AttributePropertyOptionalSyn< T, Marker > ) -> Self + { + src.0.as_ref() + } +} diff --git a/module/core/macro_tools/src/container_kind.rs b/module/core/macro_tools/src/container_kind.rs new file mode 100644 index 0000000000..a516594e47 --- /dev/null +++ b/module/core/macro_tools/src/container_kind.rs @@ -0,0 +1,142 @@ +//! +//! Determine kind of a container. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + // use crate::type_rightmost; + + /// + /// Kind of container. + /// + + #[ derive( Debug, PartialEq, Eq, Copy, Clone ) ] + pub enum ContainerKind + { + /// Not a container. + No, + /// Vector-like. + Vector, + /// Hash map-like. + HashMap, + /// Hash set-like. + HashSet, + } + + /// Return kind of container specified by type. + /// + /// Good to verify `alloc::vec::Vec< i32 >` is vector. + /// Good to verify `std::collections::HashMap< i32, i32 >` is hash map. + /// + /// ### Basic use-case. + /// ``` + /// use macro_tools::exposed::*; + /// + /// let code = qt!( std::collections::HashMap< i32, i32 > ); + /// let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + /// let kind = container_kind::of_type( &tree_type ); + /// assert_eq!( kind, container_kind::ContainerKind::HashMap ); + /// ``` + + pub fn of_type( ty : &syn::Type ) -> ContainerKind + { + + if let syn::Type::Path( path ) = ty + { + let last = &path.path.segments.last(); + if last.is_none() + { + return ContainerKind::No + } + match last.unwrap().ident.to_string().as_ref() + { + "Vec" => { return ContainerKind::Vector } + "HashMap" => { return ContainerKind::HashMap } + "HashSet" => { return ContainerKind::HashSet } + _ => { return ContainerKind::No } + } + } + ContainerKind::No + } + + /// Return kind of container specified by type. Unlike [of_type] it also understand optional types. + /// + /// Good to verify `Option< alloc::vec::Vec< i32 > >` is optional vector. + /// + /// ### Basic use-case. + /// ``` + /// use macro_tools::exposed::*; + /// + /// let code = qt!( Option< std::collections::HashMap< i32, i32 > > ); + /// let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + /// let ( kind, optional ) = container_kind::of_optional( &tree_type ); + /// assert_eq!( kind, container_kind::ContainerKind::HashMap ); + /// assert_eq!( optional, true ); + /// ``` + + pub fn of_optional( ty : &syn::Type ) -> ( ContainerKind, bool ) + { + + if typ::type_rightmost( ty ) == Some( "Option".to_string() ) + { + let ty2 = typ::type_parameters( ty, 0 ..= 0 ).first().copied(); + // inspect_type::inspect_type_of!( ty2 ); + if ty2.is_none() + { + return ( ContainerKind::No, false ) + } + let ty2 = ty2.unwrap(); + return ( of_type( ty2 ), true ) + } + + ( of_type( ty ), false ) + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + ContainerKind, + of_type, + of_optional, + }; + +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as container_kind; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/derive.rs b/module/core/macro_tools/src/derive.rs new file mode 100644 index 0000000000..13db46db90 --- /dev/null +++ b/module/core/macro_tools/src/derive.rs @@ -0,0 +1,104 @@ +//! +//! Macro helpers around derive macro and structure [`syn::DeriveInput`]. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use syn::punctuated::Punctuated; + + /// + /// Extracts the named fields from a struct defined in a `syn::DeriveInput`. + /// + /// This function specifically handles `syn::DeriveInput` that represent structs + /// with named fields. It will return an error if the provided AST does not conform to these expectations. + /// + /// # Example + /// + /// ```rust, ignore + /// let ast = match syn::parse::< syn::DeriveInput >( input ) + /// { + /// Ok( syntax_tree ) => syntax_tree, + /// Err( err ) => return Err( err ), + /// }; + /// let fields = derive.named_fields( &ast ); + /// ``` + + pub fn named_fields< 'a >( ast : &'a syn::DeriveInput ) -> crate::Result< &'a Punctuated< syn::Field, syn::token::Comma > > + { + + let fields = match ast.data + { + syn::Data::Struct( ref data_struct ) => match data_struct.fields + { + syn::Fields::Named( ref fields_named ) => + { + &fields_named.named + }, + _ => return Err( syn_err!( ast, "Unknown format of data, expected syn::Fields::Named( ref fields_named )\n {}", qt!{ #ast } ) ), + }, + _ => return Err( syn_err!( ast, "Unknown format of data, expected syn::Data::Struct( ref data_struct )\n {}", qt!{ #ast } ) ), + }; + + Ok( fields ) + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + named_fields, + }; + +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as derive; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; + +} diff --git a/module/core/macro_tools/src/diag.rs b/module/core/macro_tools/src/diag.rs new file mode 100644 index 0000000000..10a7e9e0a5 --- /dev/null +++ b/module/core/macro_tools/src/diag.rs @@ -0,0 +1,445 @@ +//! +//! Macro helpers. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// + /// Result with syn::Error. + /// + + pub type Result< T > = std::result::Result< T, syn::Error >; + + /// Adds indentation and optional prefix/postfix to each line of the given string. + /// + /// This function iterates over each line in the input string and applies the specified + /// prefix and postfix to it, effectively indenting the string and optionally wrapping + /// each line with additional content. + /// + /// # Parameters + /// - `prefix` : The string to prepend to each line, typically used for indentation. + /// - `src` : The source string to be indented and modified. + /// - `postfix` : The string to append to each line, can be used for line terminators or other suffixes. + /// + /// # Type Parameters + /// - `Prefix` : A type that can be referenced as a string slice, for the prefix. + /// - `Src` : A type that can be referenced as a string slice, for the source string. + /// - `Postfix` : A type that can be referenced as a string slice, for the postfix. + /// + /// # Returns + /// A `String` that represents the original `src` string with `prefix` and `postfix` applied to each line. + /// + /// # Example + /// ``` + /// use macro_tools::diag; + /// + /// let input = "Line 1\nLine 2\nLine 3"; + /// let indented = diag::indentation( " ", input, ";" ); + /// assert_eq!( indented, " Line 1;\n Line 2;\n Line 3;" ); + /// + /// // Demonstrating the function's handling of trailing newlines + /// let input_with_newline = "Line 1\nLine 2\nLine 3\n"; + /// let indented_with_newline = diag::indentation( " ", input_with_newline, ";" ); + /// assert_eq!( indented_with_newline, " Line 1;\n Line 2;\n Line 3;\n ;" ); + /// ``` + /// + /// In the example above, `indentation` is used to add two spaces before each line + /// and a semicolon at the end of each line. The function also demonstrates handling + /// of input strings that end with a newline character by appending an additional line + /// consisting only of the prefix and postfix. + + pub fn indentation< Prefix, Src, Postfix >( prefix : Prefix, src : Src, postfix : Postfix ) -> String + where + Prefix : AsRef< str >, + Src : AsRef< str >, + Postfix : AsRef< str >, + { + let prefix = prefix.as_ref(); + let postfix = postfix.as_ref(); + let src = src.as_ref(); + + let mut result = src + .lines() + .enumerate() + .fold( String::new(), | mut a, b | + { + if b.0 > 0 + { + a.push_str( "\n" ); + } + a.push_str( prefix ); + a.push_str( &b.1 ); + a.push_str( postfix ); + a + }); + + if src.ends_with( "\n" ) || src.ends_with( "\n\r" ) || src.ends_with( "\r\n" ) + { + result.push_str( "\n" ); + result.push_str( prefix ); + result.push_str( postfix ); + } + + result + } + + /// Formats a debugging report for code transformation processes, detailing both the original and generated code for easy comparison and review. + /// + /// This function creates a structured report comprising the initial input code, the resulting generated code, and an explanatory context. It is designed to facilitate debugging and documentation of code transformations, such as those performed in procedural macros or similar code generation tasks. The report categorizes the information into labeled sections to enhance readability and traceability. + /// + /// This function helps visualize the changes from the original to the generated code, assisting developers in verifying and understanding the transformations applied during code generation processes. + /// + /// # Parameters + /// + /// - `about` : A description or context explaining the purpose or nature of the transformation. This information is displayed at the beginning of the report to provide an overview of the code transformation context. + /// - `input` : The original code before transformation. This is typically the code that is subject to processing by macros or other code generation tools. + /// - `output` : The code generated as a result of the transformation. This reflects the changes or enhancements made to the original code. + /// + /// # Type Parameters + /// + /// - `IntoAbout` : A type that can be converted into a string representation, providing a descriptive context for the report. + /// - `IntoInput` : A type representing the original code, which can be converted into a string format for display. + /// - `IntoOutput` : A type representing the generated code, which can be converted into a string format for display. + /// + /// # Returns + /// + /// A string containing the formatted debug report, organized into sections with appropriate labels and indentation to distinguish between the original and generated code segments. + /// + /// # Examples + /// + /// ``` + /// use macro_tools::exposed::*; + /// + /// let original_input : proc_macro2::TokenStream = quote! + /// { + /// #[derive(Debug, PartialEq)] + /// pub struct MyStruct + /// { + /// pub field : i32, + /// } + /// }; + /// + /// let generated_code : proc_macro2::TokenStream = quote! + /// { + /// impl MyStruct + /// { + /// pub fn new( field : i32 ) -> Self + /// { + /// MyStruct { field } + /// } + /// } + /// }; + /// + /// // Format the debug report for printing or logging + /// let formatted_report = report_format( "Code Transformation for MyStruct", original_input, generated_code ); + /// println!( "{}", formatted_report ); + /// ``` + /// + + pub fn report_format< IntoAbout, IntoInput, IntoOutput > + ( + about : IntoAbout, input : IntoInput, output : IntoOutput + ) -> String + where + IntoAbout : ToString, + IntoInput : ToString, + IntoOutput : ToString, + { + format!( "\n" ) + + &format!( " = context\n\n{}\n\n", indentation( " ", about.to_string(), "" ) ) + + &format!( " = original\n\n{}\n\n", indentation( " ", input.to_string(), "" ) ) + + &format!( " = generated\n\n{}\n", indentation( " ", output.to_string(), "" ) ) + } + + /// Prints a debugging report for a pair of token streams to the standard output. + /// + /// This function acts as a utility for debugging transformations in procedural macros or other code generation scenarios. + /// It provides an immediate visual comparison of the original code versus the generated code by utilizing the `report_format` + /// function to format the output and then printing it directly to the standard output. This can be particularly helpful for + /// real-time debugging and quick assessments without requiring additional output management. + /// + /// # Parameters and Type Parameters + /// - `about` : A description of the code transformation context or operation. This is used to headline the generated report. + /// - `input` : The original code or token stream before transformation. This is what the code looked like prior to any procedural manipulations. + /// - `output` : The transformed or generated code or token stream as a result of the macro or code transformation process. + /// + /// The types for these parameters are expected to be convertible to strings, matching the `report_format` function's requirements. + /// + /// # Examples + /// + /// ```rust + /// use macro_tools::exposed::*; + /// + /// let original_input : proc_macro2::TokenStream = quote! + /// { + /// #[derive(Debug, PartialEq)] + /// pub struct MyStruct + /// { + /// pub field : i32, + /// } + /// }; + /// + /// let generated_code : proc_macro2::TokenStream = quote! + /// { + /// impl MyStruct + /// { + /// pub fn new( field : i32 ) -> Self + /// { + /// MyStruct { field } + /// } + /// } + /// }; + /// + /// // Directly print the debug report + /// report_print( "Code Transformation for MyStruct", original_input, generated_code ); + /// ``` + /// + /// The above example demonstrates how the `report_print` function can be used to visualize the changes from original input code to the generated code, + /// helping developers to verify and understand the modifications made during code generation processes. The output is formatted to show clear distinctions + /// between the 'original' and 'generated' sections, providing an easy-to-follow comparison. + + pub fn report_print< IntoAbout, IntoInput, IntoOutput > + ( + about : IntoAbout, input : IntoInput, output : IntoOutput + ) + where + IntoAbout : ToString, + IntoInput : ToString, + IntoOutput : ToString, + { + println!( "{}", report_format( about, input, output ) ); + } + + /// + /// Macro for diagnostics purpose to print both syntax tree and source code behind it with syntax tree. + /// + /// ### Basic use-case. + /// ``` + /// use macro_tools::prelude::*; + /// + /// let code = qt!( std::collections::HashMap< i32, i32 > ); + /// let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + /// tree_print!( tree_type ); + /// ``` + /// + + #[ macro_export ] + macro_rules! tree_print + { + ( $src :expr ) => + {{ + let result = $crate::tree_diagnostics_str!( $src ); + println!( "{}", result ); + result + }}; + ( $( $src :expr ),+ $(,)? ) => + {{ + $( $crate::tree_print!( $src ) );+ + }}; + } + + /// + /// Macro for diagnostics purpose to print both syntax tree and source code behind it without syntax tree. + /// + /// ### Basic use-case. + /// ``` + /// use macro_tools::prelude::*; + /// + /// let code = qt!( std::collections::HashMap< i32, i32 > ); + /// let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + /// tree_print!( tree_type ); + /// ``` + /// + + #[ macro_export ] + macro_rules! code_print + { + ( $src :expr ) => + {{ + let result = $crate::code_diagnostics_str!( $src ); + println!( "{}", result ); + result + }}; + ( $( $src :expr ),+ $(,)? ) => + {{ + $( $crate::code_print!( $src ) );+ + }}; + } + + /// + /// Macro for diagnostics purpose to export both syntax tree and source code behind it into a string. + /// + + #[ macro_export ] + macro_rules! tree_diagnostics_str + { + ( $src :expr ) => + {{ + let src2 = &$src; + format!( "{} : {} :\n{:#?}", stringify!( $src ), $crate::qt!{ #src2 }, $src ) + }}; + } + + /// + /// Macro for diagnostics purpose to diagnose source code behind it and export it into a string. + /// + + #[ macro_export ] + macro_rules! code_diagnostics_str + { + ( $src :expr ) => + {{ + let src2 = &$src; + format!( "{} : {}", stringify!( $src ), $crate::qt!{ #src2 } ) + }}; + } + + /// + /// Macro to export source code behind a syntax tree into a string. + /// + + #[ macro_export ] + macro_rules! code_to_str + { + ( $src :expr ) => + {{ + let src2 = &$src; + format!( "{}", $crate::qt!{ #src2 } ) + }}; + } + + /// + /// Macro to generate syn error either with span of a syntax tree element or with default one `proc_macro2::Span::call_site()`. + /// + /// ### Basic use-case. + /// ``` + /// # use macro_tools::exposed::*; + /// syn_err!( "No attr" ); + /// # () + /// ``` + /// + + #[ macro_export ] + macro_rules! syn_err + { + + ( $msg:expr $(,)? ) => + { + $crate::syn::Error::new( proc_macro2::Span::call_site(), $msg ) + }; + ( _, $msg:expr $(,)? ) => + { + $crate::syn::Error::new( proc_macro2::Span::call_site(), $msg ) + }; + ( $span:expr, $msg:expr $(,)? ) => + { + $crate::syn::Error::new( syn::spanned::Spanned::span( &( $span ) ), $msg ) + }; + ( $span:expr, $msg:expr, $( $arg:expr ),+ $(,)? ) => + { + $crate::syn::Error::new( syn::spanned::Spanned::span( &( $span ) ), format!( $msg, $( $arg ),+ ) ) + }; + ( _, $msg:expr, $( $arg:expr ),+ $(,)? ) => + { + $crate::syn::Error::new( proc_macro2::Span::call_site(), format!( $msg, $( $arg ),+ ) ) + }; + + } + + /// + /// Macro to generate syn error either with span of a syntax tree element or with default one `proc_macro2::Span::call_site()`. + /// + /// ### Basic use-case. + /// ``` + /// # use macro_tools::exposed::*; + /// syn_err!( "No attr" ); + /// # () + /// ``` + /// + + #[ macro_export ] + macro_rules! return_syn_err + { + ( $( $Arg : tt )* ) => + { + return Result::Err( $crate::syn_err!( $( $Arg )* ) ) + }; + } + + pub use + { + tree_print, + code_print, + tree_diagnostics_str, + code_diagnostics_str, + code_to_str, + syn_err, + return_syn_err, + }; + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as diag; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Result, + indentation, + report_format, + report_print, + }; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + tree_print, + code_print, + tree_diagnostics_str, + code_diagnostics_str, + code_to_str, + syn_err, + return_syn_err, + }; + + // #[ doc( inline ) ] + // pub use super::private::Result; +} diff --git a/module/core/macro_tools/src/drop.rs b/module/core/macro_tools/src/drop.rs new file mode 100644 index 0000000000..f6e5814e48 --- /dev/null +++ b/module/core/macro_tools/src/drop.rs @@ -0,0 +1,96 @@ +//! +//! zzz : write +//! + +// zzz : investiage and reuse for iterating +// https://docs.rs/syn/latest/src/syn/punctuated.rs.html#724 +// https://docs.rs/syn/latest/src/syn/drops.rs.html#11-16 + +/// Internal namespace. +pub mod private +{ + // use crate::*; + +// /// zzz : write documentation +// #[ repr( transparent ) ] +// pub struct NoDrop< T : ?Sized >( std::mem::ManuallyDrop< T > ); +// +// impl< T > NoDrop< T > +// { +// /// zzz : write documentation +// pub fn new( value : T ) -> Self +// where +// T : TrivialDrop, +// { +// NoDrop( std::mem::ManuallyDrop::new( value ) ) +// } +// } +// +// impl< T : ?Sized > std::ops::Deref for NoDrop< T > +// { +// type Target = T; +// fn deref( &self ) -> &Self::Target +// { +// &self.0 +// } +// } +// +// impl< T : ?Sized > std::ops::DerefMut for NoDrop< T > +// { +// fn deref_mut( &mut self ) -> &mut Self::Target +// { +// &mut self.0 +// } +// } +// +// /// zzz : write documentation +// pub trait TrivialDrop {} +// +// impl< T > TrivialDrop for std::iter::Empty< T > {} +// impl< 'a, T > TrivialDrop for std::slice::Iter< 'a, T > {} +// impl< 'a, T > TrivialDrop for std::slice::IterMut< 'a, T > {} +// impl< 'a, T > TrivialDrop for std::option::IntoIter< &'a T > {} +// impl< 'a, T > TrivialDrop for std::option::IntoIter< &'a mut T > {} + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + // NoDrop, + // TrivialDrop, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as drop; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/equation.rs b/module/core/macro_tools/src/equation.rs new file mode 100644 index 0000000000..36bab1ccab --- /dev/null +++ b/module/core/macro_tools/src/equation.rs @@ -0,0 +1,160 @@ +//! +//! Attributes analyzys and manipulation. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// Represents an equation parsed from a procedural macro input. + /// + /// This struct models an equation consisting of a left-hand side, an operator, + /// and a right-hand side. The `Equation` is typically constructed during the + /// parsing process of macro input, where the `left` and `op` fields are expected + /// to be syntactically represented by `syn::Path` and `syn::BinOp` respectively, + /// indicating the variable and operation involved. The `right` field is a + /// `proc_macro2::TokenStream`, which can represent more complex expressions + /// including, but not limited to, literals, function calls, or further operations. + /// + /// # Fields + /// - `left`: The left-hand side of the equation, represented as a path. + /// This could be a variable or a more complex path in the code being + /// processed by the macro. + /// + /// - `op`: The binary operator used in the equation, such as addition, + /// subtraction, multiplication, etc. + /// + /// - `right`: The right-hand side of the equation. Given the potential + /// complexity of expressions on this side, it is represented as a + /// `proc_macro2::TokenStream` to accommodate any valid Rust expression. + /// + /// # Examples + /// + /// Parsing an equation from macro input: + /// + /// ```rust + /// use macro_tools::equation; + /// let got : equation::Equation = syn::parse_quote!( default = 31 ); + /// macro_tools::tree_print!( got ); + /// assert_eq!( macro_tools::code_to_str!( got ), "default = 31".to_string() ); + /// ``` + #[ derive( Debug ) ] + pub struct Equation + { + /// The LHS of the equation, represented by a syntactic path. + pub left : syn::Path, + // /// The binary operator (e.g., +, -, *, /) of the equation. + // pub op : syn::BinOp, + /// Equality token. + pub op : syn::Token![ = ], + /// The RHS of the equation, capable of holding complex expressions. + pub right : proc_macro2::TokenStream, + } + + impl syn::parse::Parse for Equation + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self > + { + let left : syn::Path = input.parse()?; + let op : syn::Token![ = ] = input.parse()?; + let right : proc_macro2::TokenStream = input.parse()?; + Ok( Equation { left, op, right } ) + } + } + + impl quote::ToTokens for Equation + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.left.to_tokens( tokens ); + self.op.to_tokens( tokens ); + self.right.to_tokens( tokens ); + } + } + + // impl core::fmt::Display for Equation + // { + // fn fmt( &self, f : &mut core::fmt::Formatter< '_ > ) -> core::fmt::Result + // { + // write!( f, "{}", self.left.to_string() ); + // write!( f, "{}", self.op.to_string() ); + // write!( f, "{}", self.right.to_string() ) + // } + // } + + /// + /// For attribute like `#[former( default = 31 ) ]` return key `default` and value `31`, + /// as well as syn::Meta as the last element of result tuple. + /// + /// ### Basic use-case. + /// + /// ```rust + /// use macro_tools::equation; + /// let attr : syn::Attribute = syn::parse_quote!( #[ former( default = 31 ) ] ); + /// // tree_print!( attr ); + /// let got = equation::from_meta( &attr ).unwrap(); + /// assert_eq!( macro_tools::code_to_str!( got ), "default = 31".to_string() ); + /// ``` + + pub fn from_meta( attr : &syn::Attribute ) -> Result< Equation > + { + let meta = &attr.meta; + return match meta + { + syn::Meta::List( ref meta_list ) => + { + let eq : Equation = syn::parse2( meta_list.tokens.clone() )?; + Ok( eq ) + } + _ => return Err( syn::Error::new( attr.span(), "Unknown format of attribute, expected syn::Meta::List( meta_list )" ) ), + }; + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + from_meta, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as equation; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Equation, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/generic_args.rs b/module/core/macro_tools/src/generic_args.rs new file mode 100644 index 0000000000..56f70d64a6 --- /dev/null +++ b/module/core/macro_tools/src/generic_args.rs @@ -0,0 +1,195 @@ +//! +//! This module provides utilities to handle and manipulate generic arguments using the `syn` crate. It includes traits and functions for transforming, merging, and managing generic parameters within procedural macros, enabling seamless syntactic analysis and code generation. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + /// A trait for converting a reference to an existing type into a `syn::AngleBracketedGenericArguments`. + /// + /// This trait provides a mechanism to transform various types that represent generic parameters, + /// such as `syn::Generics`, into a uniform `syn::AngleBracketedGenericArguments`. This is particularly + /// useful when working with Rust syntax trees in procedural macros, allowing for the manipulation + /// and merging of generic parameters from different syntactic elements. + pub trait IntoGenericArgs + { + /// Converts a reference of the implementing type into `syn::AngleBracketedGenericArguments`. + /// + /// This method should handle the conversion logic necessary to transform the implementing + /// type's generic parameter representations into the structured format required by + /// `syn::AngleBracketedGenericArguments`, which is commonly used to represent generic parameters + /// enclosed in angle brackets. + /// + /// # Returns + /// A new instance of `syn::AngleBracketedGenericArguments` representing the generic parameters + /// of the original type. + fn into_generic_args( &self ) -> syn::AngleBracketedGenericArguments; + } + + impl IntoGenericArgs for syn::Generics + { + fn into_generic_args( &self ) -> syn::AngleBracketedGenericArguments + { + let args = self.params.iter().map( | param | + { + match param + { + syn::GenericParam::Type( ty ) => syn::GenericArgument::Type( syn::Type::Path( syn::TypePath + { + qself: None, + path: ty.ident.clone().into(), + })), + syn::GenericParam::Lifetime( lifetime ) => syn::GenericArgument::Lifetime( lifetime.lifetime.clone() ), + syn::GenericParam::Const( const_param ) => syn::GenericArgument::Const( syn::Expr::Path( syn::ExprPath + { + attrs: vec![], + qself: None, + path: const_param.ident.clone().into(), + })), + } + }).collect(); + + syn::AngleBracketedGenericArguments + { + colon2_token: None, + lt_token: syn::token::Lt::default(), + args, + gt_token: syn::token::Gt::default(), + } + } + } + + /// Merges two `syn::AngleBracketedGenericArguments` instances into a new one, + /// prioritizing lifetime parameters before other types of generic arguments. + /// + /// This function takes two references to `syn::AngleBracketedGenericArguments` and + /// categorizes their arguments into lifetimes and other types. It then combines + /// them such that all lifetimes from both instances precede any other arguments in the + /// resulting `syn::AngleBracketedGenericArguments` instance. This is particularly useful + /// for ensuring that the merged generics conform to typical Rust syntax requirements where + /// lifetimes are declared before other generic parameters. + /// + /// # Arguments + /// + /// * `a` - A reference to the first `syn::AngleBracketedGenericArguments` instance, containing one or more generic arguments. + /// * `b` - A reference to the second `syn::AngleBracketedGenericArguments` instance, containing one or more generic arguments. + /// + /// # Returns + /// + /// Returns a new `syn::AngleBracketedGenericArguments` instance containing the merged + /// arguments from both `a` and `b`, with lifetimes appearing first. + /// + /// # Examples + /// + /// ``` + /// use macro_tools::{ + /// generic_args, + /// syn::{parse_quote, AngleBracketedGenericArguments}, + /// }; + /// + /// let a: AngleBracketedGenericArguments = parse_quote! { <'a, T: Clone, U: Default> }; + /// let b: AngleBracketedGenericArguments = parse_quote! { <'b, V: core::fmt::Debug> }; + /// let merged = generic_args::merge(&a, &b); + /// + /// let expected: AngleBracketedGenericArguments = parse_quote! { <'a, 'b, T: Clone, U: Default, V: core::fmt::Debug> }; + /// assert_eq!(merged, expected); + /// ``` + /// + /// This example demonstrates how lifetimes `'a` and `'b` are placed before other generic parameters + /// like `T`, `U`, and `V` in the merged result, adhering to the expected syntax order in Rust generics. + pub fn merge + ( + a : &syn::AngleBracketedGenericArguments, + b : &syn::AngleBracketedGenericArguments + ) -> syn::AngleBracketedGenericArguments + { + let mut lifetimes : syn::punctuated::Punctuated< syn::GenericArgument, syn::token::Comma > = syn::punctuated::Punctuated::new(); + let mut others : syn::punctuated::Punctuated< syn::GenericArgument, syn::token::Comma > = syn::punctuated::Punctuated::new(); + + // Function to categorize and collect arguments into lifetimes and others + let mut categorize_and_collect = |args : &syn::punctuated::Punctuated| + { + for arg in args.iter() + { + match arg + { + syn::GenericArgument::Lifetime( _ ) => lifetimes.push( arg.clone() ), + _ => others.push( arg.clone() ), + } + } + }; + + // Categorize and collect from both input arguments + categorize_and_collect( &a.args ); + categorize_and_collect( &b.args ); + + // Combine lifetimes and other arguments into final merged arguments + let mut args = syn::punctuated::Punctuated::new(); + args.extend( lifetimes ); + args.extend( others ); + + syn::AngleBracketedGenericArguments + { + colon2_token: None, // Adjust if needed based on context + lt_token: syn::token::Lt::default(), + args, + gt_token: syn::token::Gt::default(), + } + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + + //! + //! This module provides utilities to handle and manipulate generic arguments using the `syn` crate. It includes traits and functions for transforming, merging, and managing generic parameters within procedural macros, enabling seamless syntactic analysis and code generation. + //! + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + merge, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + IntoGenericArgs, + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as generic_args; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + prelude::*, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/generic_params.rs b/module/core/macro_tools/src/generic_params.rs new file mode 100644 index 0000000000..09f4445e5b --- /dev/null +++ b/module/core/macro_tools/src/generic_params.rs @@ -0,0 +1,553 @@ +//! +//! Functions and structures to handle and manipulate generic parameters using the `syn` crate. It's designed to support macro-driven code generation by simplifying, merging, extracting, and decomposing `syn::Generics`. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// A `GenericsWithWhere` struct to handle the parsing of Rust generics with an explicit `where` clause. + /// + /// This wrapper addresses the limitation in the `syn` crate where parsing `Generics` directly from a `ParseStream` + /// does not automatically handle associated `where` clauses. By integrating `where` clause parsing into the + /// `GenericsWithWhere`, this struct provides a seamless way to capture both the generics and their constraints + /// in scenarios where the `where` clause is crucial for type constraints and bounds in Rust macros and code generation. + /// + /// Usage: + /// + /// ``` + /// let parsed_generics : macro_tools::GenericsWithWhere + /// = syn::parse_str( "< T : Clone, U : Default = Default1 > where T : Default" ).unwrap(); + /// assert!( parsed_generics.generics.params.len() == 2 ); + /// assert!( parsed_generics.generics.where_clause.is_some() ); + /// ``` + /// + + #[ derive( Debug ) ] + pub struct GenericsWithWhere + { + /// Syn's generics parameters. + pub generics : syn::Generics, + } + + impl GenericsWithWhere + { + /// Unwraps the `GenericsWithWhere` to retrieve the inner `syn::Generics`. + pub fn unwrap( self ) -> syn::Generics + { + self.generics + } + + /// Parses a string to a `GenericsWithWhere`, specifically designed to handle generics syntax with where clauses effectively. + pub fn parse_from_str( s : &str ) -> syn::Result< GenericsWithWhere > + { + syn::parse_str::< GenericsWithWhere >( s ) + } + } + + impl syn::parse::Parse for GenericsWithWhere + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let generics : syn::Generics = input.parse()?; + let where_clause : Option< syn::WhereClause > = input.parse()?; + + let mut generics_clone = generics.clone(); + generics_clone.where_clause = where_clause; + + Ok( GenericsWithWhere + { + generics : generics_clone, + }) + } + } + + impl quote::ToTokens for GenericsWithWhere + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.generics.to_tokens( tokens ); + } + } + + impl From for syn::Generics + { + fn from( g : GenericsWithWhere ) -> Self + { + g.generics + } + } + + impl From for GenericsWithWhere + { + fn from( generics : syn::Generics ) -> Self + { + GenericsWithWhere { generics } + } + } + + /// Merges two `syn::Generics` instances into a new one. + /// + /// This function takes two references to `syn::Generics` and combines their + /// type parameters and where clauses into a new `syn::Generics` instance. If + /// both instances have where clauses, the predicates of these clauses are merged + /// into a single where clause. + /// + /// # Arguments + /// + /// * `a` - A reference to the first `syn::Generics` instance. + /// * `b` - A reference to the second `syn::Generics` instance. + /// + /// # Returns + /// + /// Returns a new `syn::Generics` instance containing the merged type parameters + /// and where clauses from `a` and `b`. + /// + /// # Examples + /// + /// + /// # use syn::{Generics, parse_quote}; + /// + /// let mut generics_a : syn::Generics = parse_quote!{ < T : Clone, U : Default > }; + /// generics_a.where_clause = parse_quote!{ where T : Default }; + /// let mut generics_b : syn::Generics = parse_quote!{ < V : core::fmt::Debug > }; + /// generics_b.where_clause = parse_quote!{ where V : Sized }; + /// let got = generic_params::merge( &generics_a, &generics_b ); + /// + /// let mut exp : syn::Generics = parse_quote! + /// { + /// < T : Clone, U : Default, V : core::fmt::Debug > + /// }; + /// exp.where_clause = parse_quote! + /// { + /// where + /// T : Default, + /// V : Sized + /// }; + /// + /// assert_eq!( got, exp ); + + pub fn merge( a : &syn::Generics, b : &syn::Generics ) -> syn::Generics + { + + let mut result = syn::Generics + { + params : Default::default(), + where_clause : None, + lt_token : Some( syn::token::Lt::default() ), + gt_token : Some( syn::token::Gt::default() ), + }; + + // Merge params + // result.params.extend( a.params.iter().chain( b.params.iter() ) ); + for param in &a.params + { + result.params.push( param.clone() ); + } + for param in &b.params + { + result.params.push( param.clone() ); + } + + // Merge where clauses + result.where_clause = match( &a.where_clause, &b.where_clause ) + { + ( Some( a_clause ), Some( b_clause ) ) => + { + let mut merged_where_clause = syn::WhereClause + { + where_token: a_clause.where_token, + predicates: a_clause.predicates.clone(), + }; + for predicate in &b_clause.predicates + { + merged_where_clause.predicates.push( predicate.clone() ); + } + Some( merged_where_clause ) + }, + ( Some( a_clause ), None ) => Some( a_clause.clone() ), + ( None, Some( b_clause ) ) => Some( b_clause.clone() ), + _ => None, + }; + + result + } + + /// Extracts parameter names from the given `Generics`, + /// dropping bounds, defaults, and the where clause. + /// + /// This function simplifies the generics to include only the names of the type parameters, + /// lifetimes, and const parameters, without any of their associated bounds or default values. + /// The resulting `Generics` will have an empty where clause. + /// + /// # Arguments + /// + /// * `generics` - The `Generics` instance from which to extract parameter names. + /// + /// # Returns + /// + /// Returns a new `Generics` instance containing only the names of the parameters. + /// + /// # Examples + /// + /// ```rust + /// # use macro_tools::syn::parse_quote; + /// + /// let mut generics : syn::Generics = parse_quote!{ < T : Clone + Default, U, 'a, const N : usize > }; + /// generics.where_clause = parse_quote!{ where T: core::fmt::Debug }; + /// // let generics : Generics = parse_quote!{ < T : Clone + Default, U, 'a, const N : usize > where T: core::fmt::Debug }; + /// let simplified_generics = macro_tools::generic_params::only_names( &generics ); + /// + /// assert_eq!( simplified_generics.params.len(), 4 ); // Contains T, U, 'a, and N + /// assert!( simplified_generics.where_clause.is_none() ); // Where clause is removed + /// ``` + + pub fn only_names( generics : &syn::Generics ) -> syn::Generics + { + // use syn::{ Generics, GenericParam, LifetimeDef, TypeParam, ConstParam }; + use syn::{ Generics, GenericParam, LifetimeParam, TypeParam, ConstParam }; + + let result = Generics + { + params : generics.params.iter().map( | param | match param + { + GenericParam::Type( TypeParam { ident, .. } ) => GenericParam::Type( TypeParam + { + attrs : Vec::new(), + ident : ident.clone(), + colon_token : None, + bounds : Default::default(), + eq_token : None, + default : None, + }), + GenericParam::Lifetime( LifetimeParam { lifetime, .. } ) => GenericParam::Lifetime( LifetimeParam + { + attrs : Vec::new(), + lifetime : lifetime.clone(), + colon_token : None, + bounds : Default::default(), + }), + GenericParam::Const( ConstParam { ident, ty, .. } ) => GenericParam::Const( ConstParam + { + attrs : Vec::new(), + const_token : Default::default(), + ident : ident.clone(), + colon_token : Default::default(), + ty : ty.clone(), + eq_token : Default::default(), + default : None, + }), + }).collect(), + where_clause : None, + lt_token : generics.lt_token, + gt_token : generics.gt_token, + }; + + result + } + + /// Extracts the names of type parameters, lifetimes, and const parameters from the given `Generics`. + /// + /// This function returns an iterator over the names of the parameters in the `Generics`, + /// which can be useful for generating code that requires just the names of the parameters + /// without their associated bounds or default values. + /// + /// # Arguments + /// + /// * `generics` - The `Generics` instance from which to extract parameter names. + /// + /// # Returns + /// + /// Returns an iterator over the names of the parameters. + /// + /// # Examples + /// + /// ```rust + /// # use macro_tools::syn::parse_quote; + /// + /// let generics : syn::Generics = parse_quote! + /// { + /// < T : Clone + Default, U, 'a, const N : usize > + /// }; + /// let names : Vec< _ > = macro_tools::generic_params::names( &generics ).collect(); + /// + /// assert_eq!( names, vec! + /// [ + /// &syn::Ident::new( "T", proc_macro2::Span::call_site() ), + /// &syn::Ident::new( "U", proc_macro2::Span::call_site() ), + /// &syn::Ident::new( "a", proc_macro2::Span::call_site() ), + /// &syn::Ident::new( "N", proc_macro2::Span::call_site() ) + /// ]); + /// ``` + + pub fn names< 'a >( generics : &'a syn::Generics ) -> impl IterTrait< 'a, &'a syn::Ident > + Clone + { + generics.params.iter().map( | param | match param + { + syn::GenericParam::Type( type_param ) => &type_param.ident, + syn::GenericParam::Lifetime( lifetime_def ) => &lifetime_def.lifetime.ident, + syn::GenericParam::Const( const_param ) => &const_param.ident, + }) + } + + /// Decomposes `syn::Generics` into components suitable for different usage contexts in Rust implementations, + /// specifically focusing on different requirements for `impl` blocks and type definitions. + /// + /// This function prepares three versions of the generics: + /// - One preserving the full structure for `impl` declarations. + /// - One simplified for type definitions, removing bounds and defaults from type and const parameters, retaining only identifiers. + /// - One for the where clauses, if present, ensuring they are correctly punctuated. + /// + /// This helps in situations where you need different representations of generics for implementing traits, + /// defining types, or specifying trait bounds and conditions. + /// + /// This function is similar to `syn::Generics::split_for_impl`, which also splits generics into components + /// suitable for `impl` blocks and type definitions. However, `split_for_impl` wraps the tokens in `<>`, which + /// can reduce the flexibility of the results. The `decompose` function provides more control over the output + /// by not wrapping the tokens, allowing for more precise usage in macros and other contexts. + /// Additionally, `decompose` returns an extra component with the generics including defaults, which is often + /// in demand for certain macro or code generation tasks. + /// + /// # Examples + /// + /// ```rust + /// let code : syn::Generics = syn::parse_quote!{ <'a, T, const N : usize, U : Trait1> }; + /// let ( generics_with_defaults, generics_for_impl, generics_for_ty, generics_where ) = macro_tools::generic_params::decompose( &code ); + /// + /// // Use in a macro for generating code + /// macro_tools::qt! + /// { + /// impl < #generics_for_impl > MyTrait for Struct1 < #generics_for_ty > + /// where + /// #generics_where + /// { + /// // implementation details... + /// } + /// }; + /// ``` + /// + /// # Arguments + /// + /// * `generics` - A reference to the `syn::Generics` to be decomposed. + /// + /// # Returns + /// + /// Returns a tuple containing: + /// - `syn::punctuated::Punctuated`: Original generics with defaults, used where full specification is needed. + /// - `syn::punctuated::Punctuated`: Generics for `impl` blocks, retaining bounds but no defaults. + /// - `syn::punctuated::Punctuated`: Simplified generics for type definitions, only identifiers. + /// - `syn::punctuated::Punctuated`: Where clauses, properly punctuated for use in where conditions. + /// + /// # Differences from `syn::Generics::split_for_impl` + /// + /// While both `decompose` and `split_for_impl` functions split generics into components for `impl` blocks, type definitions, and where clauses, + /// there are key differences: + /// - `split_for_impl` wraps the generics in `<>`, which can be limiting when you need to use the generics in a different context or format. + /// - `decompose` provides raw punctuated generic parameters, offering greater flexibility and control over the output format. + /// - `decompose` returns an extra component with the generics including defaults, which is often needed for certain macro or code generation tasks. + /// + /// # Example of function signature using `decompose` + /// + /// ```rust + /// use macro_tools::{ syn, proc_macro2, qt }; + /// + /// fn generate_unit + /// ( + /// item_name : &syn::Ident, + /// generics_with_defaults : syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + /// generics_impl : syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + /// generics_ty : syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + /// generics_where: syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + /// ) + /// -> proc_macro2::TokenStream + /// { + /// qt! + /// { + /// #[ automatically_derived ] + /// impl< #generics_impl > From< i32 > for #item_name< #generics_ty > + /// where + /// #generics_where + /// { + /// #[ inline ] + /// fn from( src : i32 ) -> Self + /// { + /// Wrap( src ) + /// } + /// } + /// } + /// } + /// ``` + /// + + pub fn decompose + ( + generics : &syn::Generics, + ) + -> + ( + syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma >, + syn::punctuated::Punctuated< syn::WherePredicate, syn::token::Comma >, + ) + { + + let mut generics_with_defaults = generics.params.clone(); + punctuated::ensure_trailing_comma( &mut generics_with_defaults ); + + let mut generics_for_impl = syn::punctuated::Punctuated::new(); + let mut generics_for_ty = syn::punctuated::Punctuated::new(); + + // Process each generic parameter + for param in &generics.params + { + match param + { + syn::GenericParam::Type( type_param ) => + { + // Retain bounds for generics_for_impl, remove defaults + let impl_param = syn::GenericParam::Type( syn::TypeParam + { + attrs : vec![], + ident : type_param.ident.clone(), + colon_token : type_param.colon_token, + bounds : type_param.bounds.clone(), + eq_token : None, // Remove default token + default : None, // Remove default value + } ); + generics_for_impl.push_value( impl_param ); + generics_for_impl.push_punct( syn::token::Comma::default() ); + + // Simplify for generics_for_ty by removing all except identifiers + let ty_param = syn::GenericParam::Type( syn::TypeParam + { + attrs : vec![], + ident : type_param.ident.clone(), + colon_token : None, + bounds : syn::punctuated::Punctuated::new(), + eq_token : None, + default : None, + } ); + generics_for_ty.push_value( ty_param ); + generics_for_ty.push_punct( syn::token::Comma::default() ); + }, + syn::GenericParam::Const( const_param ) => + { + // Simplify const parameters by removing all details except the identifier + let impl_param = syn::GenericParam::Const( syn::ConstParam + { + attrs : vec![], + const_token : const_param.const_token, + ident : const_param.ident.clone(), + colon_token : const_param.colon_token, + ty : const_param.ty.clone(), + eq_token : None, + default : None, + } ); + generics_for_impl.push_value( impl_param ); + generics_for_impl.push_punct( syn::token::Comma::default() ); + + let ty_param = syn::GenericParam::Type( syn::TypeParam + { + attrs : vec![], + ident : const_param.ident.clone(), + colon_token : None, + bounds : syn::punctuated::Punctuated::new(), + eq_token : None, + default : None, + }); + generics_for_ty.push_value( ty_param ); + generics_for_ty.push_punct( syn::token::Comma::default() ); + }, + syn::GenericParam::Lifetime( lifetime_param ) => + { + // Lifetimes are added as-is to generics_for_impl and without bounds to generics_for_ty + generics_for_impl.push_value( syn::GenericParam::Lifetime( lifetime_param.clone() ) ); + generics_for_impl.push_punct( syn::token::Comma::default() ); + + let ty_param = syn::GenericParam::Lifetime( syn::LifetimeParam + { + attrs : vec![], + lifetime : lifetime_param.lifetime.clone(), + colon_token : None, + bounds : syn::punctuated::Punctuated::new(), + }); + generics_for_ty.push_value( ty_param ); + generics_for_ty.push_punct( syn::token::Comma::default() ); + } + } + } + + // Clone where predicates if present, ensuring they end with a comma + let generics_where = if let Some( where_clause ) = &generics.where_clause + { + let mut predicates = where_clause.predicates.clone(); + punctuated::ensure_trailing_comma( &mut predicates ); + predicates + } + else + { + syn::punctuated::Punctuated::new() + }; + + ( generics_with_defaults, generics_for_impl, generics_for_ty, generics_where ) + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +pub mod protected +{ + + //! + //! Functions and structures to handle and manipulate generic parameters using the `syn` crate. It's designed to support macro-driven code generation by simplifying, merging, extracting, and decomposing `syn::Generics`. + //! + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + merge, + only_names, + names, + decompose, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + GenericsWithWhere, + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as generic_params; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + prelude::*, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/item.rs b/module/core/macro_tools/src/item.rs new file mode 100644 index 0000000000..2bd19814b2 --- /dev/null +++ b/module/core/macro_tools/src/item.rs @@ -0,0 +1,136 @@ +//! This module provides various utilities and namespaces for working with `syn::Item`, specifically focusing on +//! ensuring syntactical correctness and managing different visibility levels within the code. It includes functions +//! to manipulate the structure of items, handle different kinds of fields, and provide a structured approach to +//! organizing the codebase into different access levels. + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// Ensures the last field in a struct has a trailing comma. + /// + /// This function checks and modifies the fields of a given struct, `input`, ensuring that the last field, whether in + /// named or unnamed structs, ends with a trailing comma. This adjustment is commonly needed in macro-generated + /// code to maintain consistency and syntactical correctness across different struct types, including unit structs + /// which are unaffected as they do not contain fields. + /// + /// # Arguments + /// + /// * `input` - A reference to the struct (`syn::ItemStruct`) whose fields are to be checked and modified. + /// + /// # Returns + /// + /// Returns a modified clone of the input struct (`syn::ItemStruct`) where the last field in named or unnamed + /// structs has a trailing comma. Unit structs remain unchanged as they do not contain fields. + /// + /// # Examples + /// + /// ``` + /// use macro_tools:: + /// { + /// syn::{ parse_quote, ItemStruct }, + /// quote::quote, + /// }; + /// + /// // Create a struct using `parse_quote!` macro + /// let input_struct : ItemStruct = parse_quote! + /// { + /// struct Example + /// { + /// field1 : i32, + /// field2 : String + /// } + /// }; + /// + /// // Apply `ensure_comma` to ensure the last field has a trailing comma + /// let modified_struct = macro_tools::item::ensure_comma( &input_struct ); + /// + /// // Now `modified_struct` will have a trailing comma after `field2` + /// assert_eq!( quote!( #modified_struct ).to_string(), quote! + /// { + /// struct Example + /// { + /// field1 : i32, + /// field2 : String, + /// } + /// }.to_string() ); + /// ``` + + pub fn ensure_comma( input : &syn::ItemStruct ) -> syn::ItemStruct + { + let mut new_input = input.clone(); // Clone the input to modify it + + match &mut new_input.fields + { + // Handle named fields + syn::Fields::Named( syn::FieldsNamed { named, .. } ) => + { + punctuated::ensure_trailing_comma( named ) + }, + // Handle unnamed fields (tuples) + syn::Fields::Unnamed( syn::FieldsUnnamed { unnamed, .. } ) => + { + punctuated::ensure_trailing_comma( unnamed ) + }, + // Do nothing for unit structs + syn::Fields::Unit => {} + } + + new_input + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +// qqq : zzz : make sure documentation look good. generate, review and fix every file +/// This module provides various utilities and namespaces for working with `syn::Item`, specifically focusing on +/// ensuring syntactical correctness and managing different visibility levels within the code. It includes functions +/// to manipulate the structure of items, handle different kinds of fields, and provide a structured approach to +/// organizing the codebase into different access levels. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + ensure_comma, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + // pub use super::protected as item; + pub use super::protected as item; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + prelude::*, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/item_struct.rs b/module/core/macro_tools/src/item_struct.rs new file mode 100644 index 0000000000..6404e000c0 --- /dev/null +++ b/module/core/macro_tools/src/item_struct.rs @@ -0,0 +1,117 @@ +//! +//! Parse structures, like `struct { a : i32 }`. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// Extracts the types of each field into a vector. + // pub fn field_types< 'a >( t : &'a syn::ItemStruct ) -> impl IterTrait< 'a, &'a syn::Type > + Clone + pub fn field_types< 'a >( t : &'a syn::ItemStruct ) -> impl IterTrait< 'a, &'a syn::Type > + Clone + { + t.fields.iter().map( | field | &field.ty ) + } + + /// Retrieves the names of each field, if they exist. + // pub fn field_names< 'a >( t : &'a syn::ItemStruct ) -> Option< impl IterTrait< 'a, &'a syn::Ident > + 'a > + pub fn field_names< 'a >( t : &'a syn::ItemStruct ) -> Option< Box< dyn IterTrait< 'a, &'a syn::Ident > + '_ > > + // pub fn field_names< 'a >( t : &'a syn::ItemStruct ) -> Option< Box< dyn IterTrait< 'a, syn::Ident > + '_ > > + // pub fn field_names< 'a >( t : &'a syn::ItemStruct ) -> impl IterTrait< 'a, syn::Ident > + { + match &t.fields + { + syn::Fields::Named( fields ) => Some( Box::new( fields.named.iter().map( | field | field.ident.as_ref().unwrap() ) ) ), + syn::Fields::Unit => Some( Box::new( core::iter::empty() ) ), + _ => None, + } + } + + /// Retrieves the type of the first field of the struct. + /// + /// Returns the type if the struct has at least one field, otherwise returns an error. + pub fn first_field_type( t : &syn::ItemStruct ) -> Result< syn::Type > + { + let maybe_field = match t.fields + { + syn::Fields::Named( ref fields ) => fields.named.first(), + syn::Fields::Unnamed( ref fields ) => fields.unnamed.first(), + _ => return Err( syn_err!( t.fields.span(), "Expects either named or unnamed field" ) ), + }; + + if let Some( field ) = maybe_field + { + return Ok( field.ty.clone() ) + } + + return Err( syn_err!( t.span(), "Expects at least one field" ) ); + } + + /// Retrieves the name of the first field of the struct, if available. + /// + /// Returns `Some` with the field identifier for named fields, or `None` for unnamed fields. + /// Returns an error if the struct has no fields + pub fn first_field_name( t : &syn::ItemStruct ) -> Result< Option< syn::Ident > > + { + let maybe_field = match t.fields + { + syn::Fields::Named( ref fields ) => fields.named.first(), + syn::Fields::Unnamed( ref fields ) => fields.unnamed.first(), + _ => return Err( syn_err!( t.fields.span(), "Expects fields" ) ), + }; + + if let Some( field ) = maybe_field + { + return Ok( field.ident.clone() ) + } + + return Err( syn_err!( t.span(), "Expects type for fields" ) ); + } + + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + // fields_many, + field_types, + field_names, + first_field_type, + first_field_name, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as item_struct; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/iter.rs b/module/core/macro_tools/src/iter.rs new file mode 100644 index 0000000000..59d4d614f3 --- /dev/null +++ b/module/core/macro_tools/src/iter.rs @@ -0,0 +1,126 @@ +//! +//! Iterators. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::*; + + /// Trait that encapsulates an iterator with specific characteristics, tailored for use with the `syn` crate. + /// + /// The `IterTrait` trait is designed to represent iterators that may yield references to items (`&'a T`) within the `syn` crate. + /// These iterators must also implement the `ExactSizeIterator` and `DoubleEndedIterator` traits. + /// This combination ensures that the iterator can: + /// - Provide an exact size hint (`ExactSizeIterator`), + /// - Be traversed from both ends (`DoubleEndedIterator`). + /// + pub trait IterTrait< 'a, T > + where + T : 'a, + Self : Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator, + { + // fn clone_box( &self ) -> Box< dyn IterTrait< 'a, T > + 'a >; + } + + impl< 'a, T, I > IterTrait< 'a, T > for I + where + T : 'a, + Self : Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator // + Clone, + { + + // fn clone_box( &self ) -> Box< dyn IterTrait< 'a, T > + 'a > + // { + // Box::new( self.clone() ) + // } + + } + +// /// Trait that encapsulates an iterator with specific characteristics, tailored for use with the `syn` crate. +// /// +// /// The `IterTrait2` trait is designed to represent iterators that yield references to items (`&'a T`) within the `syn` crate. +// /// These iterators must also implement the `ExactSizeIterator` and `DoubleEndedIterator` traits. +// /// This combination ensures that the iterator can: +// /// - Provide an exact size hint (`ExactSizeIterator`), +// /// - Be traversed from both ends (`DoubleEndedIterator`). +// /// +// pub trait IterTrait2< T > +// where +// Self : Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator, +// { +// } +// +// impl< T, I > IterTrait2< T > for I +// where +// Self : Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator, +// { +// } +// +// /// Trait that encapsulates an iterator with specific characteristics, tailored for use with the `syn` crate. +// /// +// /// The `IterTrait3` trait is designed to represent iterators that yield references to items (`&'a T`) within the `syn` crate. +// /// These iterators must also implement the `ExactSizeIterator` and `DoubleEndedIterator` traits. +// /// This combination ensures that the iterator can: +// /// - Provide an exact size hint (`ExactSizeIterator`), +// /// - Be traversed from both ends (`DoubleEndedIterator`). +// /// +// pub trait IterTrait3< 'a, T : 'a > +// where +// Self : Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator, +// { +// } +// +// impl< 'a, T : 'a, I > IterTrait3< 'a, T > for I +// where +// Self : Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator, +// { +// } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as iter; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + IterTrait, + // IterTrait2, + // IterTrait3, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/lib.rs b/module/core/macro_tools/src/lib.rs new file mode 100644 index 0000000000..85bafc8eb4 --- /dev/null +++ b/module/core/macro_tools/src/lib.rs @@ -0,0 +1,239 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/proc_macro_tools/latest/proc_macro_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// qqq : review every page of generated documentation improve how it look as well as its content +// +// attr +// Protected namespace of the module. +// container_kind +// Protected namespace of the module. +// dependency +// Dependencies of the module. +// derive +// Protected namespace of the module. +// diag +// Protected namespace of the module. +// drop +// Protected namespace of the module. +// exposed +// Exposed namespace of the module. + +/// Modular files. +#[ cfg( feature = "enabled" ) ] +#[ path = "." ] +mod file +{ + // use super::*; + pub mod attr; + pub mod attr_prop; + pub mod container_kind; + pub mod derive; + pub mod diag; + pub mod drop; + pub mod equation; + pub mod generic_args; + pub mod generic_params; + pub mod item; + pub mod item_struct; + pub mod iter; + pub mod name; + pub mod phantom; + pub mod punctuated; + pub mod quantifier; + pub mod struct_like; + pub mod tokens; + pub mod typ; +} + +/// +/// Dependencies of the module. +/// + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::syn; + pub use ::quote; + pub use ::proc_macro2; + pub use ::interval_adapter; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + orphan::*, + }; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::file:: + { + attr::orphan::*, + attr_prop::orphan::*, + container_kind::orphan::*, + derive::orphan::*, + diag::orphan::*, + drop::orphan::*, + equation::orphan::*, + generic_args::orphan::*, + generic_params::orphan::*, + item::orphan::*, + item_struct::orphan::*, + iter::orphan::*, + name::orphan::*, + phantom::orphan::*, + punctuated::orphan::*, + quantifier::orphan::*, + struct_like::orphan::*, + tokens::orphan::*, + typ::orphan::*, + }; +} + +/// Parented namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use quote:: + { + format_ident, + quote, + quote_spanned, + }; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + prelude::*, + }; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::file:: + { + attr::exposed::*, + attr_prop::exposed::*, + container_kind::exposed::*, + derive::orphan::*, + diag::exposed::*, + drop::exposed::*, + equation::exposed::*, + generic_args::exposed::*, + generic_params::exposed::*, + item::exposed::*, + item_struct::exposed::*, + iter::exposed::*, + name::exposed::*, + phantom::exposed::*, + punctuated::exposed::*, + quantifier::exposed::*, + struct_like::exposed::*, + tokens::exposed::*, + typ::exposed::*, + }; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::interval_adapter::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::syn; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::proc_macro2; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::quote; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::quote:: + { + quote as qt, + format_ident, + }; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::syn::spanned::Spanned; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use syn:: + { + parse::ParseStream, + Token, + braced, + bracketed, + custom_keyword, + custom_punctuation, + parenthesized, + parse_macro_input, + parse_quote, + parse_quote as parse_qt, + parse_quote_spanned, + parse_quote_spanned as parse_qt_spanned, + }; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::file:: + { + attr::prelude::*, + attr_prop::prelude::*, + container_kind::prelude::*, + derive::orphan::*, + diag::prelude::*, + drop::prelude::*, + equation::prelude::*, + generic_args::prelude::*, + generic_params::prelude::*, + item::prelude::*, + item_struct::prelude::*, + iter::prelude::*, + name::prelude::*, + phantom::prelude::*, + punctuated::prelude::*, + quantifier::prelude::*, + struct_like::prelude::*, + tokens::prelude::*, + typ::prelude::*, + }; + +} + +// qqq : introduce features. make it smart. discuss list of features before implementing diff --git a/module/core/macro_tools/src/name.rs b/module/core/macro_tools/src/name.rs new file mode 100644 index 0000000000..b88fc03f0a --- /dev/null +++ b/module/core/macro_tools/src/name.rs @@ -0,0 +1,262 @@ +//! +//! Tait to getn name of an Item. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Trait to get name of an syntax element. + /// + + pub trait Name + { + /// Get name. + fn name( &self ) -> String; + } + + impl Name for syn::Item + { + fn name( &self ) -> String + { + match self + { + syn::Item::Const( item ) => item.name(), + syn::Item::Enum( item ) => item.name(), + syn::Item::ExternCrate( item ) => item.name(), + syn::Item::Fn( item ) => item.name(), + // syn::Item::ForeignMod( item ) => item.name(), + syn::Item::Impl( item ) => item.name(), + syn::Item::Macro( item ) => item.name(), + // syn::Item::Macro2( item ) => item.name(), + syn::Item::Mod( item ) => item.name(), + syn::Item::Static( item ) => item.name(), + syn::Item::Struct( item ) => item.name(), + syn::Item::Trait( item ) => item.name(), + syn::Item::TraitAlias( item ) => item.name(), + syn::Item::Type( item ) => item.name(), + syn::Item::Union( item ) => item.name(), + // syn::Item::Use( item ) => item.name(), + // syn::Item::Verbatim( item ) => item.name(), + _ => "".into(), + } + } + } + + impl Name for syn::Path + { + fn name( &self ) -> String + { + let first = self.segments.first(); + if first.is_none() + { + return "".into() + } + let first = first.unwrap(); + first.ident.to_string() + } + } + + impl Name for syn::ItemConst + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemEnum + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemExternCrate + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemFn + { + fn name( &self ) -> String + { + self.sig.ident.to_string() + } + } + + // impl Name for syn::ItemForeignMod + // { + // fn name( &self ) -> String + // { + // self.ident.to_string() + // } + // } + + impl Name for syn::ItemImpl + { + fn name( &self ) -> String + { + if self.trait_.is_none() + { + return "".into() + } + let t = self.trait_.as_ref().unwrap(); + t.1.name() + } + } + + impl Name for syn::ItemMacro + { + fn name( &self ) -> String + { + if self.ident.is_none() + { + return "".to_string() + } + let ident = self.ident.as_ref().unwrap(); + ident.to_string() + } + } + + // impl Name for syn::ItemMacro2 + // { + // fn name( &self ) -> String + // { + // self.ident.to_string() + // } + // } + + impl Name for syn::ItemMod + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemStatic + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemStruct + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemTrait + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemTraitAlias + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemType + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + impl Name for syn::ItemUnion + { + fn name( &self ) -> String + { + self.ident.to_string() + } + } + + // impl Name for syn::ItemUse + // { + // fn name( &self ) -> String + // { + // self.ident.to_string() + // } + // } + + // impl Name for syn::ItemVerbatim + // { + // fn name( &self ) -> String + // { + // self.ident.to_string() + // } + // } + +// +// Const(ItemConst), +// Enum(ItemEnum), +// ExternCrate(ItemExternCrate), +// Fn(ItemFn), +// ForeignMod(ItemForeignMod), +// Impl(ItemImpl), +// Macro(ItemMacro), +// Macro2(ItemMacro2), +// Mod(ItemMod), +// Static(ItemStatic), +// Struct(ItemStruct), +// Trait(ItemTrait), +// TraitAlias(ItemTraitAlias), +// Type(ItemType), +// Union(ItemUnion), +// Use(ItemUse), +// Verbatim(TokenStream), +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as name; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::Name; +} diff --git a/module/core/macro_tools/src/phantom.rs b/module/core/macro_tools/src/phantom.rs new file mode 100644 index 0000000000..32f2de06b0 --- /dev/null +++ b/module/core/macro_tools/src/phantom.rs @@ -0,0 +1,233 @@ +//! +//! Responsible for generating marker `PhantomData` fields to avoid the rule requiring the usage of all generic parameters in a struct. This is often necessary to ensure that Rust's type system correctly tracks the ownership and lifetimes of these parameters without needing them to be explicitly used in the struct's fields. +//! +//! Functions and structures to handle and manipulate `PhantomData` fields in structs using the `syn` crate. These utilities ensure that generic parameters are correctly accounted for in type checking, even if they are not directly used in the struct's fields. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// Adds a `PhantomData` field to a struct to manage generic parameter usage. + /// + /// This function clones a given `syn::ItemStruct`, calculates the appropriate `PhantomData` usage + /// based on the struct's generic parameters, and adds a corresponding `PhantomData` field. This field + /// helps in handling ownership and lifetime indications for generic parameters, ensuring that they + /// are correctly accounted for in type checking, even if they are not directly used in the struct's + /// fields. + /// + /// # Parameters + /// - `input`: A reference to the `syn::ItemStruct` which describes the structure to which the + /// `PhantomData` field will be added. + /// + /// # Returns + /// Returns a new `syn::ItemStruct` with the `PhantomData` field added to its list of fields. + /// + /// # Examples + /// ```rust + /// use syn::{ parse_quote, ItemStruct }; + /// + /// let input_struct : ItemStruct = parse_quote! + /// { + /// pub struct MyStruct< T, U > + /// { + /// data : T, + /// } + /// }; + /// + /// let modified_struct = macro_tools::phantom::add_to_item( &input_struct ); + /// println!( "{:#?}", modified_struct ); + /// + /// // Output will include a _phantom field of type `PhantomData< ( T, U ) >` + /// ``` + /// + + pub fn add_to_item( input : &syn::ItemStruct ) -> syn::ItemStruct + { + + // Only proceed if there are generics + if input.generics.params.is_empty() + { + return item::ensure_comma( input ); + } + + // Clone the input struct to work on a modifiable copy + let mut input = input.clone(); + + // Prepare the tuple type for PhantomData based on the struct's generics + let phantom = tuple( &input.generics.params ); + + // Handle different field types: Named, Unnamed, or Unit + match &mut input.fields + { + syn::Fields::Named( fields ) => + { + let phantom_field : syn::Field = syn::parse_quote! + { + _phantom : #phantom + }; + + // Ensure there is a trailing comma if fields are already present + if !fields.named.empty_or_trailing() + { + fields.named.push_punct( Default::default() ); + } + fields.named.push( phantom_field ); + fields.named.push_punct( Default::default() ); // Add trailing comma after adding PhantomData + }, + syn::Fields::Unnamed( fields ) => + { + let phantom_field : syn::Field = syn::parse_quote! + { + #phantom + }; + + // Ensure there is a trailing comma if fields are already present + if !fields.unnamed.empty_or_trailing() + { + fields.unnamed.push_punct( Default::default() ); + } + fields.unnamed.push_value( phantom_field ); + fields.unnamed.push_punct( Default::default() ); // Ensure to add the trailing comma after PhantomData + }, + syn::Fields::Unit => + { + // No fields to modify in a unit struct + } + }; + + input + } + + /// Constructs a `PhantomData` type tuple from the generic parameters of a struct. + /// + /// This function generates a tuple type for `PhantomData` using the given generic parameters, + /// which includes types, lifetimes, and const generics. It ensures that the generated tuple + /// use all parameters. + /// + /// # Parameters + /// - `input`: A reference to a `Punctuated< GenericParam, Comma>` containing the generic parameters. + /// + /// # Returns + /// Returns a `syn::Type` that represents a `PhantomData` tuple incorporating all the generic parameters. + /// + /// # Examples + /// ```rust + /// use syn::{parse_quote, punctuated::Punctuated, GenericParam, token::Comma}; + /// use macro_tools::phantom::tuple; + /// + /// let generics: Punctuated< GenericParam, Comma > = parse_quote! { 'a, T, const N : usize }; + /// let phantom_type = tuple( &generics ); + /// println!( "{}", quote::quote! { #phantom_type } ); + /// // Output : ::core::marker::PhantomData< ( &'a (), *const T, N ) > + /// ``` + /// + pub fn tuple( input : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma > ) -> syn::Type + { + use proc_macro2::Span; + use syn::{ GenericParam, Type }; + + // Prepare the tuple type for PhantomData based on the struct's generics + let generics_tuple_type = + { + let generics_list = input.iter().map( | param | + { + match param + { + GenericParam::Type( type_param ) => + { + let path = &type_param.ident; + let path2 : syn::Type = parse_quote!{ *const #path }; + path2 + }, + GenericParam::Lifetime( lifetime_param ) => Type::Reference( syn::TypeReference + { + and_token : Default::default(), + lifetime : Some( lifetime_param.lifetime.clone() ), + mutability : None, + elem : Box::new( Type::Tuple( syn::TypeTuple + { + paren_token : syn::token::Paren( Span::call_site() ), + elems : syn::punctuated::Punctuated::new(), + })), + }), + GenericParam::Const( const_param ) => Type::Path( syn::TypePath + { + qself : None, + path : const_param.ident.clone().into(), + }), + } + }).collect::< syn::punctuated::Punctuated< _, syn::token::Comma > >(); + + Type::Tuple( syn::TypeTuple + { + paren_token : syn::token::Paren( Span::call_site() ), + elems : generics_list, + }) + }; + + let result : syn::Type = syn::parse_quote! + { + ::core::marker::PhantomData< #generics_tuple_type > + }; + + result + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +pub mod protected +{ + + //! + //! Responsible for generating marker `PhantomData` fields to avoid the rule requiring the usage of all generic parameters in a struct. This is often necessary to ensure that Rust's type system correctly tracks the ownership and lifetimes of these parameters without needing them to be explicitly used in the struct's fields. + //! + //! Functions and structures to handle and manipulate `PhantomData` fields in structs using the `syn` crate. These utilities ensure that generic parameters are correctly accounted for in type checking, even if they are not directly used in the struct's fields. + //! + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + add_to_item, + tuple, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as phantom; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + prelude::*, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/punctuated.rs b/module/core/macro_tools/src/punctuated.rs new file mode 100644 index 0000000000..0eb1eb50dd --- /dev/null +++ b/module/core/macro_tools/src/punctuated.rs @@ -0,0 +1,69 @@ +//! +//! Structures and functions for handling `syn::punctuated::Punctuated` collections. +//! +//! This module provides functionality to manipulate and ensure correct punctuation in `syn::punctuated::Punctuated` collections, commonly used in procedural macros to represent sequences of elements separated by punctuation marks, such as commas. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + /// Ensures that a `syn::punctuated::Punctuated` collection ends with a comma if it contains elements. + pub fn ensure_trailing_comma< T : Clone > + ( punctuated : &mut syn::punctuated::Punctuated< T, syn::token::Comma > ) + { + if !punctuated.empty_or_trailing() + { + punctuated.push_punct( syn::token::Comma::default() ); + } + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +pub mod protected +{ + //! + //! Structures and functions for handling `syn::punctuated::Punctuated` collections. + //! + //! This module provides functionality to manipulate and ensure correct punctuation in `syn::punctuated::Punctuated` collections, commonly used in procedural macros to represent sequences of elements separated by punctuation marks, such as commas. + //! + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + ensure_trailing_comma, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as punctuated; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + prelude::*, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/quantifier.rs b/module/core/macro_tools/src/quantifier.rs new file mode 100644 index 0000000000..15901b7f89 --- /dev/null +++ b/module/core/macro_tools/src/quantifier.rs @@ -0,0 +1,348 @@ +//! +//! Quantifiers like Pair and Many. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// + /// Marker saying how to parse several elements of such type in a row. + /// + + pub trait AsMuchAsPossibleNoDelimiter {} + + /// Element of parsing. + pub trait Element + where + // Self : syn::parse::Parse + quote::ToTokens, + Self : quote::ToTokens, + { + } + + impl< T > Element for T + where + // Self : syn::parse::Parse + quote::ToTokens, + Self : quote::ToTokens, + { + } + + /// Pair of two elements of parsing. + #[ derive( Debug, PartialEq, Eq, Clone, Default ) ] + pub struct Pair + < T1 : Element, T2 : Element > + ( pub T1, pub T2 ); + + impl< T1, T2 > Pair< T1, T2 > + where + T1 : Element, + T2 : Element, + { + /// Constructor. + pub fn new( src1 : T1, src2 : T2 ) -> Self + { + Self( src1, src2 ) + } + } + + impl< T1, T2 > From< ( T1, T2 ) > for Pair< T1, T2 > + where + T1 : Element, + T2 : Element, + { + #[ inline( always ) ] + fn from( src : ( T1, T2 ) ) -> Self + { + Self( src.0, src.1 ) + } + } + + impl< T1, T2 > From< Pair< T1, T2 > > for ( T1, T2 ) + where + T1 : Element, + T2 : Element, + { + #[ inline( always ) ] + fn from( src : Pair< T1, T2 > ) -> Self + { + ( src.0, src.1 ) + } + } + + impl< T1, T2 > syn::parse::Parse for Pair< T1, T2 > + where + T1 : Element + syn::parse::Parse, + T2 : Element + syn::parse::Parse, + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + Ok( Self( input.parse()?, input.parse()? ) ) + } + } + + impl< T1, T2 > quote::ToTokens for Pair< T1, T2 > + where + T1 : Element + quote::ToTokens, + T2 : Element + quote::ToTokens, + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.0.to_tokens( tokens ); + self.1.to_tokens( tokens ); + } + } + + /// + /// Parse as much elements as possible. + /// + + #[ derive( Debug, PartialEq, Eq, Clone, Default ) ] + pub struct Many< T : quote::ToTokens >( pub Vec< T > ); + + impl< T > Many< T > + where + T : Element, + { + /// Constructor. + pub fn new() -> Self + { + Self( Vec::new() ) + } + /// Constructor. + pub fn new_with( src : Vec< T > ) -> Self + { + Self( src ) + } + /// Iterator + pub fn iter( &self ) -> core::slice::Iter< '_, T > + { + self.0.iter() + } + } + + impl< T > From< Vec< T > > for Many< T > + where + T : quote::ToTokens, + { + #[ inline( always ) ] + fn from( src : Vec< T > ) -> Self + { + Self( src ) + } + } + + impl< T > From< Many< T > > for Vec< T > + where + T : quote::ToTokens, + { + #[ inline( always ) ] + fn from( src : Many< T > ) -> Self + { + src.0 + } + } + + impl< T > IntoIterator for Many< T > + where + T : quote::ToTokens, + { + type Item = T; + type IntoIter = std::vec::IntoIter< Self::Item >; + fn into_iter( self ) -> Self::IntoIter + { + self.0.into_iter() + } + } + + impl< 'a, T > IntoIterator for &'a Many< T > + where + T : quote::ToTokens, + { + type Item = &'a T; + type IntoIter = core::slice::Iter< 'a, T >; + fn into_iter( self ) -> Self::IntoIter + { + // let x = vec![ 1, 2, 3 ].iter(); + ( self.0 ).iter() + } + } + + // impl< T > From< Many< T > > for Vec< T > + // where + // T : Element, + // { + // fn from( src : Many< T > ) -> Self + // { + // src.0 + // } + // } + + impl< T > quote::ToTokens + for Many< T > + where + T : Element + quote::ToTokens, + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + use crate::quote::TokenStreamExt; + tokens.append_all( self.0.iter() ); + } + } + + impl< T > syn::parse::Parse + for Many< T > + where + T : Element + syn::parse::Parse + AsMuchAsPossibleNoDelimiter, + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self > + { + let mut items = vec![]; + while !input.is_empty() + { + let item : T = input.parse()?; + items.push( item ); + } + Ok( Self( items ) ) + } + } + +// zzz : make that working +// +// impl< T > syn::parse::Parse +// for Many< T > +// where +// T : Element + WhileDelimiter, +// { +// fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self > +// { +// let mut result = Self::new(); +// loop +// { +// let lookahead = input.lookahead1(); +// let token = < T as WhileDelimiter >::Delimiter::default().into(); +// if !lookahead.peek( token ) +// { +// break; +// } +// result.0.push( input.parse()? ); +// } +// Ok( result ) +// } +// } +// +// impl WhileDelimiter for AttributesInner +// { +// type Peek = syn::token::Pound; +// type Delimiter = syn::token::Pound; +// } +// impl WhileDelimiter for AttributesOuter +// { +// type Peek = syn::token::Pound; +// type Delimiter = syn::token::Pound; +// } + + impl syn::parse::Parse + for Many< AttributesInner > + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + let mut result = Self::new(); + loop + { + // let lookahead = input.lookahead1(); + if !input.peek( Token![ # ] ) + { + break; + } + result.0.push( input.parse()? ); + } + Ok( result ) + } + } + + impl syn::parse::Parse + for Many< AttributesOuter > + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + let mut result = Self::new(); + loop + { + // let lookahead = input.lookahead1(); + if !input.peek( Token![ # ] ) + { + break; + } + result.0.push( input.parse()? ); + } + Ok( result ) + } + } + + impl AsMuchAsPossibleNoDelimiter for syn::Item {} + + // impl syn::parse::Parse + // for Many< syn::Item > + // { + // fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self > + // { + // let mut items = vec![]; + // while !input.is_empty() + // { + // let item : syn::Item = input.parse()?; + // items.push( item ); + // } + // Ok( Self( items ) ) + // } + // } + +} + + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as quantifier; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + AsMuchAsPossibleNoDelimiter, + Pair, + Many, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} diff --git a/module/core/macro_tools/src/struct_like.rs b/module/core/macro_tools/src/struct_like.rs new file mode 100644 index 0000000000..55b90ba0eb --- /dev/null +++ b/module/core/macro_tools/src/struct_like.rs @@ -0,0 +1,467 @@ +//! +//! Parse structures, like `struct { a : i32 }`. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + // use interval_adapter::BoundExt; + + /// Enum to encapsulate either a field from a struct or a variant from an enum. + #[ derive( Debug, PartialEq ) ] + pub enum FieldOrVariant< 'a > + { + /// Represents a field within a struct or union. + Field( &'a syn::Field ), + /// Represents a variant within an enum. + Variant( &'a syn::Variant ), + } + + impl< 'a > From< &'a syn::Field > for FieldOrVariant< 'a > + { + fn from( field : &'a syn::Field ) -> Self + { + FieldOrVariant::Field( field ) + } + } + + impl< 'a > From< &'a syn::Variant > for FieldOrVariant< 'a > + { + fn from( variant : &'a syn::Variant ) -> Self + { + FieldOrVariant::Variant( variant ) + } + } + + impl quote::ToTokens for FieldOrVariant< '_ > + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + match self + { + FieldOrVariant::Field( item ) => + { + item.to_tokens( tokens ); + }, + FieldOrVariant::Variant( item ) => + { + item.to_tokens( tokens ); + }, + } + } + } + + impl< 'a > FieldOrVariant< 'a > + { + + /// Returns a reference to the attributes of the item. + pub fn attrs( &self ) -> &Vec< syn::Attribute > + { + match self + { + FieldOrVariant::Field( e ) => &e.attrs, + FieldOrVariant::Variant( e ) => &e.attrs, + } + } + + /// Returns a reference to the visibility of the item. + pub fn vis( &self ) -> Option< &syn::Visibility > + { + match self + { + FieldOrVariant::Field( e ) => Some( &e.vis ), + FieldOrVariant::Variant( _ ) => None, + } + } + + /// Returns a reference to the mutability of the item. + pub fn mutability( &self ) -> Option< &syn::FieldMutability > + { + match self + { + FieldOrVariant::Field( e ) => Some( &e.mutability ), + FieldOrVariant::Variant( _ ) => None, + } + } + + /// Returns a reference to the identifier of the item. + pub fn ident( &self ) -> Option< &syn::Ident > + { + match self + { + FieldOrVariant::Field( e ) => e.ident.as_ref(), + FieldOrVariant::Variant( e ) => Some( &e.ident ), + } + } + + /// Returns an iterator over elements of the item. + pub fn typ( &self ) -> Option< &syn::Type > + { + match self + { + FieldOrVariant::Field( e ) => + { + Some( &e.ty ) + }, + FieldOrVariant::Variant( _e ) => + { + None + }, + } + } + + /// Returns a reference to the fields of the item. + pub fn fields( &self ) -> Option< &syn::Fields > + { + match self + { + FieldOrVariant::Field( _ ) => None, + FieldOrVariant::Variant( e ) => Some( &e.fields ), + } + } + + /// Returns a reference to the discriminant of the item. + pub fn discriminant( &self ) -> Option< &( syn::token::Eq, syn::Expr ) > + { + match self + { + FieldOrVariant::Field( _ ) => None, + FieldOrVariant::Variant( e ) => e.discriminant.as_ref(), + } + } + + } + + /// Represents various struct-like constructs in Rust code. + /// + /// This enum enables differentiation among unit types, structs, and enums, allowing + /// for syntactic analysis and manipulation within macros. `StructLike` is designed to be + /// used in macro contexts where behaviors may vary based on the struct-like type being processed. + /// + /// Variants: + /// - `Unit`: Represents unit structs, which are types without any fields or data. Useful in scenarios where + /// a type needs to exist but does not hold any data itself, typically used for type-safe markers. + /// - `Struct`: Represents regular Rust structs that contain fields. This variant is used to handle data structures + /// that hold multiple related data pieces together in a named format. + /// - `Enum`: Represents enums in Rust, which are types that can hold one of multiple possible variants. This is particularly + /// useful for type-safe state or option handling without the use of external discriminators. + /// + #[ derive( Debug, PartialEq ) ] + pub enum StructLike + { + /// A unit struct with no fields. + Unit( syn::ItemStruct ), + /// A typical Rust struct with named fields. + Struct( syn::ItemStruct ), + /// A Rust enum, which can be one of several defined variants. + Enum( syn::ItemEnum ), + } + + impl From< syn::ItemStruct > for StructLike + { + fn from( item_struct : syn::ItemStruct ) -> Self + { + if item_struct.fields.is_empty() + { + StructLike::Unit( item_struct ) + } + else + { + StructLike::Struct( item_struct ) + } + } + } + + impl From< syn::ItemEnum > for StructLike + { + fn from( item_enum : syn::ItemEnum ) -> Self + { + StructLike::Enum( item_enum ) + } + } + + impl syn::parse::Parse for StructLike + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + use syn::{ ItemStruct, ItemEnum, Visibility, Attribute }; + + // Parse attributes + let attributes : Vec< Attribute > = input.call( Attribute::parse_outer )?; + // Parse visibility + let visibility : Visibility = input.parse().unwrap_or( syn::Visibility::Inherited ); + + // Fork input stream to handle struct/enum keyword without consuming + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Token![ struct ] ) + { + // Parse ItemStruct + let mut item_struct : ItemStruct = input.parse()?; + item_struct.vis = visibility; + item_struct.attrs = attributes.into(); + if item_struct.fields.is_empty() + { + Ok( StructLike::Unit( item_struct ) ) + } + else + { + Ok( StructLike::Struct( item_struct ) ) + } + } + else if lookahead.peek( syn::Token![ enum ] ) + { + // Parse ItemEnum + let mut item_enum : ItemEnum = input.parse()?; + item_enum.vis = visibility; + item_enum.attrs = attributes.into(); + Ok( StructLike::Enum( item_enum ) ) + } + else + { + Err( lookahead.error() ) + } + } + } + + impl quote::ToTokens for StructLike + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + match self + { + StructLike::Unit( item ) | StructLike::Struct( item ) => + { + item.to_tokens( tokens ); + }, + StructLike::Enum( item ) => + { + item.to_tokens( tokens ); + }, + } + } + } + + impl StructLike + { + + /// Returns an iterator over elements of the item. + pub fn elements< 'a >( &'a self ) -> impl IterTrait< 'a, FieldOrVariant< 'a > > + 'a + { + match self + { + StructLike::Unit( _ ) => + { + let empty : Vec< FieldOrVariant< 'a > > = vec![]; + Box::new( empty.into_iter() ) as Box< dyn IterTrait< 'a, FieldOrVariant< 'a > > > + }, + StructLike::Struct( item ) => + { + let fields = item.fields.iter().map( FieldOrVariant::from ); + Box::new( fields ) as Box< dyn IterTrait< 'a, FieldOrVariant< 'a > > > + }, + StructLike::Enum( item ) => + { + let variants = item.variants.iter().map( FieldOrVariant::from ); + Box::new( variants ) as Box< dyn IterTrait< 'a, FieldOrVariant< 'a > > > + }, + } + } + + /// Returns an iterator over elements of the item. + pub fn attrs( &self ) -> &Vec< syn::Attribute > + { + match self + { + StructLike::Unit( item ) => + { + &item.attrs + }, + StructLike::Struct( item ) => + { + &item.attrs + }, + StructLike::Enum( item ) => + { + &item.attrs + }, + } + } + + /// Returns an iterator over elements of the item. + pub fn vis( &self ) -> &syn::Visibility + { + match self + { + StructLike::Unit( item ) => + { + &item.vis + }, + StructLike::Struct( item ) => + { + &item.vis + }, + StructLike::Enum( item ) => + { + &item.vis + }, + } + } + + /// Returns an iterator over elements of the item. + pub fn ident( &self ) -> &syn::Ident + { + match self + { + StructLike::Unit( item ) => + { + &item.ident + }, + StructLike::Struct( item ) => + { + &item.ident + }, + StructLike::Enum( item ) => + { + &item.ident + }, + } + } + + /// Returns an iterator over elements of the item. + pub fn generics( &self ) -> &syn::Generics + { + match self + { + StructLike::Unit( item ) => + { + &item.generics + }, + StructLike::Struct( item ) => + { + &item.generics + }, + StructLike::Enum( item ) => + { + &item.generics + }, + } + } + + /// Returns an iterator over fields of the item. + // pub fn fields( &self ) -> Box< dyn Iterator< Item = &syn::Field > + '_ > + pub fn fields< 'a >( &'a self ) -> Box< dyn IterTrait< 'a, &'a syn::Field > + '_ > + // pub fn fields< 'a >( &'a self ) -> impl IterTrait< 'a, &'a syn::Field > + { + match self + { + StructLike::Unit( _item ) => + { + Box::new( std::iter::empty() ) + }, + StructLike::Struct( item ) => + { + Box::new( item.fields.iter() ) + }, + StructLike::Enum( _item ) => + { + Box::new( std::iter::empty() ) + }, + } + } + + /// Extracts the name of each field. + // pub fn field_names( &self ) -> Box< dyn Iterator< Item = Option< &syn::Ident > > + '_ > + // pub fn field_names< 'a >( &'a self ) -> Box< dyn IterTrait< 'a, Option< &'a syn::Ident > > + '_ > + // pub fn field_names< 'a >( &'a self ) -> Option< Box< dyn IterTrait< 'a, &'a syn::Ident > + '_ > > + pub fn field_names< 'a >( &'a self ) -> Option< impl IterTrait< 'a, &'a syn::Ident > + '_ > + { + match self + { + StructLike::Unit( item ) => + { + item_struct::field_names( item ) + }, + StructLike::Struct( item ) => + { + item_struct::field_names( item ) + }, + StructLike::Enum( _item ) => + { + Some( Box::new( self.fields().map( | field | field.ident.as_ref().unwrap() ) ) ) + // Box::new( std::iter::empty() ) + }, + } + + // Box::new( self.fields().map( | field | field.ident.as_ref() ) ) + } + + /// Extracts the type of each field. + // pub fn field_types( &self ) -> Box< dyn Iterator< Item = &syn::Type > + '_ > + // pub fn field_types< 'a >( &'a self ) -> Box< dyn IterTrait< 'a, &'a syn::Type > + '_ > + pub fn field_types< 'a >( &'a self ) -> impl IterTrait< 'a, &'a syn::Type > + { + Box::new( self.fields().map( | field | &field.ty ) ) + } + + /// Extracts the name of each field. + // pub fn field_attrs( &self ) -> Box< dyn Iterator< Item = &Vec< syn::Attribute > > + '_ > + // pub fn field_attrs< 'a >( &'a self ) -> Box< dyn IterTrait< 'a, &'a Vec< syn::Attribute > > + '_ > + pub fn field_attrs< 'a >( &'a self ) -> impl IterTrait< 'a, &'a Vec< syn::Attribute > > + { + Box::new( self.fields().map( | field | &field.attrs ) ) + } + + /// Extract the first field. + pub fn first_field( &self ) -> Option< &syn::Field > + { + self.fields().next() + // .ok_or( syn_err!( self.span(), "Expects at least one field" ) ) + } + + } + + // + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + StructLike, + FieldOrVariant, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as struct_like; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/macro_tools/src/tokens.rs b/module/core/macro_tools/src/tokens.rs new file mode 100644 index 0000000000..7a09fc4689 --- /dev/null +++ b/module/core/macro_tools/src/tokens.rs @@ -0,0 +1,115 @@ +//! +//! Attributes analyzys and manipulation. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use core::fmt; + + /// `Tokens` is a wrapper around `proc_macro2::TokenStream`. + /// It is designed to facilitate the parsing and manipulation of token streams + /// within procedural macros. + /// + /// # Examples + /// + /// Creating a new `Tokens` instance from a token stream : + /// + /// ```rust + /// use macro_tools::exposed::*; + /// + /// let ts : proc_macro2::TokenStream = qt! { let x = 10; }; + /// let tokens = tokens::Tokens::new( ts ); + /// ``` + #[ derive( Default ) ] + pub struct Tokens + { + /// `proc_macro2::TokenStream` + pub inner : proc_macro2::TokenStream, + } + + impl Tokens + { + /// Constructor from `proc_macro2::TokenStream`. + pub fn new( inner : proc_macro2::TokenStream ) -> Self + { + Tokens { inner } + } + } + + impl syn::parse::Parse for Tokens + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let inner : proc_macro2::TokenStream = input.parse()?; + Ok( Tokens::new( inner ) ) + } + } + + impl quote::ToTokens for Tokens + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.inner.to_tokens( tokens ); + } + } + + impl fmt::Debug for Tokens + { + fn fmt( &self, f : &mut fmt::Formatter< '_ > ) -> fmt::Result + { + write!( f, "{}", self.inner.to_string() ) + } + } + + impl core::fmt::Display for Tokens + { + fn fmt( &self, f : &mut core::fmt::Formatter< '_ > ) -> core::fmt::Result + { + write!( f, "{}", self.inner.to_string() ) + } + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as tokens; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Tokens, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} + diff --git a/module/core/macro_tools/src/typ.rs b/module/core/macro_tools/src/typ.rs new file mode 100644 index 0000000000..609cc717e3 --- /dev/null +++ b/module/core/macro_tools/src/typ.rs @@ -0,0 +1,200 @@ +//! +//! Advanced syntax elements. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use interval_adapter::BoundExt; + + /// Check is the rightmost item of path refering a type is specified type. + /// + /// Good to verify `core::option::Option< i32 >` is optional. + /// Good to verify `alloc::vec::Vec< i32 >` is vector. + /// + /// ### Basic use-case. + /// ```rust + /// use macro_tools::exposed::*; + /// + /// let code = qt!( core::option::Option< i32 > ); + /// let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + /// let got = typ::type_rightmost( &tree_type ); + /// assert_eq!( got, Some( "Option".to_string() ) ); + /// ``` + + pub fn type_rightmost( ty : &syn::Type ) -> Option< String > + { + if let syn::Type::Path( path ) = ty + { + let last = &path.path.segments.last(); + if last.is_none() + { + return None; + } + return Some( last.unwrap().ident.to_string() ); + } + None + } + + /// Return the specified number of parameters of the type. + /// + /// Good to getting `i32` from `core::option::Option< i32 >` or `alloc::vec::Vec< i32 >` + /// + /// ### Basic use-case. + /// ``` + /// use macro_tools::{ typ, qt }; + /// + /// let code = qt!( core::option::Option< i8, i16, i32, i64 > ); + /// let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + /// let got = typ::type_parameters( &tree_type, 0..=2 ); + /// got.iter().for_each( | e | println!( "{}", qt!( #e ) ) ); + /// // < i8 + /// // < i16 + /// // < i32 + /// ``` + + pub fn type_parameters( ty : &syn::Type, range : impl NonIterableInterval ) -> Vec< &syn::Type > + { + if let syn::Type::Path( syn::TypePath{ path : syn::Path { ref segments, .. }, .. } ) = ty + { + let last = &segments.last(); + if last.is_none() + { + return vec![ ty ] + } + let args = &last.unwrap().arguments; + if let syn::PathArguments::AngleBracketed( ref args2 ) = args + { + let args3 = &args2.args; + let left = range.left().into_left_closed(); + let mut right = range.right().into_right_closed(); + let len = args3.len(); + if right == isize::MAX + { + right = len as isize; + } + // dbg!( left ); + // dbg!( right ); + // dbg!( len ); + let selected : Vec< &syn::Type > = args3 + .iter() + .skip_while( | e | !matches!( e, syn::GenericArgument::Type( _ ) ) ) + .skip( usize::try_from( left.max( 0 ) ).unwrap() ) + .take( usize::try_from( ( right - left + 1 ).min( len as isize - left ).max( 0 ) ).unwrap() ) + .map( | e | if let syn::GenericArgument::Type( ty ) = e { ty } else { unreachable!( "Expects Type" ) } ) + .collect(); + return selected; + } + } + vec![ ty ] + } + +// /// Extract generics from a type. +// pub fn all_type_parameters( type_example : &syn::Type ) +// -> +// Option< syn::punctuated::Punctuated< syn::GenericArgument, syn::token::Comma > > +// { +// if let syn::Type::Path( type_path ) = type_example +// { +// let segments = &type_path.path.segments; +// let last_segment = segments.last()?; +// +// if let syn::PathArguments::AngleBracketed( generics ) = &last_segment.arguments +// { +// return Some( generics.args.clone() ); +// } +// } +// None +// } + + + /// Checks if a given [`syn::Type`] is an `Option` type. + /// + /// This function examines a type to determine if it represents an `Option`. + /// It is useful for scenarios where type-specific behavior needs to be conditional + /// on whether the type is optional or not. + /// + /// # Example + /// + /// ```rust + /// let type_string = "Option< i32 >"; + /// let parsed_type : syn::Type = syn::parse_str( type_string ).expect( "Type should parse correctly" ); + /// assert!( macro_tools::typ::is_optional( &parsed_type ) ); + /// ``` + /// + + pub fn is_optional( ty : &syn::Type ) -> bool + { + typ::type_rightmost( ty ) == Some( "Option".to_string() ) + } + + /// Extracts the first generic parameter from a given `syn::Type` if any exists. + /// + /// This function is designed to analyze a type and retrieve its first generic parameter. + /// It is particularly useful when working with complex types in macro expansions and needs + /// to extract specific type information for further processing. + /// +/// + /// # Example + /// ```rust + /// let type_string = "Result< Option< i32 >, Error >"; + /// let parsed_type : syn::Type = syn::parse_str( type_string ).expect( "Type should parse correctly" ); + /// let first_param = macro_tools::typ::parameter_first( &parsed_type ).expect( "Should have at least one parameter" ); + /// // Option< i32 > + /// ``` + + pub fn parameter_first( ty : &syn::Type ) -> Result< &syn::Type > + { + typ::type_parameters( ty, 0 ..= 0 ) + .first() + .copied() + .ok_or_else( || syn_err!( ty, "Expects at least one parameter here:\n {}", qt!{ #ty } ) ) + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + type_rightmost, + type_parameters, + // all_type_parameters, + is_optional, + parameter_first, + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as typ; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} + diff --git a/module/core/macro_tools/tests/inc/attr_prop_test.rs b/module/core/macro_tools/tests/inc/attr_prop_test.rs new file mode 100644 index 0000000000..e2fdb5ecb6 --- /dev/null +++ b/module/core/macro_tools/tests/inc/attr_prop_test.rs @@ -0,0 +1,113 @@ +use super::*; +use quote::ToTokens; + +#[ test ] +fn attr_prop_test() +{ + + #[ derive( Debug, Default, Clone, Copy ) ] + pub struct DebugMarker; + + #[ derive( Debug, Default, Clone, Copy ) ] + pub struct EnabledMarker; + + pub trait AttributePropertyComponent + { + const KEYWORD : &'static str; + } + + impl AttributePropertyComponent for DebugMarker + { + const KEYWORD : &'static str = "debug"; + } + + impl AttributePropertyComponent for EnabledMarker + { + const KEYWORD : &'static str = "enabled"; + } + + #[ derive( Debug, Default ) ] + struct MyAttributes + { + pub debug : AttributePropertyBoolean< DebugMarker >, + pub enabled : AttributePropertyBoolean< EnabledMarker >, + } + + impl syn::parse::Parse for MyAttributes + { + fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self > + { + let mut debug = AttributePropertyBoolean::< DebugMarker >::default(); + let mut enabled = AttributePropertyBoolean::< EnabledMarker >::default(); + + while !input.is_empty() + { + let lookahead = input.lookahead1(); + if lookahead.peek( syn::Ident ) + { + let ident : syn::Ident = input.parse()?; + match ident.to_string().as_str() + { + DebugMarker::KEYWORD => debug = input.parse()?, + EnabledMarker::KEYWORD => enabled = input.parse()?, + _ => return Err( lookahead.error() ), + } + } + else + { + return Err( lookahead.error() ); + } + + // Optional comma handling + if input.peek( syn::Token![,] ) + { + input.parse::< syn::Token![,] >()?; + } + } + + Ok( MyAttributes { debug, enabled } ) + } + } + + let input : syn::Attribute = syn::parse_quote!( #[ attribute( enabled = true ) ] ); + let meta = match input.meta + { + syn::Meta::List( meta_list ) => meta_list, + _ => panic!( "Expected a Meta::List" ), + }; + + let nested_meta_stream : proc_macro2::TokenStream = meta.tokens; + let attrs : MyAttributes = syn::parse2( nested_meta_stream ).unwrap(); + println!( "{:?}", attrs ); + + let attr : AttributePropertyBoolean< DebugMarker > = AttributePropertyBoolean::default(); + assert_eq!( attr.internal(), false ); + let attr : AttributePropertyBoolean< DebugMarker > = true.into(); + assert_eq!( attr.internal(), true ); + let attr : AttributePropertyBoolean< DebugMarker > = false.into(); + assert_eq!( attr.internal(), false ); + + let input : syn::Attribute = syn::parse_quote!( #[ attribute( enabled = true ) ] ); + let meta = match input.meta + { + syn::Meta::List( meta_list ) => meta_list, + _ => panic!( "Expected a Meta::List" ), + }; + + let nested_meta_stream : proc_macro2::TokenStream = meta.tokens; + let parsed : MyAttributes = syn::parse2( nested_meta_stream ).unwrap(); + assert_eq!( parsed.enabled.internal(), true ); + assert_eq!( parsed.debug.internal(), false ); + +} + +#[ test ] +fn attribute_property_enabled() +{ + // Test default value + let attr : AttributePropertyOptionalSingletone = Default::default(); + assert_eq!( attr.internal(), None ); + assert_eq!( attr.value( true ), true ); + assert_eq!( attr.value( false ), false ); + +} diff --git a/module/core/macro_tools/tests/inc/attr_test.rs b/module/core/macro_tools/tests/inc/attr_test.rs new file mode 100644 index 0000000000..dab489f65d --- /dev/null +++ b/module/core/macro_tools/tests/inc/attr_test.rs @@ -0,0 +1,76 @@ + +use super::*; + +// + +#[ test ] +fn is_standard_standard() +{ + // Test a selection of attributes known to be standard + assert!( attr::is_standard( "cfg" ), "Expected 'cfg' to be a standard attribute." ); + assert!( attr::is_standard( "derive" ), "Expected 'derive' to be a standard attribute." ); + assert!( attr::is_standard( "inline" ), "Expected 'inline' to be a standard attribute." ); + assert!( attr::is_standard( "test" ), "Expected 'test' to be a standard attribute." ); + assert!( attr::is_standard( "doc" ), "Expected 'doc' to be a standard attribute." ); +} + +#[ test ] +fn is_standard_non_standard() +{ + // Test some made-up attributes that should not be standard + assert!( !attr::is_standard( "custom_attr" ), "Expected 'custom_attr' to not be a standard attribute." ); + assert!( !attr::is_standard( "my_attribute" ), "Expected 'my_attribute' to not be a standard attribute." ); + assert!( !attr::is_standard( "special_feature" ), "Expected 'special_feature' to not be a standard attribute." ); +} + +#[ test ] +fn is_standard_edge_cases() +{ + // Test edge cases like empty strings or unusual input + assert!( !attr::is_standard( "" ), "Expected empty string to not be a standard attribute." ); + assert!( !attr::is_standard( " " ), "Expected a single space to not be a standard attribute." ); + assert!( !attr::is_standard( "cfg_attr_extra" ), "Expected 'cfg_attr_extra' to not be a standard attribute." ); +} + +#[ test ] +fn attribute_component_from_meta() +{ + struct MyComponent; + + impl AttributeComponent for MyComponent + { + const KEYWORD : &'static str = "my_component"; + + fn from_meta( attr : &syn::Attribute ) -> Result< Self > + { + match &attr.meta + { + syn::Meta::NameValue( meta_name_value ) if meta_name_value.path.is_ident( Self::KEYWORD ) => + { + Ok( MyComponent ) + } + _ => Err( syn::Error::new_spanned( attr, "Failed to parse attribute as MyComponent" ) ), + } + } + } + + // Define a sample attribute + let attr : syn::Attribute = syn::parse_quote!( #[ my_component = "value" ] ); + + // Attempt to construct MyComponent from the attribute + let result = MyComponent::from_meta( &attr ); + + // Assert that the construction was successful + assert!( result.is_ok() ); + + // Negative testing + + // Define a sample invalid attribute + let attr : syn::Attribute = syn::parse_quote!( #[ other_component = "value" ] ); + + // Attempt to construct MyComponent from the invalid attribute + let result = MyComponent::from_meta( &attr ); + + // Assert that the construction failed + assert!( result.is_err() ); +} diff --git a/module/core/macro_tools/tests/inc/basic_test.rs b/module/core/macro_tools/tests/inc/basic_test.rs new file mode 100644 index 0000000000..78e3dc4460 --- /dev/null +++ b/module/core/macro_tools/tests/inc/basic_test.rs @@ -0,0 +1,14 @@ + +use super::*; + +// + +tests_impls! +{ +} + +// + +tests_index! +{ +} diff --git a/module/core/macro_tools/tests/inc/container_kind_test.rs b/module/core/macro_tools/tests/inc/container_kind_test.rs new file mode 100644 index 0000000000..e6669410a1 --- /dev/null +++ b/module/core/macro_tools/tests/inc/container_kind_test.rs @@ -0,0 +1,160 @@ + +use super::*; + +// + +#[ test ] +fn type_container_kind_basic() +{ + use the_module::exposed::container_kind; + + // test.case( "core::option::Option< i32 >" ); + let code = qt!( core::option::Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::No ); + + // test.case( "core::option::Option< Vec >" ); + let code = qt!( core::option::Option< Vec > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::No ); + + // test.case( "alloc::vec::Vec< i32 >" ); + let code = qt!( alloc::vec::Vec< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::Vector ); + + // test.case( "alloc::vec::Vec" ); + let code = qt!( alloc::vec::Vec ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::Vector ); + + // test.case( "std::vec::Vec< i32 >" ); + let code = qt!( std::vec::Vec< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::Vector ); + + // test.case( "std::vec::Vec" ); + let code = qt!( std::vec::Vec ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::Vector ); + + // test.case( "std::Vec< i32 >" ); + let code = qt!( std::Vec< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::Vector ); + + // test.case( "std::Vec" ); + let code = qt!( std::Vec ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::Vector ); + + // test.case( "not vector" ); + let code = qt!( std::SomeVector< i32, i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::No ); + + // test.case( "hash map" ); + let code = qt!( std::collections::HashMap< i32, i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::HashMap ); + + // test.case( "hash set" ); + let code = qt!( std::collections::HashSet< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = container_kind::of_type( &tree_type ); + a_id!( got, the_module::container_kind::ContainerKind::HashSet ); + +} + +// + +#[ test ] +fn type_optional_container_kind_basic() +{ + + // test.case( "non optional not container" ); + let code = qt!( i32 ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::No, false ) ); + + // test.case( "optional not container" ); + let code = qt!( core::option::Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::No, true ) ); + + // test.case( "optional not container" ); + let code = qt!( Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::No, true ) ); + + + // test.case( "optional vector" ); + let code = qt!( core::option::Option< Vec > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::Vector, true ) ); + + // test.case( "optional vector" ); + let code = qt!( Option< Vec > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::Vector, true ) ); + + // test.case( "non optional vector" ); + let code = qt!( std::Vec< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::Vector, false ) ); + + + // test.case( "optional vector" ); + let code = qt!( core::option::Option< std::collections::HashMap< i32, i32 > > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::HashMap, true ) ); + + // test.case( "optional vector" ); + let code = qt!( Option< HashMap > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::HashMap, true ) ); + + // test.case( "non optional vector" ); + let code = qt!( HashMap< i32, i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::HashMap, false ) ); + + + // test.case( "optional vector" ); + let code = qt!( core::option::Option< std::collections::HashSet< i32, i32 > > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::HashSet, true ) ); + + // test.case( "optional vector" ); + let code = qt!( Option< HashSet > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::HashSet, true ) ); + + // test.case( "non optional vector" ); + let code = qt!( HashSet< i32, i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::container_kind::of_optional( &tree_type ); + a_id!( got, ( the_module::container_kind::ContainerKind::HashSet, false ) ); + +} diff --git a/module/core/macro_tools/tests/inc/derive_test.rs b/module/core/macro_tools/tests/inc/derive_test.rs new file mode 100644 index 0000000000..b6983e34d5 --- /dev/null +++ b/module/core/macro_tools/tests/inc/derive_test.rs @@ -0,0 +1,72 @@ + +use super::*; + +// + +#[test] +fn named_fields_with_named_fields() +{ + use syn::{parse_quote, punctuated::Punctuated, Field, token::Comma}; + use the_module::derive; + + let ast: syn::DeriveInput = parse_quote! + { + struct Test + { + a : i32, + b : String, + } + }; + + let result = derive::named_fields( &ast ).expect( "Expected successful extraction of named fields" ); + + let mut expected_fields = Punctuated::new(); + let field_a : Field = parse_quote! { a: i32 }; + let field_b : Field = parse_quote! { b: String }; + expected_fields.push_value( field_a); + expected_fields.push_punct( Comma::default() ); + expected_fields.push_value( field_b ); + expected_fields.push_punct( Comma::default() ); + + a_id!( format!( "{:?}", result ), format!( "{:?}", expected_fields ), "Fields did not match expected output" ); +} + +// + +#[ test ] +fn named_fields_with_tuple_struct() +{ + use syn::{ parse_quote }; + use the_module::derive::named_fields; + + let ast : syn::DeriveInput = parse_quote! + { + struct Test( i32, String ); + }; + + let result = named_fields( &ast ); + + assert!( result.is_err(), "Expected an error for tuple struct, but extraction was successful" ); +} + +// + +#[ test ] +fn named_fields_with_enum() +{ + use syn::{ parse_quote }; + use the_module::derive::named_fields; + + let ast : syn::DeriveInput = parse_quote! + { + enum Test + { + Variant1, + Variant2, + } + }; + + let result = named_fields( &ast ); + + assert!( result.is_err(), "Expected an error for enum, but extraction was successful" ); +} diff --git a/module/core/macro_tools/tests/inc/diag_test.rs b/module/core/macro_tools/tests/inc/diag_test.rs new file mode 100644 index 0000000000..e39db7d824 --- /dev/null +++ b/module/core/macro_tools/tests/inc/diag_test.rs @@ -0,0 +1,133 @@ + +use super::*; + +// + +tests_impls! +{ + + fn tree_diagnostics_str_basic() + { + + let exp = r#"code : std :: collections :: HashMap < i32 , i32 > : +TokenStream [ + Ident { + sym: std, + }, + Punct { + char: ':', + spacing: Joint, + }, + Punct { + char: ':', + spacing: Alone, + }, + Ident { + sym: collections, + }, + Punct { + char: ':', + spacing: Joint, + }, + Punct { + char: ':', + spacing: Alone, + }, + Ident { + sym: HashMap, + }, + Punct { + char: '<', + spacing: Alone, + }, + Ident { + sym: i32, + }, + Punct { + char: ',', + spacing: Alone, + }, + Ident { + sym: i32, + }, + Punct { + char: '>', + spacing: Alone, + }, +]"#; + let code = qt!( std::collections::HashMap< i32, i32 > ); + let got = the_module::tree_diagnostics_str!( code ); + // println!( "{}", got ); + a_id!( got, exp ); + let got = the_module::tree_print!( code ); + // println!( "{}", got ); + a_id!( got, exp ); + + } + + // + + fn syn_err_basic() + { + + // test.case( "basic" ); + let err = the_module::syn_err!( "abc" ); + a_id!( err.to_string(), "abc" ); + + // test.case( "basic, trailing comma" ); + let err = the_module::syn_err!( "abc", ); + a_id!( err.to_string(), "abc" ); + + // test.case( "with span" ); + let code = qt!( core::option::Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let err = the_module::syn_err!( tree_type, "abc" ); + a_id!( err.to_string(), "abc" ); + // a_id!( err.span(), syn::spanned::Spanned::span( &tree_type ) ); + + // test.case( "with span, trailing comma" ); + let code = qt!( core::option::Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let err = the_module::syn_err!( tree_type, "abc", ); + a_id!( err.to_string(), "abc" ); + + // test.case( "with span and args" ); + let code = qt!( core::option::Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let err = the_module::syn_err!( tree_type, "abc{}{}", "def", "ghi" ); + a_id!( err.to_string(), "abcdefghi" ); + // a_id!( err.span(), syn::spanned::Spanned::span( &tree_type ) ); + + // test.case( "with span and args, trailing comma" ); + let code = qt!( core::option::Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let err = the_module::syn_err!( tree_type, "abc{}{}", "def", "ghi", ); + a_id!( err.to_string(), "abcdefghi" ); + + // test.case( "without span" ); + let err = the_module::syn_err!( _, "abc" ); + a_id!( err.to_string(), "abc" ); + + // test.case( "without span, trailing comma" ); + let err = the_module::syn_err!( _, "abc", ); + a_id!( err.to_string(), "abc" ); + + // test.case( "without span, but with args" ); + let err = the_module::syn_err!( _, "abc{}{}", "def", "ghi" ); + a_id!( err.to_string(), "abcdefghi" ); + + // test.case( "without span, trailing comma" ); + let err = the_module::syn_err!( _, "abc{}{}", "def", "ghi", ); + a_id!( err.to_string(), "abcdefghi" ); + + } + +} + +// + +tests_index! +{ + tree_diagnostics_str_basic, + syn_err_basic, +} diff --git a/module/core/macro_tools/tests/inc/drop_test.rs b/module/core/macro_tools/tests/inc/drop_test.rs new file mode 100644 index 0000000000..8dc0e89c9c --- /dev/null +++ b/module/core/macro_tools/tests/inc/drop_test.rs @@ -0,0 +1,23 @@ + +use super::*; + +#[ test ] +fn test_needs_drop() +{ + struct NeedsDrop; + + impl Drop for NeedsDrop + { + fn drop( &mut self ) {} + } + + assert!( std::mem::needs_drop::< NeedsDrop >() ); + + // Test each of the types with a handwritten TrivialDrop impl above. + assert!( !std::mem::needs_drop::< std::iter::Empty< NeedsDrop > >() ); + assert!( !std::mem::needs_drop::< std::slice::Iter< '_, NeedsDrop > >() ); + assert!( !std::mem::needs_drop::< std::slice::IterMut< '_, NeedsDrop > >() ); + assert!( !std::mem::needs_drop::< std::option::IntoIter< &NeedsDrop > >() ); + assert!( !std::mem::needs_drop::< std::option::IntoIter< &mut NeedsDrop > >() ); + +} diff --git a/module/core/macro_tools/tests/inc/equation_test.rs b/module/core/macro_tools/tests/inc/equation_test.rs new file mode 100644 index 0000000000..735d8261fc --- /dev/null +++ b/module/core/macro_tools/tests/inc/equation_test.rs @@ -0,0 +1,108 @@ + +use super::*; + +// + +tests_impls! +{ + + #[ test ] + fn equation_test() -> Result< () > + { + use syn::spanned::Spanned; + + // test.case( "basic" ); + let input = qt! + { + #[ derive( Former ) ] + pub struct Struct1 + { + #[former( default = 31 ) ] + pub int_1 : i32, + } + }; + + let ast = match syn::parse2::< syn::DeriveInput >( input ) + { + Ok( syntax_tree ) => syntax_tree, + Err( err ) => return Err( err ), + }; + + let fields = match ast.data + { + syn::Data::Struct( ref data_struct ) => match data_struct.fields + { + syn::Fields::Named( ref fields_named ) => + { + &fields_named.named + }, + _ => return Err( syn::Error::new( ast.span(), "Unknown format of data, expected syn::Fields::Named( ref fields_named )" ) ), + }, + _ => return Err( syn::Error::new( ast.span(), "Unknown format of data, expected syn::Data::Struct( ref data_struct )" ) ), + }; + + let attr = fields.first().ok_or_else( || err( "No field" ) )?.attrs.first().ok_or_else( || err( "No attr" ) )?; + + let exp = equation::Equation + { + left : parse_quote!{ default }, + op : parse_quote!{ = }, + right : parse_quote!{ 31 }, + }; + let got = equation::from_meta( &attr )?; + a_id!( got.left, exp.left ); + a_id!( format!( "{:?}", got ), format!( "{:?}", exp ) ); + // a_id!( got.right, exp.right ); + + return Ok( () ); + + fn err( src : &str ) -> syn::Error + { + syn::Error::new( proc_macro2::Span::call_site(), src ) + } + } + + fn equation_parse_test() + { + + let got : the_module::Equation = syn::parse_quote!( default = 31 ); + tree_print!( got ); + a_id!( code_to_str!( got ), "default = 31".to_string() ); + + a_id!( got.left, syn::parse_quote!( default ) ); + a_id!( got.op, syn::token::Eq::default() ); + a_id!( code_to_str!( got.right ), "31".to_string() ); + + } + + fn equation_from_meta_test() + { + + let attr1 : syn::Attribute = syn::parse_quote!( #[ default( 31 ) ] ); + tree_print!( attr1 ); + + let attr1 : syn::Attribute = syn::parse_quote!( #[ default[ 31 ] ] ); + tree_print!( attr1 ); + + let attr1 : syn::Attribute = syn::parse_quote!( #[ former( default = 31 ) ] ); + // tree_print!( attr1 ); + let got = equation::from_meta( &attr1 ).unwrap(); + a_id!( code_to_str!( got ), "default = 31".to_string() ); + a_id!( got.left, syn::parse_quote!( default ) ); + a_id!( got.op, syn::token::Eq::default() ); + a_id!( code_to_str!( got.right ), "31".to_string() ); + + } + +} + +// + +// + +tests_index! +{ + equation_test, + equation_parse_test, + equation_from_meta_test, +} diff --git a/module/core/macro_tools/tests/inc/generic_args_test.rs b/module/core/macro_tools/tests/inc/generic_args_test.rs new file mode 100644 index 0000000000..8076737930 --- /dev/null +++ b/module/core/macro_tools/tests/inc/generic_args_test.rs @@ -0,0 +1,356 @@ + +use super::*; + +// + +#[ test ] +fn assumptions() +{ + + // let code : syn::ItemStruct = syn::parse_quote! + // { + // pub struct Struct1Former + // < + // Definition = Struct1FormerDefinition< (), Struct1, former::ReturnPreformed >, + // > + // {} + // }; + // tree_print!( code ); + + // let mut a : syn::Generics = parse_quote! + // { + // < 'a, T > + // }; + // let mut b : syn::IntoGenericArgs = parse_quote! + // { + // < (), Struct1, former::ReturnPreformed > + // }; + // let got = generic_params::generic_args::merge( &a.into(), &b.into() ); + // // let got = definition_extra_generics; + + // let mut _got : syn::Generics = parse_quote! + // { + // < Struct1, former::ReturnPreformed > + // }; + + // let mut _got : syn::Generics = parse_quote! + // { + // < (), Struct1, former::ReturnPreformed > + // }; + +} + +// + +#[ test ] +fn into_generic_args_empty_generics() +{ + use syn::{ Generics, AngleBracketedGenericArguments, token }; + use macro_tools::IntoGenericArgs; + use proc_macro2::Span; + + let generics = Generics::default(); + let got = generics.into_generic_args(); + let exp = AngleBracketedGenericArguments + { + colon2_token: None, + lt_token: token::Lt::default(), + args: syn::punctuated::Punctuated::new(), + gt_token: token::Gt::default(), + }; + a_id!( exp, got, "Failed into_generic_args_empty_generics: exp {:?}, got {:?}", exp, got ); +} + +// +#[ test ] +fn into_generic_args_single_type_parameter() +{ + use syn:: + { + Generics, + AngleBracketedGenericArguments, + parse_quote + }; + use macro_tools::IntoGenericArgs; + + // Generate the generics with a single type parameter using parse_quote + let generics : Generics = parse_quote! + { + < T > + }; + + // Create the exp AngleBracketedGenericArguments using parse_quote + let exp : AngleBracketedGenericArguments = parse_quote! + { + < T > + }; + + let got = generics.into_generic_args(); + a_id!( exp, got, "Failed into_generic_args_single_type_parameter: exp {:?}, got {:?}", exp, got ); +} + +/// + +#[ test ] +fn into_generic_args_single_lifetime_parameter() +{ + use syn:: + { + Generics, + AngleBracketedGenericArguments, + GenericArgument, + parse_quote, + punctuated::Punctuated + }; + use macro_tools::IntoGenericArgs; + + // Generate the generics using parse_quote to include a lifetime parameter + let generics : Generics = parse_quote! + { + < 'a > + }; + + // Create the exp AngleBracketedGenericArguments using parse_quote + let exp : AngleBracketedGenericArguments = parse_quote! + { + < 'a > + }; + + // Use the implementation to generate the actual output + let got = generics.into_generic_args(); + + // Debug prints for better traceability in case of failure + println!( "Expected: {:?}", exp ); + println!( "Got: {:?}", got ); + + // Assert to check if the exp matches the got + a_id!( exp, got, "Failed into_generic_args_single_lifetime_parameter: exp {:?}, got {:?}", exp, got ); +} + +#[ test ] +fn into_generic_args_single_const_parameter() +{ + use syn:: + { + Generics, + AngleBracketedGenericArguments, + GenericArgument, + Expr, + ExprPath, + Ident, + token::{ self, Lt, Gt }, + punctuated::Punctuated + }; + use macro_tools::IntoGenericArgs; + + // Use parse_quote to create the generic parameters + let generics : Generics = parse_quote! + { + < const N: usize > + }; + + let got = generics.into_generic_args(); + + // Manually construct the exp value + let mut args = Punctuated::new(); + args.push_value( GenericArgument::Const( Expr::Path( ExprPath + { + attrs: vec![], + qself: None, + path: syn::Path::from( Ident::new( "N", proc_macro2::Span::call_site() )), + }))); + + let exp = AngleBracketedGenericArguments + { + colon2_token: None, + lt_token: Lt::default(), + args, + gt_token: Gt::default(), + }; + + // Debug prints for better traceability in case of failure + println!( "Expected: {:?}", exp ); + println!( "Got: {:?}", got ); + + a_id!( exp, got, "Failed into_generic_args_single_const_parameter: exp {:?}, got {:?}", exp, got ); +} + + +// + +#[ test ] +fn into_generic_args_mixed_parameters() +{ + use syn:: + { + Generics, + AngleBracketedGenericArguments, + GenericArgument, + Type, + TypePath, + Expr, + ExprPath, + Ident, + Lifetime, + token::{ self, Comma }, + punctuated::Punctuated, + parse_quote + }; + use macro_tools::IntoGenericArgs; + + // Generate the actual value using the implementation + let generics : Generics = parse_quote! + { + + }; + let got = generics.into_generic_args(); + + // Manually construct the exp value + let mut args = Punctuated::new(); + let t_type : GenericArgument = GenericArgument::Type( Type::Path( TypePath + { + qself: None, + path: Ident::new( "T", proc_macro2::Span::call_site() ).into(), + })); + args.push_value( t_type ); + args.push_punct( Comma::default() ); + + let a_lifetime = GenericArgument::Lifetime( Lifetime::new( "'a", proc_macro2::Span::call_site() )); + args.push_value( a_lifetime ); + args.push_punct( Comma::default() ); + + let n_const : GenericArgument = GenericArgument::Const( Expr::Path( ExprPath + { + attrs: vec![], + qself: None, + path: Ident::new( "N", proc_macro2::Span::call_site() ).into(), + })); + args.push_value( n_const ); + + let exp = AngleBracketedGenericArguments + { + colon2_token: None, + lt_token: token::Lt::default(), + args, + gt_token: token::Gt::default(), + }; + + // tree_print!( got ); + // tree_print!( exp ); + // a_id!(tree_diagnostics_str!( exp ), tree_diagnostics_str!( got ) ); + a_id!( exp, got, "Failed into_generic_args_mixed_parameters: exp {:?}, got {:?}", exp, got ); +} + +// = generic_args::merge + +#[ test ] +fn merge_empty_arguments() +{ + use syn::AngleBracketedGenericArguments; + use macro_tools::generic_args; + + let a : AngleBracketedGenericArguments = parse_quote! { <> }; + let b : AngleBracketedGenericArguments = parse_quote! { <> }; + let exp : AngleBracketedGenericArguments = parse_quote! { <> }; + + let got = generic_args::merge( &a, &b ); + a_id!( got, exp, "Merging two empty arguments should got in empty arguments" ); +} + +// + +#[ test ] +fn merge_one_empty_one_non_empty() +{ + use syn::AngleBracketedGenericArguments; + use macro_tools::generic_args; + + let a : AngleBracketedGenericArguments = parse_quote! { < T, U > }; + let b : AngleBracketedGenericArguments = parse_quote! { <> }; + let exp : AngleBracketedGenericArguments = parse_quote! { < T, U > }; + + let got = generic_args::merge( &a, &b ); + a_id!( got, exp, "Merging non-empty with empty should got in the non-empty" ); +} + +// + +#[ test ] +fn merge_duplicate_arguments() +{ + use syn::AngleBracketedGenericArguments; + use macro_tools::generic_args; + + let a : AngleBracketedGenericArguments = parse_quote! { < T > }; + let b : AngleBracketedGenericArguments = parse_quote! { < T > }; + let exp : AngleBracketedGenericArguments = parse_quote! { < T, T > }; + + let got = generic_args::merge( &a, &b ); + a_id!( got, exp, "Duplicates should be preserved in the output" ); +} + +// + +#[ test ] +fn merge_large_number_of_arguments() +{ + use syn::AngleBracketedGenericArguments; + use macro_tools::generic_args; + + let a : AngleBracketedGenericArguments = parse_quote! { }; + let b : AngleBracketedGenericArguments = parse_quote! { }; + let exp : AngleBracketedGenericArguments = parse_quote! { }; + + let got = generic_args::merge( &a, &b ); + a_id!( got, exp, "Merging large number of arguments should succeed without altering order or count" ); +} + +// + +#[ test ] +fn merge_complex_generic_constraints() +{ + use syn::AngleBracketedGenericArguments; + use macro_tools::generic_args; + + let a : AngleBracketedGenericArguments = parse_quote! { < T : Clone + Send, U: Default > }; + let b : AngleBracketedGenericArguments = parse_quote! { < V : core::fmt::Debug + Sync > }; + let exp : AngleBracketedGenericArguments = parse_quote! { < T: Clone + Send, U: Default, V: core::fmt::Debug + Sync > }; + + let got = generic_args::merge( &a, &b ); + a_id!( got, exp, "Complex constraints should be merged correctly" ); +} + +// + +#[ test ] +fn merge_different_orders_of_arguments() +{ + use syn::AngleBracketedGenericArguments; + use macro_tools::generic_args; + + let a : AngleBracketedGenericArguments = parse_quote! { < T, U > }; + let b : AngleBracketedGenericArguments = parse_quote! { < V, W > }; + let exp : AngleBracketedGenericArguments = parse_quote! { < T, U, V, W > }; + + let got = generic_args::merge( &a, &b ); + a_id!( got, exp, "Order of arguments should be preserved as per the inputs" ); +} + +// + +#[ test ] +fn merge_interaction_with_lifetimes_and_constants() +{ + use syn::AngleBracketedGenericArguments; + use macro_tools::generic_args; + + let a : AngleBracketedGenericArguments = parse_quote! { < 'a, M : T > }; + let b : AngleBracketedGenericArguments = parse_quote! { < 'b, N > }; + let exp : AngleBracketedGenericArguments = parse_quote! { <'a, 'b, M : T, N > }; + + let got = generic_args::merge( &a, &b ); + // a_id!(tree_diagnostics_str!( exp ), tree_diagnostics_str!( got ) ); + a_id!( got, exp, "Lifetimes and constants should be interleaved correctly" ); + +} diff --git a/module/core/macro_tools/tests/inc/generic_params_test.rs b/module/core/macro_tools/tests/inc/generic_params_test.rs new file mode 100644 index 0000000000..12e82142a9 --- /dev/null +++ b/module/core/macro_tools/tests/inc/generic_params_test.rs @@ -0,0 +1,353 @@ + +use super::*; + +// + +#[ test ] +fn generics_with_where() +{ + + let got : the_module::GenericsWithWhere = parse_quote! + { + < 'a, T : Clone, U : Default, V : core::fmt::Debug > + where + Definition : former::FormerDefinition, + }; + let got = got.unwrap(); + + let mut exp : syn::Generics = parse_quote! + { + < 'a, T : Clone, U : Default, V : core::fmt::Debug > + }; + exp.where_clause = parse_quote! + { + where + Definition : former::FormerDefinition, + }; + + // a_id!( tree_print!( got ), tree_print!( exp ) ); + // code_print!( got ); + // code_print!( exp ); + // code_print!( got.where_clause ); + // code_print!( exp.where_clause ); + + assert_eq!( got.params, exp.params ); + assert_eq!( got.where_clause, exp.where_clause ); + assert_eq!( got, exp ); + +} + +// + +#[ test ] +fn merge_assumptions() +{ + use the_module::generic_params; + + let mut generics_a : syn::Generics = parse_quote!{ < T : Clone, U : Default > }; + generics_a.where_clause = parse_quote!{ where T : Default }; + let mut generics_b : syn::Generics = parse_quote!{ < V : core::fmt::Debug > }; + generics_b.where_clause = parse_quote!{ where V : Sized }; + let got = generic_params::merge( &generics_a, &generics_b ); + + let mut exp : syn::Generics = parse_quote! + { + < T : Clone, U : Default, V : core::fmt::Debug > + }; + exp.where_clause = parse_quote! + { + where + T : Default, + V : Sized + }; + + // a_id!( tree_print!( got ), tree_print!( exp ) ); + // code_print!( got ); + // code_print!( exp ); + // code_print!( got.where_clause ); + // code_print!( exp.where_clause ); + + assert_eq!( got.params, exp.params ); + assert_eq!( got.where_clause, exp.where_clause ); + assert_eq!( got, exp ); + +} + +// + +#[ test ] +fn merge_defaults() +{ + use the_module::generic_params; + + let mut generics_a : syn::Generics = parse_quote!{ < T : Clone, U : Default = Default1 > }; + generics_a.where_clause = parse_quote!{ where T : Default }; + let mut generics_b : syn::Generics = parse_quote!{ < V : core::fmt::Debug = Debug1 > }; + generics_b.where_clause = parse_quote!{ where V : Sized }; + let got = generic_params::merge( &generics_a, &generics_b ); + + let mut exp : syn::Generics = parse_quote! + { + < T : Clone, U : Default = Default1, V : core::fmt::Debug = Debug1 > + }; + exp.where_clause = parse_quote! + { + where + T : Default, + V : Sized + }; + + // a_id!( tree_print!( got ), tree_print!( exp ) ); + // code_print!( got ); + // code_print!( exp ); + // code_print!( got.where_clause ); + // code_print!( exp.where_clause ); + + assert_eq!( got.params, exp.params ); + assert_eq!( got.where_clause, exp.where_clause ); + assert_eq!( got, exp ); + +} + +// + +#[ test ] +fn only_names() +{ + + use macro_tools::syn::parse_quote; + + let generics : the_module::GenericsWithWhere = parse_quote!{ < T : Clone + Default, U, 'a, const N : usize > where T: core::fmt::Debug }; + let simplified_generics = macro_tools::generic_params::only_names( &generics.unwrap() ); + + assert_eq!( simplified_generics.params.len(), 4 ); // Contains T, U, 'a, and N + assert!( simplified_generics.where_clause.is_none() ); // Where clause is removed + +} + +// + +#[ test ] +fn decompose_empty_generics() +{ + let generics : syn::Generics = syn::parse_quote! {}; + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + assert!( impl_gen.is_empty(), "Impl generics should be empty" ); + assert!( ty_gen.is_empty(), "Type generics should be empty" ); + assert!( where_gen.is_empty(), "Where generics should be empty" ); +} + +#[ test ] +fn decompose_generics_without_where_clause() +{ + let generics : syn::Generics = syn::parse_quote! { < T, U > }; + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + assert_eq!( impl_gen.len(), 2, "Impl generics should have two parameters" ); + assert_eq!( ty_gen.len(), 2, "Type generics should have two parameters" ); + assert!( where_gen.is_empty(), "Where generics should be empty" ); + + let exp : syn::Generics = syn::parse_quote! { < T, U, > }; + a_id!( impl_gen, exp.params ); + let exp : syn::Generics = syn::parse_quote! { < T, U, > }; + a_id!( ty_gen, exp.params ); + +} + +#[ test ] +fn decompose_generics_with_where_clause() +{ + use macro_tools::quote::ToTokens; + + let generics : the_module::GenericsWithWhere = syn::parse_quote! { < T, U > where T : Clone, U : Default }; + let generics = generics.unwrap(); + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + let impl_exp : syn::Generics = syn::parse_quote! { < T, U, > }; + let ty_exp : syn::Generics = syn::parse_quote! { < T, U, > }; + a_id!( impl_gen, impl_exp.params ); + a_id!( ty_gen, ty_exp.params ); + + assert_eq!( impl_gen.len(), 2, "Impl generics should have two parameters" ); + assert_eq!( ty_gen.len(), 2, "Type generics should have two parameters" ); + assert_eq!( where_gen.len(), 2, "Where generics should have two predicates" ); + + let where_clauses : Vec< _ > = where_gen.iter().collect(); + + // Properly match against the `syn::WherePredicate::Type` variant to extract `bounded_ty` + if let syn::WherePredicate::Type( pt ) = &where_clauses[0] + { + assert_eq!( pt.bounded_ty.to_token_stream().to_string(), "T", "The first where clause should be for T" ); + } + else + { + panic!( "First where clause is not a Type predicate as expected." ); + } + + if let syn::WherePredicate::Type( pt ) = &where_clauses[1] + { + assert_eq!( pt.bounded_ty.to_token_stream().to_string(), "U", "The second where clause should be for U" ); + } + else + { + panic!( "Second where clause is not a Type predicate as expected." ); + } +} + +#[ test ] +fn decompose_generics_with_only_where_clause() +{ + let generics : the_module::GenericsWithWhere = syn::parse_quote! { where T : Clone, U : Default }; + let generics = generics.unwrap(); + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + assert!( impl_gen.is_empty(), "Impl generics should be empty" ); + assert!( ty_gen.is_empty(), "Type generics should be empty" ); + assert_eq!( where_gen.len(), 2, "Where generics should have two predicates" ); + +} + +#[ test ] +fn decompose_generics_with_complex_constraints() +{ + use macro_tools::quote::ToTokens; + let generics : the_module::GenericsWithWhere = syn::parse_quote! { < T : Clone + Send, U : Default > where T: Send, U: Default }; + let generics = generics.unwrap(); + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + let impl_exp : syn::Generics = syn::parse_quote! { < T : Clone + Send, U : Default, > }; + let ty_exp : syn::Generics = syn::parse_quote! { < T, U, > }; + a_id!( impl_gen, impl_exp.params ); + a_id!( ty_gen, ty_exp.params ); + + assert_eq!( impl_gen.len(), 2, "Impl generics should reflect complex constraints" ); + assert_eq!( ty_gen.len(), 2, "Type generics should reflect complex constraints" ); + assert_eq!( where_gen.len(), 2, "Where generics should reflect complex constraints" ); + + let where_clauses : Vec<_> = where_gen.iter().collect(); + + // Properly matching against the WherePredicate::Type variant + if let syn::WherePredicate::Type( pt ) = &where_clauses[0] + { + assert_eq!( pt.bounded_ty.to_token_stream().to_string(), "T", "The first where clause should be for T" ); + } + else + { + panic!( "First where clause is not a Type predicate as expected." ); + } + + if let syn::WherePredicate::Type( pt ) = &where_clauses[1] + { + assert_eq!( pt.bounded_ty.to_token_stream().to_string(), "U", "The second where clause should be for U" ); + } + else + { + panic!( "Second where clause is not a Type predicate as expected." ); + } +} + +#[ test ] +fn decompose_generics_with_nested_generic_types() +{ + let generics : syn::Generics = syn::parse_quote! { < T : Iterator< Item = U >, U > }; + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + let impl_exp : syn::Generics = syn::parse_quote! { < T : Iterator< Item = U >, U, > }; + let ty_exp : syn::Generics = syn::parse_quote! { < T, U, > }; + a_id!( impl_gen, impl_exp.params ); + a_id!( ty_gen, ty_exp.params ); + + assert_eq!( impl_gen.len(), 2, "Impl generics should handle nested generics" ); + assert_eq!( ty_gen.len(), 2, "Type generics should handle nested generics" ); + assert!( where_gen.is_empty(), "Where generics should be empty for non-conditional types" ); +} + +#[ test ] +fn decompose_generics_with_lifetime_parameters_only() +{ + let generics : syn::Generics = syn::parse_quote! { < 'a, 'b > }; + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + let impl_exp : syn::Generics = syn::parse_quote! { < 'a, 'b, > }; + let ty_exp : syn::Generics = syn::parse_quote! { < 'a, 'b, > }; + a_id!( impl_gen, impl_exp.params ); + a_id!( ty_gen, ty_exp.params ); + + assert_eq!( impl_gen.len(), 2, "Impl generics should contain only lifetimes" ); + assert_eq!( ty_gen.len(), 2, "Type generics should contain only lifetimes" ); + assert!( where_gen.is_empty(), "Where generics should be empty" ); +} + +#[ test ] +fn decompose_generics_with_constants_only() +{ + let generics : syn::Generics = syn::parse_quote! { < const N : usize, const M : usize > }; + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + let impl_exp : syn::Generics = syn::parse_quote! { < const N : usize, const M : usize, > }; + let ty_exp : syn::Generics = syn::parse_quote! { < N, M, > }; + a_id!( impl_gen, impl_exp.params ); + a_id!( ty_gen, ty_exp.params ); + + assert_eq!( impl_gen.len(), 2, "Impl generics should contain constants" ); + assert_eq!( ty_gen.len(), 2, "Type generics should contain constants" ); + assert!( where_gen.is_empty(), "Where generics should be empty" ); +} + +#[ test ] +fn decompose_generics_with_default_values() +{ + let generics : syn::Generics = syn::parse_quote! { < T = usize, U = i32 > }; + let ( impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + let impl_with_exp : syn::Generics = syn::parse_quote! { < T = usize, U = i32, > }; + let impl_exp : syn::Generics = syn::parse_quote! { < T, U, > }; + let ty_exp : syn::Generics = syn::parse_quote! { < T, U, > }; + a_id!( impl_with_def, impl_with_exp.params ); + a_id!( impl_gen, impl_exp.params ); + a_id!( ty_gen, ty_exp.params ); + + assert_eq!( impl_gen.len(), 2, "Impl generics should retain default types" ); + assert_eq!( ty_gen.len(), 2, "Type generics should retain default types" ); + assert!( where_gen.is_empty(), "Where generics should be empty" ); +} + +#[ test ] +fn decompose_mixed_generics_types() +{ + use macro_tools::quote::ToTokens; + let generics : the_module::GenericsWithWhere = syn::parse_quote! { < 'a, T, const N : usize, U : Trait1 > where T : Clone, U : Default }; + let generics = generics.unwrap(); + let ( _impl_with_def, impl_gen, ty_gen, where_gen ) = the_module::generic_params::decompose( &generics ); + + let impl_exp : syn::Generics = syn::parse_quote! { < 'a, T, const N : usize, U : Trait1, > }; + let ty_exp : syn::Generics = syn::parse_quote! { < 'a, T, N, U, > }; + a_id!( impl_gen, impl_exp.params ); + a_id!( ty_gen, ty_exp.params ); + + assert_eq!( impl_gen.len(), 4, "Impl generics should correctly interleave types" ); + assert_eq!( ty_gen.len(), 4, "Type generics should correctly interleave types" ); + assert_eq!( where_gen.len(), 2, "Where generics should include conditions for T and U" ); + + // Correctly handling the pattern matching for WherePredicate::Type + let where_clauses : Vec<_> = where_gen.iter().collect(); + if let syn::WherePredicate::Type( pt ) = &where_clauses[0] + { + assert_eq!( pt.bounded_ty.to_token_stream().to_string(), "T", "The first where clause should be for T" ); + } + else + { + panic!( "First where clause is not a Type predicate as expected." ); + } + + if let syn::WherePredicate::Type( pt ) = &where_clauses[1] + { + assert_eq!( pt.bounded_ty.to_token_stream().to_string(), "U", "The second where clause should be for U" ); + } + else + { + panic!( "Second where clause is not a Type predicate as expected." ); + } + +} diff --git a/module/core/macro_tools/tests/inc/item_struct_test.rs b/module/core/macro_tools/tests/inc/item_struct_test.rs new file mode 100644 index 0000000000..087054cf1e --- /dev/null +++ b/module/core/macro_tools/tests/inc/item_struct_test.rs @@ -0,0 +1,202 @@ + +use super::*; + +#[ test ] +fn field_names_with_named_fields() +{ + use syn::parse_quote; + use the_module::item_struct::field_names; + + let item_struct : syn::ItemStruct = parse_quote! + { + struct Test + { + a : i32, + b : String, + } + }; + + let names = field_names( &item_struct ); + assert!( names.is_some(), "Expected to extract field names" ); + let names : Vec< _ > = names.unwrap().collect(); + assert_eq!( names.len(), 2, "Expected two field names" ); + assert_eq!( names[ 0 ], "a", "First field name mismatch" ); + assert_eq!( names[ 1 ], "b", "Second field name mismatch" ); +} + +#[ test ] +fn field_names_with_unnamed_fields() +{ + use syn::parse_quote; + use the_module::item_struct::field_names; + + let item_struct : syn::ItemStruct = parse_quote! + { + struct Test( i32, String ); + }; + + let names = field_names( &item_struct ); + assert!( names.is_none(), "Expected None for unnamed fields" ); +} + +#[ test ] +fn field_names_with_unit_struct() +{ + use syn::parse_quote; + use the_module::item_struct::field_names; + + let item_struct : syn::ItemStruct = parse_quote! + { + struct Test; + }; + + let names = field_names( &item_struct ); + assert!( names.is_some() ); + let names : Vec< _ > = names.unwrap().collect(); + assert_eq!( names.len(), 0 ); + +} + +#[ test ] +fn field_names_with_reserved_keywords() +{ + use syn::parse_quote; + use the_module::item_struct::field_names; + + let item_struct : syn::ItemStruct = parse_quote! + { + struct Test + { + r#type : i32, + r#fn : String, + } + }; + + let names = field_names( &item_struct ); + assert!( names.is_some(), "Expected to extract field names" ); + let names : Vec< _ > = names.unwrap().collect(); + assert_eq!( names.len(), 2, "Expected two field names" ); + assert_eq!( names[ 0 ], &syn::Ident::new_raw( "type", proc_macro2::Span::call_site() ), "First field name mismatch" ); + assert_eq!( names[ 1 ], &syn::Ident::new_raw( "fn", proc_macro2::Span::call_site() ), "Second field name mismatch" ); + +} + +#[ test ] +fn test_field_or_variant_field() +{ + let input : proc_macro2::TokenStream = quote::quote! + { + struct MyStruct + { + my_field : i32, + } + }; + + let ast : syn::ItemStruct = syn::parse2( input ).unwrap(); + let field = ast.fields.iter().next().unwrap(); + let field_or_variant = the_module::struct_like::FieldOrVariant::from( field ); + + match field_or_variant + { + the_module::struct_like::FieldOrVariant::Field( f ) => + { + assert_eq!( f.ty, syn::parse_quote!( i32 ) ); + }, + _ => panic!( "Expected Field variant" ), + } +} + +#[ test ] +fn test_field_or_variant_variant() +{ + let input : proc_macro2::TokenStream = quote::quote! + { + enum MyEnum + { + Variant1, + } + }; + + let ast : syn::ItemEnum = syn::parse2( input ).unwrap(); + let variant = ast.variants.iter().next().unwrap(); + let field_or_variant = the_module::struct_like::FieldOrVariant::from( variant ); + + match field_or_variant + { + the_module::struct_like::FieldOrVariant::Variant( v ) => + { + let exp : syn::Ident = syn::parse_quote!( Variant1 ); + assert_eq!( v.ident, exp ); + }, + _ => panic!( "Expected Variant variant" ), + } +} + +#[ test ] +fn test_typ() +{ + let input : proc_macro2::TokenStream = quote::quote! + { + struct MyStruct + { + my_field : i32, + } + }; + + let ast : syn::ItemStruct = syn::parse2( input ).unwrap(); + let field = ast.fields.iter().next().unwrap(); + let field_or_variant = the_module::struct_like::FieldOrVariant::from( field ); + assert_eq!( field_or_variant.typ(), Some( &syn::parse_quote!( i32 ) ) ); +} + +#[ test ] +fn test_attrs() +{ + let input : proc_macro2::TokenStream = quote::quote! + { + struct MyStruct + { + #[ some_attr ] + my_field : i32, + } + }; + + let ast : syn::ItemStruct = syn::parse2( input ).unwrap(); + let field = ast.fields.iter().next().unwrap(); + let field_or_variant = the_module::struct_like::FieldOrVariant::from( field ); + assert!( field_or_variant.attrs().iter().any( | attr | attr.path().is_ident( "some_attr" ) ) ); +} + +#[ test ] +fn test_vis() +{ + let input : proc_macro2::TokenStream = quote::quote! + { + struct MyStruct + { + pub my_field : i32, + } + }; + + let ast : syn::ItemStruct = syn::parse2( input ).unwrap(); + let field = ast.fields.iter().next().unwrap(); + let field_or_variant = the_module::struct_like::FieldOrVariant::from( field ); + assert!( matches!( field_or_variant.vis(), Some( syn::Visibility::Public( _ ) ) ) ); +} + +#[ test ] +fn test_ident() +{ + let input : proc_macro2::TokenStream = quote::quote! + { + struct MyStruct + { + my_field : i32, + } + }; + + let ast : syn::ItemStruct = syn::parse2( input ).unwrap(); + let field = ast.fields.iter().next().unwrap(); + let field_or_variant = the_module::struct_like::FieldOrVariant::from( field ); + assert_eq!( field_or_variant.ident().unwrap(), "my_field" ); +} diff --git a/module/core/macro_tools/tests/inc/item_test.rs b/module/core/macro_tools/tests/inc/item_test.rs new file mode 100644 index 0000000000..a9652f81cd --- /dev/null +++ b/module/core/macro_tools/tests/inc/item_test.rs @@ -0,0 +1,118 @@ + +use super::*; + +#[ test ] +fn ensure_comma_named_struct_with_multiple_fields() +{ + use syn::{ parse_quote, ItemStruct }; + + let input_struct : ItemStruct = parse_quote! + { + struct Example + { + field1 : i32, + field2 : String + } + }; + + let got = the_module::item::ensure_comma( &input_struct ); + // let exp = "struct Example { field1 : i32, field2 : String, }"; + let exp : syn::ItemStruct = parse_quote! { struct Example { field1 : i32, field2 : String, } }; + // let got = quote!( #got ).to_string(); + // assert_eq!( exp, got ); + a_id!( got, exp ); + +} + +#[ test ] +fn ensure_comma_named_struct_with_single_field() +{ + use syn::{ parse_quote, ItemStruct }; + + let input_struct : ItemStruct = parse_quote! + { + struct Example + { + field1 : i32 + } + }; + + let got = the_module::item::ensure_comma( &input_struct ); + let exp : ItemStruct = parse_quote! { struct Example { field1 : i32, } }; + assert_eq!( got, exp ); +} + +#[ test ] +fn ensure_comma_named_struct_with_no_fields() +{ + use syn::{ parse_quote, ItemStruct }; + + let input_struct : ItemStruct = parse_quote! + { + struct Example { } + }; + + let got = the_module::item::ensure_comma( &input_struct ); + let exp : ItemStruct = parse_quote! { struct Example { } }; + assert_eq!( got, exp ); +} + +#[ test ] +fn ensure_comma_unnamed_struct_with_multiple_fields() +{ + use syn::{ parse_quote, ItemStruct }; + + let input_struct : ItemStruct = parse_quote! + { + struct Example( i32, String ); + }; + + let got = the_module::item::ensure_comma( &input_struct ); + let exp : ItemStruct = parse_quote! { struct Example( i32, String, ); }; + assert_eq!( got, exp ); +} + +#[ test ] +fn ensure_comma_unnamed_struct_with_single_field() +{ + use syn::{ parse_quote, ItemStruct }; + + let input_struct : ItemStruct = parse_quote! + { + struct Example( i32 ); + }; + + let got = the_module::item::ensure_comma( &input_struct ); + let exp : ItemStruct = parse_quote! { struct Example( i32, ); }; + assert_eq!( got, exp ); +} + +#[ test ] +fn ensure_comma_unnamed_struct_with_no_fields() +{ + use syn::{ parse_quote, ItemStruct }; + + let input_struct : ItemStruct = parse_quote! + { + struct Example( ); + }; + + let got = the_module::item::ensure_comma( &input_struct ); + let exp : ItemStruct = parse_quote! { struct Example( ); }; + assert_eq!( got, exp ); +} + +#[ test ] +fn ensure_comma_unit_struct_with_no_fields() +{ + use syn::{ parse_quote, ItemStruct }; + + let input_struct : ItemStruct = parse_quote! + { + struct Example; + }; + + let got = the_module::item::ensure_comma( &input_struct ); + let exp : ItemStruct = parse_quote! { struct Example; }; + assert_eq!( got, exp ); +} diff --git a/module/core/macro_tools/tests/inc/mod.rs b/module/core/macro_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..9ed0a80bee --- /dev/null +++ b/module/core/macro_tools/tests/inc/mod.rs @@ -0,0 +1,36 @@ + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use the_module::protected::*; + +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +#[ path = "." ] +mod if_enabled +{ + + use super::*; + + mod attr_test; + mod attr_prop_test; + mod basic_test; + mod container_kind_test; + mod derive_test; + mod diag_test; + mod drop_test; + mod equation_test; + mod generic_args_test; + mod generic_params_test; + mod item_test; + mod item_struct_test; + mod phantom_test; + mod quantifier_test; + mod struct_like_test; + mod syntax_test; + mod tokens_test; + mod typ_test; + +} diff --git a/module/core/macro_tools/tests/inc/phantom_test.rs b/module/core/macro_tools/tests/inc/phantom_test.rs new file mode 100644 index 0000000000..44c3610e66 --- /dev/null +++ b/module/core/macro_tools/tests/inc/phantom_test.rs @@ -0,0 +1,298 @@ + +use super::*; + +#[ test ] +fn phantom_add_basic() +{ + + let item : syn::ItemStruct = syn::parse_quote! + { + pub struct Struct1< 'a, Context, Formed > + { + f1 : int32, + } + }; + + let exp : syn::ItemStruct = syn::parse_quote! + { + pub struct Struct1< 'a, Context, Formed > + { + f1 : int32, + _phantom : ::core::marker::PhantomData< ( &'a(), *const Context, *const Formed ) >, + } + }; + + let got = the_module::phantom::add_to_item( &item ); + // a_id!( tree_print!( got ), tree_print!( exp ) ); + a_id!( got, exp ); + +} + +// + +#[ test ] +fn phantom_add_no_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct {} }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct + { + } + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_type_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct< T, U > {} }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct< T, U > + { + _phantom : ::core::marker::PhantomData< ( *const T, *const U ) >, + } + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_lifetime_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct< 'a, 'b > {} }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct< 'a, 'b > + { + _phantom : ::core::marker::PhantomData< ( &'a (), &'b () ) >, + } + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_const_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct< const N : usize > {} }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct< const N : usize > + { + _phantom : ::core::marker::PhantomData< ( N, ) >, + } + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_mixed_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct< T, 'a, const N : usize > {} }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct< T, 'a, const N : usize > + { + _phantom : ::core::marker::PhantomData< ( *const T, &'a (), N ) >, + } + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_named_fields() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct { field1 : i32, field2 : f64 } }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct + { + field1 : i32, + field2 : f64, + } + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_unnamed_fields() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct( i32, f64 ); }; + let got = the_module::phantom::add_to_item( &input ); + let exp : syn::ItemStruct = parse_quote! { struct TestStruct( i32, f64, ); }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_unnamed_fields_with_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct< T, U >( T, U ); }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct< T, U > + ( + T, U, + ::core::marker::PhantomData< ( *const T, *const U ) >, + ); + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_unnamed_fields_lifetime_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct< 'a, 'b >( &'a i32, &'b f64 ); }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct< 'a, 'b > + ( + &'a i32, + &'b f64, + ::core::marker::PhantomData< ( &'a (), &'b () ) >, + ); + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +#[ test ] +fn phantom_add_unnamed_fields_const_generics() +{ + use syn::parse_quote; + use quote::ToTokens; + + let input : syn::ItemStruct = parse_quote! { struct TestStruct< const N : usize >( [ i32 ; N ] ); }; + let got = the_module::phantom::add_to_item( &input ); + + let exp : syn::ItemStruct = parse_quote! + { + struct TestStruct< const N : usize > + ( + [ i32 ; N ], + ::core::marker::PhantomData< ( N, ) >, + ); + }; + + assert_eq!( got.to_token_stream().to_string(), exp.to_token_stream().to_string() ); +} + +// + +// +#[ test ] +fn phantom_tuple_empty_generics() +{ + use syn::{ punctuated::Punctuated, GenericParam, token::Comma, parse_quote }; + use macro_tools::phantom::tuple; + + let input : Punctuated< GenericParam, Comma > = Punctuated::new(); + let result = tuple( &input ); + + let exp : syn::Type = parse_quote! { ::core::marker::PhantomData<()> }; + let got = result; + + assert_eq!( format!( "{:?}", exp ), format!( "{:?}", got ), "Expected empty PhantomData, got: {:?}", got ); +} + +// + +#[ test ] +fn phantom_tuple_only_type_parameters() +{ + use syn::{ parse_quote, punctuated::Punctuated, GenericParam, token::Comma }; + use macro_tools::phantom::tuple; + + let input : Punctuated< GenericParam, Comma > = parse_quote! { T, U }; + let result = tuple( &input ); + + let exp : syn::Type = parse_quote! { ::core::marker::PhantomData< ( *const T, *const U ) > }; + let got = result; + + assert_eq!( format!( "{:?}", exp ), format!( "{:?}", got ), "Expected PhantomData with type parameters, got: {:?}", got ); +} + +// + +#[ test ] +fn phantom_tuple_mixed_generics() +{ + use syn::{ parse_quote, punctuated::Punctuated, GenericParam, token::Comma }; + use macro_tools::phantom::tuple; + + let input : Punctuated< GenericParam, Comma > = parse_quote! { T, 'a, const N: usize }; + let result = tuple( &input ); + + let exp : syn::Type = parse_quote! { ::core::marker::PhantomData< ( *const T, &'a (), N ) > }; + let got = result; + + assert_eq!( format!( "{:?}", exp ), format!( "{:?}", got ), "Expected PhantomData with mixed generics, got: {:?}", got ); +} diff --git a/module/core/macro_tools/tests/inc/quantifier_test.rs b/module/core/macro_tools/tests/inc/quantifier_test.rs new file mode 100644 index 0000000000..5a6c59bcf3 --- /dev/null +++ b/module/core/macro_tools/tests/inc/quantifier_test.rs @@ -0,0 +1,158 @@ + +use super::*; + +// + +tests_impls! +{ + + fn pair() -> Result< () > + { + use macro_tools::syn::parse::Parser; + + // test.case( "basic" ); + let code = qt!( x core::option::Option< i32 > ); + let got = syn::parse2::< the_module::Pair< syn::Ident, syn::Type > >( code )?; + let exp = the_module::Pair::< syn::Ident, syn::Type >::new + ( + syn::Ident::new( "x", proc_macro2::Span::call_site() ), + syn::parse2::< syn::Type >( qt!( core::option::Option< i32 > ) )?, + ); + a_id!( got, exp ); + + // test.case( "pair of many" ); + let code = qt! + { + #[ derive( Copy ) ] + #[ derive( Clone ) ] + x1 + }; + let got = syn::parse2::< the_module::Pair< the_module::Many< the_module::AttributesOuter >, syn::Ident > >( code )?; + let exp = the_module::Pair::< the_module::Many< the_module::AttributesOuter >, syn::Ident > + ( + the_module::Many( vec! + [ + the_module::AttributesOuter::from( syn::Attribute::parse_outer.parse2( qt! + { + #[ derive( Copy ) ] + #[ derive( Clone ) ] + } )? ), + ]), + syn::Ident::new( "x1", proc_macro2::Span::call_site() ), + ); + a_id!( got, exp ); + + // test.case( "punctuated of pairs" ); + let code = qt! + { + #[ derive( Copy ) ] + x1, + #[ derive( Clone ) ] + x2, + x3 + }; + type PunctuatedPairs = syn::punctuated::Punctuated + < + the_module::Pair + < + the_module::AttributesOuter, + syn::Ident, + >, + syn::token::Comma + >; + + let got = PunctuatedPairs::parse_terminated.parse2( code )?; + let mut exp = PunctuatedPairs::new(); + exp.push( the_module::Pair::new + ( + the_module::AttributesOuter::from( syn::Attribute::parse_outer.parse2( qt!( #[ derive( Copy ) ] ) )? ), + syn::Ident::new( "x1", proc_macro2::Span::call_site() ), + )); + exp.push( the_module::Pair::new + ( + the_module::AttributesOuter::from( syn::Attribute::parse_outer.parse2( qt!( #[ derive( Clone ) ] ) )? ), + syn::Ident::new( "x2", proc_macro2::Span::call_site() ), + )); + exp.push( the_module::Pair::new + ( + // from!(), + Default::default(), + syn::Ident::new( "x3", proc_macro2::Span::call_site() ), + )); + a_id!( got, exp ); + + // + + Ok( () ) + } + + // + + fn many() -> Result< () > + { + use macro_tools::syn::parse::Parser; + + // test.case( "AttributesOuter" ); + let code = qt! + { + #[ derive( Copy ) ] + #[ derive( Clone ) ] + #[ derive( Debug ) ] + }; + let got = syn::parse2::< the_module::Many< the_module::AttributesOuter > >( code ).unwrap(); + let exp = the_module::Many::< the_module::AttributesOuter >::new_with( vec! + [ + the_module::AttributesOuter::from( syn::Attribute::parse_outer.parse2( qt! + { + #[ derive( Copy ) ] + #[ derive( Clone ) ] + #[ derive( Debug ) ] + } )? ), + ]); + a_id!( got, exp ); + + // test.case( "AttributesInner" ); + let code = qt! + { + // #![ deny( missing_docs ) ] + #![ warn( something ) ] + }; + let got = syn::parse2::< the_module::Many< the_module::AttributesInner > >( code ).unwrap(); + let exp = the_module::Many::< the_module::AttributesInner >::new_with( vec! + [ + the_module::AttributesInner::from( syn::Attribute::parse_inner.parse2( qt! + { + // #![ deny( missing_docs ) ] + #![ warn( something ) ] + } )? ), + ]); + a_id!( got, exp ); + + // test.case( "Item" ); + let code = qt! + { + fn f1(){} + fn f2(){} + }; + let got = syn::parse2::< the_module::Many< the_module::syn::Item > >( code ).unwrap(); + let exp = the_module::Many::< the_module::syn::Item >::new_with( vec! + [ + syn::parse2::< syn::Item >( qt!( fn f1(){} ) )?, + syn::parse2::< syn::Item >( qt!( fn f2(){} ) )?, + ]); + a_id!( got, exp ); + + // + + Ok( () ) + } + +} + +// + +tests_index! +{ + pair, + many, +} diff --git a/module/core/macro_tools/tests/inc/struct_like_test.rs b/module/core/macro_tools/tests/inc/struct_like_test.rs new file mode 100644 index 0000000000..c1de1cf90e --- /dev/null +++ b/module/core/macro_tools/tests/inc/struct_like_test.rs @@ -0,0 +1,432 @@ + +use super::*; + +#[ test ] +fn basic() +{ + use syn::{ parse_quote, ItemStruct }; + use the_module::struct_like; + + // - struct + + let item : ItemStruct = parse_quote! + { + struct Example + { + field1 : i32, + field2 : String + } + }; + let exp = struct_like::StructLike::Struct( item ); + + let got : struct_like::StructLike = parse_quote! + { + struct Example + { + field1 : i32, + field2 : String + } + }; + a_id!( got, exp ); + + // - pub struct + + let item : ItemStruct = parse_quote! + { + pub( crate ) struct Example + { + field1 : i32, + field2 : String + } + }; + let exp = struct_like::StructLike::Struct( item ); + + let got : struct_like::StructLike = parse_quote! + { + pub( crate ) struct Example + { + field1 : i32, + field2 : String + } + }; + a_id!( got, exp ); + + // - enum + + let item : syn::ItemEnum = parse_quote! + { + enum Example + { + field1, + field2( i32 ), + } + }; + let exp = struct_like::StructLike::Enum( item ); + + let got : struct_like::StructLike = parse_quote! + { + enum Example + { + field1, + field2( i32 ), + } + }; + a_id!( got, exp ); + + // - pub enum + + let item : syn::ItemEnum = parse_quote! + { + pub( crate ) enum Example + { + field1, + field2( i32 ), + } + }; + let exp = struct_like::StructLike::Enum( item ); + + let got : struct_like::StructLike = parse_quote! + { + pub( crate ) enum Example + { + field1, + field2( i32 ), + } + }; + a_id!( got, exp ); + + // - unit + + let item : syn::ItemStruct = parse_quote! + { + struct Unit; + }; + let exp = struct_like::StructLike::Unit( item ); + + let got : struct_like::StructLike = parse_quote! + { + struct Unit; + }; + a_id!( got, exp ); + + // - pub unit + + let item : syn::ItemStruct = parse_quote! + { + pub( crate ) struct Unit; + }; + let exp = struct_like::StructLike::Unit( item ); + + let got : struct_like::StructLike = parse_quote! + { + pub( crate ) struct Unit; + }; + a_id!( got, exp ); + +} + +// + +#[ test ] +fn structlike_unit_struct() +{ + use syn::parse_quote; + use the_module::struct_like::StructLike; + + let struct_like : StructLike = parse_quote! + { + struct UnitStruct; + }; + + assert!( matches!( struct_like, StructLike::Unit( _ ) ), "Expected StructLike::Unit variant" ); + assert_eq!( struct_like.ident().to_string(), "UnitStruct", "Struct name mismatch" ); +} + +#[ test ] +fn structlike_struct() +{ + use syn::parse_quote; + use the_module::struct_like::StructLike; + + let struct_like : StructLike = parse_quote! + { + struct RegularStruct + { + a : i32, + b : String, + } + }; + + assert!( matches!( struct_like, StructLike::Struct( _ ) ), "Expected StructLike::Struct variant" ); + assert_eq!( struct_like.ident().to_string(), "RegularStruct", "Struct name mismatch" ); + assert_eq!( struct_like.fields().count(), 2, "Expected two fields" ); +} + +#[ test ] +fn structlike_enum() +{ + use syn::parse_quote; + use the_module::struct_like::StructLike; + + let struct_like : StructLike = parse_quote! + { + enum TestEnum + { + Variant1, + Variant2 { x : i32, y : String }, + } + }; + + assert!( matches!( struct_like, StructLike::Enum( _ ) ), "Expected StructLike::Enum variant" ); + assert_eq!( struct_like.ident().to_string(), "TestEnum", "Enum name mismatch" ); +} + +#[ test ] +fn test_field_or_variant_field() +{ + use syn::parse_quote; + use the_module::struct_like::{ FieldOrVariant, StructLike }; + + let input : StructLike = parse_quote! + { + struct MyStruct + { + my_field : i32, + } + }; + + let field = input.fields().next().expect( "Expected at least one field" ); + let field_or_variant = FieldOrVariant::from( field ); + + match field_or_variant + { + FieldOrVariant::Field( f ) => assert_eq!( f.ty, parse_quote!( i32 ) ), + _ => panic!( "Expected Field variant" ), + } +} + +#[ test ] +fn test_field_or_variant_variant() +{ + use syn::parse_quote; + use the_module::struct_like::{ FieldOrVariant, StructLike }; + + let input : StructLike = parse_quote! + { + enum MyEnum + { + Variant1, + } + }; + + let variant = input.elements().next().expect( "Expected at least one variant" ); + let field_or_variant = FieldOrVariant::from( variant ); + + match field_or_variant + { + FieldOrVariant::Variant( v ) => + { + let exp : syn::Ident = parse_quote!( Variant1 ); + assert_eq!( v.ident, exp ); + }, + _ => panic!( "Expected Variant variant" ), + } +} + +#[ test ] +fn test_typ() +{ + use syn::parse_quote; + use the_module::struct_like::{ FieldOrVariant, StructLike }; + + let input : StructLike = parse_quote! + { + struct MyStruct + { + my_field : i32, + } + }; + + let field = input.fields().next().expect( "Expected at least one field" ); + let field_or_variant = FieldOrVariant::from( field ); + assert_eq!( field_or_variant.typ(), Some( &parse_quote!( i32 ) ) ); +} + +#[ test ] +fn test_attrs() +{ + use syn::parse_quote; + use the_module::struct_like::{ FieldOrVariant, StructLike }; + + let input : StructLike = parse_quote! + { + struct MyStruct + { + #[ some_attr ] + my_field : i32, + } + }; + + let field = input.fields().next().expect( "Expected at least one field" ); + let field_or_variant = FieldOrVariant::from( field ); + assert!( field_or_variant.attrs().iter().any( | attr | attr.path().is_ident( "some_attr" ) ) ); +} + +#[ test ] +fn test_vis() +{ + use syn::parse_quote; + use the_module::struct_like::{ FieldOrVariant, StructLike }; + + let input : StructLike = parse_quote! + { + struct MyStruct + { + pub my_field : i32, + } + }; + + let field = input.fields().next().expect( "Expected at least one field" ); + let field_or_variant = FieldOrVariant::from( field ); + assert!( matches!( field_or_variant.vis(), Some( syn::Visibility::Public( _ ) ) ) ); +} + +#[ test ] +fn test_ident() +{ + use the_module::struct_like::StructLike; + use syn::parse_quote; + use the_module::struct_like::FieldOrVariant; + + let input : StructLike = parse_quote! + { + struct MyStruct + { + my_field : i32, + } + }; + + // Extract the first field using the fields iterator from StructLike + let field = input.fields().next().expect( "Expected at least one field" ); + + let field_or_variant = FieldOrVariant::from( field ); + assert_eq!( field_or_variant.ident().unwrap(), "my_field" ); +} + +// + +#[ test ] +fn struct_with_attrs() +{ + use the_module::struct_like::StructLike; + + let input : proc_macro2::TokenStream = quote::quote! + { + #[ derive( From, InnerFrom, Display, FromStr, PartialEq, Debug ) ] + #[ display( "{a}-{b}" ) ] + pub struct Struct1 + { + a : i32, + b : i32, + } + }; + + let ast : StructLike = syn::parse2( input ).unwrap(); + let field = ast.fields().next().unwrap(); + let field_or_variant = the_module::struct_like::FieldOrVariant::from( field ); + assert_eq!( field_or_variant.ident().unwrap(), "a" ); +} + +// + +// #[ test ] +// fn struct_with_attrs2() +// { +// use the_module::struct_like::StructLike; +// +// let input : proc_macro2::TokenStream = quote::quote! +// { +// #[ derive( Debug, PartialEq, the_module::From ) ] +// #[ debug ] +// pub enum GetData +// { +// #[ allow( dead_code ) ] +// Nothing, +// FromString( String ), +// FromBin( &'static [ u8 ] ), +// } +// }; +// +// let ast : StructLike = syn::parse2( input ).unwrap(); +// let field = ast.elements().next().unwrap(); +// let field_or_variant = the_module::struct_like::FieldOrVariant::from( field ); +// assert_eq!( field_or_variant.ident().unwrap().to_string(), "Nothing" ); +// +// } + +#[ test ] +fn struct_with_attrs2() +{ + use quote::ToTokens; + use the_module::struct_like::{ StructLike, FieldOrVariant }; + + let input : proc_macro2::TokenStream = quote::quote! + { + #[ derive( Debug, PartialEq, the_module::From ) ] + #[ debug ] + pub enum GetData + { + #[ allow( dead_code ) ] + Nothing, + FromString( String ), + FromBin( & 'static [u8] ), + } + }; + + // Parse the input into a StructLike enum + let ast : StructLike = syn::parse2( input ).unwrap(); + + // Ensure the parsed item is an enum + assert!( matches!( ast, StructLike::Enum( _ ) ), "Expected StructLike::Enum variant" ); + + // Check the attributes of the enum + let attrs = ast.attrs(); + assert!( attrs.iter().any( | attr | attr.path().is_ident( "derive" ) ), "Missing derive attribute" ); + assert!( attrs.iter().any( | attr | attr.path().is_ident( "debug" ) ), "Missing debug attribute" ); + + // Check the visibility of the enum + assert!( matches!( ast.vis(), syn::Visibility::Public( _ ) ), "Expected public visibility" ); + + // Check all elements + let elements : Vec< FieldOrVariant< '_ > > = ast.elements().map( FieldOrVariant::from ).collect(); + + // Check the first variant + let first_field_or_variant = &elements[ 0 ]; + assert_eq!( first_field_or_variant.ident().unwrap().to_string(), "Nothing" ); + + // Check the attributes of the first variant + let variant_attrs = first_field_or_variant.attrs(); + assert!( variant_attrs.iter().any( | attr | attr.path().is_ident( "allow" ) ), "Missing allow attribute" ); + + // Check all variant names + let variant_names : Vec< String > = elements.iter().map( | elem | elem.ident().unwrap().to_string() ).collect(); + assert_eq!( variant_names, vec![ "Nothing", "FromString", "FromBin" ], "Variant names do not match" ); + + // Check the types of the variants + let variant_types : Vec< Option< &syn::Type > > = elements.iter().map( | elem | elem.typ() ).collect(); + + // let variant_fields: Vec< syn::Fields > = ast.elements().map( | e | e.fields() ).collect(); + let variant_fields : Vec< syn::Fields > = elements.iter().filter_map( | elem | elem.fields().cloned() ).collect(); + // dbg!( &variant_types ); + + assert_eq!( variant_types.len(), 3, "Expected three variants" ); + assert!( variant_types[ 0 ].is_none(), "First variant should have no type" ); + + assert!( variant_types[ 0 ].is_none() ); + assert!( variant_types[ 1 ].is_none() ); + assert!( variant_types[ 2 ].is_none() ); + + // tree_print!( variant_fields[1] ); + assert_eq!( variant_fields[ 1 ].to_token_stream().to_string(), "(String)", "Second variant should be of type String" ); + assert_eq!( variant_fields[ 2 ].to_token_stream().to_string(), "(& 'static [u8])", "Third variant should be of type & 'static [u8]" ); +} diff --git a/module/core/macro_tools/tests/inc/syntax_test.rs b/module/core/macro_tools/tests/inc/syntax_test.rs new file mode 100644 index 0000000000..adddd1285d --- /dev/null +++ b/module/core/macro_tools/tests/inc/syntax_test.rs @@ -0,0 +1,83 @@ + +use super::*; + +// + +tests_impls! +{ + + // + + fn attribute() -> Result< () > + { + use macro_tools::syn::parse::Parser; + + // test.case( "AttributesOuter" ); + let code = qt! + { + #[ derive( Copy ) ] + #[ derive( Clone ) ] + #[ derive( Debug ) ] + }; + let got = syn::parse2::< the_module::AttributesOuter >( code ).unwrap(); + let exp = the_module::AttributesOuter::from( syn::Attribute::parse_outer.parse2( qt! + { + #[ derive( Copy ) ] + #[ derive( Clone ) ] + #[ derive( Debug ) ] + } )? ); + a_id!( got, exp ); + + // test.case( "AttributesInner" ); + let code = qt! + { + // #![ deny( missing_docs ) ] + #![ warn( something ) ] + }; + let got = syn::parse2::< the_module::AttributesInner >( code ).unwrap(); + let exp = the_module::AttributesInner::from( syn::Attribute::parse_inner.parse2( qt! + { + // #![ deny( missing_docs ) ] + #![ warn( something ) ] + } )? ); + a_id!( got, exp ); + + // test.case( "AttributesInner" ); + let code = qt! + { + #![ warn( missing_docs1 ) ] + #![ warn( missing_docs2 ) ] + #[ warn( something1 ) ] + #[ warn( something2 ) ] + }; + let got = syn::parse2::< the_module::Pair< the_module::AttributesInner, the_module::AttributesOuter > >( code ).unwrap(); + let exp = the_module::Pair::from + (( + the_module::AttributesInner::from( syn::Attribute::parse_inner.parse2( qt! + { + #![ warn( missing_docs1 ) ] + #![ warn( missing_docs2 ) ] + } )? ), + the_module::AttributesOuter::from( syn::Attribute::parse_outer.parse2( qt! + { + #[ warn( something1 ) ] + #[ warn( something2 ) ] + } )? ), + )); + a_id!( got, exp ); + + // + + Ok( () ) + } + + // + +} + +// + +tests_index! +{ + attribute, +} diff --git a/module/core/macro_tools/tests/inc/tokens_test.rs b/module/core/macro_tools/tests/inc/tokens_test.rs new file mode 100644 index 0000000000..fcae746f5d --- /dev/null +++ b/module/core/macro_tools/tests/inc/tokens_test.rs @@ -0,0 +1,18 @@ + +use super::*; + +// + +#[ test ] +fn tokens() +{ + + let got : the_module::Tokens = syn::parse_quote!( a = b ); + // tree_print!( got ); + a_id!( got.to_string(), "a = b".to_string() ); + + let got : the_module::Tokens = syn::parse_quote!( #[ former( default = 31 ) ] ); + // tree_print!( got ); + a_id!( got.to_string(), "# [former (default = 31)]".to_string() ); + +} diff --git a/module/core/macro_tools/tests/inc/typ_Test.rs b/module/core/macro_tools/tests/inc/typ_Test.rs new file mode 100644 index 0000000000..174c2c243b --- /dev/null +++ b/module/core/macro_tools/tests/inc/typ_Test.rs @@ -0,0 +1,195 @@ + +use super::*; + +// + +#[ test ] +fn is_optional_with_option_type() +{ + use syn::parse_str; + use macro_tools::typ::is_optional; + + let type_string = "Option"; + let parsed_type : syn::Type = parse_str( type_string ).expect( "Type should parse correctly" ); + + assert!( is_optional( &parsed_type ), "Expected type to be recognized as an Option" ); +} + +#[ test ] +fn is_optional_with_non_option_type() +{ + use syn::parse_str; + use macro_tools::typ::is_optional; + + let type_string = "Vec"; + let parsed_type : syn::Type = parse_str( type_string ).expect( "Type should parse correctly" ); + + assert!( !is_optional( &parsed_type ), "Expected type not to be recognized as an Option" ); +} + +#[ test ] +fn is_optional_with_nested_option_type() +{ + use syn::parse_str; + use macro_tools::typ::is_optional; + + let type_string = "Option>"; + let parsed_type : syn::Type = parse_str( type_string ).expect( "Type should parse correctly" ); + + assert!( is_optional( &parsed_type ), "Expected nested Option type to be recognized as an Option" ); +} + +#[ test ] +fn is_optional_with_similar_name_type() +{ + use syn::parse_str; + use macro_tools::typ::is_optional; + + let type_string = "OptionalValue"; + let parsed_type : syn::Type = parse_str( type_string ).expect( "Type should parse correctly" ); + + assert!( !is_optional( &parsed_type ), "Expected type with similar name not to be recognized as an Option" ); +} + +#[ test ] +fn is_optional_with_empty_input() +{ + use syn::{ parse_str, Type }; + use macro_tools::typ::is_optional; + + let type_string = ""; + let parsed_type_result = parse_str::< Type >( type_string ); + + assert!( parsed_type_result.is_err(), "Expected parsing to fail for empty input" ); +} + +// + +#[ test ] +fn parameter_first_with_multiple_generics() +{ + use syn::{ parse_str, Type }; + use macro_tools::typ::parameter_first; + + let type_string = "Result, Error>"; + let parsed_type : Type = parse_str( type_string ).expect( "Type should parse correctly" ); + + let first_param = parameter_first( &parsed_type ).expect( "Expected to extract the first generic parameter" ); + + let expected_type : Type = parse_str( "Option" ).expect( "Expected type to parse correctly" ); + assert_eq!( format!( "{:?}", expected_type ), format!( "{:?}", first_param ), "Extracted type does not match expected" ); +} + +#[ test ] +fn parameter_first_with_no_generics() +{ + use syn::{ parse_str, Type }; + use macro_tools::typ::parameter_first; + + let type_string = "i32"; + let parsed_type : Type = parse_str( type_string ).expect( "Type should parse correctly" ); + let got = parameter_first( &parsed_type ).expect( "Type should parse correctly" ); + + // tree_print!( got.as_ref().unwrap() ); + + let expected_type : Type = parse_str( "i32" ).expect( "Expected type to parse correctly" ); + assert_eq!( format!( "{:?}", expected_type ), format!( "{:?}", got ), "Extracted type does not match expected" ); + +} + +#[ test ] +fn parameter_first_with_single_generic() +{ + use syn::{ parse_str, Type }; + use macro_tools::typ::parameter_first; + + let type_string = "Vec< i32 >"; + let parsed_type : Type = parse_str( type_string ).expect( "Type should parse correctly" ); + + let first_param = parameter_first( &parsed_type ).expect( "Expected to extract the first generic parameter" ); + + let expected_type : Type = parse_str( "i32" ).expect( "Expected type to parse correctly" ); + assert_eq!( format!( "{:?}", expected_type ), format!( "{:?}", first_param ), "Extracted type does not match expected" ); +} + +#[ test ] +fn parameter_first_with_deeply_nested_generics() +{ + use syn::{ parse_str, Type }; + use macro_tools::typ::parameter_first; + + let type_string = "Vec< HashMap< String, Option< i32 > > >"; + let parsed_type : Type = parse_str( type_string ).expect( "Type should parse correctly" ); + + let first_param = parameter_first( &parsed_type ).expect( "Expected to extract the first generic parameter" ); + + let expected_type : Type = parse_str( "HashMap< String, Option< i32 > >" ).expect( "Expected type to parse correctly" ); + assert_eq!( format!( "{:?}", expected_type ), format!( "{:?}", first_param ), "Extracted type does not match expected" ); +} + +// + +#[ test ] +fn type_rightmost_basic() +{ + + // test.case( "core::option::Option< i32 >" ); + let code = qt!( core::option::Option< i32 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = the_module::typ::type_rightmost( &tree_type ); + a_id!( got, Some( "Option".to_string() ) ); + +} + +// + +#[ test ] +fn type_parameters_basic() +{ + + macro_rules! q + { + ( $( $Src : tt )+ ) => + { + syn::parse2::< syn::Type >( qt!( $( $Src )+ ) ).unwrap() + } + } + + // test.case( "core::option::Option< i8, i16, i32, i64 >" ); + let code = qt!( core::option::Option< i8, i16, i32, i64 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, 0..=0 ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ) ]; + a_id!( got, exp ); + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, 0..=1 ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ), q!( i16 ) ]; + a_id!( got, exp ); + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, 0..=2 ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ), q!( i16 ), q!( i32 ) ]; + a_id!( got, exp ); + + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, 0..0 ).into_iter().cloned().collect(); + let exp : Vec< syn::Type > = vec![]; + a_id!( got, exp ); + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, 0..1 ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ) ]; + a_id!( got, exp ); + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, 0..2 ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ), q!( i16 ) ]; + a_id!( got, exp ); + + // unbound + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, .. ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ), q!( i16 ), q!( i32 ), q!( i64 ) ]; + a_id!( got, exp ); + + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, .. ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ), q!( i16 ), q!( i32 ), q!( i64 ) ]; + a_id!( got, exp ); + + let got : Vec< syn::Type > = the_module::typ::type_parameters( &tree_type, .. ).into_iter().cloned().collect(); + let exp = vec![ q!( i8 ), q!( i16 ), q!( i32 ), q!( i64 ) ]; + a_id!( got, exp ); + +} diff --git a/module/core/macro_tools/tests/smoke_test.rs b/module/core/macro_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/macro_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/macro_tools/tests/tests.rs b/module/core/macro_tools/tests/tests.rs new file mode 100644 index 0000000000..dc27d22258 --- /dev/null +++ b/module/core/macro_tools/tests/tests.rs @@ -0,0 +1,6 @@ +#[ allow( unused_imports ) ] +use macro_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/core/mem_tools/Cargo.toml b/module/core/mem_tools/Cargo.toml new file mode 100644 index 0000000000..08bc56fc1a --- /dev/null +++ b/module/core/mem_tools/Cargo.toml @@ -0,0 +1,50 @@ +[package] +name = "mem_tools" +version = "0.6.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/mem_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/mem_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/mem_tools" +description = """ +Collection of tools to manipulate memory. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/mem", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ + "enabled", +] +full = [ + "use_alloc", + "enabled", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/mem_tools/License b/module/core/mem_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/mem_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/mem_tools/Readme.md b/module/core/mem_tools/Readme.md new file mode 100644 index 0000000000..96f5ae9605 --- /dev/null +++ b/module/core/mem_tools/Readme.md @@ -0,0 +1,59 @@ + + +# Module :: mem_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/mem_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/mem_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmem_tools%2Fexamples%2Fmem_tools_trivial.rs,RUN_POSTFIX=--example%20mem_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of tools to manipulate memory. + +Performant size / pointer / region / data comparing. + +### Basic use-case + + + +```rust + +use mem_tools as mem; + +// Are two pointers are the same, not taking into accoint type. +// Unlike `std::ptr::eq()` does not require arguments to have the same type. +let src1 = ( 1, ); +let src2 = ( 1, ); +assert!( !mem::same_ptr( &src1, &src2 ) ); + +// Are two pointers points on data of the same size. +let src1 = "abc"; +let src2 = "cba"; +assert!( mem::same_size( src1, src2 ) ); + +// Are two pointers points on the same region, ie same size and same pointer. +// Does not require arguments to have the same type. +let src1 = "abc"; +let src2 = "abc"; +assert!( mem::same_region( src1, src2 ) ); + +``` + +### To add to your project + +```sh +cargo add mem_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/mem_tools_trivial +cargo run +``` + +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Fmeta_tools_trivial,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/meta_tools) +![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/meta_tools) diff --git a/module/core/mem_tools/examples/mem_tools_trivial.rs b/module/core/mem_tools/examples/mem_tools_trivial.rs new file mode 100644 index 0000000000..e7396d53c3 --- /dev/null +++ b/module/core/mem_tools/examples/mem_tools_trivial.rs @@ -0,0 +1,24 @@ +//! qqq : write proper description +use mem_tools as mem; + +fn main() +{ + + // Are two pointers are the same, not taking into accoint type. + // Unlike `std::ptr::eq()` does not require arguments to have the same type. + let src1 = ( 1, ); + let src2 = ( 1, ); + assert!( !mem::same_ptr( &src1, &src2 ) ); + + // Are two pointers points on data of the same size. + let src1 = "abc"; + let src2 = "cba"; + assert!( mem::same_size( src1, src2 ) ); + + // Are two pointers points on the same region, ie same size and same pointer. + // Does not require arguments to have the same type. + let src1 = "abc"; + let src2 = "abc"; + assert!( mem::same_region( src1, src2 ) ); + +} diff --git a/module/core/mem_tools/src/lib.rs b/module/core/mem_tools/src/lib.rs new file mode 100644 index 0000000000..fffffc6fdd --- /dev/null +++ b/module/core/mem_tools/src/lib.rs @@ -0,0 +1,71 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/mem_tools/latest/mem_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Collection of tools to manipulate memory. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +/// Collection of general purpose meta tools. +#[ cfg( feature = "enabled" ) ] +pub mod mem; + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::mem::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::mem::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::mem::prelude::*; +} diff --git a/module/core/mem_tools/src/mem.rs b/module/core/mem_tools/src/mem.rs new file mode 100644 index 0000000000..b0c7e199f5 --- /dev/null +++ b/module/core/mem_tools/src/mem.rs @@ -0,0 +1,108 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + + /// + /// Are two pointers points on the same data. + /// + /// Does not require arguments to have the same type. + /// + + pub fn same_data< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool + { + extern "C" { fn memcmp( s1 : *const u8, s2 : *const u8, n : usize ) -> i32; } + + let mem1 = src1 as *const _ as *const u8; + let mem2 = src2 as *const _ as *const u8; + + if !same_size( src1, src2 ) + { + return false; + } + + // Unsafe block is required because we're calling a foreign function (memcmp) + // and manually managing memory addresses. + #[ allow( unsafe_code ) ] + unsafe { memcmp( mem1, mem2, core::mem::size_of_val( src1 ) ) == 0 } + } + + /* zzz : qqq : implement mem::same_data, comparing data. discuss */ + + /// + /// Are two pointers are the same, not taking into accoint type. + /// + /// Unlike `std::ptr::eq()` does not require arguments to have the same type. + /// + + pub fn same_ptr< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool + { + let mem1 = src1 as *const _ as *const (); + let mem2 = src2 as *const _ as *const (); + mem1 == mem2 + } + + /// + /// Are two pointers points on data of the same size. + /// + + pub fn same_size< T1 : ?Sized, T2 : ?Sized >( _src1 : &T1, _src2 : &T2 ) -> bool + { + core::mem::size_of_val( _src1 ) == core::mem::size_of_val( _src2 ) + } + + /// + /// Are two pointers points on the same region, ie same size and same pointer. + /// + /// Does not require arguments to have the same type. + /// + + pub fn same_region< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool + { + same_ptr( src1, src2 ) && same_size( src1, src2 ) + } + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + orphan::*, + }; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super:: + { + exposed::*, + private::same_data, + private::same_ptr, + private::same_size, + private::same_region, + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/mem_tools/tests/inc/mem_test.rs b/module/core/mem_tools/tests/inc/mem_test.rs new file mode 100644 index 0000000000..1b2fa2954e --- /dev/null +++ b/module/core/mem_tools/tests/inc/mem_test.rs @@ -0,0 +1,120 @@ +use super::*; + +// + +tests_impls! +{ + + fn same_data() + { + let buf = [ 0u8; 128 ]; + a_true!( the_module::same_data( &buf, &buf ) ); + + let x = [ 0u8; 1 ]; + let y = 0u8; + + a_true!( the_module::same_data( &x, &y ) ); + + a_false!( the_module::same_data( &buf, &x ) ); + a_false!( the_module::same_data( &buf, &y ) ); + + struct H1( &'static str ); + struct H2( &'static str ); + + a_true!( the_module::same_data( &H1( "hello" ), &H2( "hello" ) ) ); + a_false!( the_module::same_data( &H1( "qwerty" ), &H2( "hello" ) ) ); + + } + + fn same_ptr() + { + + let src1 = "abc"; + let src2 = "abc"; + a_true!( the_module::same_ptr( src1, src2 ) ); + + let src1 = ( 1, ); + let src2 = ( 1, ); + a_false!( the_module::same_ptr( &src1, &src2 ) ); + + let src1 = ( 1 ); + let src2 = "abcde"; + a_false!( the_module::same_ptr( &src1, src2 ) ); + + } + + // + + fn same_size() + { + + let src1 = "abc"; + let src2 = "cba"; + a_true!( the_module::same_size( src1, src2 ) ); + + let src1 = ( 1, ); + let src2 = ( 3, ); + a_true!( the_module::same_size( &src1, &src2 ) ); + + let src1 = ( 1 ); + let src2 = "abcde"; + a_false!( the_module::same_size( &src1, src2 ) ); + + } + + // + + fn same_region() + { + + let src1 = "abc"; + let src2 = "abc"; + a_true!( the_module::same_region( src1, src2 ) ); + + let src1 = ( 1, ); + let src2 = ( 1, ); + a_false!( the_module::same_region( &src1, &src2 ) ); + + let src1 = ( 1 ); + let src2 = "abcde"; + a_false!( the_module::same_region( &src1, src2 ) ); + + } + + // + + fn samples() + { + use the_module as mem; + + // Are two pointers are the same, not taking into accoint type. + // Unlike `std::ptr::eq()` does not require arguments to have the same type. + let src1 = ( 1, ); + let src2 = ( 1, ); + assert!( !mem::same_ptr( &src1, &src2 ) ); + + // Are two pointers points on data of the same size. + let src1 = "abc"; + let src2 = "cba"; + assert!( mem::same_size( src1, src2 ) ); + + // Are two pointers points on the same region, ie same size and same pointer. + // Does not require arguments to have the same type. + let src1 = "abc"; + let src2 = "abc"; + assert!( mem::same_region( src1, src2 ) ); + + } + +} + +// + +tests_index! +{ + same_data, + same_ptr, + same_size, + same_region, + samples, +} diff --git a/module/core/mem_tools/tests/inc/mod.rs b/module/core/mem_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..9147b3ddcc --- /dev/null +++ b/module/core/mem_tools/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod mem_test; diff --git a/module/core/mem_tools/tests/mem_tools_tests.rs b/module/core/mem_tools/tests/mem_tools_tests.rs new file mode 100644 index 0000000000..5f9856b952 --- /dev/null +++ b/module/core/mem_tools/tests/mem_tools_tests.rs @@ -0,0 +1,12 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] +// #![ feature( type_name_of_val ) ] + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +use mem_tools as the_module; + +mod inc; diff --git a/module/core/mem_tools/tests/smoke_test.rs b/module/core/mem_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/mem_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/meta_tools/Cargo.toml b/module/core/meta_tools/Cargo.toml new file mode 100644 index 0000000000..1fc7ff399b --- /dev/null +++ b/module/core/meta_tools/Cargo.toml @@ -0,0 +1,70 @@ +[package] +name = "meta_tools" +version = "0.10.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/meta_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/meta_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/meta_tools" +description = """ +Collection of general purpose meta tools. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ + "enabled", + "meta_for_each", + "meta_impls_index", + # "meta_mod_interface", + "meta_constructors", + "meta_idents_concat", +] +full = [ + "enabled", + "meta_for_each", + "meta_impls_index", + # "meta_mod_interface", + "meta_constructors", + "meta_idents_concat", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +meta_for_each = [ "for_each/enabled" ] +meta_impls_index = [ "impls_index/enabled" ] +meta_mod_interface = [ "mod_interface/enabled" ] +# xxx : qqq : make mod_interface optional maybe + +meta_constructors = [ "literally" ] +meta_idents_concat = [ "paste" ] + +[dependencies] + +## external +literally = { version = "~0.1.3", optional = true, default-features = false } +paste = { version = "~1.0.14", optional = true, default-features = false } + +## internal +impls_index = { workspace = true } +for_each = { workspace = true } +mod_interface = { workspace = true, features = [ "default" ] } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/meta_tools/License b/module/core/meta_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/meta_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/meta_tools/Readme.md b/module/core/meta_tools/Readme.md new file mode 100644 index 0000000000..0d472b069f --- /dev/null +++ b/module/core/meta_tools/Readme.md @@ -0,0 +1,58 @@ + + +# Module :: meta_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/meta_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/meta_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmeta_tools%2Fexamples%2Fmeta_tools_trivial.rs,RUN_POSTFIX=--example%20meta_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose meta tools. + +### Basic use-case :: variadic constructor of collections + +Among other useful meta tools the module aggregates variadic constructors of collections. For example macro `hmap!` for constructing a hash map. + + + +```rust +use meta_tools::*; + +let meta_map = hmap! { 3 => 13 }; +let mut std_map = std::collections::HashMap::new(); +std_map.insert( 3, 13 ); +assert_eq!( meta_map, std_map ); +``` + +### Basic Use Case :: function-style call + +Apply a macro for each element of a list. + +Macro `for_each` may be called either in function-style way or in map-style way. +Pass name of macro to apply to elements as the first arguments and elements after the macro name. +Use comma as delimiter. + + + +```rust +use meta_tools::*; +for_each!( dbg, "a", "b", "c" ); + +// generates +dbg!( "a" ); +dbg!( "b" ); +dbg!( "c" ); +``` + +### To add to your project + +```sh +cargo add meta_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/meta_tools_trivial +cargo run +``` diff --git a/module/core/meta_tools/examples/meta_tools_trivial.rs b/module/core/meta_tools/examples/meta_tools_trivial.rs new file mode 100644 index 0000000000..75d17ddace --- /dev/null +++ b/module/core/meta_tools/examples/meta_tools_trivial.rs @@ -0,0 +1,10 @@ +//! This example showcases the usage of the `hmap!` macro from the `meta_tools` crate to create a hashmap and compares it with a hashmap created using `std::collections::HashMap`. +use meta_tools::*; + +fn main() +{ + let meta_map = hmap! { 3 => 13 }; + let mut std_map = std::collections::HashMap::new(); + std_map.insert( 3, 13 ); + assert_eq!( meta_map, std_map ); +} diff --git a/module/core/meta_tools/src/lib.rs b/module/core/meta_tools/src/lib.rs new file mode 100644 index 0000000000..cd49c9841e --- /dev/null +++ b/module/core/meta_tools/src/lib.rs @@ -0,0 +1,41 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/meta_tools/latest/meta_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + + // #[ cfg( feature = "meta_mod_interface" ) ] + pub use ::mod_interface; + #[ cfg( feature = "meta_for_each" ) ] + pub use ::for_each; + #[ cfg( feature = "meta_impls_index" ) ] + pub use ::impls_index; + + #[ cfg( feature = "meta_constructors" ) ] + pub use ::literally; + #[ cfg( feature = "meta_idents_concat" ) ] + pub use ::paste; + + // #[ cfg( feature = "former" ) ] + // pub use ::former; + // #[ cfg( feature = "options" ) ] + // pub use ::woptions; + +} + +// + +// qqq : meta interface should be optional dependancy. please fix writing equivalent code manually +#[ cfg( feature = "enabled" ) ] +mod_interface::mod_interface! +{ + + layer meta; + +} diff --git a/module/core/meta_tools/src/meta.rs b/module/core/meta_tools/src/meta.rs new file mode 100644 index 0000000000..bd0e677412 --- /dev/null +++ b/module/core/meta_tools/src/meta.rs @@ -0,0 +1,40 @@ +//! +//! Collection of general purpose meta tools. +//! + +/// Internal namespace. +pub( crate ) mod private +{ +} + +// + +#[ cfg( feature = "enabled" ) ] +mod_interface::mod_interface! +{ + + #[ cfg( feature = "meta_impls_index" ) ] + use ::impls_index; + #[ cfg( feature = "meta_for_each" ) ] + use ::for_each; + // #[ cfg( feature = "meta_mod_interface" ) ] + use ::mod_interface; + // #[ cfg( feature = "meta_mod_interface" ) ] + prelude use ::mod_interface::mod_interface; + + #[ cfg( feature = "meta_constructors" ) ] + prelude use ::literally::*; + #[ cfg( feature = "meta_idents_concat" ) ] + prelude use ::paste::paste as meta_idents_concat; + + // #[ cfg( feature = "options" ) ] + // use ::woptions; + // #[ cfg( feature = "options" ) ] + // prelude use ::woptions as options; + + // #[ cfg( feature = "former" ) ] + // use ::former; + // #[ cfg( feature = "former" ) ] + // prelude use ::former as former; + +} diff --git a/module/core/meta_tools/tests/inc/indents_concat_test.rs b/module/core/meta_tools/tests/inc/indents_concat_test.rs new file mode 100644 index 0000000000..58a68bbd5e --- /dev/null +++ b/module/core/meta_tools/tests/inc/indents_concat_test.rs @@ -0,0 +1,42 @@ +use super::*; + +tests_impls! +{ + + // + + fn basic() + { + let mut a = 0; + + println!( "MODULES_PATH : {}", env!( "MODULES_PATH" ) ); + println!( "WORKSPACE_PATH : {}", env!( "WORKSPACE_PATH" ) ); + // xxx : add to program_tools::{ path::modules(), path::workspace() } + + macro_rules! macro1 + { + ( $Number:tt ) => + { + a = 13; + // let xy3_ = 13; + the_module::meta_idents_concat! + { + let [< x $Number _ >] = 13; + }; + a_id!( xy3_, a ); + }; + } + + macro1!( y3 ); + a_id!( a, 13 ); + + } + +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/meta_tools/tests/inc/meta_constructor_test.rs b/module/core/meta_tools/tests/inc/meta_constructor_test.rs new file mode 100644 index 0000000000..acee680259 --- /dev/null +++ b/module/core/meta_tools/tests/inc/meta_constructor_test.rs @@ -0,0 +1,50 @@ +use super::*; + +// + +tests_impls! +{ + + fn hash_map() + { + + // test.case( "empty" ); + let got : std::collections::HashMap< i32, i32 > = the_module::hmap!{}; + let exp = std::collections::HashMap::new(); + a_id!( got, exp ); + + // test.case( "single entry" ); + let got = the_module::hmap!{ 3 => 13 }; + let mut exp = std::collections::HashMap::new(); + exp.insert( 3, 13 ); + a_id!( got, exp ); + + } + + // + + + fn hash_set() + { + + // test.case( "empty" ); + let got : std::collections::HashSet< i32 > = the_module::hset!{}; + let exp = std::collections::HashSet::new(); + a_id!( got, exp ); + + // test.case( "single entry" ); + let got = the_module::hset!{ 13 }; + let mut exp = std::collections::HashSet::new(); + exp.insert( 13 ); + a_id!( got, exp ); + + } +} + +// + +tests_index! +{ + hash_map, + hash_set, +} diff --git a/module/core/meta_tools/tests/inc/mod.rs b/module/core/meta_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..9fc942d2c2 --- /dev/null +++ b/module/core/meta_tools/tests/inc/mod.rs @@ -0,0 +1,20 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ cfg( any( feature = "meta_constructors", feature = "meta_constructors" ) ) ] +mod meta_constructor_test; + +#[ cfg( any( feature = "meta_idents_concat", feature = "meta_idents_concat" ) ) ] +mod indents_concat_test; + +#[ cfg( any( feature = "for_each", feature = "meta_for_each" ) ) ] +#[ path = "../../../for_each/tests/inc/mod.rs" ] +mod for_each_test; + +#[ cfg( any( feature = "impls_index", feature = "meta_impls_index" ) ) ] +#[ path = "../../../impls_index/tests/inc/mod.rs" ] +mod impls_index; + +// #[ cfg( any( feature = "mod_interface", feature = "meta_mod_interface" ) ) ] +#[ path = "../../../mod_interface/tests/inc/mod.rs" ] +mod mod_interface; diff --git a/module/core/meta_tools/tests/meta_tools_tests.rs b/module/core/meta_tools/tests/meta_tools_tests.rs new file mode 100644 index 0000000000..9f1a2b8c08 --- /dev/null +++ b/module/core/meta_tools/tests/meta_tools_tests.rs @@ -0,0 +1,19 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use ::meta_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ path="../../../../module/step/meta/src/module/aggregating.rs" ] +mod aggregating; + +/// A struct for testing purpose. +#[ derive( Debug, PartialEq ) ] +pub struct CrateStructForTesting1 +{ +} + + +mod inc; diff --git a/module/core/meta_tools/tests/smoke_test.rs b/module/core/meta_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/meta_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/mod_interface/Cargo.toml b/module/core/mod_interface/Cargo.toml new file mode 100644 index 0000000000..bc096312e0 --- /dev/null +++ b/module/core/mod_interface/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "mod_interface" +version = "0.21.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/mod_interface" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/mod_interface" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/mod_interface" +description = """ +Protocol of modularity unifying interface of a module and introducing layers. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [ "mod_interface_meta/enabled" ] + +# keep these examples in directories + +[[example]] +name = "mod_interface_trivial" +path = "examples/mod_interface_trivial/src/main.rs" + +[[example]] +name = "mod_interface_debug" +path = "examples/mod_interface_debug/src/main.rs" + +[dependencies] +mod_interface_meta = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/mod_interface/License b/module/core/mod_interface/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/mod_interface/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/mod_interface/Readme.md b/module/core/mod_interface/Readme.md new file mode 100644 index 0000000000..1115dea469 --- /dev/null +++ b/module/core/mod_interface/Readme.md @@ -0,0 +1,166 @@ + + +# Module :: mod_interface + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml) [![docs.rs](https://img.shields.io/docsrs/mod_interface?color=e3e8f0&logo=docs.rs)](https://docs.rs/mod_interface) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Protocol of modularity unifying interface of a module and introducing layers. + +### Basic use-case + +Library file with code `inner.rs`: + +```rust ignore +pub( crate ) mod private +{ + /// Routine of inner module. + pub fn inner_is() -> bool + { + true + } +} + +// + +mod_interface::mod_interface! +{ + prelude use inner_is; +} +``` + +Main file that generates modules and namespaces `main.rs` : + +```rust ignore +use mod_interface::mod_interface; + +// + +fn main() +{ + assert_eq!( prelude::inner_is(), inner::prelude::inner_is() ); +} + +// + +mod_interface::mod_interface! +{ + /// Inner. + layer inner; +} +``` + +It generates code : + +```rust +use mod_interface::mod_interface; + +// + +fn main() +{ + assert_eq!( prelude::inner_is(), inner::prelude::inner_is() ); +} + +// + +/// Inner. +pub mod inner +{ + pub( crate ) mod private + { + /// Routine of inner module. + pub fn inner_is() -> bool { true } + } + + /// Protected namespace of the module. + pub mod protected + { + pub use super::orphan::*; + } + pub use protected::*; + + /// Orphan namespace of the module. + pub mod orphan + { + pub use super::exposed::*; + } + + /// Exposed namespace of the module. + pub mod exposed + { + pub use super::prelude::*; + } + + /// Prelude to use essentials: `use my_module::prelude::*`. + pub mod prelude + { + pub use super::private::inner_is; + } +} + +/// Protected namespace of the module. +pub mod protected +{ + pub use super::orphan::*; + pub use super::inner::orphan::*; +} +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::prelude::*; + pub use super::inner::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + pub use super::inner::prelude::*; +} +``` + +### Debugging + +To debug module interface use directive `#![ debug ]` in macro `mod_interface`. Let's update the main file of the example : + +```rust ignore +mod_interface::mod_interface! +{ + #![ debug ] + /// Inner. + layer inner; +} +``` + +Full sample see at [sample directory](https://github.com/Wandalen/wTools/tree/master/examples/mod_interface_trivial). + +### To add to your project + +```sh +cargo add mod_interface +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/mod_interface_trivial +cargo run +``` +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/mod_interface_trivial +cargo run +``` diff --git a/module/core/mod_interface/examples/mod_interface_debug/Cargo.toml b/module/core/mod_interface/examples/mod_interface_debug/Cargo.toml new file mode 100644 index 0000000000..cc123adbf0 --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_debug/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "mod_interface_debug" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +mod_interface = { workspace = true } diff --git a/module/core/mod_interface/examples/mod_interface_debug/Readme.md b/module/core/mod_interface/examples/mod_interface_debug/Readme.md new file mode 100644 index 0000000000..6cc31966fb --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_debug/Readme.md @@ -0,0 +1,13 @@ +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Fmod_interface_with_debug,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/mod_interface) + +A sample demonstrates basic usage of macro `mod_interface`. + +In file `inner.rs` demonstrated how to generate module interface from namespace `private` and its public routine. + +In file `main.rs` demonstrated how to generate module interface from layer ( file with full module interface ). + +The directive `#![ debug ]` in declaration of macro `mod_interface` allow to show generated module interface as the standard output in compile time. diff --git a/module/core/mod_interface/examples/mod_interface_debug/src/inner.rs b/module/core/mod_interface/examples/mod_interface_debug/src/inner.rs new file mode 100644 index 0000000000..2e2ea03cee --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_debug/src/inner.rs @@ -0,0 +1,15 @@ +pub( crate ) mod private +{ + /// Routine of inner module. + pub fn inner_is() -> bool + { + true + } +} + +// + +mod_interface::mod_interface! +{ + prelude use inner_is; +} diff --git a/module/core/mod_interface/examples/mod_interface_debug/src/main.rs b/module/core/mod_interface/examples/mod_interface_debug/src/main.rs new file mode 100644 index 0000000000..e316b7acd6 --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_debug/src/main.rs @@ -0,0 +1,18 @@ +//! qqq : write proper description +use mod_interface::mod_interface; + +// + +fn main() +{ + assert_eq!( prelude::inner_is(), inner::prelude::inner_is() ); +} + +// + +mod_interface! +{ + #![ debug ] + /// Inner. + layer inner; +} diff --git a/module/core/mod_interface/examples/mod_interface_trivial/Cargo.toml b/module/core/mod_interface/examples/mod_interface_trivial/Cargo.toml new file mode 100644 index 0000000000..81fc70675c --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_trivial/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "mod_interface_trivial" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +mod_interface = { workspace = true } diff --git a/module/core/mod_interface/examples/mod_interface_trivial/Readme.md b/module/core/mod_interface/examples/mod_interface_trivial/Readme.md new file mode 100644 index 0000000000..343322a31c --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_trivial/Readme.md @@ -0,0 +1,11 @@ +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Fmod_interface_trivial,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/mod_interface) + +A sample demonstrates basic usage of macro `mod_interface`. + +In file `inner.rs` demonstrated how to generate module interface from namespace `private` and its public routine. + +In file `main.rs` demonstrated how to generate module interface from layer ( file with full module interface ). diff --git a/module/core/mod_interface/examples/mod_interface_trivial/src/inner.rs b/module/core/mod_interface/examples/mod_interface_trivial/src/inner.rs new file mode 100644 index 0000000000..2e2ea03cee --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_trivial/src/inner.rs @@ -0,0 +1,15 @@ +pub( crate ) mod private +{ + /// Routine of inner module. + pub fn inner_is() -> bool + { + true + } +} + +// + +mod_interface::mod_interface! +{ + prelude use inner_is; +} diff --git a/module/core/mod_interface/examples/mod_interface_trivial/src/main.rs b/module/core/mod_interface/examples/mod_interface_trivial/src/main.rs new file mode 100644 index 0000000000..03b8905594 --- /dev/null +++ b/module/core/mod_interface/examples/mod_interface_trivial/src/main.rs @@ -0,0 +1,21 @@ +//! qqq : write proper descriptionuse mod_interface::mod_interface; + +// + +use mod_interface::mod_interface; + +fn main() +{ + assert_eq!( prelude::inner_is(), prelude::inner_is() ); +} + +// + +mod_interface! +{ + /// Inner. + layer inner; +} + +// qqq : rewrite sample +/* aaa : Dmytro : sample with layer */ diff --git a/module/core/mod_interface/src/lib.rs b/module/core/mod_interface/src/lib.rs new file mode 100644 index 0000000000..582ad8e8c9 --- /dev/null +++ b/module/core/mod_interface/src/lib.rs @@ -0,0 +1,60 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/mod_interface/latest/mod_interface/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + // pub use mod_interface_runtime; + pub use mod_interface_meta; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use mod_interface_meta as meta; + +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. + +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use mod_interface_meta::*; +} diff --git a/module/core/mod_interface/tests/inc/derive/attr_debug/layer_a.rs b/module/core/mod_interface/tests/inc/derive/attr_debug/layer_a.rs new file mode 100644 index 0000000000..f1e9f256fb --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/attr_debug/layer_a.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/attr_debug/mod.rs b/module/core/mod_interface/tests/inc/derive/attr_debug/mod.rs new file mode 100644 index 0000000000..939ebcdfb3 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/attr_debug/mod.rs @@ -0,0 +1,15 @@ + +use super::*; + +mod_interface! +{ + #![ debug ] + + /// layer_a + layer layer_a; + +} + +// + +include!( "../../only_test/layer_single_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.rs b/module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.stderr b/module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.stderr new file mode 100644 index 0000000000..4ee886828f --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/attr_debug/trybuild.stderr @@ -0,0 +1,7 @@ +error: Layer should not have explicitly defined visibility because all its subnamespaces are used. + #[doc = " layer_a"] pub layer layer_a ; + --> tests/meta/mod_interface/front/layer_bad_vis/mod.rs + | + | / /// layer_a + | | pub layer layer_a; + | |____________________^ diff --git a/module/core/mod_interface/tests/inc/derive/layer/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer/layer_a.rs new file mode 100644 index 0000000000..f1e9f256fb --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer/layer_a.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/layer/layer_b.rs b/module/core/mod_interface/tests/inc/derive/layer/layer_b.rs new file mode 100644 index 0000000000..8051e73936 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer/layer_b.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/layer/mod.rs b/module/core/mod_interface/tests/inc/derive/layer/mod.rs new file mode 100644 index 0000000000..d8e79fb20b --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer/mod.rs @@ -0,0 +1,21 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + /// layer_a + layer layer_a; + /// layer_b + layer layer_b; + +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/layer/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_bad_vis/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/layer_a.rs new file mode 100644 index 0000000000..f1e9f256fb --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/layer_a.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_bad_vis/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/mod.rs new file mode 100644 index 0000000000..85b1e3c05c --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/mod.rs @@ -0,0 +1,10 @@ + +use super::*; + +the_module::mod_interface! +{ + + /// layer_a + pub layer layer_a; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.stderr b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.stderr new file mode 100644 index 0000000000..b81832286c --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_bad_vis/trybuild.stderr @@ -0,0 +1,7 @@ +error: Layer should not have explicitly defined visibility because all its subnamespaces are used. + #[doc = " layer_a"] pub layer layer_a; + --> tests/inc/derive/layer_bad_vis/mod.rs + | + | / /// layer_a + | | pub layer layer_a; + | |____________________^ diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_a.rs new file mode 100644 index 0000000000..8ba8f1e9e6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_a.rs @@ -0,0 +1,52 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } + + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } + + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } + + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } + +} + +// + +mod_interface! +{ + + // orphan use super::private:: + // { + // protected where layer_a_protected as layer_a_protected2, + // layer_a_orphan, + // exposed where layer_a_exposed, + // prelude where layer_a_prelude, + // }; + + protected use { layer_a_protected }; + orphan use layer_a_orphan; + exposed use layer_a_exposed; + prelude use layer_a_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_b.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_b.rs new file mode 100644 index 0000000000..5ee8e574aa --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer/layer_b.rs @@ -0,0 +1,50 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } + + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } + + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } + + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } + +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct2 +{ +} + +// + +mod_interface! +{ + + protected use layer_b_protected; + orphan use { layer_b_orphan }; + exposed use { layer_b_exposed }; + prelude use layer_b_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer/mod.rs new file mode 100644 index 0000000000..6cf3f6db29 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer/mod.rs @@ -0,0 +1,26 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + /// layer_a + layer layer_a; + /// layer_b + layer layer_b; + +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_a.rs new file mode 100644 index 0000000000..8ba8f1e9e6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_a.rs @@ -0,0 +1,52 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } + + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } + + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } + + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } + +} + +// + +mod_interface! +{ + + // orphan use super::private:: + // { + // protected where layer_a_protected as layer_a_protected2, + // layer_a_orphan, + // exposed where layer_a_exposed, + // prelude where layer_a_prelude, + // }; + + protected use { layer_a_protected }; + orphan use layer_a_orphan; + exposed use layer_a_exposed; + prelude use layer_a_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_b.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_b.rs new file mode 100644 index 0000000000..5ee8e574aa --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/layer_b.rs @@ -0,0 +1,50 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } + + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } + + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } + + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } + +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct2 +{ +} + +// + +mod_interface! +{ + + protected use layer_b_protected; + orphan use { layer_b_orphan }; + exposed use { layer_b_exposed }; + prelude use layer_b_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/mod.rs new file mode 100644 index 0000000000..09c564f64b --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/mod.rs @@ -0,0 +1,32 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + /// layer_a + layer layer_a; + + #[ cfg( all() ) ] + /// layer_b + layer layer_b; + + #[ cfg( any() ) ] + /// layer_c + layer layer_c; + +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_cfg/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_a.rs new file mode 100644 index 0000000000..b5b8b613f1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_a.rs @@ -0,0 +1,44 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } + + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } + + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } + + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } + +} + +// + +mod_interface! +{ + + protected use { layer_a_protected }; + orphan use layer_a_orphan; + exposed use layer_a_exposed; + prelude use layer_a_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_b.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_b.rs new file mode 100644 index 0000000000..5ee8e574aa --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/layer_b.rs @@ -0,0 +1,50 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } + + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } + + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } + + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } + +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct2 +{ +} + +// + +mod_interface! +{ + + protected use layer_b_protected; + orphan use { layer_b_orphan }; + exposed use { layer_b_exposed }; + prelude use layer_b_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/mod.rs new file mode 100644 index 0000000000..c34df1c831 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/mod.rs @@ -0,0 +1,31 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +/// Private namespace of the module. +mod private +{ +} + +/// layer_a +mod layer_a; +/// layer_b +mod layer_b; + +mod_interface! +{ + + /// layer_a + use super::layer_a; + /// layer_b + use super::layer_b; + +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_a.rs new file mode 100644 index 0000000000..b5b8b613f1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_a.rs @@ -0,0 +1,44 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } + + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } + + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } + + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } + +} + +// + +mod_interface! +{ + + protected use { layer_a_protected }; + orphan use layer_a_orphan; + exposed use layer_a_exposed; + prelude use layer_a_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_b.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_b.rs new file mode 100644 index 0000000000..5ee8e574aa --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/layer_b.rs @@ -0,0 +1,50 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } + + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } + + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } + + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } + +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct2 +{ +} + +// + +mod_interface! +{ + + protected use layer_b_protected; + orphan use { layer_b_orphan }; + exposed use { layer_b_exposed }; + prelude use layer_b_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/mod.rs new file mode 100644 index 0000000000..4774b23347 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/mod.rs @@ -0,0 +1,47 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +/// Private namespace of the module. +mod private +{ +} + +/// layer_a +mod layer_a; +/// layer_b +mod layer_b; + +mod_interface! +{ + + // zzz : test with `layer { layer_a, layer_a };` + // zzz : test with `use { layer_a, layer_a };` + + // zzz : make it working + // use super:: + // { + // layer_a, + // layer_b, + // }; + + use super::layer_a; + use super::layer_b; + +} + +mod mod1 +{ + + // use super::{ layer_b }; + // pub use super::{ layer_b }::orphan::*; + +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_layer_separate_use_two/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod.rs new file mode 100644 index 0000000000..2188f4a6b3 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod.rs @@ -0,0 +1,30 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + /// mod_a + orphan mod mod_a; + #[ cfg( all() ) ] + /// mod_b + orphan mod mod_b; + #[ cfg( any() ) ] + /// mod_c + orphan mod mod_c; + +} + +// + +include!( "../../only_test/layer_have_mod_cfg_test_only.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_a.rs b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_a.rs new file mode 100644 index 0000000000..9c1f3eec0e --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_a.rs @@ -0,0 +1,5 @@ +/// fn_a +pub fn fn_a() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_b.rs b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_b.rs new file mode 100644 index 0000000000..2a20fd3e3d --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/mod_b.rs @@ -0,0 +1,5 @@ +/// fn_b +pub fn fn_b() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_have_mod_cfg/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/layer_a.rs new file mode 100644 index 0000000000..f1e9f256fb --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/layer_a.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/mod.rs new file mode 100644 index 0000000000..b92ba66dc6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/mod.rs @@ -0,0 +1,10 @@ + +use super::*; + +the_module::mod_interface! +{ + + /// layer_a + xyz layer layer_a; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.stderr b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.stderr new file mode 100644 index 0000000000..2d2aa78ea8 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_unknown_vis/trybuild.stderr @@ -0,0 +1,5 @@ +error: expected one of: `mod`, `use`, `layer` + --> tests/inc/derive/layer_unknown_vis/mod.rs + | + | xyz layer layer_a; + | ^^^ diff --git a/module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_a.rs new file mode 100644 index 0000000000..8ba8f1e9e6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_a.rs @@ -0,0 +1,52 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } + + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } + + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } + + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } + +} + +// + +mod_interface! +{ + + // orphan use super::private:: + // { + // protected where layer_a_protected as layer_a_protected2, + // layer_a_orphan, + // exposed where layer_a_exposed, + // prelude where layer_a_prelude, + // }; + + protected use { layer_a_protected }; + orphan use layer_a_orphan; + exposed use layer_a_exposed; + prelude use layer_a_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_b.rs b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_b.rs new file mode 100644 index 0000000000..5ee8e574aa --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/layer_b.rs @@ -0,0 +1,50 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } + + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } + + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } + + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } + +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct2 +{ +} + +// + +mod_interface! +{ + + protected use layer_b_protected; + orphan use { layer_b_orphan }; + exposed use { layer_b_exposed }; + prelude use layer_b_prelude; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_use_cfg/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/mod.rs new file mode 100644 index 0000000000..0c730db3a7 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/mod.rs @@ -0,0 +1,36 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +/// Private namespace of the module. +mod private +{ +} + +/// layer_a +mod layer_a; +/// layer_b +mod layer_b; + +mod_interface! +{ + + /// layer_a + use super::layer_a; + #[ cfg( all() ) ] + /// layer_b + use super::layer_b; + #[ cfg( any() ) ] + /// layer_c + use super::layer_c; + +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); + diff --git a/module/core/mod_interface/tests/inc/derive/layer_use_cfg/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_use_cfg/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_use_macro/layer_a.rs b/module/core/mod_interface/tests/inc/derive/layer_use_macro/layer_a.rs new file mode 100644 index 0000000000..12db22ecfc --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_use_macro/layer_a.rs @@ -0,0 +1,45 @@ + +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + #[ allow( unused_macros ) ] + #[ macro_export ] + /// macro1 + macro_rules! macro1 + { + () => {}; + } + + #[ allow( unused_macros ) ] + /// macro2 + macro_rules! macro2 + { + () => {}; + } + + #[ allow( unused_macros ) ] + /// macro3 + macro_rules! macro3 + { + () => {}; + } + + #[ allow( unused_imports ) ] + pub( crate ) use macro2; + #[ allow( unused_imports ) ] + use macro3; +} + +// + +mod_interface! +{ + + // exposed( crate ) use macro1; + exposed( crate ) use macro2; + // exposed( crate ) use macro3; + +} diff --git a/module/core/mod_interface/tests/inc/derive/layer_use_macro/mod.rs b/module/core/mod_interface/tests/inc/derive/layer_use_macro/mod.rs new file mode 100644 index 0000000000..1bb9569c90 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_use_macro/mod.rs @@ -0,0 +1,25 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + /// layer_a + layer layer_a; + +} + +// use macro1 as macro1b; +#[ allow( unused_imports ) ] +use macro2 as macro2b; +// use macro3 as macro3b; diff --git a/module/core/mod_interface/tests/inc/derive/layer_use_macro/trybuild.rs b/module/core/mod_interface/tests/inc/derive/layer_use_macro/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/layer_use_macro/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules/mod.rs b/module/core/mod_interface/tests/inc/derive/micro_modules/mod.rs new file mode 100644 index 0000000000..3e924ca630 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules/mod.rs @@ -0,0 +1,25 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + /// mod_protected + protected mod mod_protected; + /// mod_orphan + orphan mod mod_orphan; + /// mod_exposed + exposed mod mod_exposed; + /// mod_prelude + prelude mod mod_prelude; + +} + +// + +include!( "../../only_test/micro_modules_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules/mod_exposed.rs b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_exposed.rs new file mode 100644 index 0000000000..d4d30de2d1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_exposed.rs @@ -0,0 +1,5 @@ +/// has_exposed +pub fn has_exposed() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules/mod_orphan.rs b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_orphan.rs new file mode 100644 index 0000000000..213478e250 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_orphan.rs @@ -0,0 +1,5 @@ +/// has_orphan +pub fn has_orphan() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules/mod_prelude.rs b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_prelude.rs new file mode 100644 index 0000000000..84f94af4ed --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_prelude.rs @@ -0,0 +1,5 @@ +/// has_prelude +pub fn has_prelude() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules/mod_protected.rs b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_protected.rs new file mode 100644 index 0000000000..3bd5325a02 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules/mod_protected.rs @@ -0,0 +1,5 @@ +/// has_protected +pub fn has_protected() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules/trybuild.rs b/module/core/mod_interface/tests/inc/derive/micro_modules/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod.rs new file mode 100644 index 0000000000..a9c26b6f77 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod.rs @@ -0,0 +1,10 @@ + +use super::*; + +the_module::mod_interface! +{ + + /// mod_exposed + pub mod mod_exposed; + +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod_exposed.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod_exposed.rs new file mode 100644 index 0000000000..d4d30de2d1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/mod_exposed.rs @@ -0,0 +1,5 @@ +/// has_exposed +pub fn has_exposed() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.stderr b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.stderr new file mode 100644 index 0000000000..b84160eec0 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_bad_vis/trybuild.stderr @@ -0,0 +1,7 @@ +error: To include a non-standard module use either [ private, protected, orphan, exposed, prelude ] visibility: + #[doc = " mod_exposed"] pub mod mod_exposed; + --> tests/inc/derive/micro_modules_bad_vis/mod.rs + | + | / /// mod_exposed + | | pub mod mod_exposed; + | |______________________^ diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod.rs new file mode 100644 index 0000000000..3481dfdef2 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod.rs @@ -0,0 +1,33 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + /// mod_protected1 + protected mod mod_protected1; + /// mod_protected2 + protected mod mod_protected2; + /// mod_orphan1 + orphan mod mod_orphan1; + /// mod_orphan2 + orphan mod mod_orphan2; + /// mod_exposed1 + exposed mod mod_exposed1; + /// mod_exposed2 + exposed mod mod_exposed2; + /// mod_prelude1 + prelude mod mod_prelude1; + /// mod_prelude2 + prelude mod mod_prelude2; + +} + +// + +include!( "../../only_test/micro_modules_two_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed1.rs new file mode 100644 index 0000000000..30df3095b3 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed1.rs @@ -0,0 +1,5 @@ +/// has_exposed1 +pub fn has_exposed1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed2.rs new file mode 100644 index 0000000000..968e34c8c1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_exposed2.rs @@ -0,0 +1,5 @@ +/// has_exposed2 +pub fn has_exposed2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan1.rs new file mode 100644 index 0000000000..16ae065af5 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan1.rs @@ -0,0 +1,5 @@ +/// has_orphan1 +pub fn has_orphan1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan2.rs new file mode 100644 index 0000000000..db45312bca --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_orphan2.rs @@ -0,0 +1,5 @@ +/// has_orphan2 +pub fn has_orphan2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude1.rs new file mode 100644 index 0000000000..0d58ab5b3d --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude1.rs @@ -0,0 +1,5 @@ +/// has_prelude1 +pub fn has_prelude1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude2.rs new file mode 100644 index 0000000000..faf9bf1d95 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_prelude2.rs @@ -0,0 +1,5 @@ +/// has_prelude2 +pub fn has_prelude2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected1.rs new file mode 100644 index 0000000000..c95649476e --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected1.rs @@ -0,0 +1,5 @@ +/// has_protected1 +pub fn has_protected1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected2.rs new file mode 100644 index 0000000000..8466c075b3 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/mod_protected2.rs @@ -0,0 +1,5 @@ +/// has_protected2 +pub fn has_protected2() -> bool +{ + true +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two/trybuild.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod.rs new file mode 100644 index 0000000000..da5ed051d0 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod.rs @@ -0,0 +1,44 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +mod_interface! +{ + + protected mod + { + /// mod_protected1 + mod_protected1, + /// mod_protected2 + mod_protected2, + }; + orphan mod + { + /// mod_orphan1 + mod_orphan1, + /// mod_orphan2 + mod_orphan2, + }; + exposed mod + { + /// mod_exposed1 + mod_exposed1, + /// mod_exposed2 + mod_exposed2 + }; + /// Prelude + prelude mod + { + mod_prelude1, + mod_prelude2 + }; + +} + +// + +include!( "../../only_test/micro_modules_two_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed1.rs new file mode 100644 index 0000000000..30df3095b3 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed1.rs @@ -0,0 +1,5 @@ +/// has_exposed1 +pub fn has_exposed1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed2.rs new file mode 100644 index 0000000000..968e34c8c1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_exposed2.rs @@ -0,0 +1,5 @@ +/// has_exposed2 +pub fn has_exposed2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan1.rs new file mode 100644 index 0000000000..16ae065af5 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan1.rs @@ -0,0 +1,5 @@ +/// has_orphan1 +pub fn has_orphan1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan2.rs new file mode 100644 index 0000000000..db45312bca --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_orphan2.rs @@ -0,0 +1,5 @@ +/// has_orphan2 +pub fn has_orphan2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude1.rs new file mode 100644 index 0000000000..0d58ab5b3d --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude1.rs @@ -0,0 +1,5 @@ +/// has_prelude1 +pub fn has_prelude1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude2.rs new file mode 100644 index 0000000000..faf9bf1d95 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_prelude2.rs @@ -0,0 +1,5 @@ +/// has_prelude2 +pub fn has_prelude2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected1.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected1.rs new file mode 100644 index 0000000000..c95649476e --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected1.rs @@ -0,0 +1,5 @@ +/// has_protected1 +pub fn has_protected1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected2.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected2.rs new file mode 100644 index 0000000000..a163ea8af5 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/mod_protected2.rs @@ -0,0 +1,5 @@ +/// has_protected2 +pub fn has_protected2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/trybuild.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_two_joined/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod.rs new file mode 100644 index 0000000000..c8aa979788 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod.rs @@ -0,0 +1,10 @@ + +use super::*; + +the_module::mod_interface! +{ + + /// mod_exposed + not_vis mod mod_exposed; + +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod_exposed.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod_exposed.rs new file mode 100644 index 0000000000..d4d30de2d1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/mod_exposed.rs @@ -0,0 +1,5 @@ +/// has_exposed +pub fn has_exposed() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.rs b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.stderr b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.stderr new file mode 100644 index 0000000000..8df4ef8899 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/micro_modules_unknown_vis/trybuild.stderr @@ -0,0 +1,5 @@ +error: expected one of: `mod`, `use`, `layer` + --> tests/inc/derive/micro_modules_unknown_vis/mod.rs + | + | not_vis mod mod_exposed; + | ^^^^^^^ diff --git a/module/core/mod_interface/tests/inc/derive/use_as/derive.rs b/module/core/mod_interface/tests/inc/derive/use_as/derive.rs new file mode 100644 index 0000000000..4c452702b0 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_as/derive.rs @@ -0,0 +1,24 @@ + +use super::*; + +/// Layer X +pub mod layer_x; + +mod_interface! +{ + // #![ debug ] + + /// layer_a + use super::layer_x as layer_a; + + // /// layer_a + // pub use super::layer_x as layer_a; + // xxx : make that working + +} + +// include!( "./manual_only.rs" ); + +// + +include!( "../../only_test/layer_single_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/use_as/layer_x.rs b/module/core/mod_interface/tests/inc/derive/use_as/layer_x.rs new file mode 100644 index 0000000000..f1e9f256fb --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_as/layer_x.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/use_as/layer_y.rs b/module/core/mod_interface/tests/inc/derive/use_as/layer_y.rs new file mode 100644 index 0000000000..8051e73936 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_as/layer_y.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/use_as/manual.rs b/module/core/mod_interface/tests/inc/derive/use_as/manual.rs new file mode 100644 index 0000000000..43a397b08f --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_as/manual.rs @@ -0,0 +1,19 @@ + +use super::*; + +/// Layer X +pub mod layer_x; + +// the_module::mod_interface! +// { +// #![ debug ] +// +// /// layer_a +// use super::layer_x as layer_a; +// } + +include!( "./manual_only.rs" ); + +// + +include!( "../../only_test/layer_single_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/use_as/manual_only.rs b/module/core/mod_interface/tests/inc/derive/use_as/manual_only.rs new file mode 100644 index 0000000000..816287978c --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_as/manual_only.rs @@ -0,0 +1,53 @@ + +use layer_x as layer_a; + +#[doc(inline)] +#[allow(unused_imports)] +pub use protected :: * ; + +#[doc = r" Protected namespace of the module."] +pub mod protected +{ + + #[doc(inline)] + #[allow(unused_imports)] + pub use super :: orphan :: * ; + + #[doc(inline)] + #[allow(unused_imports)] + #[doc = " layer_a"] + pub use super :: layer_x :: orphan :: * ; + +} + +#[doc = r" Orphan namespace of the module."] +pub mod orphan +{ + + #[doc(inline)] + #[allow(unused_imports)] + pub use super :: exposed :: * ; + +} + +#[doc = r" Exposed namespace of the module."] +pub mod exposed +{ + #[doc(inline)] + #[allow(unused_imports)] + pub use super :: prelude :: * ; + + #[doc(inline)] + #[allow(unused_imports)] + #[doc = " layer_a"] + pub use super :: layer_x :: exposed :: * ; +} + +#[doc = r" Prelude to use essentials: `use my_module::prelude::*`."] +pub mod prelude +{ + #[doc(inline)] + #[allow(unused_imports)] + #[doc = " layer_a"] + pub use super :: layer_x :: prelude :: * ; +} diff --git a/module/core/mod_interface/tests/inc/derive/use_as/trybuild.rs b/module/core/mod_interface/tests/inc/derive/use_as/trybuild.rs new file mode 100644 index 0000000000..4a8a430244 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_as/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "derive.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/use_bad_vis/mod.rs b/module/core/mod_interface/tests/inc/derive/use_bad_vis/mod.rs new file mode 100644 index 0000000000..2356526d75 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_bad_vis/mod.rs @@ -0,0 +1,18 @@ + +use super::*; + +/// Private +mod private +{ + + pub fn f1(){} + +} + +the_module::mod_interface! +{ + + /// layer_a + pub use f1; + +} diff --git a/module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.rs b/module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.stderr b/module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.stderr new file mode 100644 index 0000000000..b63d146f04 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_bad_vis/trybuild.stderr @@ -0,0 +1,7 @@ +error: Use either [ private, protected, orphan, exposed, prelude ] visibility: + #[doc = " layer_a"] pub use; + --> tests/inc/derive/use_bad_vis/mod.rs + | + | / /// layer_a + | | pub use f1; + | |_____________^ diff --git a/module/core/mod_interface/tests/inc/derive/use_basic/layer_a.rs b/module/core/mod_interface/tests/inc/derive/use_basic/layer_a.rs new file mode 100644 index 0000000000..f1e9f256fb --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_basic/layer_a.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/use_basic/layer_b.rs b/module/core/mod_interface/tests/inc/derive/use_basic/layer_b.rs new file mode 100644 index 0000000000..8051e73936 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_basic/layer_b.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/derive/use_basic/mod.rs b/module/core/mod_interface/tests/inc/derive/use_basic/mod.rs new file mode 100644 index 0000000000..3cfbb3ad53 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_basic/mod.rs @@ -0,0 +1,20 @@ + +use super::*; + +mod layer_a; +mod layer_b; + +mod_interface! +{ + + /// layer_a + use super::layer_a; + + /// layer_b + use super::layer_b; + +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/use_basic/trybuild.rs b/module/core/mod_interface/tests/inc/derive/use_basic/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_basic/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/use_layer/layer_a.rs b/module/core/mod_interface/tests/inc/derive/use_layer/layer_a.rs new file mode 100644 index 0000000000..14ecb25b3e --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_layer/layer_a.rs @@ -0,0 +1,47 @@ + +#[ allow( unused_imports ) ] +use super::tools::*; + +/// Private namespace of the module. +mod private +{ + + /// PrivateStruct1. + #[ derive( Debug, PartialEq ) ] + pub struct PrivateStruct1 + { + } + +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct2 +{ +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct3 +{ +} + +/// Super struct. +#[ derive( Debug, PartialEq ) ] +pub struct SubStruct4 +{ +} + +// + +mod_interface! +{ + + orphan use ::std::vec::Vec; + orphan use super::private::PrivateStruct1; + orphan use super::super::SuperStruct1; + orphan use super::SubStruct2; + orphan use super::{ SubStruct3, SubStruct4 }; + orphan use crate::CrateStructForTesting1; + +} diff --git a/module/core/mod_interface/tests/inc/derive/use_layer/mod.rs b/module/core/mod_interface/tests/inc/derive/use_layer/mod.rs new file mode 100644 index 0000000000..17247d2d07 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_layer/mod.rs @@ -0,0 +1,32 @@ + +use super::*; +mod tools +{ + #[ allow( unused_imports ) ] + pub use super::super::*; +} + +// /// Private namespace of the module. +// mod private +// { +// } + +mod layer_a; + +/// SuperStruct1. +#[ derive( Debug, PartialEq ) ] +pub struct SuperStruct1 +{ +} + +mod_interface! +{ + + /// layer_a + use super::layer_a; + +} + +// + +include!( "../../only_test/use_non_layer_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/derive/use_layer/trybuild.rs b/module/core/mod_interface/tests/inc/derive/use_layer/trybuild.rs new file mode 100644 index 0000000000..f6fe332269 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_layer/trybuild.rs @@ -0,0 +1,24 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// A struct for testing purpose. +#[ derive( Debug, PartialEq ) ] +pub struct CrateStructForTesting1 +{ +} + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/use_unknown_vis/mod.rs b/module/core/mod_interface/tests/inc/derive/use_unknown_vis/mod.rs new file mode 100644 index 0000000000..087625f70f --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_unknown_vis/mod.rs @@ -0,0 +1,18 @@ + +use super::*; + +/// Private +mod private +{ + + pub fn f1(){} + +} + +the_module::mod_interface! +{ + + /// layer_a + xyz use f1; + +} diff --git a/module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.rs b/module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.rs new file mode 100644 index 0000000000..ebfde31db6 --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.rs @@ -0,0 +1,18 @@ +#![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! Trybuild tests. + +#[ allow( unused_imports ) ] +use mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// Test module. +#[ path = "mod.rs" ] +pub mod test; + +fn main() +{ +} diff --git a/module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.stderr b/module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.stderr new file mode 100644 index 0000000000..530570d39a --- /dev/null +++ b/module/core/mod_interface/tests/inc/derive/use_unknown_vis/trybuild.stderr @@ -0,0 +1,5 @@ +error: expected one of: `mod`, `use`, `layer` + --> tests/inc/derive/use_unknown_vis/mod.rs + | + | xyz use f1; + | ^^^ diff --git a/module/core/mod_interface/tests/inc/manual/layer/layer_a.rs b/module/core/mod_interface/tests/inc/manual/layer/layer_a.rs new file mode 100644 index 0000000000..f1e9f256fb --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/layer/layer_a.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/manual/layer/layer_b.rs b/module/core/mod_interface/tests/inc/manual/layer/layer_b.rs new file mode 100644 index 0000000000..8051e73936 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/layer/layer_b.rs @@ -0,0 +1,58 @@ + +/// Private namespace of the module. +mod private +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } +} diff --git a/module/core/mod_interface/tests/inc/manual/layer/mod.rs b/module/core/mod_interface/tests/inc/manual/layer/mod.rs new file mode 100644 index 0000000000..ea4b8b33bc --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/layer/mod.rs @@ -0,0 +1,67 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +/// layer_a +pub mod layer_a; +/// layer_b +pub mod layer_b; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_a::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_b::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_a::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_b::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_a::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_b::prelude::*; +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/manual/layer_use/layer_a.rs b/module/core/mod_interface/tests/inc/manual/layer_use/layer_a.rs new file mode 100644 index 0000000000..7e0b8bd94b --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/layer_use/layer_a.rs @@ -0,0 +1,75 @@ + +/// Private namespace of the module. +mod private +{ + + /// layer_a_protected + pub fn layer_a_protected() -> bool + { + true + } + + /// layer_a_orphan + pub fn layer_a_orphan() -> bool + { + true + } + + /// layer_a_exposed + pub fn layer_a_exposed() -> bool + { + true + } + + /// layer_a_prelude + pub fn layer_a_prelude() -> bool + { + true + } + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_a_protected; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_a_orphan; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_a_exposed; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_a_prelude; +} diff --git a/module/core/mod_interface/tests/inc/manual/layer_use/layer_b.rs b/module/core/mod_interface/tests/inc/manual/layer_use/layer_b.rs new file mode 100644 index 0000000000..9a68ea64fd --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/layer_use/layer_b.rs @@ -0,0 +1,75 @@ + +/// Private namespace of the module. +mod private +{ + + /// layer_b_protected + pub fn layer_b_protected() -> bool + { + true + } + + /// layer_b_orphan + pub fn layer_b_orphan() -> bool + { + true + } + + /// layer_b_exposed + pub fn layer_b_exposed() -> bool + { + true + } + + /// layer_b_prelude + pub fn layer_b_prelude() -> bool + { + true + } + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_b_protected; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_b_orphan; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_b_exposed; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::layer_b_prelude; +} diff --git a/module/core/mod_interface/tests/inc/manual/layer_use/mod.rs b/module/core/mod_interface/tests/inc/manual/layer_use/mod.rs new file mode 100644 index 0000000000..ea4b8b33bc --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/layer_use/mod.rs @@ -0,0 +1,67 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +/// layer_a +pub mod layer_a; +/// layer_b +pub mod layer_b; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_a::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_b::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_a::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_b::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_a::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::layer_b::prelude::*; +} + +// + +include!( "../../only_test/layer_simple_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules/mod.rs b/module/core/mod_interface/tests/inc/manual/micro_modules/mod.rs new file mode 100644 index 0000000000..f052ac97cc --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules/mod.rs @@ -0,0 +1,53 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +pub mod mod_protected; +pub mod mod_orphan; +pub mod mod_exposed; +pub mod mod_prelude; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + pub use super::mod_protected; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + pub use super::mod_orphan; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + pub use super::mod_exposed; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + pub use super::mod_prelude; +} + +// + +include!( "../../only_test/micro_modules_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules/mod_exposed.rs b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_exposed.rs new file mode 100644 index 0000000000..d4d30de2d1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_exposed.rs @@ -0,0 +1,5 @@ +/// has_exposed +pub fn has_exposed() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules/mod_orphan.rs b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_orphan.rs new file mode 100644 index 0000000000..213478e250 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_orphan.rs @@ -0,0 +1,5 @@ +/// has_orphan +pub fn has_orphan() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules/mod_prelude.rs b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_prelude.rs new file mode 100644 index 0000000000..84f94af4ed --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_prelude.rs @@ -0,0 +1,5 @@ +/// has_prelude +pub fn has_prelude() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules/mod_protected.rs b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_protected.rs new file mode 100644 index 0000000000..3bd5325a02 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules/mod_protected.rs @@ -0,0 +1,5 @@ +/// has_protected +pub fn has_protected() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod.rs new file mode 100644 index 0000000000..a48af7bc73 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod.rs @@ -0,0 +1,62 @@ + +use super::*; + +/// Private namespace of the module. +mod private +{ +} + +pub mod mod_protected1; +pub mod mod_orphan1; +pub mod mod_exposed1; +pub mod mod_prelude1; + +pub mod mod_protected2; +pub mod mod_orphan2; +pub mod mod_exposed2; +pub mod mod_prelude2; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + pub use super::mod_protected1; + pub use super::mod_protected2; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + pub use super::mod_orphan1; + pub use super::mod_orphan2; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + pub use super::mod_exposed1; + pub use super::mod_exposed2; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + pub use super::mod_prelude1; + pub use super::mod_prelude2; +} + +// + +include!( "../../only_test/micro_modules_two_only_test.rs" ); diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed1.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed1.rs new file mode 100644 index 0000000000..30df3095b3 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed1.rs @@ -0,0 +1,5 @@ +/// has_exposed1 +pub fn has_exposed1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed2.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed2.rs new file mode 100644 index 0000000000..968e34c8c1 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_exposed2.rs @@ -0,0 +1,5 @@ +/// has_exposed2 +pub fn has_exposed2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan1.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan1.rs new file mode 100644 index 0000000000..16ae065af5 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan1.rs @@ -0,0 +1,5 @@ +/// has_orphan1 +pub fn has_orphan1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan2.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan2.rs new file mode 100644 index 0000000000..db45312bca --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_orphan2.rs @@ -0,0 +1,5 @@ +/// has_orphan2 +pub fn has_orphan2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude1.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude1.rs new file mode 100644 index 0000000000..0d58ab5b3d --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude1.rs @@ -0,0 +1,5 @@ +/// has_prelude1 +pub fn has_prelude1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude2.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude2.rs new file mode 100644 index 0000000000..faf9bf1d95 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_prelude2.rs @@ -0,0 +1,5 @@ +/// has_prelude2 +pub fn has_prelude2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected1.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected1.rs new file mode 100644 index 0000000000..c95649476e --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected1.rs @@ -0,0 +1,5 @@ +/// has_protected1 +pub fn has_protected1() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected2.rs b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected2.rs new file mode 100644 index 0000000000..a163ea8af5 --- /dev/null +++ b/module/core/mod_interface/tests/inc/manual/micro_modules_two/mod_protected2.rs @@ -0,0 +1,5 @@ +/// has_protected2 +pub fn has_protected2() -> bool +{ + true +} \ No newline at end of file diff --git a/module/core/mod_interface/tests/inc/mod.rs b/module/core/mod_interface/tests/inc/mod.rs new file mode 100644 index 0000000000..5d8aaa7045 --- /dev/null +++ b/module/core/mod_interface/tests/inc/mod.rs @@ -0,0 +1,48 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod manual +{ + + use super::*; + + mod micro_modules; + mod micro_modules_two; + mod layer; + mod layer_use; + +} + +mod derive +{ + + use super::*; + + // micro module + mod micro_modules; + mod micro_modules_two; + mod micro_modules_two_joined; + + // layer + mod layer; + mod layer_have_layer; + mod layer_have_layer_separate_use; + mod layer_have_layer_separate_use_two; + mod layer_have_layer_cfg; + mod layer_have_mod_cfg; + mod layer_use_cfg; + mod layer_use_macro; + + mod use_layer; + mod use_basic; + #[ path = "./use_as/derive.rs" ] + mod use_as_derive; + #[ path = "./use_as/manual.rs" ] + mod use_as_manual; + + // attr + mod attr_debug; + +} + +mod trybuild_test; diff --git a/module/core/mod_interface/tests/inc/only_test/layer_have_mod_cfg_test_only.rs b/module/core/mod_interface/tests/inc/only_test/layer_have_mod_cfg_test_only.rs new file mode 100644 index 0000000000..f1bb10e5d3 --- /dev/null +++ b/module/core/mod_interface/tests/inc/only_test/layer_have_mod_cfg_test_only.rs @@ -0,0 +1,18 @@ +tests_impls! +{ + fn mod_cfg() + { + + a_true!( mod_a::fn_a() ); + a_true!( mod_b::fn_b() ); + // a_true!( mod_c::fn_c() ); + + } +} + +// + +tests_index! +{ + mod_cfg, +} diff --git a/module/core/mod_interface/tests/inc/only_test/layer_simple_only_test.rs b/module/core/mod_interface/tests/inc/only_test/layer_simple_only_test.rs new file mode 100644 index 0000000000..12b14ca545 --- /dev/null +++ b/module/core/mod_interface/tests/inc/only_test/layer_simple_only_test.rs @@ -0,0 +1,90 @@ +// use super::*; + +// + +tests_impls! +{ + fn basic() + { + + /* test.case( "root" ); */ + { + a_id!( layer_a::layer_a_protected(), true ); + a_id!( layer_b::layer_b_protected(), true ); + a_id!( layer_a::layer_a_orphan(), true ); + a_id!( layer_b::layer_b_orphan(), true ); + a_id!( layer_a::layer_a_exposed(), true ); + a_id!( layer_b::layer_b_exposed(), true ); + a_id!( layer_a::layer_a_prelude(), true ); + a_id!( layer_b::layer_b_prelude(), true ); + } + + /* test.case( "root" ); */ + { + // a_id!( layer_a_protected(), true ); + // a_id!( layer_b_protected(), true ); + a_id!( layer_a_orphan(), true ); + a_id!( layer_b_orphan(), true ); + a_id!( layer_a_exposed(), true ); + a_id!( layer_b_exposed(), true ); + a_id!( layer_a_prelude(), true ); + a_id!( layer_b_prelude(), true ); + } + + /* test.case( "protected" ); */ + { + // a_id!( protected::layer_a_protected(), true ); + // a_id!( protected::layer_b_protected(), true ); + a_id!( protected::layer_a_orphan(), true ); + a_id!( protected::layer_b_orphan(), true ); + a_id!( protected::layer_a_exposed(), true ); + a_id!( protected::layer_b_exposed(), true ); + a_id!( protected::layer_a_prelude(), true ); + a_id!( protected::layer_b_prelude(), true ); + } + + /* test.case( "orphan" ); */ + { + // a_id!( orphan::layer_a_protected(), true ); + // a_id!( orphan::layer_b_protected(), true ); + // a_id!( orphan::layer_a_orphan(), true ); + // a_id!( orphan::layer_b_orphan(), true ); + a_id!( orphan::layer_a_exposed(), true ); + a_id!( orphan::layer_b_exposed(), true ); + a_id!( orphan::layer_a_prelude(), true ); + a_id!( orphan::layer_b_prelude(), true ); + } + + /* test.case( "exposed" ); */ + { + // a_id!( exposed::layer_a_protected(), true ); + // a_id!( exposed::layer_b_protected(), true ); + // a_id!( exposed::layer_a_orphan(), true ); + // a_id!( exposed::layer_b_orphan(), true ); + a_id!( exposed::layer_a_exposed(), true ); + a_id!( exposed::layer_b_exposed(), true ); + a_id!( exposed::layer_a_prelude(), true ); + a_id!( exposed::layer_b_prelude(), true ); + } + + /* test.case( "prelude" ); */ + { + // a_id!( prelude::layer_a_protected(), true ); + // a_id!( prelude::layer_b_protected(), true ); + // a_id!( prelude::layer_a_orphan(), true ); + // a_id!( prelude::layer_b_orphan(), true ); + // a_id!( prelude::layer_a_exposed(), true ); + // a_id!( prelude::layer_b_exposed(), true ); + a_id!( prelude::layer_a_prelude(), true ); + a_id!( prelude::layer_b_prelude(), true ); + } + + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/mod_interface/tests/inc/only_test/layer_single_only_test.rs b/module/core/mod_interface/tests/inc/only_test/layer_single_only_test.rs new file mode 100644 index 0000000000..ea9a785df0 --- /dev/null +++ b/module/core/mod_interface/tests/inc/only_test/layer_single_only_test.rs @@ -0,0 +1,66 @@ +// use super::*; + +// + +tests_impls! +{ + fn basic() + { + + /* test.case( "root" ); */ + { + a_id!( layer_a::layer_a_protected(), true ); + a_id!( layer_a::layer_a_orphan(), true ); + a_id!( layer_a::layer_a_exposed(), true ); + a_id!( layer_a::layer_a_prelude(), true ); + } + + /* test.case( "root" ); */ + { + // a_id!( layer_a_protected(), true ); + a_id!( layer_a_orphan(), true ); + a_id!( layer_a_exposed(), true ); + a_id!( layer_a_prelude(), true ); + } + + /* test.case( "protected" ); */ + { + // a_id!( protected::layer_a_protected(), true ); + a_id!( protected::layer_a_orphan(), true ); + a_id!( protected::layer_a_exposed(), true ); + a_id!( protected::layer_a_prelude(), true ); + } + + /* test.case( "orphan" ); */ + { + // a_id!( orphan::layer_a_protected(), true ); + // a_id!( orphan::layer_a_orphan(), true ); + a_id!( orphan::layer_a_exposed(), true ); + a_id!( orphan::layer_a_prelude(), true ); + } + + /* test.case( "exposed" ); */ + { + // a_id!( exposed::layer_a_protected(), true ); + // a_id!( exposed::layer_a_orphan(), true ); + a_id!( exposed::layer_a_exposed(), true ); + a_id!( exposed::layer_a_prelude(), true ); + } + + /* test.case( "prelude" ); */ + { + // a_id!( prelude::layer_a_protected(), true ); + // a_id!( prelude::layer_a_orphan(), true ); + // a_id!( prelude::layer_a_exposed(), true ); + a_id!( prelude::layer_a_prelude(), true ); + } + + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/mod_interface/tests/inc/only_test/micro_modules_only_test.rs b/module/core/mod_interface/tests/inc/only_test/micro_modules_only_test.rs new file mode 100644 index 0000000000..db02c32da5 --- /dev/null +++ b/module/core/mod_interface/tests/inc/only_test/micro_modules_only_test.rs @@ -0,0 +1,58 @@ +// use super::*; + +// + +tests_impls! +{ + fn basic() + { + + { + // a_id!( protected::mod_private::has_private(), true ); + a_id!( mod_protected::has_protected(), true ); + a_id!( mod_orphan::has_orphan(), true ); + a_id!( mod_exposed::has_exposed(), true ); + a_id!( mod_prelude::has_prelude(), true ); + } + + { + // a_id!( protected::mod_private::has_private(), true ); + a_id!( protected::mod_protected::has_protected(), true ); + a_id!( protected::mod_orphan::has_orphan(), true ); + a_id!( protected::mod_exposed::has_exposed(), true ); + a_id!( protected::mod_prelude::has_prelude(), true ); + } + + { + // a_id!( orphan::mod_private::has_private(), true ); + // a_id!( orphan::mod_protected::has_protected(), true ); + a_id!( orphan::mod_orphan::has_orphan(), true ); + a_id!( orphan::mod_exposed::has_exposed(), true ); + a_id!( orphan::mod_prelude::has_prelude(), true ); + } + + { + // a_id!( exposed::mod_private::has_private(), true ); + // a_id!( exposed::mod_protected::has_protected(), true ); + // a_id!( exposed::mod_orphan::has_orphan(), true ); + a_id!( exposed::mod_exposed::has_exposed(), true ); + a_id!( exposed::mod_prelude::has_prelude(), true ); + } + + { + // a_id!( prelude::mod_private::has_private(), true ); + // a_id!( prelude::mod_protected::has_protected(), true ); + // a_id!( prelude::mod_orphan::has_orphan(), true ); + // a_id!( prelude::mod_exposed::has_exposed(), true ); + a_id!( prelude::mod_prelude::has_prelude(), true ); + } + + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/mod_interface/tests/inc/only_test/micro_modules_two_only_test.rs b/module/core/mod_interface/tests/inc/only_test/micro_modules_two_only_test.rs new file mode 100644 index 0000000000..a9825ec197 --- /dev/null +++ b/module/core/mod_interface/tests/inc/only_test/micro_modules_two_only_test.rs @@ -0,0 +1,83 @@ +// use super::*; + +// + +tests_impls! +{ + fn basic() + { + + { + // a_id!( mod_private1::has_private1(), true ); + // a_id!( mod_private2::has_private2(), true ); + a_id!( mod_protected1::has_protected1(), true ); + a_id!( mod_protected2::has_protected2(), true ); + a_id!( mod_orphan1::has_orphan1(), true ); + a_id!( mod_orphan2::has_orphan2(), true ); + a_id!( mod_exposed1::has_exposed1(), true ); + a_id!( mod_exposed2::has_exposed2(), true ); + a_id!( mod_prelude1::has_prelude1(), true ); + a_id!( mod_prelude2::has_prelude2(), true ); + } + + { + // a_id!( protected::mod_private1::has_private1(), true ); + // a_id!( protected::mod_private2::has_private2(), true ); + a_id!( protected::mod_protected1::has_protected1(), true ); + a_id!( protected::mod_protected2::has_protected2(), true ); + a_id!( protected::mod_orphan1::has_orphan1(), true ); + a_id!( protected::mod_orphan2::has_orphan2(), true ); + a_id!( protected::mod_exposed1::has_exposed1(), true ); + a_id!( protected::mod_exposed2::has_exposed2(), true ); + a_id!( protected::mod_prelude1::has_prelude1(), true ); + a_id!( protected::mod_prelude2::has_prelude2(), true ); + } + + { + // a_id!( orphan::mod_private1::has_private1(), true ); + // a_id!( orphan::mod_private2::has_private2(), true ); + // a_id!( orphan::mod_protected1::has_protected1(), true ); + // a_id!( orphan::mod_protected2::has_protected2(), true ); + a_id!( orphan::mod_orphan1::has_orphan1(), true ); + a_id!( orphan::mod_orphan2::has_orphan2(), true ); + a_id!( orphan::mod_exposed1::has_exposed1(), true ); + a_id!( orphan::mod_exposed2::has_exposed2(), true ); + a_id!( orphan::mod_prelude1::has_prelude1(), true ); + a_id!( orphan::mod_prelude2::has_prelude2(), true ); + } + + { + // a_id!( exposed::mod_private1::has_private1(), true ); + // a_id!( exposed::mod_private2::has_private2(), true ); + // a_id!( exposed::mod_protected1::has_protected1(), true ); + // a_id!( exposed::mod_protected2::has_protected2(), true ); + // a_id!( exposed::mod_orphan1::has_orphan1(), true ); + // a_id!( exposed::mod_orphan2::has_orphan2(), true ); + a_id!( exposed::mod_exposed1::has_exposed1(), true ); + a_id!( exposed::mod_exposed2::has_exposed2(), true ); + a_id!( exposed::mod_prelude1::has_prelude1(), true ); + a_id!( exposed::mod_prelude2::has_prelude2(), true ); + } + + { + // a_id!( prelude::mod_private1::has_private1(), true ); + // a_id!( prelude::mod_private2::has_private2(), true ); + // a_id!( prelude::mod_protected1::has_protected1(), true ); + // a_id!( prelude::mod_protected2::has_protected2(), true ); + // a_id!( prelude::mod_orphan1::has_orphan1(), true ); + // a_id!( prelude::mod_orphan2::has_orphan2(), true ); + // a_id!( prelude::mod_exposed1::has_exposed1(), true ); + // a_id!( prelude::mod_exposed2::has_exposed2(), true ); + a_id!( prelude::mod_prelude1::has_prelude1(), true ); + a_id!( prelude::mod_prelude2::has_prelude2(), true ); + } + + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/mod_interface/tests/inc/only_test/use_non_layer_only_test.rs b/module/core/mod_interface/tests/inc/only_test/use_non_layer_only_test.rs new file mode 100644 index 0000000000..e0851aa35f --- /dev/null +++ b/module/core/mod_interface/tests/inc/only_test/use_non_layer_only_test.rs @@ -0,0 +1,85 @@ +// use super::*; + +// + +tests_impls! +{ + fn divergent() + { + + // test.case( "CrateStructForTesting1" ); + { + a_id!( layer_a::CrateStructForTesting1{}, layer_a::CrateStructForTesting1{} ); + a_id!( layer_a::protected::CrateStructForTesting1{}, layer_a::protected::CrateStructForTesting1{} ); + } + + // test.case( "SuperStruct" ); + { + a_id!( layer_a::SuperStruct1{}, layer_a::SuperStruct1{} ); + a_id!( layer_a::protected::SuperStruct1{}, layer_a::protected::SuperStruct1{} ); + } + + // test.case( "Vec" ); + { + a_id!( layer_a::Vec::< i32 >::new(), layer_a::Vec::< i32 >::new() ); + a_id!( layer_a::protected::Vec::< i32 >::new(), layer_a::protected::Vec::< i32 >::new() ); + a_id!( layer_a::orphan::Vec::< i32 >::new(), layer_a::orphan::Vec::< i32 >::new() ); + // a_id!( layer_a::exposed::Vec::< i32 >::new(), layer_a::exposed::Vec::< i32 >::new() ); + a_id!( Vec::< i32 >::new(), Vec::< i32 >::new() ); + a_id!( protected::Vec::< i32 >::new(), protected::Vec::< i32 >::new() ); + // a_id!( orphan::Vec::< i32 >::new(), orphan::Vec::< i32 >::new() ); + } + + // test.case( "SubStruct2" ); + { + a_id!( layer_a::SubStruct2{}, layer_a::SubStruct2{} ); + a_id!( layer_a::protected::SubStruct2{}, layer_a::protected::SubStruct2{} ); + a_id!( layer_a::orphan::SubStruct2{}, layer_a::orphan::SubStruct2{} ); + // a_id!( layer_a::exposed::SubStruct2{}, layer_a::exposed::SubStruct2{} ); + a_id!( SubStruct2{}, SubStruct2{} ); + a_id!( protected::SubStruct2{}, protected::SubStruct2{} ); + // a_id!( orphan::SubStruct2{}, orphan::SubStruct2{} ); + } + + // test.case( "SubStruct2" ); + { + a_id!( layer_a::SubStruct3{}, layer_a::SubStruct3{} ); + a_id!( layer_a::protected::SubStruct3{}, layer_a::protected::SubStruct3{} ); + a_id!( layer_a::orphan::SubStruct3{}, layer_a::orphan::SubStruct3{} ); + // a_id!( layer_a::exposed::SubStruct3{}, layer_a::exposed::SubStruct3{} ); + a_id!( SubStruct3{}, SubStruct3{} ); + a_id!( protected::SubStruct3{}, protected::SubStruct3{} ); + // a_id!( orphan::SubStruct3{}, orphan::SubStruct3{} ); + } + + // test.case( "SubStruct2" ); + { + a_id!( layer_a::SubStruct4{}, layer_a::SubStruct4{} ); + a_id!( layer_a::protected::SubStruct4{}, layer_a::protected::SubStruct4{} ); + a_id!( layer_a::orphan::SubStruct4{}, layer_a::orphan::SubStruct4{} ); + // a_id!( layer_a::exposed::SubStruct4{}, layer_a::exposed::SubStruct4{} ); + a_id!( SubStruct4{}, SubStruct4{} ); + a_id!( protected::SubStruct4{}, protected::SubStruct4{} ); + // a_id!( orphan::SubStruct4{}, orphan::SubStruct4{} ); + } + + // test.case( "SubStruct2" ); + { + a_id!( layer_a::PrivateStruct1{}, layer_a::PrivateStruct1{} ); + a_id!( layer_a::protected::PrivateStruct1{}, layer_a::protected::PrivateStruct1{} ); + a_id!( layer_a::orphan::PrivateStruct1{}, layer_a::orphan::PrivateStruct1{} ); + // a_id!( layer_a::exposed::PrivateStruct1{}, layer_a::exposed::PrivateStruct1{} ); + a_id!( PrivateStruct1{}, PrivateStruct1{} ); + a_id!( protected::PrivateStruct1{}, protected::PrivateStruct1{} ); + // a_id!( orphan::PrivateStruct1{}, orphan::PrivateStruct1{} ); + } + + } +} + +// + +tests_index! +{ + divergent, +} diff --git a/module/core/mod_interface/tests/inc/trybuild_test.rs b/module/core/mod_interface/tests/inc/trybuild_test.rs new file mode 100644 index 0000000000..5acc2a4f29 --- /dev/null +++ b/module/core/mod_interface/tests/inc/trybuild_test.rs @@ -0,0 +1,97 @@ + +#[ allow( unused_imports ) ] +use super::*; +// use crate::only_for_terminal_module; + +// #[ cfg_attr( feature = "enabled", module_mod_interface ) ] + +// #[ cfg( module_mod_interface ) ] +// #[ cfg( module_is_terminal ) ] +#[ test_tools::nightly ] +#[ test ] +fn trybuild_tests() +{ + // qqq : fix test : if run its test with --target-dir flag it's fall (for example : cargo test --target-dir C:\foo\bar ) + // // use test_tools::dependency::trybuild; + // println!( "current_dir : {:?}", std::env::current_dir().unwrap() ); + // // let t = trybuild::TestCases::new(); + // let t = test_tools::compiletime::TestCases::new(); + // + // let current_exe_path = std::env::current_exe().expect( "No such file or directory" ); + // + // let exe_directory = dbg!(current_exe_path.parent().expect("No such file or directory")); + // fn find_workspace_root( start_path : &std::path::Path ) -> Option< &std::path::Path > + // { + // start_path + // .ancestors() + // .find( |path| path.join( "Cargo.toml" ).exists() ) + // } + // + // let workspace_root = find_workspace_root( exe_directory ).expect( "No such file or directory" ); + // let current_dir = workspace_root.join( "module/core/mod_interface" ); + // + // // micro module + // + // t.pass( current_dir.join( "tests/inc/derive/micro_modules/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/micro_modules_two/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/micro_modules_two_joined/trybuild.rs" ) ); + // + // // layer + // + // t.pass( current_dir.join( "tests/inc/derive/layer/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/layer_have_layer/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/layer_have_layer_separate_use/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/layer_have_layer_separate_use_two/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/layer_have_layer_cfg/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/layer_use_cfg/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/layer_have_mod_cfg/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/layer_use_macro/trybuild.rs" ) ); + // + // // use + // + // t.pass( current_dir.join( "tests/inc/derive/use_basic/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/use_layer/trybuild.rs" ) ); + // t.pass( current_dir.join( "tests/inc/derive/use_as/trybuild.rs" ) ); + // + // // attr + // + // t.pass( current_dir.join( "tests/inc/derive/attr_debug/trybuild.rs" ) ); + + // +} + +use crate::only_for_terminal_module; + +only_for_terminal_module! +{ + #[ test_tools::nightly ] + #[ test ] + fn cta_trybuild_tests() + { + // qqq : fix test : if run its test with --target-dir flag it's fall (for example : cargo test --target-dir C:\foo\bar ) + // use test_tools::dependency::trybuild; + // println!( "current_dir : {:?}", std::env::current_dir().unwrap() ); + // // let t = trybuild::TestCases::new(); + // let t = test_tools::compiletime::TestCases::new(); + // + // let current_exe_path = std::env::current_exe().expect( "No such file or directory" ); + // + // let exe_directory = current_exe_path.parent().expect( "No such file or directory" ); + // fn find_workspace_root( start_path : &std::path::Path ) -> Option< &std::path::Path > + // { + // start_path + // .ancestors() + // .find( |path| path.join( "Cargo.toml" ).exists() ) + // } + // + // let workspace_root = find_workspace_root( exe_directory ).expect( "No such file or directory" ); + // let current_dir = workspace_root.join( "module/core/mod_interface" ); + // + // t.compile_fail( current_dir.join( "tests/inc/derive/micro_modules_bad_vis/trybuild.rs" ) ); + // t.compile_fail( current_dir.join( "tests/inc/derive/micro_modules_unknown_vis/trybuild.rs" ) ); + // t.compile_fail( current_dir.join( "tests/inc/derive/layer_bad_vis/trybuild.rs" ) ); + // t.compile_fail( current_dir.join( "tests/inc/derive/layer_unknown_vis/trybuild.rs" ) ); + // t.compile_fail( current_dir.join( "tests/inc/derive/use_bad_vis/trybuild.rs" ) ); + // t.compile_fail( current_dir.join( "tests/inc/derive/use_unknown_vis/trybuild.rs" ) ); + } +} diff --git a/module/core/mod_interface/tests/smoke_test.rs b/module/core/mod_interface/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/mod_interface/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/mod_interface/tests/tests.rs b/module/core/mod_interface/tests/tests.rs new file mode 100644 index 0000000000..33120affda --- /dev/null +++ b/module/core/mod_interface/tests/tests.rs @@ -0,0 +1,15 @@ + +/// A struct for testing purpose. +#[ derive( Debug, PartialEq ) ] +pub struct CrateStructForTesting1 +{ +} + +#[ allow( unused_imports ) ] +use ::mod_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ path="../../../../module/step/meta/src/module/terminal.rs" ] +mod terminal; + +mod inc; diff --git a/module/core/mod_interface_meta/Cargo.toml b/module/core/mod_interface_meta/Cargo.toml new file mode 100644 index 0000000000..8364db34d6 --- /dev/null +++ b/module/core/mod_interface_meta/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "mod_interface_meta" +version = "0.21.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/mod_interface_meta" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/mod_interface_meta" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/mod_interface_meta" +description = """ +Protocol of modularity unifying interface of a module and introducing layers. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/meta/mod_interface_meta_lib.rs", + "/rust/impl/meta/mod_interface/meta", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [] + +[lib] +proc-macro = true + +[dependencies] +macro_tools = { workspace = true } +derive_tools = { workspace = true, features = [ "enabled", "derive_is_variant" ] } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/mod_interface_meta/License b/module/core/mod_interface_meta/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/mod_interface_meta/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/mod_interface_meta/Readme.md b/module/core/mod_interface_meta/Readme.md new file mode 100644 index 0000000000..d9b2a9bd8b --- /dev/null +++ b/module/core/mod_interface_meta/Readme.md @@ -0,0 +1,11 @@ + + +# Module :: mod_interface_meta + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml) [![docs.rs](https://img.shields.io/docsrs/mod_interface_meta?color=e3e8f0&logo=docs.rs)](https://docs.rs/mod_interface_meta) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Protocol of modularity unifying interface of a module and introducing layers. + +Not intended to be used without runtime. This module and runtime is aggregate in module::mod_interface is [here](https://github.com/Wandalen/wTools/tree/master/module/core/mod_interface). +module and runtime is aggregate in module::mod_interface is [here](https://github.com/Wandalen/wTools/tree/master/module/core/mod_interface). diff --git a/module/core/mod_interface_meta/src/impls.rs b/module/core/mod_interface_meta/src/impls.rs new file mode 100644 index 0000000000..0f4608e420 --- /dev/null +++ b/module/core/mod_interface_meta/src/impls.rs @@ -0,0 +1,513 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use macro_tools::exposed::*; + use std::collections::HashMap; + +// = use + + // x + // use private::Type1; + // use private::{ Type1, Type2 }; + // protected use private::Type1; + // prelude use private::Type1; + +// = ? + + // x + // protected protected1; + // orphan orphan1; + // exposed exposed1; + // prelude prelude1; + // prelude { prelude1, prelude2 }; + +// = macro module + + // x + // macromod mod1; + // macromod mod2; + // macromod { mod1, mod2 }; + + // - narrowing + + // x + // orphan macromod mod_orphan1; + // : protected -> protected + // : orphan -> orphan + // : exposed -> orphan + // : prelude -> orphan + + // - extending + + // x + // prelude exposed macromod mod_protected1; + // : protected -> exposed + // : orphan -> exposed + // : exposed -> exposed + // : prelude -> prelude + + // x + // prelude protected macromod mod_exposed1; + // : protected -> protected + // : orphan -> orphan + // : exposed -> exposed + // : prelude -> prelude + + // - selective + + // x + // exposed exposed macromod mod_exposed1; + // : protected -> exposed + // : orphan -> exposed + // : exposed -> exposed + // : prelude -> exposed + + // x + // exposed orphan macromod mod_exposed1; + // : protected -> orphan + // : orphan -> orphan + // : exposed -> exposed + // : prelude -> exposed + +// = micro module + + // x + // mod mod1; + // mod mod2; + // mod { mod1, mod2 }; + + // + + // protected mod mod_protected1; + // orphan mod mod_orphan1; + // exposed mod mod_exposed1; + // prelude mod mod_prelude1; + + // + + // protected mod { mod_protected1, mod_protected2 }; + // orphan mod { mod_orphan1, mod_orphan2 }; + // exposed mod { mod_exposed1, mod_exposed2 }; + // prelude mod { mod_prelude1, mod_prelude2 }; + + // zzz : clause should not expect the first argument + + /// Context for handlign a record. Cotnains clauses map and debug attribute. + #[ allow( dead_code ) ] + pub struct RecordContext< 'clauses_map > + { + pub has_debug : bool, + pub clauses_map : &'clauses_map mut HashMap< ClauseKind , Vec< proc_macro2::TokenStream > >, + } + + /// + /// Handle record "use" with implicit visibility. + /// + #[ allow ( dead_code ) ] + fn record_use_implicit + ( + record : &Record, + c : &'_ mut RecordContext< '_ >, + // clauses_map : &mut HashMap< u32, Vec< proc_macro2::TokenStream > >, + ) + -> + Result< () > + { + + let attrs1 = &record.attrs; + let path = record.use_elements.as_ref().unwrap(); + // let vis = record.vis.clone(); + + // if vis == Visibility::Inherited + + // xxx + + // let _path; + // let path2 = if path.prefix_is_needed() + // { + // _path = parse_qt!{ super::private::#path }; + // &_path + // } + // else + // { + // path + // }; + + let adjsuted_path = path.adjsuted_implicit_path()?; + + // println!( "adjsuted_path : {}", qt!{ #adjsuted_path } ); + + if let Some( rename ) = &path.rename + { + let pure_path = path.pure_without_super_path()?; + c.clauses_map.get_mut( &ClauseImmediates::Kind() ).unwrap().push( qt! + { + pub use #pure_path as #rename; + }); + } + + c.clauses_map.get_mut( &VisProtected::Kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + pub use #adjsuted_path::orphan::*; + }); + + c.clauses_map.get_mut( &VisExposed::Kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + pub use #adjsuted_path::exposed::*; + }); + + c.clauses_map.get_mut( &VisPrelude::Kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + pub use #adjsuted_path::prelude::*; + }); + + Ok( () ) + } + + /// + /// Handle record "use" with explicit visibility. + /// + #[ allow ( dead_code ) ] + fn record_use_explicit + ( + record : &Record, + c : &'_ mut RecordContext< '_ >, + // clauses_map : &mut HashMap< u32, Vec< proc_macro2::TokenStream > >, + ) + -> + Result< () > + { + let attrs1 = &record.attrs; + let path = record.use_elements.as_ref().unwrap(); + let vis = record.vis.clone(); + + if !vis.valid_sub_namespace() + { + return Err( syn_err! + ( + record, + "Use either {} visibility:\n {}", + VALID_VISIBILITY_LIST_STR, + qt!{ #record }, + )); + } + + let adjsuted_path = path.adjsuted_explicit_path(); + + let vis2 = if vis.restriction().is_some() + { + qt!{ pub( crate ) } + } + else + { + qt!{ pub } + }; + + c.clauses_map.get_mut( &vis.kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + #vis2 use #adjsuted_path; + }); + + Ok( () ) + } + + /// + /// Handle record micro module. + /// + + fn record_micro_module + ( + record : &Record, + element : &Pair< AttributesOuter, syn::Path >, + c : &'_ mut RecordContext< '_ >, + ) + -> + Result< () > + { + let attrs1 = &record.attrs; + let attrs2 = &element.0; + let path = &element.1; + + c.clauses_map.get_mut( &ClauseImmediates::Kind() ).unwrap().push( qt! + { + #attrs1 + #attrs2 + pub mod #path; + }); + + if !record.vis.valid_sub_namespace() + { + return Err( syn_err! + ( + record, + "To include a non-standard module use either {} visibility:\n {}", + VALID_VISIBILITY_LIST_STR, + qt!{ #record }, + )); + } + + c.clauses_map.get_mut( &record.vis.kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + #attrs2 + pub use super::#path; + }); + + Ok( () ) + } + + /// + /// Handle record micro module. + /// + #[ allow ( dead_code ) ] + fn record_layer + ( + record : &Record, + element : &Pair< AttributesOuter, syn::Path >, + c : &'_ mut RecordContext< '_ >, + ) + -> + Result< () > + { + let attrs1 = &record.attrs; + let attrs2 = &element.0; + let path = &element.1; + + if record.vis != Visibility::Inherited + { + return Err( syn_err! + ( + record, + "Layer should not have explicitly defined visibility because all its subnamespaces are used.\n {}", + qt!{ #record }, + )); + } + + c.clauses_map.get_mut( &ClauseImmediates::Kind() ).unwrap().push( qt! + { + #attrs1 + #attrs2 + pub mod #path; + }); + + c.clauses_map.get_mut( &VisProtected::Kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + #attrs2 + pub use super::#path::orphan::*; + }); + + c.clauses_map.get_mut( &VisExposed::Kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + #attrs2 + pub use super::#path::exposed::*; + }); + + c.clauses_map.get_mut( &VisPrelude::Kind() ).unwrap().push( qt! + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #attrs1 + #attrs2 + pub use super::#path::prelude::*; + }); + + Ok( () ) + } + + /// + /// Protocol of modularity unifying interface of a module and introducing layers. + /// + #[ allow ( dead_code ) ] + pub fn mod_interface( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > + { + use ElementType::*; + + let original_input = input.clone(); + let document = syn::parse::< Thesis >( input )?; + document.inner_attributes_validate()?; + let has_debug = document.has_debug(); + + // use inspect_type::*; + // inspect_type_of!( immediates ); + + let mut clauses_map : HashMap< _ , Vec< proc_macro2::TokenStream > > = HashMap::new(); + clauses_map.insert( ClauseImmediates::Kind(), Vec::new() ); + //clauses_map.insert( VisPrivate::Kind(), Vec::new() ); + clauses_map.insert( VisProtected::Kind(), Vec::new() ); + clauses_map.insert( VisOrphan::Kind(), Vec::new() ); + clauses_map.insert( VisExposed::Kind(), Vec::new() ); + clauses_map.insert( VisPrelude::Kind(), Vec::new() ); + + // zzz : test case with several attrs + + let mut record_context = RecordContext::< '_ > + { + has_debug, + clauses_map : &mut clauses_map, + }; + + document.records.0.iter().try_for_each( | record | + { + + match record.element_type + { + Use( _ ) => + { + let vis = &record.vis; + if vis == &Visibility::Inherited + { + record_use_implicit( record, &mut record_context )?; + } + else + { + record_use_explicit( record, &mut record_context )?; + } + }, + _ => + { + record.elements.iter().try_for_each( | element | -> Result::< () > + { + match record.element_type + { + MicroModule( _ ) => + { + record_micro_module( record, element, &mut record_context )?; + }, + Layer( _ ) => + { + record_layer( record, element, &mut record_context )?; + }, + Use( _ ) => + { + }, + } + Result::Ok( () ) + })?; + } + }; + + Result::Ok( () ) + })?; + + let immediates_clause = clauses_map.get( &ClauseImmediates::Kind() ).unwrap(); + let protected_clause = clauses_map.get( &VisProtected::Kind() ).unwrap(); + let orphan_clause = clauses_map.get( &VisOrphan::Kind() ).unwrap(); + let exposed_clause = clauses_map.get( &VisExposed::Kind() ).unwrap(); + let prelude_clause = clauses_map.get( &VisPrelude::Kind() ).unwrap(); + + let result = qt! + { + + #( #immediates_clause )* + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use protected::*; + + /// Protected namespace of the module. + pub mod protected + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #( #protected_clause )* + } + + /// Orphan namespace of the module. + pub mod orphan + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #( #orphan_clause )* + } + + /// Exposed namespace of the module. + pub mod exposed + { + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #( #exposed_clause )* + } + + /// Prelude to use essentials: `use my_module::prelude::*`. + pub mod prelude + { + #( #prelude_clause )* + } + + }; + + if has_debug + { + let about = format!( "derive : mod_interface" ); + diag::report_print( about, &original_input, &result ); + } + + // if has_debug + // { + // diag::report_print( "derive : mod_interface", original_input, &result ); + // } + + Ok( result ) + } + +} + +/// Protected namespace of the module. +pub mod protected +{ + pub use super::orphan::*; +} + +pub use protected::*; + +/// Parented namespace of the module. +pub mod orphan +{ + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::prelude::*; + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ allow( unused_imports ) ] + pub use super::private:: + { + mod_interface, + }; +} + +// xxx : clean up, ad solve problems +// - example based on simpified version of test::layer_have_layer with single sublayer +// - example with attribute `#![ debug ]` diff --git a/module/core/mod_interface_meta/src/lib.rs b/module/core/mod_interface_meta/src/lib.rs new file mode 100644 index 0000000000..eefcd860de --- /dev/null +++ b/module/core/mod_interface_meta/src/lib.rs @@ -0,0 +1,92 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/mod_interface_meta/latest/mod_interface_meta/" ) ] +#![ deny( dead_code ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// xxx : write good description and the main use-case + +// xxx : does not work. make it working +// use super::test::{ compiletime, helper, smoke_test }; + +// // xxx : eliminate need to do such things, putting itself to proper category +// exposed use super::test::compiletime; +// exposed use super::test::helper; +// exposed use super::test::smoke_test; + +// crate::mod_interface! +// { +// // xxx : make it working +// // exposed use super; +// exposed use super::super::compiletime; +// protected use +// { +// * +// }; +// } + +// xxx : make use proper_path_tools::protected::path working + +// xxx : put modular files into a namespace `file` maybe +// #[ cfg( feature = "enabled" ) ] +// #[ path = "." ] +// mod file +// { +// use super::*; +// pub mod tokens; +// pub mod typ; +// pub mod item_struct; +// } + +mod impls; +#[ allow( unused_imports ) ] +use impls::exposed::*; +mod record; +use record::exposed::*; +mod visibility; +use visibility::exposed::*; +mod use_tree; +use use_tree::exposed::*; + +/// +/// Protocol of modularity unifying interface of a module and introducing layers. +/// + +#[ cfg( feature = "enabled" ) ] +#[ proc_macro ] +pub fn mod_interface( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = impls::mod_interface( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} + +/* + +mod_interface! +{ + + pub mod file1; + pub mod file2; + + private mod micro_private; + protected mod micro_protected; + orphan mod micro_orphan; + exposed mod micro_exposed; + prelude mod micro_prelude; + + use prelude_file::*; + +} + + private < protected < orphan < exposed < prelude + itself itself its parent its inter-module its inter-module + private public public public public + +micro-module < meso-module < macro-module < inter-module + +*/ + diff --git a/module/core/mod_interface_meta/src/record.rs b/module/core/mod_interface_meta/src/record.rs new file mode 100644 index 0000000000..b078dcf6c6 --- /dev/null +++ b/module/core/mod_interface_meta/src/record.rs @@ -0,0 +1,297 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use derive_tools::IsVariant; + use macro_tools::exposed::*; + + /// + /// Custom keywords. + /// + + pub mod kw + { + super::syn::custom_keyword!( layer ); + } + + /// + /// Kind of element. + /// + + #[ derive( IsVariant, Debug, PartialEq, Eq, Clone, Copy ) ] + pub enum ElementType + { + MicroModule( syn::token::Mod ), + Layer( kw::layer ), + Use( syn::token::Use ), + } + + // + + impl syn::parse::Parse for ElementType + { + + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + let lookahead = input.lookahead1(); + let element_type = match() + { + _case if lookahead.peek( syn::token::Mod ) => + { + ElementType::MicroModule( input.parse()? ) + }, + _case if lookahead.peek( syn::token::Use ) => + { + ElementType::Use( input.parse()? ) + }, + _case if lookahead.peek( kw::layer ) => + { + ElementType::Layer( input.parse()? ) + }, + _default => + { + return Err( lookahead.error() ) + }, + }; + Ok( element_type ) + } + + } + + // + + impl quote::ToTokens for ElementType + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + use ElementType::*; + match self + { + MicroModule( e ) => e.to_tokens( tokens ), + Use( e ) => e.to_tokens( tokens ), + Layer( e ) => e.to_tokens( tokens ), + } + } + } + + /// + /// Record. + /// + + #[ derive( Debug, PartialEq, Eq, Clone ) ] + pub struct Record + { + pub attrs : AttributesOuter, + pub vis : Visibility, + pub element_type : ElementType, + pub elements : syn::punctuated::Punctuated< Pair< AttributesOuter, syn::Path >, syn::token::Comma >, + pub use_elements : Option< crate::UseTree >, + pub semi : Option< syn::token::Semi >, + } + + // + + impl syn::parse::Parse for Record + { + + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + + let attrs = input.parse()?; + let vis = input.parse()?; + let element_type = input.parse()?; + let mut elements; + let mut use_elements = None; + + match element_type + { + ElementType::Use( _ ) => + { + use_elements = Some( input.parse()? ); + elements = syn::punctuated::Punctuated::new(); + }, + _ => + { + if input.peek( syn::token::Brace ) + { + let input2; + let _brace_token = syn::braced!( input2 in input ); + elements = syn::punctuated::Punctuated::parse_terminated( &input2 )?; + } + else + { + let ident = input.parse()?; + elements = syn::punctuated::Punctuated::new(); + elements.push( Pair::new( Default::default(), ident ) ); + } + }, + } + + let lookahead = input.lookahead1(); + if !lookahead.peek( Token![ ; ] ) + { + return Err( lookahead.error() ); + } + + let semi = Some( input.parse()? ); + Ok( Record + { + attrs, + vis, + element_type, + elements, + use_elements, + semi, + }) + + } + + } + + // + + impl quote::ToTokens for Record + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.attrs.to_tokens( tokens ); + self.vis.to_tokens( tokens ); + self.element_type.to_tokens( tokens ); + self.elements.to_tokens( tokens ); + self.semi.to_tokens( tokens ); + } + } + + /// + /// Many records. + /// + + pub type Records = Many< Record >; + + impl AsMuchAsPossibleNoDelimiter for Record {} + + /// + /// Thesis. + /// + + #[ derive( Debug, PartialEq, Eq, Clone ) ] + pub struct Thesis + { + pub head : AttributesInner, + pub records : Records, + } + + // + + impl Thesis + { + /// Validate each inner attribute of the thesis. + #[ allow ( dead_code ) ] + pub fn inner_attributes_validate( &self ) -> Result< () > + { + self.head.iter().try_for_each( | attr | + { + // code_print!( attr ); + // code_print!( attr.path() ); + // code_print!( attr.meta ); + + let good = true + && code_to_str!( attr.path() ) == "debug" + // && code_to_str!( attr.meta ).is_empty() + ; + + if !good + { + return Err( syn_err! + ( + attr, + "Unknown inner attribute:\n{}", + tree_diagnostics_str!( attr ), + )); + } + + Result::Ok( () ) + })?; + Ok( () ) + } + /// Does the thesis has debug inner attribute. + #[ allow ( dead_code ) ] + pub fn has_debug( &self ) -> bool + { + self.head.iter().any( | attr | + { + code_to_str!( attr.path() ) == "debug" + }) + } + } + + // + + impl syn::parse::Parse for Thesis + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + let head = input.parse()?; + // let head = Default::default(); + let records = input.parse()?; + Ok( Thesis + { + head, + records, + }) + } + } + + // + + impl quote::ToTokens for Thesis + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.head.to_tokens( tokens ); + self.records.to_tokens( tokens ); + } + } + +} + +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ allow( unused_imports ) ] + pub use super::private:: + { + ElementType, + Record, + Records, + Thesis, + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} diff --git a/module/core/mod_interface_meta/src/use_tree.rs b/module/core/mod_interface_meta/src/use_tree.rs new file mode 100644 index 0000000000..a7c1397e96 --- /dev/null +++ b/module/core/mod_interface_meta/src/use_tree.rs @@ -0,0 +1,243 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use macro_tools::prelude::*; + use macro_tools::Result; + // use macro_tools::err; + + #[ derive( Debug, PartialEq, Eq, Clone ) ] + pub struct UseTree + { + pub leading_colon : Option< syn::token::PathSep >, + pub tree : syn::UseTree, + pub rename : Option< syn::Ident >, + pub glob : bool, + pub group : bool, + } + + // pub struct SimplePath + // { + // } + + impl UseTree + { + + /// Is adding prefix to the tree path required? + /// Add `super::private::` to path unless it starts from `::` or `super` or `crate`. + pub fn prefix_is_needed( &self ) -> bool + { + use syn::UseTree::*; + + // println!( "prefix_is_needed : {:?}", self ); + // println!( "prefix_is_needed : self.leading_colon : {:?}", self.leading_colon ); + + if self.leading_colon.is_some() + { + return false; + } + match &self.tree + { + Path( e ) => e.ident != "super" && e.ident != "crate", + Rename( e ) => e.ident != "super" && e.ident != "crate", + _ => true, + } + } + + /// Get pure path, cutting off `as module2` from `use module1 as module2`. + pub fn pure_path( &self ) -> Result< syn::punctuated::Punctuated< syn::Ident, Token![::] > > + { + use syn::UseTree::*; + + // let leading_colon = None; + let mut path = syn::punctuated::Punctuated::< syn::Ident, Token![::] >::new(); + let use_tree = &mut &self.tree; + + loop + { + match &use_tree + { + Name( e ) => + { + path.push( e.ident.clone() ); + break; + }, + Path( e ) => + { + path.push( e.ident.clone() ); + *use_tree = e.tree.as_ref(); + }, + Rename( e ) => + { + path.push( e.ident.clone() ); + break; + }, + Glob( _e ) => + { + // return Err( syn_err!( "Complex glob uses like `use module1::*` are not supported." ) ); + break; + }, + Group( _e ) => + { + return Err( syn_err!( "Complex group uses like `use module1::{ module2, module3 }` are not supported." ) ); + }, + }; + } + + Ok( path ) + } + + /// Pure path without super. + /// Get pure path, cutting off `as module2` from `use module1 as module2`. + /// Strip first `super::` in `super::some::module` + pub fn pure_without_super_path( &self ) -> Result< syn::punctuated::Punctuated< syn::Ident, Token![::] > > + { + let path = self.pure_path()?; + if path.len() < 1 + { + return Ok( path ); + } + if path[ 0 ].to_string() == "super" + { + // let mut path2 = syn::punctuated::Punctuated::< syn::Ident, Token![::] >::new(); + let path2 : syn::punctuated::Punctuated< syn::Ident, Token![::] > = path.into_iter().skip(1).collect(); + return Ok( path2 ); + } + Ok( path ) + } + + /// Adjusted path. + /// Add `super::private::` to path unless it starts from `::` or `super` or `crate`. + pub fn adjsuted_implicit_path( &self ) -> Result< syn::punctuated::Punctuated< syn::Ident, Token![::] > > + { + // use syn::UseTree::*; + let pure_path = self.pure_path()?; + if self.prefix_is_needed() + { + Ok( parse_qt!{ super::private::#pure_path } ) + } + else + { + Ok( pure_path ) + } + } + + /// Adjusted path. + /// Add `super::private::` to path unless it starts from `::` or `super` or `crate`. + // pub fn adjsuted_explicit_path( &self ) -> syn::UseTree + pub fn adjsuted_explicit_path( &self ) -> Self + { + // use syn::UseTree::*; + if self.prefix_is_needed() + { + let mut clone = self.clone(); + let tree = parse_qt!{ super::private::#self }; + clone.tree = tree; + clone + } + else + { + self.clone() + } + } + + } + + impl syn::parse::Parse for UseTree + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + use syn::UseTree::*; + let leading_colon = input.parse()?; + let tree = input.parse()?; + + let mut glob = false; + let mut group = false; + let mut rename = None; + let use_tree = &mut &tree; + loop + { + match &use_tree + { + Name( _e ) => + { + break; + }, + Path( e ) => + { + *use_tree = e.tree.as_ref(); + }, + Rename( e ) => + { + rename = Some( e.rename.clone() ); + break; + }, + Glob( _e ) => + { + glob = true; + break; + }, + Group( _e ) => + { + group = true; + break; + }, + }; + } + + Ok( Self + { + leading_colon, + tree, + rename, + glob, + group, + }) + } + } + + impl quote::ToTokens for UseTree + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.leading_colon.to_tokens( tokens ); + self.tree.to_tokens( tokens ); + } + } + +} + +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ allow( unused_imports ) ] + pub use super::private:: + { + UseTree, + }; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/mod_interface_meta/src/visibility.rs b/module/core/mod_interface_meta/src/visibility.rs new file mode 100644 index 0000000000..10d8a68c48 --- /dev/null +++ b/module/core/mod_interface_meta/src/visibility.rs @@ -0,0 +1,561 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use macro_tools::prelude::*; + use macro_tools::Result; + use core::hash::{ Hash, Hasher }; + + pub const VALID_VISIBILITY_LIST_STR : &str = "[ private, protected, orphan, exposed, prelude ]"; + + /// + /// Custom keywords + /// + + pub mod kw + { + use super::*; + // syn::custom_keyword!( private ); + syn::custom_keyword!( protected ); + syn::custom_keyword!( orphan ); + syn::custom_keyword!( exposed ); + syn::custom_keyword!( prelude ); + + pub use syn::token::Pub as public; + + } + + /// + /// Visibility constructor. + /// + + pub trait VisibilityInterface + { + type Token : syn::token::Token + syn::parse::Parse; + + fn vis_make( token : Self::Token, restriction : Option< Restriction > ) -> Self; + fn restriction( &self ) -> Option< &Restriction >; + + } + + /// + /// Trait answering question can the visibility be used for non-standard module. + /// + + pub trait ValidSubNamespace + { + fn valid_sub_namespace( &self ) -> bool { false } + } + + /// Has kind. + pub trait HasClauseKind + { + + /// Static function to get kind of the visibility. + #[ allow( non_snake_case ) ] + #[ allow( dead_code ) ] + fn Kind() -> ClauseKind; + + /// Method to get kind of the visibility. + #[ allow( dead_code ) ] + fn kind( &self ) -> ClauseKind + { + Self::Kind() + } + + } + + // + + macro_rules! Clause + { + + ( $Name1:ident, $Kind:ident ) => + { + + #[ derive( Debug, PartialEq, Eq, Clone ) ] + pub struct $Name1 + { + } + + impl $Name1 + { + #[ allow( dead_code ) ] + pub fn new() -> Self + { + Self {} + } + } + + impl HasClauseKind for $Name1 + { + #[ allow( non_snake_case ) ] + #[ allow( dead_code ) ] + fn Kind() -> ClauseKind + { + ClauseKind::$Kind + } + } + + } + + } + + // + + macro_rules! Vis + { + ( $Name0:ident, $Name1:ident, $Name2:ident, $Kind:ident ) => + { + + #[ derive( Debug, PartialEq, Eq, Clone ) ] + pub struct $Name1 + { + pub token : kw::$Name2, + pub restriction : Option< Restriction >, + } + + impl $Name1 + { + #[ allow( dead_code ) ] + pub fn new() -> Self + { + Self + { + token : kw::$Name2( proc_macro2::Span::call_site() ), + restriction : None, + } + } + } + + impl VisibilityInterface for $Name1 + { + type Token = kw::$Name2; + fn vis_make( token : Self::Token, restriction : Option< Restriction > ) -> Self + { + Self + { + token, + restriction, + } + } + fn restriction( &self ) -> Option< &Restriction > + { + self.restriction.as_ref() + } + } + + impl HasClauseKind for $Name1 + { + #[ allow( non_snake_case ) ] + #[ allow( dead_code ) ] + fn Kind() -> ClauseKind + { + ClauseKind::$Kind + } + } + + impl quote::ToTokens for $Name1 + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + self.token.to_tokens( tokens ); + } + } + + impl From< $Name1 > for Visibility + { + fn from( src : $Name1 ) -> Self + { + Self::$Name0( src ) + } + } + + + } + } + + // + + macro_rules! HasClauseKind + { + + ( $Name1:path, $Kind:ident ) => + { + + impl HasClauseKind for $Name1 + { + #[ allow( non_snake_case ) ] + #[ allow( dead_code ) ] + fn Kind() -> ClauseKind + { + ClauseKind::$Kind + } + } + + } + + } + + // + + macro_rules! impl_valid_sub_namespace + { + + ( $Name1:path, $Val:literal ) => + { + + impl ValidSubNamespace for $Name1 + { + fn valid_sub_namespace( &self ) -> bool + { + $Val + } + } + + } + + } + + // Vis!( Private, VisPrivate, private, 1 ); + Vis!( Protected, VisProtected, protected, Protected ); + Vis!( Orphan, VisOrphan, orphan, Orphan ); + Vis!( Exposed, VisExposed, exposed, Exposed ); + Vis!( Prelude, VisPrelude, prelude, Prelude ); + + Vis!( Public, VisPublic, public, Public ); + // Vis!( Restricted, VisRestricted, restricted, Restricted ); + + // HasClauseKind!( syn::Visibility::Public, Public ); + HasClauseKind!( syn::VisRestricted, Restricted ); + Clause!( ClauseImmediates, Immadiate ); + + // impl_valid_sub_namespace!( VisPrivate, false ); + impl_valid_sub_namespace!( VisProtected, true ); + impl_valid_sub_namespace!( VisOrphan, true ); + impl_valid_sub_namespace!( VisExposed, true ); + impl_valid_sub_namespace!( VisPrelude, true ); + impl_valid_sub_namespace!( VisPublic, false ); + impl_valid_sub_namespace!( syn::VisRestricted, false ); + // impl_valid_sub_namespace!( syn::Visibility::Public, false ); + // impl_valid_sub_namespace!( syn::VisRestricted, false ); + + /// + /// Restriction, for example `pub( crate )`. + /// + + #[ derive( Debug, PartialEq, Eq, Clone ) ] + pub struct Restriction + { + paren_token : syn::token::Paren, + in_token : Option< syn::token::In >, + path : Box< syn::Path >, + } + + /// Kinds of clause. + + #[ derive( Debug, Hash, Default, PartialEq, Eq, Clone, Copy ) ] + pub enum ClauseKind + { + /// Invisible outside. + #[ default ] + Private, + /// Owned by current file entities. + Protected, + /// Should be used by parent. + Orphan, + /// Should be used by all ascendants in the current crate. + Exposed, + /// Should be used by all crates which use current crate. + Prelude, + /// Public. + Public, + /// Public, but with some restrictions. + Restricted, + /// Immediate namespace + Immadiate, + } + + /// + /// Visibility of an element. + /// + + #[ derive( Debug, Default, PartialEq, Eq, Clone ) ] + pub enum Visibility + { + //Private( VisPrivate ), + Protected( VisProtected ), + Orphan( VisOrphan ), + Exposed( VisExposed ), + Prelude( VisPrelude ), + Public( VisPublic ), + // Public( syn::VisPublic ), + // Crate( syn::VisCrate ), + // Restricted( syn::VisRestricted ), + #[ default ] + Inherited, + } + + impl Visibility + { + + fn parse_protected( input : ParseStream< '_ > ) -> Result< Self > + { + Self::_parse_vis::< VisProtected >( input ) + } + + fn parse_orphan( input : ParseStream< '_ > ) -> Result< Self > + { + Self::_parse_vis::< VisOrphan >( input ) + } + + fn parse_exposed( input : ParseStream< '_ > ) -> Result< Self > + { + Self::_parse_vis::< VisExposed >( input ) + } + + fn parse_prelude( input : ParseStream< '_ > ) -> Result< Self > + { + Self::_parse_vis::< VisPrelude >( input ) + } + + fn parse_pub( input : ParseStream< '_ > ) -> Result< Self > + { + Self::_parse_vis::< VisPublic >( input ) + } + + // fn parse_pub( input : ParseStream< '_ > ) -> Result< Self > + // { + // Ok( Visibility::Public( syn::VisPublic { pub_token : input.parse()? } ) ) + // } + + fn _parse_vis< Vis >( input : ParseStream< '_ > ) -> Result< Self > + where + Vis : Into< Visibility > + VisibilityInterface, + { + use macro_tools::syn::parse::discouraged::Speculative; + use macro_tools::syn::ext::IdentExt; + let token = input.parse::< < Vis as VisibilityInterface >::Token >()?; + + if input.peek( syn::token::Paren ) + { + let ahead = input.fork(); + + let input2; + let paren_token = syn::parenthesized!( input2 in ahead ); + if input2.peek( Token![ crate ] ) + || input2.peek( Token![ self ] ) + || input2.peek( Token![ super ] ) + { + let path = input2.call( syn::Ident::parse_any )?; + + // Ensure there are no additional tokens within `input2`. + // Without explicitly checking, we may misinterpret a tuple + // field as a restricted visibility, causing a parse error. + // e.g. `pub (crate::A, crate::B)` (Issue #720). + if input2.is_empty() + { + input.advance_to( &ahead ); + + let restriction = Restriction + { + paren_token, + in_token : None, + path : Box::new( syn::Path::from( path ) ), + }; + + return Ok( Vis::vis_make + ( + token, + Some( restriction ), + ).into() ); + } + } + + } + + Ok( Vis::vis_make + ( + token, + None, + ).into() ) + } + + // fn parse_in_crate( input : ParseStream< '_ > ) -> Result< Self > + // { + // if input.peek2( Token![ :: ] ) + // { + // Ok( Visibility::Inherited ) + // } + // else + // { + // Ok( Visibility::Crate( VisInCrate + // { + // crate_token : input.parse()?, + // })) + // } + // } + + /// Get kind. + #[ allow( dead_code ) ] + pub fn kind( &self ) -> ClauseKind + { + match self + { + // Visibility::Private( e ) => e.kind(), + // Visibility::Crate( e ) => e.kind(), + Visibility::Protected( e ) => e.kind(), + Visibility::Orphan( e ) => e.kind(), + Visibility::Exposed( e ) => e.kind(), + Visibility::Prelude( e ) => e.kind(), + Visibility::Public( e ) => e.kind(), + // Visibility::Restricted( e ) => e.kind(), + Visibility::Inherited => ClauseKind::Private, + } + } + + /// Get restrictions. + #[ allow( dead_code ) ] + pub fn restriction( &self ) -> Option< &Restriction > + { + match self + { + // Visibility::Private( e ) => e.restriction(), + // Visibility::Crate( e ) => e.restriction(), + Visibility::Protected( e ) => e.restriction(), + Visibility::Orphan( e ) => e.restriction(), + Visibility::Exposed( e ) => e.restriction(), + Visibility::Prelude( e ) => e.restriction(), + Visibility::Public( _ ) => None, + // Visibility::Restricted( e ) => e.restriction(), + Visibility::Inherited => None, + } + } + + } + + impl syn::parse::Parse for Visibility + { + fn parse( input : ParseStream< '_ > ) -> Result< Self > + { + // Recognize an empty None-delimited group, as produced by a $:vis + // matcher that matched no tokens. + + // if input.peek( syn::token::Group ) + // { + // let ahead = input.fork(); + // let group = syn::group::parse_group( &ahead )?; + // if group.input2.is_empty() + // { + // input.advance_to( &ahead ); + // return Ok( Visibility::Inherited ); + // } + // } + + match() + { + //_case if input.peek( kw::private ) => Self::parse_private( input ), + _case if input.peek( kw::protected ) => Self::parse_protected( input ), + _case if input.peek( kw::orphan ) => Self::parse_orphan( input ), + _case if input.peek( kw::exposed ) => Self::parse_exposed( input ), + _case if input.peek( kw::prelude ) => Self::parse_prelude( input ), + _case if input.peek( Token![ pub ] ) => Self::parse_pub( input ), + _default => + { + Ok( Visibility::Inherited ) + }, + } + + } + } + + impl quote::ToTokens for Visibility + { + fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream ) + { + match self + { + //Visibility::Private( e ) => e.to_tokens( tokens ), + Visibility::Protected( e ) => e.to_tokens( tokens ), + Visibility::Orphan( e ) => e.to_tokens( tokens ), + Visibility::Exposed( e ) => e.to_tokens( tokens ), + Visibility::Prelude( e ) => e.to_tokens( tokens ), + Visibility::Public( e ) => e.to_tokens( tokens ), + Visibility::Inherited => (), + } + } + } + + #[ allow( clippy::derive_hash_xor_eq ) ] + impl Hash for Visibility + { + fn hash< H : Hasher >( &self, state : &mut H ) + { + self.kind().hash( state ) + } + } + + impl ValidSubNamespace for Visibility + { + fn valid_sub_namespace( &self ) -> bool + { + match self + { + //Visibility::Private( e ) => e.valid_sub_namespace(), + Visibility::Protected( e ) => e.valid_sub_namespace(), + Visibility::Orphan( e ) => e.valid_sub_namespace(), + Visibility::Exposed( e ) => e.valid_sub_namespace(), + Visibility::Prelude( e ) => e.valid_sub_namespace(), + Visibility::Public( e ) => e.valid_sub_namespace(), + Visibility::Inherited => false, + } + } + } + +} + +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ allow( unused_imports ) ] + pub use super::private:: + { + kw, + VALID_VISIBILITY_LIST_STR, + ValidSubNamespace, + HasClauseKind, + // VisPrivate, + VisProtected, + VisOrphan, + VisExposed, + VisPrelude, + ClauseImmediates, + Visibility, + ClauseKind, + }; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/mod_interface_meta/tests/smoke_test.rs b/module/core/mod_interface_meta/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/mod_interface_meta/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/process_tools/Cargo.toml b/module/core/process_tools/Cargo.toml new file mode 100644 index 0000000000..f3e45a836d --- /dev/null +++ b/module/core/process_tools/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "process_tools" +version = "0.6.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/process_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/process_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/process_tools" +description = """ +Collection of algorithms and structures to handle processes properly. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + + +[features] +default = [ "enabled", "process_environment_is_cicd" ] +full = [ "enabled", "process_environment_is_cicd" ] +enabled = [ + "mod_interface/enabled", + "former/enabled", + "proper_path_tools/enabled", + "error_tools/enabled", + "iter_tools/enabled", +] + +process_environment_is_cicd = [] + + +[dependencies] +mod_interface = { workspace = true } +former = { workspace = true, features = [ "derive_former" ] } +proper_path_tools = { workspace = true } +error_tools = { workspace = true, features = [ "error_for_app" ] } # qqq : xxx : rid off error_for_app +iter_tools = { workspace = true } + +## external +duct = "0.13.7" + + +[dev-dependencies] +test_tools = { workspace = true } +assert_fs = { version = "1.1.1" } diff --git a/module/core/process_tools/License b/module/core/process_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/process_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/process_tools/Readme.md b/module/core/process_tools/Readme.md new file mode 100644 index 0000000000..97f7c673ea --- /dev/null +++ b/module/core/process_tools/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: process_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/process_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/process_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of algorithms and structures to handle processes properly. + + diff --git a/module/core/process_tools/src/environment.rs b/module/core/process_tools/src/environment.rs new file mode 100644 index 0000000000..a69a622379 --- /dev/null +++ b/module/core/process_tools/src/environment.rs @@ -0,0 +1,54 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// Checks if the current execution environment is a Continuous Integration (CI) or Continuous Deployment (CD) pipeline. + /// + /// This function looks for environment variables that are commonly set by CI/CD systems to determine if it's running + /// within such an environment. It supports detection for a variety of popular CI/CD platforms including GitHub Actions, + /// GitLab CI, Travis CI, CircleCI, and Jenkins. + /// + /// # Returns + /// - `true` if an environment variable indicating a CI/CD environment is found. + /// - `false` otherwise. + /// + /// # Examples + /// + /// When running in a typical development environment (locally): + /// ```no_run + /// use process_tools::environment; + /// assert_eq!( environment::is_cicd(), false ); + /// ``` + /// + /// When running in a CI/CD environment, one of the specified environment variables would be set, and: + /// ```no_run + /// // This example cannot be run as a test since it depends on the environment + /// // the code is executed in. However, in a CI environment, this would return true. + /// use process_tools::environment; + /// assert_eq!( environment::is_cicd(), true ); + /// ``` + + #[ cfg( feature = "process_environment_is_cicd" ) ] + pub fn is_cicd() -> bool + { + use std::env; + let ci_vars = vec! + [ + "CI", // Common in many CI systems + "GITHUB_ACTIONS", // GitHub Actions + "GITLAB_CI", // GitLab CI + "TRAVIS", // Travis CI + "CIRCLECI", // CircleCI + "JENKINS_URL", // Jenkins + ]; + + ci_vars.iter().any( | &var | env::var( var ).is_ok() ) + } + +} + +crate::mod_interface! +{ + #[ cfg( feature = "process_environment_is_cicd" ) ] + protected use is_cicd; +} diff --git a/module/core/process_tools/src/lib.rs b/module/core/process_tools/src/lib.rs new file mode 100644 index 0000000000..ceb35389ea --- /dev/null +++ b/module/core/process_tools/src/lib.rs @@ -0,0 +1,22 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/process_tools/latest/process_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +use mod_interface::mod_interface; + +#[ cfg( feature = "enabled" ) ] +mod_interface! +{ + + /// Basic functionality. + // #[ cfg( not( feature = "no_std" ) ) ] + layer process; + + /// Inspection of running environment. + // #[ cfg( not( feature = "no_std" ) ) ] + layer environment; + +} diff --git a/module/core/process_tools/src/process.rs b/module/core/process_tools/src/process.rs new file mode 100644 index 0000000000..db954da17c --- /dev/null +++ b/module/core/process_tools/src/process.rs @@ -0,0 +1,331 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::*; + + use std:: + { + fmt::Formatter, + path::{ Path, PathBuf }, + process::{ Command, Stdio }, + }; + use std::collections::HashMap; + use std::ffi::OsString; + use duct::cmd; + use error_tools:: + { + for_app::{ Error, Context, anyhow }, + Result, + }; + use former::Former; + use iter_tools::iter::Itertools; + + // /// + // /// Executes an external process using the system shell. + // /// + // /// This function abstracts over the differences between shells on Windows and Unix-based + // /// systems, allowing for a unified interface to execute shell commands. + // /// + // /// # Parameters: + // /// - `exec_path`: The command line string to execute in the shell. + // /// - `current_path`: The working directory current_path where the command is executed. + // /// + // /// # Returns: + // /// A `Result` containing a `Report` on success, which includes the command's output, + // /// or an error if the command fails to execute or complete. + // /// + // /// # Examples: + // /// ```rust + // /// use process_tools::process; + // /// + // /// let report = process::run_with_shell( "echo Hello World", "." ).unwrap(); + // /// println!( "{}", report.out ); + // /// ``` + // /// + // + // pub fn run_with_shell + // ( + // exec_path : &str, + // current_path : impl Into< PathBuf >, + // ) + // -> Result< Report, Report > + // { + // let current_path = current_path.into(); + // let ( program, args ) = + // if cfg!( target_os = "windows" ) + // { + // ( "cmd", [ "/C", exec_path ] ) + // } + // else + // { + // ( "sh", [ "-c", exec_path ] ) + // }; + // let options = Run::former() + // .bin_path( program ) + // .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + // .current_path( current_path ) + // .form(); + // // xxx : qqq : for Petro : implement run for former та Ð´Ð»Ñ Run + // run( options ) + // } + + /// + /// Executes an external process in a specified directory without using a shell. + /// + /// # Arguments: + /// - `bin_path`: Path to the executable bin_path. + /// - `args`: Command-line arguments for the bin_path. + /// - `current_path`: Directory current_path to run the bin_path in. + /// + /// # Returns: + /// A `Result` containing `Report` on success, detailing execution output, + /// or an error message on failure. + /// + /// # Errors: + /// Returns an error if the process fails to spawn, complete, or if output + /// cannot be decoded as UTF-8. + // + // qqq : for Petro : use typed error + // qqq : for Petro : write example + pub fn run( options : Run ) -> Result< Report, Report > + { + let bin_path : &Path = options.bin_path.as_ref(); + let current_path : &Path = options.current_path.as_ref(); + + let mut report = Report + { + command : format!( "{} {}", bin_path.display(), options.args.iter().map( | a | a.to_string_lossy() ).join( " " ) ), + current_path : current_path.to_path_buf(), + .. Report::default() + }; + + let mut env: HashMap = std::env::vars().collect(); + env.extend( options.env_variable ); + + let output = if options.joining_streams + { + let output = cmd( bin_path.as_os_str(), &options.args ) + .dir( current_path ) + .full_env( env ) + .stderr_to_stdout() + .stdout_capture() + .unchecked() + .run() + .map_err( | e | + { + report.error = Err( e.into() ); + Err::< (), () >( () ) + }); + + output + } + else + { + let child = Command::new( bin_path ) + .args( &options.args ) + .envs( env ) + .stdout( Stdio::piped() ) + .stderr( Stdio::piped() ) + .current_dir( current_path ) + .spawn() + .context( "failed to spawn process" ) + .map_err( | e | + { + report.error = Err( e.into() ); + Err::< (), () >( () ) + }); + + if report.error.is_err() + { + return Err( report ); + } + let child = child.unwrap(); + + let output = child + .wait_with_output() + .context( "failed to wait on child" ) + .map_err( | e | + { + report.error = Err( e.into() ); + Err::< (), () >( () ) + }); + + output + }; + + if report.error.is_err() + { + return Err( report ); + } + let output = output.unwrap(); + + let out = String::from_utf8( output.stdout ) + .context( "Found invalid UTF-8" ) + .map_err( | e | + { + report.error = Err( e.into() ); + Err::< (), () >( () ) + }); + + if out.is_err() + { + return Err( report ); + } + let out = out.unwrap(); + + report.out = out; + + let err = String::from_utf8( output.stderr ) + .context( "Found invalid UTF-8" ) + .map_err( | e | + { + report.error = Err( e.into() ); + Err::< (), () >( () ) + }); + + if err.is_err() + { + return Err( report ); + } + let err = err.unwrap(); + + report.err = err; + + if output.status.success() + { + Ok( report ) + } + else + { + report.error = Err( anyhow!( "Process was finished with error code : {}", output.status ) ); + Err( report ) + } + + } + + /// Option for `run` function + #[ derive( Debug, Former ) ] + // #[ debug ] + pub struct Run + { + bin_path : PathBuf, + current_path : PathBuf, + args : Vec< OsString >, + #[ former( default = false ) ] + joining_streams : bool, + env_variable : HashMap< String, String >, + } + + impl RunFormer + { + pub fn run( self ) -> Result< Report, Report > + { + run( self.form() ) + } + + /// Executes an external process using the system shell. + /// + /// This function abstracts over the differences between shells on Windows and Unix-based + /// systems, allowing for a unified interface to execute shell commands. + /// + /// # Parameters: + /// - `exec_path`: The command line string to execute in the shell. + /// + /// # Returns: + /// A `Result` containing a `Report` on success, which includes the command's output, + /// or an error if the command fails to execute or complete. + pub fn run_with_shell( self, exec_path : &str, ) -> Result< Report, Report > + { + let ( program, args ) = + if cfg!( target_os = "windows" ) + { + ( "cmd", [ "/C", exec_path ] ) + } + else + { + ( "sh", [ "-c", exec_path ] ) + }; + self + .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .bin_path( program ) + .run() + } + } + + /// Process command output. + #[ derive( Debug, ) ] + pub struct Report + { + /// Command that was executed. + pub command : String, + /// Path where command was executed. + pub current_path : PathBuf, + /// Stdout. + pub out : String, + /// Stderr. + pub err : String, + /// Error if any + pub error : Result< (), Error > + } + + impl Clone for Report + { + fn clone( &self ) -> Self + { + Report + { + command : self.command.clone(), + current_path : self.current_path.clone(), + out : self.out.clone(), + err : self.err.clone(), + error : self.error.as_ref().map_err( | e | Error::msg( e.to_string() ) ).copied(), + // error : self.error.as_ref().map_err( | e | Error::new( e ) ).copied(), + } + } + } + + impl Default for Report + { + fn default() -> Self + { + Report + { + command : Default::default(), + current_path : PathBuf::new(), + out : Default::default(), + err : Default::default(), + error : Ok( () ), + } + } + } + + impl core::fmt::Display for Report + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> core::fmt::Result + { + // Trim prevents writing unnecessary whitespace or empty lines + f.write_fmt( format_args!( "> {}\n", self.command ) )?; + f.write_fmt( format_args!( " @ {}\n\n", self.current_path.display() ) )?; + + if !self.out.trim().is_empty() + { + f.write_fmt( format_args!( " {}\n", self.out.replace( '\n', "\n " ) ) )?; + } + if !self.err.trim().is_empty() + { + f.write_fmt( format_args!( " {}\n", self.err.replace( '\n', "\n " ) ) )?; + } + + Ok( () ) + } + } + +} + +crate::mod_interface! +{ + // protected use run_with_shell; + protected use run; + protected use Run; + protected use Report; +} diff --git a/module/core/process_tools/tests/asset/err_out_test/err_out_err.rs b/module/core/process_tools/tests/asset/err_out_test/err_out_err.rs new file mode 100644 index 0000000000..d6bc10ff45 --- /dev/null +++ b/module/core/process_tools/tests/asset/err_out_test/err_out_err.rs @@ -0,0 +1,8 @@ +fn main() +{ + eprintln!( "This is stderr text" ); + + println!( "This is stdout text" ); + + eprintln!( "This is stderr text" ); +} diff --git a/module/core/process_tools/tests/asset/err_out_test/out_err_out.rs b/module/core/process_tools/tests/asset/err_out_test/out_err_out.rs new file mode 100644 index 0000000000..eeb47d28bf --- /dev/null +++ b/module/core/process_tools/tests/asset/err_out_test/out_err_out.rs @@ -0,0 +1,9 @@ +//! need for tests +fn main() +{ + println!( "This is stdout text" ); + + eprintln!( "This is stderr text" ); + + println!( "This is stdout text" ); +} diff --git a/module/core/process_tools/tests/inc/basic.rs b/module/core/process_tools/tests/inc/basic.rs new file mode 100644 index 0000000000..60c9a81cfb --- /dev/null +++ b/module/core/process_tools/tests/inc/basic.rs @@ -0,0 +1,7 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn basic() +{ +} diff --git a/module/core/process_tools/tests/inc/environment_is_cicd.rs b/module/core/process_tools/tests/inc/environment_is_cicd.rs new file mode 100644 index 0000000000..616e1e17e4 --- /dev/null +++ b/module/core/process_tools/tests/inc/environment_is_cicd.rs @@ -0,0 +1,86 @@ +use super::*; + +// xxx : qqq : rewrite this tests with running external application + +#[ test ] +fn basic() +{ + + assert!( the_module::environment::is_cicd() || !the_module::environment::is_cicd() ); + +} + +// #[ test ] +// fn returns_false_when_no_ci_env_vars_are_set() +// { +// use std::env; +// let original_env_vars = std::env::vars().collect::>(); +// +// for ( key, _ ) in &original_env_vars +// { +// env::remove_var( key ); +// } +// +// assert_eq!( the_module::environment::is_cicd(), false ); +// +// // Restore environment variables +// for ( key, value ) in original_env_vars +// { +// env::set_var( key, value ); +// } +// +// } +// +// #[ test ] +// fn returns_true_for_github_actions() +// { +// use std::env; +// env::set_var( "GITHUB_ACTIONS", "true" ); +// assert!( the_module::environment::is_cicd() ); +// env::remove_var( "GITHUB_ACTIONS" ); +// } +// +// #[ test ] +// fn returns_true_for_gitlab_ci() +// { +// use std::env; +// env::set_var( "GITLAB_CI", "true" ); +// assert!( the_module::environment::is_cicd() ); +// env::remove_var( "GITLAB_CI" ); +// } +// +// #[ test ] +// fn returns_true_for_travis_ci() +// { +// use std::env; +// env::set_var( "TRAVIS", "true" ); +// assert!( the_module::environment::is_cicd() ); +// env::remove_var( "TRAVIS" ); +// } +// +// #[ test ] +// fn returns_true_for_circleci() +// { +// use std::env; +// env::set_var( "CIRCLECI", "true" ); +// assert!( the_module::environment::is_cicd() ); +// env::remove_var( "CIRCLECI" ); +// } +// +// #[ test ] +// fn returns_true_for_jenkins() +// { +// use std::env; +// env::set_var( "JENKINS_URL", "http://example.com" ); +// assert!( the_module::environment::is_cicd() ); +// env::remove_var( "JENKINS_URL" ); +// } +// +// #[ test ] +// fn returns_false_when_set_to_non_standard_value() +// { +// use std::env; +// env::set_var( "CI", "false" ); // Assuming 'false' string shouldn't be treated as indicating CI presence +// assert_eq!( the_module::environment::is_cicd(), true ); // The function checks for the presence of the variable, not its value +// env::remove_var( "CI" ); +// } diff --git a/module/core/process_tools/tests/inc/mod.rs b/module/core/process_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..8e7d9e8664 --- /dev/null +++ b/module/core/process_tools/tests/inc/mod.rs @@ -0,0 +1,8 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic; +mod process_run; + +#[ cfg( feature = "process_environment_is_cicd" ) ] +mod environment_is_cicd; diff --git a/module/core/process_tools/tests/inc/process_run.rs b/module/core/process_tools/tests/inc/process_run.rs new file mode 100644 index 0000000000..0aca11a047 --- /dev/null +++ b/module/core/process_tools/tests/inc/process_run.rs @@ -0,0 +1,69 @@ +use super::*; +use the_module::process; +use std:: +{ + env::consts::EXE_EXTENSION, + path::{ Path, PathBuf }, + process::Command, +}; + +#[ path = "../tool/asset.rs" ] +mod asset; + + +// xxx : qqq : ? +// xxx2 : eliminate the function and use test_tools/process_tools instead +/// Poorly named function +pub fn path_to_exe( name : &Path, temp_path : &Path ) -> PathBuf +{ + + // dbg!( name ); + + _ = Command::new( "rustc" ) + .current_dir( temp_path ) + .arg( name ) + .status() + .unwrap(); + + PathBuf::from( temp_path ) + .join( name.file_name().unwrap() ) + .with_extension( EXE_EXTENSION ) + +} + +#[ test ] +fn err_out_err() +{ + let temp = assert_fs::TempDir::new().unwrap(); + let assets_path = asset::path().unwrap(); + + // dbg!( path_to_exe( &assets_path.join( "err_out_test" ).join( "err_out_err.rs" ), temp.path() ) ); + + let options = process::Run::former() + .bin_path( path_to_exe( &assets_path.join( "err_out_test" ).join( "err_out_err.rs" ), temp.path() ) ) + .current_path( temp.to_path_buf() ) + .joining_streams( true ) + .form(); + + let report = process::run( options ).unwrap(); + + println!( "{}", report ); + + assert_eq!( "This is stderr text\nThis is stdout text\nThis is stderr text\n", report.out ); +} + +#[ test ] +fn out_err_out() +{ + let temp = assert_fs::TempDir::new().unwrap(); + let assets_path = asset::path().unwrap(); + + let options = process::Run::former() + .bin_path( path_to_exe( &assets_path.join( "err_out_test" ).join( "out_err_out.rs" ), temp.path() ) ) + .current_path( temp.to_path_buf() ) + .joining_streams( true ) + .form(); + let report = process::run( options ).unwrap(); + + assert_eq!( "This is stdout text\nThis is stderr text\nThis is stdout text\n", report.out ); +} diff --git a/module/core/process_tools/tests/smoke_test.rs b/module/core/process_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/process_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/process_tools/tests/tests.rs b/module/core/process_tools/tests/tests.rs new file mode 100644 index 0000000000..e1e4927fd7 --- /dev/null +++ b/module/core/process_tools/tests/tests.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use process_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/core/process_tools/tests/tool/asset.rs b/module/core/process_tools/tests/tool/asset.rs new file mode 100644 index 0000000000..7261904225 --- /dev/null +++ b/module/core/process_tools/tests/tool/asset.rs @@ -0,0 +1,140 @@ + +// xxx2 : incorporate the function into a tool + +pub const ASSET_PATH : &str = "tests/asset"; + +macro_rules! ERR_MSG +{ + () + => + { + "Create `.cargo/config.toml` file at root of your project and append it by +``` +[env] +WORKSPACE_PATH = { value = \".\", relative = true } +```" + }; +} + +pub fn path() -> std::io::Result< std::path::PathBuf > +{ + use std:: + { + path::Path, + io::{ self, ErrorKind } + }; + let workspace_path = Path::new( env!( "WORKSPACE_PATH", ERR_MSG!{} ) ); + // dbg!( workspace_path ); + // let crate_path = Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + // dbg!( file!() ); + let dir_path = workspace_path.join( Path::new( file!() ) ); + let dir_path = dir_path.canonicalize()?; + let test_dir = dir_path + .parent() + .ok_or_else( || io::Error::new( ErrorKind::NotFound, format!( "Failed to find parent directory {}", dir_path.display() ) ) )? + .parent() + .ok_or_else( || io::Error::new( ErrorKind::NotFound, format!( "Failed to find parent directory {}", dir_path.display() ) ) )? + .parent() + .ok_or_else( || io::Error::new( ErrorKind::NotFound, format!( "Failed to find parent directory {}", dir_path.display() ) ) )? + ; + // dbg!( &test_dir ); + let assets_path = test_dir.join( Path::new( ASSET_PATH ) ); + // dbg!( &assets_path ); + Ok( assets_path ) +} + +// + +// xxx2 : adjust Former to generate required code easier +// xxx2 : implement the interface + +use former::Former; +use std:: +{ + path::{ Path, PathBuf }, + // process::Command, +}; + +#[ derive( Debug, Default, Former ) ] +pub struct SourceFile +{ + file_path : PathBuf, + data : GetData, +} + +#[ derive( Debug, Default, Former ) ] +pub struct Entry +{ + source_file : SourceFile, + typ : EntryType, +} + +#[ derive( Debug, Default, Former ) ] +pub struct CargoFile +{ + file_path : PathBuf, + data : GetData, +} + +#[ derive( Debug, Default, Former ) ] +// #[ debug ] +pub struct Program +{ + write_path : Option< PathBuf >, + read_path : Option< PathBuf >, + entries : Vec< Entry >, + sources : Vec< SourceFile >, + cargo_file : Option< CargoFile >, +} + +#[ derive( Debug, Default, Former ) ] +pub struct ProgramRun +{ + // #[ embed ] + program : Program, + calls : Vec< ProgramCall >, +} + +#[ derive( Debug ) ] +pub enum GetData +{ + FromStr( &'static str ), + FromBin( &'static [ u8 ] ), + FromFile( PathBuf ), + FromString( String ), +} + +impl Default for GetData +{ + fn default() -> Self + { + GetData::FromStr( "" ) + } +} + +#[ derive( Debug, Default ) ] +pub struct ProgramCall +{ + action : ProgramAction, + current_path : Option< PathBuf >, + args : Vec< String >, + index_of_entry : i32, +} + +#[ derive( Debug, Default ) ] +pub enum ProgramAction +{ + #[ default ] + Run, + Build, + Test, +} + +#[ derive( Debug, Default ) ] +pub enum EntryType +{ + #[ default ] + Bin, + Lib, + Test, +} diff --git a/module/core/program_tools/Cargo.toml b/module/core/program_tools/Cargo.toml new file mode 100644 index 0000000000..30faf2edc3 --- /dev/null +++ b/module/core/program_tools/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "program_tools" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/program_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/program_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/program_tools" +description = """ +Compile and run a Rust program. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + + +[features] +default = [ + "enabled", +] +full = [ + "enabled" + ] + +enabled = [ + "mod_interface/enabled", + "former/enabled", + "proper_path_tools/enabled", + "error_tools/enabled", + "iter_tools/enabled", +] + +[dependencies] +mod_interface = { workspace = true } +former = { workspace = true, features = [ "derive_former" ] } +proper_path_tools = { workspace = true } +error_tools = { workspace = true, features = [ "error_for_app" ] } # qqq : xxx : rid off error_for_app +iter_tools = { workspace = true } + +# ## external +# duct = "0.13.7" + + +[dev-dependencies] +test_tools = { workspace = true } +# assert_fs = { version = "1.1.1" } diff --git a/module/core/program_tools/License b/module/core/program_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/program_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/program_tools/Readme.md b/module/core/program_tools/Readme.md new file mode 100644 index 0000000000..daf1b1c108 --- /dev/null +++ b/module/core/program_tools/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: program_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_program_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_program_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/program_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/program_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Compile and run a Rust program. + + diff --git a/module/core/program_tools/src/lib.rs b/module/core/program_tools/src/lib.rs new file mode 100644 index 0000000000..71c19f2ab4 --- /dev/null +++ b/module/core/program_tools/src/lib.rs @@ -0,0 +1,24 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/program_tools/latest/program_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#![ allow( unused_imports, dead_code, missing_docs ) ] // xxx : rid off + +#[ cfg( feature = "enabled" ) ] +use mod_interface::mod_interface; + +// xxx : move is_cicd here +// println!( "MODULES_PATH : {}", env!( "MODULES_PATH" ) ); +// println!( "WORKSPACE_PATH : {}", env!( "WORKSPACE_PATH" ) ); +// // xxx : add to program_tools::{ path::modules(), path::workspace() } + +#[ cfg( feature = "enabled" ) ] +mod_interface! +{ + + /// Compile and run a Rust program. + layer program; + +} diff --git a/module/core/program_tools/src/program.rs b/module/core/program_tools/src/program.rs new file mode 100644 index 0000000000..5ae707cf30 --- /dev/null +++ b/module/core/program_tools/src/program.rs @@ -0,0 +1,158 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + use former::Former; + use std:: + { + path::{ Path, PathBuf }, + // process::Command, + }; + + // xxx2 : get completed + + #[ derive( Debug, Default, Former ) ] + // #[ debug ] + pub struct Program + { + pub write_path : Option< PathBuf >, + pub read_path : Option< PathBuf >, + #[ subform_entry( name = entry ) ] + pub entries : Vec< Entry >, + #[ subform_entry( name = source ) ] + pub sources : Vec< SourceFile >, + pub cargo_file : Option< CargoFile >, + } + + #[ derive( Debug, Default, Former ) ] + pub struct Plan + { + #[ subform_scalar ] + pub program : Program, + pub calls : Vec< Call >, + } + + #[ derive( Debug, Default ) ] + pub struct Call + { + pub action : Action, + pub current_path : Option< PathBuf >, + pub args : Vec< String >, + pub index_of_entry : i32, + } + + #[ derive( Debug, Default ) ] + pub enum Action + { + #[ default ] + Run, + Build, + Test, + } + + #[ derive( Debug, Default ) ] + pub enum EntryType + { + #[ default ] + Bin, + Lib, + Test, + } + + #[ derive( Debug, Default, Former ) ] + pub struct Entry + { + source_file : SourceFile, + typ : EntryType, + } + + #[ derive( Debug, Default, Former ) ] + pub struct SourceFile + { + file_path : PathBuf, + data : GetData, + } + + #[ derive( Debug, Default, Former ) ] + pub struct CargoFile + { + file_path : PathBuf, + data : GetData, + } + + #[ derive( Debug ) ] + pub enum GetData + { + FromStr( &'static str ), + FromBin( &'static [ u8 ] ), + FromFile( PathBuf ), + FromString( String ), + } + + impl From< &'static str > for GetData + { + #[ inline ] + fn from( src : &'static str ) -> Self + { + Self::FromStr( src ) + } + } + + impl From< &'static [ u8 ] > for GetData + { + #[ inline ] + fn from( src : &'static [ u8 ] ) -> Self + { + Self::FromBin( src ) + } + } + + impl From< PathBuf > for GetData + { + #[ inline ] + fn from( src : PathBuf ) -> Self + { + Self::FromFile( src ) + } + } + + impl From< String > for GetData + { + #[ inline ] + fn from( src : String ) -> Self + { + Self::FromString( src ) + } + } + + impl Default for GetData + { + fn default() -> Self + { + GetData::FromStr( "" ) + } + } + +} + +crate::mod_interface! +{ + + exposed use + { + Program, + }; + + protected use + { + Plan, + Call, + Action, + EntryType, + Entry, + SourceFile, + CargoFile, + GetData, + }; + +} diff --git a/module/core/program_tools/tests/asset/err_out_test/err_out_err.rs b/module/core/program_tools/tests/asset/err_out_test/err_out_err.rs new file mode 100644 index 0000000000..d6bc10ff45 --- /dev/null +++ b/module/core/program_tools/tests/asset/err_out_test/err_out_err.rs @@ -0,0 +1,8 @@ +fn main() +{ + eprintln!( "This is stderr text" ); + + println!( "This is stdout text" ); + + eprintln!( "This is stderr text" ); +} diff --git a/module/core/program_tools/tests/asset/err_out_test/out_err_out.rs b/module/core/program_tools/tests/asset/err_out_test/out_err_out.rs new file mode 100644 index 0000000000..eeb47d28bf --- /dev/null +++ b/module/core/program_tools/tests/asset/err_out_test/out_err_out.rs @@ -0,0 +1,9 @@ +//! need for tests +fn main() +{ + println!( "This is stdout text" ); + + eprintln!( "This is stderr text" ); + + println!( "This is stdout text" ); +} diff --git a/module/core/program_tools/tests/inc/basic.rs b/module/core/program_tools/tests/inc/basic.rs new file mode 100644 index 0000000000..9f9aa8daea --- /dev/null +++ b/module/core/program_tools/tests/inc/basic.rs @@ -0,0 +1,16 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn basic() +{ + use the_module::program; + + let _plan = program::Plan::former() + .program() + // .source().file_path( "main.rs" ).data( program::GetData::FromStr( "fn main() { println( \"hello!\" ) }" ) ).end() + .source().file_path( "main.rs" ).data( "fn main() { println( \"hello!\" ) }" ).end() + .end() + .end(); + +} diff --git a/module/core/program_tools/tests/inc/mod.rs b/module/core/program_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..d78794e341 --- /dev/null +++ b/module/core/program_tools/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic; diff --git a/module/core/program_tools/tests/smoke_test.rs b/module/core/program_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/program_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/program_tools/tests/tests.rs b/module/core/program_tools/tests/tests.rs new file mode 100644 index 0000000000..e353b1d4d9 --- /dev/null +++ b/module/core/program_tools/tests/tests.rs @@ -0,0 +1,11 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use program_tools as the_module; + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/core/program_tools/tests/tool/asset.rs b/module/core/program_tools/tests/tool/asset.rs new file mode 100644 index 0000000000..7261904225 --- /dev/null +++ b/module/core/program_tools/tests/tool/asset.rs @@ -0,0 +1,140 @@ + +// xxx2 : incorporate the function into a tool + +pub const ASSET_PATH : &str = "tests/asset"; + +macro_rules! ERR_MSG +{ + () + => + { + "Create `.cargo/config.toml` file at root of your project and append it by +``` +[env] +WORKSPACE_PATH = { value = \".\", relative = true } +```" + }; +} + +pub fn path() -> std::io::Result< std::path::PathBuf > +{ + use std:: + { + path::Path, + io::{ self, ErrorKind } + }; + let workspace_path = Path::new( env!( "WORKSPACE_PATH", ERR_MSG!{} ) ); + // dbg!( workspace_path ); + // let crate_path = Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + // dbg!( file!() ); + let dir_path = workspace_path.join( Path::new( file!() ) ); + let dir_path = dir_path.canonicalize()?; + let test_dir = dir_path + .parent() + .ok_or_else( || io::Error::new( ErrorKind::NotFound, format!( "Failed to find parent directory {}", dir_path.display() ) ) )? + .parent() + .ok_or_else( || io::Error::new( ErrorKind::NotFound, format!( "Failed to find parent directory {}", dir_path.display() ) ) )? + .parent() + .ok_or_else( || io::Error::new( ErrorKind::NotFound, format!( "Failed to find parent directory {}", dir_path.display() ) ) )? + ; + // dbg!( &test_dir ); + let assets_path = test_dir.join( Path::new( ASSET_PATH ) ); + // dbg!( &assets_path ); + Ok( assets_path ) +} + +// + +// xxx2 : adjust Former to generate required code easier +// xxx2 : implement the interface + +use former::Former; +use std:: +{ + path::{ Path, PathBuf }, + // process::Command, +}; + +#[ derive( Debug, Default, Former ) ] +pub struct SourceFile +{ + file_path : PathBuf, + data : GetData, +} + +#[ derive( Debug, Default, Former ) ] +pub struct Entry +{ + source_file : SourceFile, + typ : EntryType, +} + +#[ derive( Debug, Default, Former ) ] +pub struct CargoFile +{ + file_path : PathBuf, + data : GetData, +} + +#[ derive( Debug, Default, Former ) ] +// #[ debug ] +pub struct Program +{ + write_path : Option< PathBuf >, + read_path : Option< PathBuf >, + entries : Vec< Entry >, + sources : Vec< SourceFile >, + cargo_file : Option< CargoFile >, +} + +#[ derive( Debug, Default, Former ) ] +pub struct ProgramRun +{ + // #[ embed ] + program : Program, + calls : Vec< ProgramCall >, +} + +#[ derive( Debug ) ] +pub enum GetData +{ + FromStr( &'static str ), + FromBin( &'static [ u8 ] ), + FromFile( PathBuf ), + FromString( String ), +} + +impl Default for GetData +{ + fn default() -> Self + { + GetData::FromStr( "" ) + } +} + +#[ derive( Debug, Default ) ] +pub struct ProgramCall +{ + action : ProgramAction, + current_path : Option< PathBuf >, + args : Vec< String >, + index_of_entry : i32, +} + +#[ derive( Debug, Default ) ] +pub enum ProgramAction +{ + #[ default ] + Run, + Build, + Test, +} + +#[ derive( Debug, Default ) ] +pub enum EntryType +{ + #[ default ] + Bin, + Lib, + Test, +} diff --git a/module/core/proper_path_tools/Cargo.toml b/module/core/proper_path_tools/Cargo.toml new file mode 100644 index 0000000000..1571d43e0f --- /dev/null +++ b/module/core/proper_path_tools/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "proper_path_tools" +version = "0.7.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/proper_path_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/proper_path_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/proper_path_tools" +description = """ +Collection of algorithms and structures to handle paths properly. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled", "path_unique_folder_name" ] +full = [ "enabled", "path_unique_folder_name", "derive_serde" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [ "mod_interface/enabled" ] + +path_unique_folder_name = [] +derive_serde = [ "serde" ] + +[dependencies] +regex = { version = "1.10.3" } +mod_interface = { workspace = true } +serde = { version = "1.0.197", optional = true, features = [ "derive" ] } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/proper_path_tools/License b/module/core/proper_path_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/proper_path_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/proper_path_tools/Readme.md b/module/core/proper_path_tools/Readme.md new file mode 100644 index 0000000000..d142018019 --- /dev/null +++ b/module/core/proper_path_tools/Readme.md @@ -0,0 +1,35 @@ + + +# Module :: proper_path_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_proper_path_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_proper_path_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/proper_path_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/proper_path_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of algorithms and structures to handle paths properly. + +All functions in the crate don't touch file system, but only process paths. + + diff --git a/module/core/proper_path_tools/src/lib.rs b/module/core/proper_path_tools/src/lib.rs new file mode 100644 index 0000000000..d437f55081 --- /dev/null +++ b/module/core/proper_path_tools/src/lib.rs @@ -0,0 +1,21 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/proper_path_tools/latest/proper_path_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +use mod_interface::mod_interface; + +#[ cfg( feature="no_std" ) ] +#[ macro_use ] +extern crate alloc; + +#[ cfg( feature = "enabled" ) ] +mod_interface! +{ + + /// Basic functionality. + layer path; + +} diff --git a/module/core/proper_path_tools/src/path.rs b/module/core/proper_path_tools/src/path.rs new file mode 100644 index 0000000000..7e00e31d19 --- /dev/null +++ b/module/core/proper_path_tools/src/path.rs @@ -0,0 +1,1061 @@ +/// Internal namespace. + +pub( crate ) mod private +{ + #[ cfg( feature = "no_std" ) ] + extern crate std; + + // use std:: + // { + // path::{ Component, Path, PathBuf }, + // time::{ SystemTime, UNIX_EPOCH, SystemTimeError }, + // }; + // use cargo_metadata::camino::{ Utf8Path, Utf8PathBuf }; + + // // xxx : it's not path, but file + // /// Check if path is valid. + // pub fn valid_is( path : &str ) -> bool + // { + // std::fs::metadata( path ).is_ok() + // } + + /// Determines if a given path string contains unescaped glob pattern characters. + /// + /// # Parameters: + /// + /// - `path` : A reference to a string slice ( `&str` ) representing the path to be checked. + /// + /// # Returns: + /// + /// - `bool` : Returns `true` if the path contains unescaped glob pattern characters ( `*`, `?`, `[`, `{` ), + /// otherwise `false`. The function takes into account escape sequences, and only considers glob characters + /// outside of escape sequences. + /// + /// # Behavior: + /// + /// - The function handles escaped characters ( `\` ) and identifies unescaped glob characters and sequences. + /// - It correctly interprets nested and escaped brackets ( `[`, `]` ) and braces ( `{`, `}` ). + /// + /// # Examples: + /// + /// ``` + /// use proper_path_tools::path; + /// + /// assert_eq!( path::is_glob( "file.txt" ), false ); // No glob patterns + /// assert_eq!( path::is_glob( "*.txt" ), true ); // Contains unescaped glob character * + /// assert_eq!( path::is_glob( "\\*.txt" ), false ); // Escaped *, not a glob pattern + /// assert_eq!( path::is_glob( "file[0-9].txt" ), true ); // Unescaped brackets indicate a glob pattern + /// assert_eq!( path::is_glob( "file\\[0-9].txt" ), false ); // Escaped brackets, not a glob pattern + /// ``` + + pub fn is_glob( path : &str ) -> bool + { + let mut chars = path.chars().peekable(); + let mut is_escaped = false; + let mut in_brackets = false; + let mut in_braces = false; + + while let Some( c ) = chars.next() + { + if is_escaped + { + // If the character is escaped, ignore its special meaning in the next iteration + is_escaped = false; + continue; + } + + match c + { + '\\' => + { + is_escaped = !is_escaped; + } + '*' | '?' if !in_brackets && !in_braces => return true, + '[' if !in_brackets && !in_braces && !is_escaped => + { + // Enter a bracket block, indicating potential glob pattern + in_brackets = true; + // continue; // Ensure we don't immediately exit on the next char if it's ']' + } + ']' if in_brackets => + { + // in_brackets = false; + return true; + } + '{' if !in_braces && !is_escaped => in_braces = true, + '}' if in_braces => + { + // in_braces = false; + return true; + } + _ => (), + } + } + + // If the function completes without returning true, it means no unescaped glob patterns were detected. + // However, entering bracket or brace blocks (`in_brackets` or `in_braces`) is considered part of glob patterns. + // Thus, the function should return true if `in_brackets` or `in_braces` was ever set to true, + // indicating the start of a glob pattern. + // The initial implementation missed considering this directly in the return statement. + // Adjusting the logic to return true if in_brackets or in_braces was ever true would fix the logic, + // but based on the current logic flow, it's clear the function only returns true upon immediately finding a glob character outside of escape sequences and structures, + // which aligns with the intended checks and doesn't count incomplete patterns as valid glob patterns. + // Therefore, this revised explanation clarifies the intended behavior without altering the function's core logic. + + false + } + + /// + /// Normalizes a given filesystem path by syntactically removing occurrences of `.` and properly handling `..` components. + /// + /// This function iterates over the components of the input path and applies the following rules: + /// - For `..` (ParentDir) components, it removes the last normal (non-special) segment from the normalized path. If the last segment is another `..` or if there are no preceding normal segments and the path does not start with the root directory (`/`), it preserves the `..` to represent moving up in the directory hierarchy. + /// - For paths starting with the root directory followed by `..`, it retains these `..` components to accurately reflect paths that navigate upwards from the root. + /// - Skips `.` (CurDir) components as they represent the current directory and don't affect the path's normalization. + /// - Retains all other components unchanged, including normal segments and the root directory. + /// + /// The normalization process is purely syntactical and does not interact with the file system. + /// It does not resolve symbolic links, check the existence of path components, or consider the current working directory. + /// The function ensures that paths are represented using `/` as the separator for consistency across different operating systems, + /// including Windows, where the native path separator is `\`. + /// + /// # Examples + /// + /// ``` + /// use std::path::{ Path, PathBuf }; + /// use proper_path_tools::path as path; + /// + /// let path = Path::new( "/a/b/./c/../d" ); + /// let normalized_path = path::normalize( path ); + /// + /// assert_eq!( normalized_path, PathBuf::from( "/a/b/d" ) ); + /// ``` + /// + /// # Arguments + /// + /// * `path` - A reference to a path that implements `AsRef`, which will be normalized. + /// + /// # Returns + /// + /// A `PathBuf` containing the normalized path. + /// + + pub fn normalize< P : AsRef< std::path::Path > >( path : P ) -> std::path::PathBuf + { + use std::path::{ Component, PathBuf }; + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::vec::Vec; + + let mut components = Vec::new(); + let mut starts_with_dot = false; + + let mut iter = path.as_ref().components().peekable(); + if let Some( first ) = iter.peek() + { + starts_with_dot = matches!( first, Component::CurDir ); + if matches!( first, Component::RootDir ) + { + components.push( Component::RootDir ); + iter.next(); // Skip the root component in further processing + } + } + + for component in iter + { + match component + { + Component::ParentDir => + { + match components.last() + { + Some( Component::Normal( _ ) ) => + { + components.pop(); + } + Some( Component::RootDir ) => + { + components.push( Component::ParentDir ); + } + Some( Component::ParentDir ) | None => + { + components.push( Component::ParentDir ); + } + _ => {} // Do nothing for CurDir + } + } + Component::CurDir => {} // Skip + _ => components.push( component ), + } + } + + let mut normalized = PathBuf::new(); + if starts_with_dot || components.is_empty() + { + normalized.push( "." ); + } + + for component in components.iter() + { + normalized.push( component.as_os_str() ); + } + + // Convert back to a PathBuf using "/" as the separator for consistency + #[ cfg( target_os = "windows" ) ] + let normalized = PathBuf::from( normalized.to_string_lossy().replace( "\\", "/" ) ); + + normalized + } + + // qqq : for Petro : for Bohdan : write test. never leave such functions without a test. + // qqq : for Petro : for Bohdan : why that transofrmation is necessary. give several examples of input and output + /// Returns the canonical, absolute form of the path with all intermediate components normalized and symbolic links resolved. + /// This function does not touch fs. + pub fn canonicalize( path : impl AsRef< std::path::Path > ) -> std::io::Result< std::path::PathBuf > + { + #[ cfg( target_os = "windows" ) ] + use std::path::PathBuf; + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::string::ToString; + + // println!( "a" ); + // let path = path.as_ref().canonicalize()?; + // println!( "b" ); + let path = normalize( path ); + + // In Windows the regular/legacy paths (C :\foo) are supported by all programs, but have lots of bizarre restrictions for backwards compatibility with MS-DOS. + // And there are Windows NT UNC paths (\\?\C :\foo), which are more robust and with fewer gotchas, but are rarely supported by Windows programs. Even Microsoft’s own! + // + // https://github.com/rust-lang/rust/issues/42869 + #[ cfg( target_os = "windows" ) ] + let path = + { + const VERBATIM_PREFIX: &str = r#"\\?\"#; + let p = path.display().to_string(); + if p.starts_with( VERBATIM_PREFIX ) + { + PathBuf::from( &p[ VERBATIM_PREFIX.len().. ] ) + } else + { + path.into() + } + }; + + Ok( path ) + } + + /// Generates a unique folder name using the current system time, process ID, + /// thread ID, and an internal thread-local counter. + /// + /// This function constructs the folder name by combining: + /// - The current system time in nanoseconds since the UNIX epoch, + /// - The current process ID, + /// - A checksum of the current thread's ID, + /// - An internal thread-local counter which increments on each call within the same thread. + /// + /// The format of the generated name is "{timestamp}_{pid}_{tid}_{counter}", + /// where each component adds a layer of uniqueness, making the name suitable for + /// temporary or unique directory creation in multi-threaded and multi-process environments. + /// + /// # Returns + /// + /// A `Result< String, SystemTimeError >` where: + /// - `Ok( String )` contains the unique folder name if the current system time + /// can be determined relative to the UNIX epoch, + /// - `Err( SystemTimeError )` if there is an error determining the system time. + /// + /// # Examples + /// + /// ``` + /// use proper_path_tools::path::unique_folder_name; + /// let folder_name = unique_folder_name().unwrap(); + /// println!( "Generated folder name: {}", folder_name ); + /// ``` + + #[ cfg( feature = "path_unique_folder_name" ) ] + pub fn unique_folder_name() -> std::result::Result< std::string::String, std::time::SystemTimeError > + { + use std::time::{ SystemTime, UNIX_EPOCH }; + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::string::String; + + // Thread-local static variable for a counter + std::thread_local! + { + static COUNTER : std::cell::Cell< usize > = std::cell::Cell::new( 0 ); + } + + // Increment and get the current value of the counter safely + let count = COUNTER.with( | counter | + { + let val = counter.get(); + counter.set( val + 1 ); + val + } ); + + let timestamp = SystemTime::now().duration_since( UNIX_EPOCH )?.as_nanos(); + + let pid = std::process::id(); + let tid : String = std::format!( "{:?}", std::thread::current().id() ) + .chars() + .filter( | c | c.is_digit( 10 ) ) + .collect(); + // dbg!( &tid ); + + Ok( std::format!( "{}_{}_{}_{}", timestamp, pid, tid, count ) ) + } + /// Joins a list of file system paths into a single absolute path. + /// + /// This function takes a list of file system paths and joins them into a single path, + /// normalizing and simplifying them as it goes. The result is returned as a PathBuf. + /// + /// Examples: + /// + /// ``` + /// + /// let paths = vec![ "a/b/c", "/d/e", "f/g" ]; + /// let joined = proper_path_tools::path::join_paths( paths.into_iter() ); + /// assert_eq!( joined, std::path::PathBuf::from( "/d/e/f/g" ) ); + /// + /// let paths = vec![]; + /// let joined = proper_path_tools::path::join_paths( paths.into_iter() ); + /// assert_eq!( joined, std::path::PathBuf::from( "" ) ); + /// + /// let paths = vec![ "", "a/b", "", "c", "" ]; + /// let joined = proper_path_tools::path::join_paths( paths.into_iter() ); + /// assert_eq!( joined, std::path::PathBuf::from( "/a/b/c" ) ); + /// + /// ``` + pub fn join_paths< 'a, I >( paths : I ) -> std::path::PathBuf + where + I : Iterator< Item = &'a str >, + { + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::string::String; + #[ cfg( feature = "no_std" ) ] + use alloc::vec::Vec; + + let mut result = String::new(); + + for path in paths { + let mut path = path.replace( '\\', "/" ); + path = path.replace( ':', "" ); + + let mut added_slah = false; + + // If the path is empty, skip it + if path.is_empty() + { + continue; + } + + // If the path starts with '/', clear the result and set it to '/' + if path.starts_with('/') + { + result.clear(); + result.push( '/' ); + } + // If the result doesn't end with '/', append '/' + else if !result.ends_with( '/' ) + { + added_slah = true; + result.push( '/' ); + } + let components: Vec<&str> = path.split( '/' ).collect(); + // Split the path into components + for ( idx, component ) in components.clone().into_iter().enumerate() + { + match component + { + "." => + { + if ( result.ends_with( '/' ) && components.len() > idx + 1 && components[ idx + 1 ].is_empty() ) + || components.len() == idx + 1 + { + result.pop(); + } + } + ".." => + { + if result != "/" + { + if added_slah + { + result.pop(); + added_slah = false; + } + let mut parts : Vec< _ > = result.split( '/' ).collect(); + parts.pop(); + if let Some( part ) = parts.last() + { + if part.is_empty() + { + parts.push( "" ); + } + } + result = parts.join( "/" ); + if result.is_empty() + { + result.push( '/' ); + } + } else + { + result.push_str( &components[ idx.. ].to_vec().join( "/" ) ); + break; + } + } + _ => + { + if !component.is_empty() + { + if result.ends_with( '/' ) + { + result.push_str( component ); + } else + { + result.push( '/' ); + result.push_str( component ); + } + } else if components.len() > idx + 1 && components[ idx + 1 ].is_empty() && path != "/" + { + result.push( '/' ); + } + } + } + } + + if path.ends_with( '/' ) && result != "/" + { + result.push( '/' ); + } + } + + result.into() + } + + /// Extracts multiple extensions from the given path. + /// + /// This function takes a path and returns a vector of strings representing the extensions of the file. + /// If the input path is empty or if it doesn't contain any extensions, it returns an empty vector. + /// + /// # Arguments + /// + /// * `path` - An object that can be converted into a Path reference, representing the file path. + /// + /// # Returns + /// + /// A vector of strings containing the extensions of the file, or an empty vector if the input path is empty or lacks extensions. + /// + /// # Examples + /// + /// ``` + /// use proper_path_tools::path::exts; + /// + /// let path = "/path/to/file.tar.gz"; + /// let extensions = exts( path ); + /// assert_eq!( extensions, vec![ "tar", "gz" ] ); + /// ``` + /// + /// ``` + /// use proper_path_tools::path::exts; + /// + /// let empty_path = ""; + /// let extensions = exts( empty_path ); + /// let expected : Vec< String > = vec![]; + /// assert_eq!( extensions, expected ); + /// ``` + /// + pub fn exts( path : impl AsRef< std::path::Path > ) -> std::vec::Vec< std::string::String > + { + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::string::ToString; + + if let Some( file_name ) = std::path::Path::new( path.as_ref() ).file_name() + { + if let Some( file_name_str ) = file_name.to_str() + { + let mut file_name_str = file_name_str.to_string(); + if file_name_str.starts_with( '.' ) + { + file_name_str.remove( 0 ); + } + if let Some( dot_index ) = file_name_str.find( '.' ) + { + + let extensions = &file_name_str[ dot_index + 1.. ]; + + return extensions.split( '.' ).map( | s | s.to_string() ).collect() + } + } + } + vec![] + } + + /// Extracts the parent directory and file stem (without extension) from the given path. + /// + /// This function takes a path and returns an Option containing the modified path without the extension. + /// If the input path is empty or if it doesn't contain a file stem, it returns None. + /// + /// # Arguments + /// + /// * `path` - An object that can be converted into a Path reference, representing the file path. + /// + /// # Returns + /// + /// An Option containing the modified path without the extension, or None if the input path is empty or lacks a file stem. + /// + /// # Examples + /// + /// ``` + /// use std::path::PathBuf; + /// use proper_path_tools::path::without_ext; + /// + /// let path = "/path/to/file.txt"; + /// let modified_path = without_ext(path); + /// assert_eq!(modified_path, Some(PathBuf::from("/path/to/file"))); + /// ``` + /// + /// ``` + /// use std::path::PathBuf; + /// use proper_path_tools::path::without_ext; + /// + /// let empty_path = ""; + /// let modified_path = without_ext(empty_path); + /// assert_eq!(modified_path, None); + /// ``` + /// + pub fn without_ext( path : impl AsRef< std::path::Path > ) -> core::option::Option< std::path::PathBuf > + { + use std::path::{ Path, PathBuf }; + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::string::String; + + if path.as_ref().to_string_lossy().is_empty() + { + return None; + } + + let path_buf = Path::new( path.as_ref() ); + + let parent = match path_buf.parent() + { + Some( parent ) => parent, + None => return None, + }; + let file_stem = match path_buf.file_stem() + { + Some( name ) => + { + let ends = format!( "{}/", name.to_string_lossy() ); + if path.as_ref().to_string_lossy().ends_with( &ends ) + { + ends + } + else + { + String::from( name.to_string_lossy() ) + } + + } + None => return None, + }; + + let mut full_path = parent.to_path_buf(); + full_path.push( file_stem ); + + Some( PathBuf::from( full_path.to_string_lossy().replace( "\\", "/" ) ) ) + } + + /// Replaces the existing path extension with the provided extension. + /// + /// If the input path is empty or contains non-ASCII characters, or if the provided extension is empty or contains non-ASCII characters, + /// the function returns None. + /// Otherwise, it returns an Option containing the modified path with the new extension. + /// + /// # Arguments + /// + /// * `path` - An object that can be converted into a Path reference, representing the file path. + /// * `ext` - A string slice representing the new extension to be appended to the path. + /// + /// # Returns + /// + /// An Option containing the modified path with the new extension, or None if any of the input parameters are invalid. + /// + /// # Examples + /// + /// ``` + /// use std::path::PathBuf; + /// use proper_path_tools::path::change_ext; + /// + /// let path = "/path/to/file.txt"; + /// let modified_path = change_ext( path, "json" ); + /// assert_eq!( modified_path, Some( PathBuf::from( "/path/to/file.json" ) ) ); + /// ``` + /// + /// ``` + /// use std::path::PathBuf; + /// use proper_path_tools::path::change_ext; + /// + /// let empty_path = ""; + /// let modified_path = change_ext( empty_path, "txt" ); + /// assert_eq!( modified_path, None ); + /// ``` + /// + pub fn change_ext( path : impl AsRef< std::path::Path >, ext : &str ) -> Option< std::path::PathBuf > + { + use std::path::PathBuf; + if path.as_ref().to_string_lossy().is_empty() || !path.as_ref().to_string_lossy().is_ascii() || !ext.is_ascii() + { + return None; + } + + let without_ext = without_ext( path )?; + if ext.is_empty() + { + Some( without_ext ) + } else + { + Some( PathBuf::from( format!( "{}.{}", without_ext.to_string_lossy(), ext ) ) ) + } + } + + /// Finds the common directory path among a collection of paths. + /// + /// Given an iterator of path strings, this function determines the common directory + /// path shared by all paths. If no common directory path exists, it returns `None`. + /// + /// # Arguments + /// + /// * `paths` - An iterator of path strings (`&str`). + /// + /// # Returns + /// + /// * `Option` - The common directory path shared by all paths, if it exists. + /// If no common directory path exists, returns `None`. + /// + /// # Examples + /// + /// ``` + /// use proper_path_tools::path::path_common; + /// + /// let paths = vec![ "/a/b/c", "/a/b/d", "/a/b/e" ]; + /// let common_path = path_common( paths.into_iter() ); + /// assert_eq!( common_path, Some( "/a/b/".to_string() ) ); + /// ``` + /// + pub fn path_common< 'a, I >( paths : I ) -> Option< std::string::String > + where + I: Iterator, + { + use std::collections::HashMap; + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::{ string::{ String, ToString }, vec::Vec }; + + let orig_paths : Vec< String > = paths.map( | path | path.to_string() ).collect(); + + if orig_paths.is_empty() + { + return None; + } + + // Create a map to store directory frequencies + let mut dir_freqs : HashMap< String, usize > = HashMap::new(); + + let mut paths = orig_paths.clone(); + // Iterate over paths to count directory frequencies + for path in paths.iter_mut() + { + path_remove_dots( path ); + path_remove_double_dots( path ); + // Split path into directories + let dirs : Vec< &str > = path.split( '/' ).collect(); + + // Iterate over directories + for i in 0..dirs.len() + { + + // Construct directory path + let mut dir_path = dirs[ 0..i + 1 ].join( "/" ); + + + // Increment frequency count + *dir_freqs.entry( dir_path.clone() ).or_insert( 0 ) += 1; + + if i != dirs.len() - 1 && !dirs[ i + 1 ].is_empty() + { + dir_path.push( '/' ); + *dir_freqs.entry( dir_path ).or_insert( 0 ) += 1; + } + } + } + + // Find the directory with the highest frequency + let common_dir = dir_freqs + .into_iter() + .filter( | ( _, freq ) | *freq == paths.len() ) + .map( | ( dir, _ ) | dir ) + .max_by_key( | dir | dir.len() ) + .unwrap_or_default(); + + let mut result = common_dir.to_string(); + + if result.is_empty() + { + if orig_paths.iter().any( | path | path.starts_with( '/' ) ) + { + result.push( '/' ); + } + else if orig_paths.iter().any( | path | path.starts_with( ".." ) ) + { + result.push_str( ".." ); + } + else + { + result.push( '.' ); + } + + } + + Some( result ) + + + } + + /// Removes dot segments (".") from the given path string. + /// + /// Dot segments in a path represent the current directory and can be safely removed + /// without changing the meaning of the path. + /// + /// # Arguments + /// + /// * `path` - A mutable reference to a string representing the path to be cleaned. + /// + fn path_remove_dots( path : &mut std::string::String ) + { + let mut cleaned_parts = vec![]; + for part in path.split( '/' ) + { + if part == "." + { + continue; + } + cleaned_parts.push( part ); + } + *path = cleaned_parts.join( "/" ); + } + + /// Removes dot-dot segments ("..") from the given path string. + /// + /// Dot-dot segments in a path represent the parent directory and can be safely resolved + /// to simplify the path. + /// + /// # Arguments + /// + /// * `path` - A mutable reference to a string representing the path to be cleaned. + /// + fn path_remove_double_dots( path : &mut std::string::String ) + { + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::vec::Vec; + + let mut cleaned_parts: Vec< &str > = Vec::new(); + let mut delete_empty_part = false; + for part in path.split( '/' ) + { + if part == ".." + { + if let Some( pop ) = cleaned_parts.pop() + { + if pop.is_empty() + { + delete_empty_part = true; + } + if pop == ".." + { + cleaned_parts.push(".."); + cleaned_parts.push(".."); + } + } + else + { + cleaned_parts.push( ".." ); + } + } + else + { + cleaned_parts.push( part ); + } + } + if delete_empty_part + { + *path = format!( "/{}", cleaned_parts.join( "/" ) ); + } + else + { + *path = cleaned_parts.join( "/" ); + } + + } + + /// Rebase the file path relative to a new base path, optionally removing a common prefix. + /// + /// # Arguments + /// + /// * `file_path` - The original file path to rebase. + /// * `new_path` - The new base path to which the file path will be rebased. + /// * `old_path` - An optional common prefix to remove from the file path before rebasing. + /// + /// # Returns + /// + /// Returns the rebased file path if successful, or None if any error occurs. + /// + /// # Examples + /// + /// Rebase a file path to a new base path without removing any common prefix: + /// + /// ``` + /// use std::path::PathBuf; + /// + /// let file_path = "/home/user/documents/file.txt"; + /// let new_path = "/mnt/storage"; + /// let rebased_path = proper_path_tools::path::rebase( file_path, new_path, None ).unwrap(); + /// assert_eq!( rebased_path, PathBuf::from( "/mnt/storage/home/user/documents/file.txt" ) ); + /// ``` + /// + /// Rebase a file path to a new base path after removing a common prefix: + /// + /// ``` + /// use std::path::PathBuf; + /// + /// let file_path = "/home/user/documents/file.txt"; + /// let new_path = "/mnt/storage"; + /// let old_path = "/home/user"; + /// let rebased_path = proper_path_tools::path::rebase( file_path, new_path, Some( old_path ) ).unwrap(); + /// assert_eq!( rebased_path, PathBuf::from( "/mnt/storage/documents/file.txt" ) ); + /// ``` + /// + pub fn rebase< T : AsRef< std::path::Path > >( file_path : T, new_path : T, old_path : Option< T > ) -> Option< std::path::PathBuf > + { + use std::path::Path; + use std::path::PathBuf; + let new_path = Path::new( new_path.as_ref() ); + let mut main_file_path = Path::new( file_path.as_ref() ); + if old_path.is_some() + { + let common = path_common( vec![ file_path.as_ref().to_str().unwrap(), old_path.unwrap().as_ref().to_str().unwrap() ].into_iter() )?; + + main_file_path = match main_file_path.strip_prefix( common ) + { + Ok( rel ) => rel, + Err( _ ) => return None, + }; + } + let mut rebased_path = PathBuf::new(); + rebased_path.push( new_path ); + rebased_path.push( main_file_path.strip_prefix( "/" ).unwrap_or( main_file_path ) ); + Some( normalize( rebased_path ) ) + } + + + /// Computes the relative path from one path to another. + /// + /// This function takes two paths and returns a relative path from the `from` path to the `to` path. + /// If the paths have different roots, the function returns the `to` path. + /// + /// # Arguments + /// + /// * `from` - The starting path. + /// * `to` - The target path. + /// + /// # Returns + /// + /// A `std::path::PathBuf` representing the relative path from `from` to `to`. + /// + /// # Examples + /// + /// ``` + /// use std::path::PathBuf; + /// + /// let from = "/a/b"; + /// let to = "/a/c/d"; + /// let relative_path = proper_path_tools::path::path_relative( from, to ); + /// assert_eq!( relative_path, PathBuf::from( "../c/d" ) ); + /// ``` + pub fn path_relative< T : AsRef< std::path::Path > >( from : T, to : T ) -> std::path::PathBuf + { + use std::path::PathBuf; + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::{ vec::Vec, string::ToString }; + + let mut from = from.as_ref().to_string_lossy().to_string(); + let mut to = to.as_ref().to_string_lossy().to_string(); + from = from.replace( ':', "" ); + to = to.replace( ':', "" ); + if from == "./" + { + from.push_str( &to ); + return PathBuf::from( from ) + } + if from == "." + { + return PathBuf::from( to ) + } + path_remove_double_dots( &mut from ); + path_remove_double_dots( &mut to ); + path_remove_dots( &mut from ); + path_remove_dots( &mut to ); + + let mut from_parts: Vec< &str > = from.split( '/' ).collect(); + let mut to_parts: Vec< &str > = to.split( '/' ).collect(); + if from_parts.len() == 1 && from_parts[ 0 ].is_empty() + { + from_parts.pop(); + } + if to_parts.len() == 1 && to_parts[ 0 ].is_empty() + { + to_parts.pop(); + } + let mut common_prefix = 0; + for ( idx, ( f, t ) ) in from_parts.iter().zip( to_parts.iter() ).enumerate() + { + if f != t + { + break; + } + common_prefix = idx + 1; + } + let mut result = Vec::new(); + // Add ".." for each directory not in common + for i in common_prefix..from_parts.len() + { + if from_parts[ common_prefix ].is_empty() || + ( + i == from_parts.len() - 1 + && from_parts[ i ].is_empty() + && !to_parts.last().unwrap_or( &"" ).is_empty() + ) + { + continue; + } + result.push( ".." ); + } + // Add the remaining directories from 'to' + for part in to_parts.iter().skip( common_prefix ) + { + result.push( *part ); + } + // Join the parts into a string + let mut relative_path = result.join( "/" ); + // If the relative path is empty or the 'to' path is the same as the 'from' path, + // set the relative path to "." + if relative_path.is_empty() || from == to + { + relative_path = ".".to_string(); + } + + if to.ends_with( '/' ) && !relative_path.ends_with( '/' ) && to != "/" + { + relative_path.push( '/' ); + } + if from.ends_with( '/' ) && to.starts_with( '/' ) && relative_path.starts_with( ".." ) && relative_path != ".." + { + relative_path.replace_range( ..2 , "." ); + } + if from.ends_with( '/' ) && to.starts_with( '/' ) && relative_path == ".." + { + relative_path = "./..".to_string(); + } + PathBuf::from( relative_path ) + } + + + + + /// Extracts the extension from the given path. + /// + /// This function takes a path and returns a string representing the extension of the file. + /// If the input path is empty or if it doesn't contain an extension, it returns an empty string. + /// + /// # Arguments + /// + /// * `path` - An object that can be converted into a Path reference, representing the file path. + /// + /// # Returns + /// + /// A string containing the extension of the file, or an empty string if the input path is empty or lacks an extension. + /// + /// # Examples + /// + /// ``` + /// use proper_path_tools::path::ext; + /// + /// let path = "/path/to/file.txt"; + /// let extension = ext( path ); + /// assert_eq!( extension, "txt" ); + /// ``` + /// + /// ``` + /// use proper_path_tools::path::ext; + /// + /// let empty_path = ""; + /// let extension = ext( empty_path ); + /// assert_eq!( extension, "" ); + /// ``` + /// + pub fn ext( path : impl AsRef< std::path::Path > ) -> std::string::String + { + use std::path::Path; + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::string::{ String, ToString }; + + if path.as_ref().to_string_lossy().is_empty() + { + return String::new(); + } + let path_buf = Path::new( path.as_ref() ); + match path_buf.extension() + { + Some( ext ) => ext.to_string_lossy().to_string(), + None => String::new(), + } + } +} + +crate::mod_interface! { + protected use ext; + protected use exts; + protected use change_ext; + protected use path_relative; + protected use rebase; + protected use path_common; + protected use join_paths; + protected use without_ext; + protected use is_glob; + protected use normalize; + protected use canonicalize; + #[ cfg( feature = "path_unique_folder_name" ) ] + protected use unique_folder_name; + + /// Describe absolute path. Prefer using absolute path instead of relative when ever possible. + layer absolute_path; + +} diff --git a/module/core/proper_path_tools/src/path/absolute_path.rs b/module/core/proper_path_tools/src/path/absolute_path.rs new file mode 100644 index 0000000000..115c71d37b --- /dev/null +++ b/module/core/proper_path_tools/src/path/absolute_path.rs @@ -0,0 +1,128 @@ +/// Internal namespace. +pub( crate ) mod private +{ + #[cfg(feature="no_std")] + extern crate std; + use crate::*; + use std:: + { + borrow::Cow, + fmt, + path::{ Path, PathBuf }, + }; + #[ cfg( feature = "derive_serde" ) ] + use serde::{ Serialize, Deserialize }; + + /// Absolute path. + #[ cfg_attr( feature = "derive_serde", derive( Serialize, Deserialize ) ) ] + #[ derive( Debug, Default, Clone, Ord, PartialOrd, Eq, PartialEq, Hash ) ] + pub struct AbsolutePath( PathBuf ); + + impl fmt::Display for AbsolutePath + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + write!( f, "{}", self.0.display() ) + } + } + + impl< 'a > TryFrom< &'a str > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : &'a str ) -> Result< Self, Self::Error > + { + Ok( Self( path::canonicalize( value )? ) ) + } + } + + impl TryFrom< PathBuf > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : PathBuf ) -> Result< Self, Self::Error > + { + Ok( Self( path::canonicalize( value )? ) ) + } + } + + // xxx : qqq : use Into< Path > + impl TryFrom< &Path > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : &Path ) -> Result< Self, Self::Error > + { + Ok( Self( path::canonicalize( value )? ) ) + } + } + + impl From< AbsolutePath > for PathBuf + { + fn from( abs_path: AbsolutePath ) -> Self + { + abs_path.0 + } + } + + +// impl TryFrom< Utf8PathBuf > for AbsolutePath +// { +// type Error = std::io::Error; +// +// fn try_from( value : Utf8PathBuf ) -> Result< Self, Self::Error > +// { +// AbsolutePath::try_from( value.as_std_path() ) +// } +// } + +// impl TryFrom< &Utf8Path > for AbsolutePath +// { +// type Error = std::io::Error; +// +// fn try_from( value : &Utf8Path ) -> Result< Self, Self::Error > +// { +// AbsolutePath::try_from( value.as_std_path() ) +// } +// } + + // xxx : use derives + impl AsRef< Path > for AbsolutePath + { + fn as_ref( &self ) -> &Path + { + self.0.as_ref() + } + } + + impl AbsolutePath + { + /// Returns the Path without its final component, if there is one. + /// Returns None if the path terminates in a root or prefix, or if it's the empty string. + pub fn parent( &self ) -> Option< AbsolutePath > + { + self.0.parent().map( PathBuf::from ).map( AbsolutePath ) + } + + /// Creates an owned `AbsolutePath` with path adjoined to self. + pub fn join< P >( &self, path : P ) -> AbsolutePath + where + P : AsRef< Path >, + { + Self::try_from( self.0.join( path ) ).unwrap() + } + + /// Converts a `AbsolutePath` to a `Cow` + pub fn to_string_lossy( &self ) -> Cow< '_, str > + { + self.0.to_string_lossy() + } + + } + +} + +crate::mod_interface! +{ + exposed use AbsolutePath; +} diff --git a/module/core/proper_path_tools/tests/experiment.rs b/module/core/proper_path_tools/tests/experiment.rs new file mode 100644 index 0000000000..29e2cd3eba --- /dev/null +++ b/module/core/proper_path_tools/tests/experiment.rs @@ -0,0 +1,20 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use proper_path_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +// #[ cfg( feature = "enabled" ) ] +// #[ test ] +// fn path_with_dotdot_segments_that_fully_resolve() +// { +// +// let path = std::path::PathBuf::from( "a/b/c/../../.." ); +// let exp = "."; +// let normalized = the_module::path::normalize( &path ); +// let got = normalized.to_str().unwrap(); +// a_id!( exp, got, "Failed: path_with_dotdot_segments_that_fully_resolve_in_relative_path. Expected: '{}', got: '{}'", exp, got ); +// +// } diff --git a/module/core/proper_path_tools/tests/inc/absolute_path.rs b/module/core/proper_path_tools/tests/inc/absolute_path.rs new file mode 100644 index 0000000000..9ef2c83a5f --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/absolute_path.rs @@ -0,0 +1,106 @@ +#[ allow( unused_imports ) ] +use super::*; +use the_module::AbsolutePath; +use std::path::Path; +use std::path::PathBuf; + +#[ test ] +fn basic() +{ + let path1 = "/some/absolute/path"; + let got : AbsolutePath = path1.try_into().unwrap(); + println!( "got : {}", &got ); + println!( "path1 : {}", &path1 ); + a_id!( &got.to_string(), path1 ); +} + +#[ test ] +fn test_to_string_lossy() +{ + let path : AbsolutePath = "/path/to/file.txt".try_into().unwrap(); + let result = path.to_string_lossy(); + assert_eq!( result, "/path/to/file.txt" ); +} +#[test] +fn test_to_string_lossy_hard() +{ + let abs_path : AbsolutePath = "/path/with/😀/unicode.txt".try_into().unwrap(); + let string_lossy = abs_path.to_string_lossy(); + assert_eq!( string_lossy, "/path/with/\u{1F600}/unicode.txt" ); +} + + +#[test] +fn test_try_from_pathbuf() +{ + + let path_buf = PathBuf::from( "/path/to/some/file.txt" ); + let abs_path : AbsolutePath = path_buf.try_into().unwrap(); + assert_eq!( abs_path.to_string_lossy(), "/path/to/some/file.txt" ); +} + +#[test] +fn test_try_from_path() +{ + let path = Path::new( "/path/to/some/file.txt" ); + let abs_path : AbsolutePath = path.try_into().unwrap(); + assert_eq!( abs_path.to_string_lossy(), "/path/to/some/file.txt" ); +} + +#[test] +fn test_parent() +{ + let abs_path : AbsolutePath = "/path/to/some/file.txt".try_into().unwrap(); + let parent_path = abs_path.parent().unwrap(); + assert_eq!( parent_path.to_string_lossy(), "/path/to/some" ); +} + +#[test] +fn test_join() +{ + let abs_path : AbsolutePath = "/path/to/some".try_into().unwrap(); + let joined_path = abs_path.join( "file.txt" ); + assert_eq!( joined_path.to_string_lossy(), "/path/to/some/file.txt" ); +} + + +#[test] +fn test_relative_path_try_from_str() +{ + let rel_path_str = "src/main.rs"; + let rel_path = AbsolutePath::try_from( rel_path_str ).unwrap(); + assert_eq!( rel_path.to_string_lossy(), "src/main.rs" ); +} + +#[test] +fn test_relative_path_try_from_pathbuf() +{ + let rel_path_buf = PathBuf::from( "src/main.rs" ); + let rel_path = AbsolutePath::try_from( rel_path_buf.clone() ).unwrap(); + assert_eq!( rel_path.to_string_lossy(), "src/main.rs" ); +} + +#[test] +fn test_relative_path_try_from_path() +{ + let rel_path = Path::new( "src/main.rs" ); + let rel_path_result = AbsolutePath::try_from( rel_path ); + assert!( rel_path_result.is_ok() ); + assert_eq!( rel_path_result.unwrap().to_string_lossy(), "src/main.rs" ); +} + +#[test] +fn test_relative_path_parent() +{ + let rel_path = AbsolutePath::try_from( "src/main.rs" ).unwrap(); + let parent_path = rel_path.parent().unwrap(); + assert_eq!( parent_path.to_string_lossy(), "src" ); +} + +#[test] +fn test_relative_path_join() +{ + let rel_path = AbsolutePath::try_from( "src" ).unwrap(); + let joined = rel_path.join( "main.rs" ); + assert_eq!( joined.to_string_lossy(), "src/main.rs" ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/mod.rs b/module/core/proper_path_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..31872cad50 --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/mod.rs @@ -0,0 +1,18 @@ +#[allow(unused_imports)] + +use super::*; + +mod absolute_path; +mod path_change_ext; +mod path_common; +mod path_ext; +mod path_exts; +mod path_is_glob; +mod path_join; +mod path_normalize; +mod path_relative; +mod rebase_path; +mod without_ext; + +#[cfg(feature = "path_unique_folder_name")] +mod path_unique_folder_name; diff --git a/module/core/proper_path_tools/tests/inc/path_change_ext.rs b/module/core/proper_path_tools/tests/inc/path_change_ext.rs new file mode 100644 index 0000000000..caf19a5c51 --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_change_ext.rs @@ -0,0 +1,107 @@ +#[ allow( unused_imports ) ] +use super::*; + + +#[ test ] +fn test_empty_ext() +{ + let got = the_module::path::change_ext( "some.txt", "" ); + let expected = "some"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_simple_change_extension() +{ + let got = the_module::path::change_ext( "some.txt", "json" ); + let expected = "some.json"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_path_with_non_empty_dir_name() +{ + let got = the_module::path::change_ext( "/foo/bar/baz.asdf", "txt" ); + let expected = "/foo/bar/baz.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_change_extension_of_hidden_file() +{ + let got = the_module::path::change_ext( "/foo/bar/.baz", "sh" ); + let expected = "/foo/bar/.baz.sh"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_change_extension_in_composite_file_name() +{ + let got = the_module::path::change_ext( "/foo.coffee.md", "min" ); + let expected = "/foo.coffee.min"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_add_extension_to_file_without_extension() +{ + let got = the_module::path::change_ext( "/foo/bar/baz", "txt" ); + let expected = "/foo/bar/baz.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_path_folder_contains_dot_file_without_extension() +{ + let got = the_module::path::change_ext( "/foo/baz.bar/some.md", "txt" ); + let expected = "/foo/baz.bar/some.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_relative_path_1() +{ + let got = the_module::path::change_ext( "./foo/.baz", "txt" ); + let expected = "./foo/.baz.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_relative_path_2() +{ + let got = the_module::path::change_ext( "./.baz", "txt" ); + let expected = "./.baz.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_relative_path_3() +{ + let got = the_module::path::change_ext( ".baz", "txt" ); + let expected = ".baz.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_relative_path_4() +{ + let got = the_module::path::change_ext( "./baz", "txt" ); + let expected = "./baz.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_relative_path_5() +{ + let got = the_module::path::change_ext( "./foo/baz", "txt" ); + let expected = "./foo/baz.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn test_relative_path_6() +{ + let got = the_module::path::change_ext( "./foo/", "txt" ); + let expected = "./foo/.txt"; + assert_eq!( got.unwrap().to_string_lossy(), expected ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/path_common.rs b/module/core/proper_path_tools/tests/inc/path_common.rs new file mode 100644 index 0000000000..b491d2106c --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_common.rs @@ -0,0 +1,506 @@ +#[ allow( unused_imports ) ] +use super::*; + + +#[ test ] +fn test_with_empty_array() +{ + let paths : Vec< &str > = vec![]; + let got = the_module::path::path_common( paths.into_iter() ); + assert_eq!( got, None ); +} + +// absolute-absolute + +#[ test ] +fn test_absolute_absolute_have_common_dir() +{ + let got = the_module::path::path_common( vec![ "/a1/b2", "/a1/a" ].into_iter() ).unwrap(); + assert_eq!( got, "/a1/" ); +} + +#[ test ] +fn test_absolute_absolute_have_common_dir_2() +{ + let got = the_module::path::path_common( vec![ "/a1/b1/c", "/a1/b1/d", "/a1/b2" ].into_iter() ).unwrap(); + assert_eq!( got, "/a1/" ); +} + +#[ test ] +fn test_absolute_absolute_have_common_dir_and_part_of_name() +{ + let got = the_module::path::path_common( vec![ "/a1/b2", "/a1/b1" ].into_iter() ).unwrap(); + assert_eq!( got, "/a1/" ); +} + +#[ test ] +fn test_absolute_absolute_one_path_has_dots_identical_paths() +{ + let got = the_module::path::path_common( vec![ "/a1/x/../b1", "/a1/b1" ].into_iter() ).unwrap(); + assert_eq!( got, "/a1/b1" ); +} + +#[ test ] +fn test_absolute_absolute_more_than_one_dir_in_common_path() +{ + let got = the_module::path::path_common( vec![ "/a1/b1/c1", "/a1/b1/c" ].into_iter() ).unwrap(); + assert_eq!( got, "/a1/b1/" ); +} + +#[ test ] +fn test_absolute_absolute_one_path_have_dots_no_common_dirs() +{ + let got = the_module::path::path_common( vec![ "/a1/../../b1/c1", "/a1/b1/c1" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_absolute_dir_name_is_part_of_another_dir_name() +{ + let got = the_module::path::path_common( vec![ "/abcd", "/ab" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_absolute_dir_names_has_dots_have_common_path() +{ + let got = the_module::path::path_common( vec![ "/.a./.b./.c.", "/.a./.b./.c" ].into_iter() ).unwrap(); + assert_eq!( got, "/.a./.b./" ); +} + +#[ test ] +fn test_absolute_absolute_one_path_has_several_slashes_the_other_has_not_not_identical() +{ + let got = the_module::path::path_common( vec![ "//a//b//c", "/a/b" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_absolute_identical_paths_with_several_slashes() +{ + let got = the_module::path::path_common( vec![ "/a//b", "/a//b" ].into_iter() ).unwrap(); + assert_eq!( got, "/a//b" ); +} + +#[ test ] +fn test_absolute_absolute_identical_paths_with_several_slashes_2() +{ + let got = the_module::path::path_common( vec![ "/a//", "/a//" ].into_iter() ).unwrap(); + assert_eq!( got, "/a//" ); +} + +#[ test ] +fn test_absolute_absolute_one_path_has_here_token_dirs_identical_paths() +{ + let got = the_module::path::path_common( vec![ "/./a/./b/./c", "/a/b" ].into_iter() ).unwrap(); + assert_eq!( got, "/a/b" ); +} + +#[ test ] +fn test_absolute_absolute_different_case_in_path_name_not_identical() +{ + let got = the_module::path::path_common( vec![ "/A/b/c", "/a/b/c" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_absolute_one_path_is_root_directory_common_root_directory() +{ + let got = the_module::path::path_common( vec![ "/", "/x" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_absolute_different_paths_in_root_directory_common_root_directory() +{ + let got = the_module::path::path_common( vec![ "/a", "/x" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + + +// more than 2 path in arguments + +#[ test ] +fn test_absolute_absolute_more_than_2_path_in_arguments() +{ + let got = the_module::path::path_common( vec![ "/a/b/c", "/a/b/c", "/a/b/c", "/a/b/c" ].into_iter() ).unwrap(); + assert_eq!( got, "/a/b/c" ); +} + +#[ test ] +fn test_absolute_absolute_more_than_2_path_in_arguments_variant2() +{ + let got = the_module::path::path_common( vec![ "/a/b/c", "/a/b/c", "/a/b" ].into_iter() ).unwrap(); + assert_eq!( got, "/a/b" ); +} + +#[ test ] +fn test_absolute_absolute_more_than_2_path_in_arguments_variant3() +{ + let got = the_module::path::path_common( vec![ "/a/b/c", "/a/b/c", "/a/b1" ].into_iter() ).unwrap(); + assert_eq!( got, "/a/" ); +} + +#[ test ] +fn test_absolute_absolute_more_than_2_path_in_arguments_variant4() +{ + let got = the_module::path::path_common( vec![ "/a/b/c", "/a/b/c", "/a" ].into_iter() ).unwrap(); + assert_eq!( got, "/a" ); +} + +#[ test ] +fn test_absolute_absolute_more_than_2_path_in_arguments_variant5() +{ + let got = the_module::path::path_common( vec![ "/a/b/c", "/a/b/c", "/x" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_absolute_more_than_2_path_in_arguments_variant6() +{ + let got = the_module::path::path_common( vec![ "/a/b/c", "/a/b/c", "/" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + + + + + + + + + +// absolute-relative + +#[ test ] +fn test_absolute_relative_root_and_down_token() +{ + let got = the_module::path::path_common( vec![ "/", ".." ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_relative_root_and_here_token() +{ + let got = the_module::path::path_common( vec![ "/", "." ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_relative_root_and_some_relative_directory() +{ + let got = the_module::path::path_common( vec![ "/", "x" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_relative_root_and_double_down_token_in_path() +{ + let got = the_module::path::path_common( vec![ "/", "../.." ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_relative_root_with_here_token_and_down_token() +{ + let got = the_module::path::path_common( vec![ "/.", ".." ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_relative_root_with_here_token_and_here_token() +{ + let got = the_module::path::path_common( vec![ "/.", "." ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_relative_root_with_here_token_and_some_relative_directory() +{ + let got = the_module::path::path_common( vec![ "/.", "x" ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + +#[ test ] +fn test_absolute_relative_root_with_here_token_and_double_down_token_in_path() +{ + let got = the_module::path::path_common( vec![ "/.", "../.." ].into_iter() ).unwrap(); + assert_eq!( got, "/" ); +} + + + + + + + +// relative - relative +#[ test ] +fn test_relative_relative_common_dir() +{ + let got = the_module::path::path_common( vec![ "a1/b2", "a1/a" ].into_iter() ).unwrap(); + assert_eq!( got, "a1/" ); +} + +#[ test ] +fn test_relative_relative_common_dir_and_part_of_dir_names() +{ + let got = the_module::path::path_common( vec![ "a1/b2", "a1/b1" ].into_iter() ).unwrap(); + assert_eq!( got, "a1/" ); +} + +#[ test ] +fn test_relative_relative_one_path_with_down_token_dir_identical_paths() +{ + let got = the_module::path::path_common( vec![ "a1/x/../b1", "a1/b1" ].into_iter() ).unwrap(); + assert_eq!( got, "a1/b1" ); +} + +#[ test ] +fn test_relative_relative_paths_begins_with_here_token_directory_dots_identical_paths() +{ + let got = the_module::path::path_common( vec![ "./a1/x/../b1", "./a1/b1" ].into_iter() ).unwrap(); + assert_eq!( got, "a1/b1" ); +} + +#[ test ] +fn test_relative_relative_one_path_begins_with_here_token_dir_another_down_token() +{ + let got = the_module::path::path_common( vec![ "./a1/x/../b1", "../a1/b1" ].into_iter() ).unwrap(); + assert_eq!( got, ".." ); +} + +#[ test ] +fn test_relative_relative_here_token_and_down_token() +{ + let got = the_module::path::path_common( vec![ ".", ".." ].into_iter() ).unwrap(); + assert_eq!( got, ".." ); +} + +#[ test ] +fn test_relative_relative_different_paths_start_with_here_token_dir() +{ + let got = the_module::path::path_common( vec![ "./b/c", "./x" ].into_iter() ).unwrap(); + assert_eq!( got, "." ); +} + + + + +//combinations of paths with dots + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots() +{ + let got = the_module::path::path_common( vec![ "./././a", "./a/b" ].into_iter() ).unwrap(); + assert_eq!( got, "a" ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant2() +{ + let got = the_module::path::path_common( vec![ "./a/./b", "./a/b" ].into_iter() ).unwrap(); + assert_eq!( got, "a/b" ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant3() +{ + let got = the_module::path::path_common( vec![ "./a/./b", "./a/c/../b" ].into_iter() ).unwrap(); + assert_eq!( got, "a/b" ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant4() +{ + let got = the_module::path::path_common( vec![ "../b/c", "./x" ].into_iter() ).unwrap(); + assert_eq!( got, ".." ); +} + + + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant9() +{ + let got = the_module::path::path_common( vec![ "../../..", "./../../.." ].into_iter() ).unwrap(); + assert_eq!( got, "../../.." ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant10() +{ + let got = the_module::path::path_common( vec![ "./../../..", "./../../.." ].into_iter() ).unwrap(); + assert_eq!( got, "../../.." ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant11() +{ + let got = the_module::path::path_common( vec![ "../../..", "../../.." ].into_iter() ).unwrap(); + assert_eq!( got, "../../.." ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant12() +{ + let got = the_module::path::path_common( vec![ "../b", "../b" ].into_iter() ).unwrap(); + assert_eq!( got, "../b" ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant13() +{ + let got = the_module::path::path_common( vec![ "../b", "./../b" ].into_iter() ).unwrap(); + assert_eq!( got, "../b" ); +} + + +// several relative paths + +#[ test ] +fn test_relative_relative_several_relative_paths() +{ + let got = the_module::path::path_common( vec![ "a/b/c", "a/b/c", "a/b/c" ].into_iter() ).unwrap(); + assert_eq!( got, "a/b/c" ); +} + +#[ test ] +fn test_relative_relative_several_relative_paths_variant2() +{ + let got = the_module::path::path_common( vec![ "a/b/c", "a/b/c", "a/b" ].into_iter() ).unwrap(); + assert_eq!( got, "a/b" ); +} + +#[ test ] +fn test_relative_relative_several_relative_paths_variant3() +{ + let got = the_module::path::path_common( vec![ "a/b/c", "a/b/c", "a/b1" ].into_iter() ).unwrap(); + assert_eq!( got, "a/" ); +} + +#[ test ] +fn test_relative_relative_several_relative_paths_variant4() +{ + let got = the_module::path::path_common( vec![ "a/b/c", "a/b/c", "." ].into_iter() ).unwrap(); + assert_eq!( got, "." ); +} + +#[ test ] +fn test_relative_relative_several_relative_paths_variant5() +{ + let got = the_module::path::path_common( vec![ "a/b/c", "a/b/c", "x" ].into_iter() ).unwrap(); + assert_eq!( got, "." ); +} + +#[ test ] +fn test_relative_relative_several_relative_paths_variant6() +{ + let got = the_module::path::path_common( vec![ "a/b/c", "a/b/c", "./" ].into_iter() ).unwrap(); + assert_eq!( got, "." ); +} + +#[ test ] +fn test_relative_relative_several_relative_paths_variant7() +{ + let got = the_module::path::path_common( vec![ "../a/b/c", "a/../b/c", "a/b/../c" ].into_iter() ).unwrap(); + assert_eq!( got, ".." ); +} + + + +#[ test ] +fn test_relative_relative_dot_and_double_up_and_down_tokens() +{ + let got = the_module::path::path_common( vec![ ".", "./", ".." ].into_iter() ).unwrap(); + assert_eq!( got, ".." ); +} + + + +/* + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant5() +{ + let got = the_module::path::path_common( vec![ "../../b/c", "../b" ].into_iter() ).unwrap(); + assert_eq!( got, "../.." ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant6() +{ + let got = the_module::path::path_common( vec![ "../../b/c", "../../../x" ].into_iter() ).unwrap(); + assert_eq!( got, "../../.." ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant7() +{ + let got = the_module::path::path_common( vec![ "../../b/c/../../x", "../../../x" ].into_iter() ).unwrap(); + assert_eq!( got, "../../.." ); +} + +#[ test ] +fn test_relative_relative_combinations_of_paths_with_dots_variant8() +{ + let got = the_module::path::path_common( vec![ "./../../b/c/../../x", "./../../../x" ].into_iter() ).unwrap(); + assert_eq!( got, "../../.." ); +} + + +#[ test ] +fn test_relative_relative_dot_and_double_up_and_down_tokens_variant2() +{ + let got = the_module::path::path_common( vec![ ".", "./../..", ".." ].into_iter() ).unwrap(); + assert_eq!( got, "../.." ); +} + +#[ test ] +fn test_relative_relative_several_relative_paths_variant8() +{ + let got = the_module::path::path_common( vec![ "./a/b/c", "../../a/b/c", "../../../a/b" ].into_iter() ).unwrap(); + assert_eq!( got, "../../.." ); +} + + + + + + + + + +#[ test ] +#[ should_panic ] +fn test_first_path_is_absolute_another_is_dots() +{ + the_module::path::path_common( vec![ "/a", ".."]); +} + +#[ test ] +#[ should_panic ] +fn test_first_path_is_dots_and_absolute_path() +{ + the_module::path::path_common( vec![ "..", "../../b/c", "/a"]); +} + +#[ test ] +#[ should_panic ] +fn test_first_path_is_dots_and_absolute_path_variant2() +{ + the_module::path::path_common( vec![ "../..", "../../b/c", "/a"]); +} + +#[ test ] +#[ should_panic ] +fn test_unknown_path() +{ + the_module::path::path_common( vec![ "/a", "x"]); +} + +#[ test ] +#[ should_panic ] +fn test_unknown_path_variant2() +{ + the_module::path::path_common( vec![ "x", "/a/b/c", "/a"]); +} */ \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/path_ext.rs b/module/core/proper_path_tools/tests/inc/path_ext.rs new file mode 100644 index 0000000000..63de0bfcca --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_ext.rs @@ -0,0 +1,44 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn empty_path() +{ + let path = ""; + assert_eq!( the_module::path::ext( path ), "" ); +} + +#[ test ] +fn txt_extension() +{ + let path = "some.txt"; + assert_eq!( the_module::path::ext( path ), "txt" ); +} + +#[ test ] +fn path_with_non_empty_dir_name() +{ + let path = "/foo/bar/baz.asdf"; + assert_eq!( the_module::path::ext( path ), "asdf" ); +} + +#[ test ] +fn hidden_file() +{ + let path = "/foo/bar/.baz"; + assert_eq!( the_module::path::ext( path ), "" ); +} + +#[ test ] +fn several_extension() +{ + let path = "/foo.coffee.md"; + assert_eq!( the_module::path::ext( path ), "md" ); +} + +#[ test ] +fn file_without_extension() +{ + let path = "/foo/bar/baz"; + assert_eq!( the_module::path::ext( path ), "" ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/path_exts.rs b/module/core/proper_path_tools/tests/inc/path_exts.rs new file mode 100644 index 0000000000..2e96a55341 --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_exts.rs @@ -0,0 +1,50 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn empty_path() +{ + let path = ""; + let expected : Vec< String > = vec![]; + assert_eq!( the_module::path::exts( path ), expected ); +} + +#[ test ] +fn txt_extension() +{ + let path = "some.txt"; + let expected : Vec< String > = vec![ "txt".to_string() ]; + assert_eq!( the_module::path::exts( path ), expected ); +} + +#[ test ] +fn path_with_non_empty_dir_name() +{ + let path = "/foo/bar/baz.asdf"; + let expected : Vec< String > = vec![ "asdf".to_string() ]; + assert_eq!( the_module::path::exts( path ), expected ); +} + +#[ test ] +fn hidden_file() +{ + let path = "/foo/bar/.baz"; + let expected : Vec< String > = vec![]; + assert_eq!( the_module::path::exts( path ), expected ); +} + +#[ test ] +fn several_extension() +{ + let path = "/foo.coffee.md"; + let expected : Vec< String > = vec![ "coffee".to_string(), "md".to_string() ]; + assert_eq!( the_module::path::exts( path ), expected ); +} + +#[ test ] +fn hidden_file_extension() +{ + let path = "/foo/bar/.baz.txt"; + let expected : Vec< String > = vec![ "txt".to_string() ]; + assert_eq!( the_module::path::exts( path ), expected ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/path_is_glob.rs b/module/core/proper_path_tools/tests/inc/path_is_glob.rs new file mode 100644 index 0000000000..c0f695b1d9 --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_is_glob.rs @@ -0,0 +1,93 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn path_with_no_glob_patterns() +{ + assert_eq!( the_module::path::is_glob( "file.txt" ), false ); +} + +#[ test ] +fn path_with_unescaped_glob_star() +{ + assert_eq!( the_module::path::is_glob( "*.txt" ), true ); +} + +#[ test ] +fn path_with_escaped_glob_star() +{ + assert_eq!( the_module::path::is_glob( "\\*.txt" ), false ); +} + +#[ test ] +fn path_with_unescaped_brackets() +{ + assert_eq!( the_module::path::is_glob( "file[0-9].txt" ), true ); +} + +#[ test ] +fn path_with_escaped_brackets() +{ + assert_eq!( the_module::path::is_glob( "file\\[0-9].txt" ), false ); +} + +#[ test ] +fn path_with_unescaped_question_mark() +{ + assert_eq!( the_module::path::is_glob( "file?.txt" ), true ); +} + +#[ test ] +fn path_with_escaped_question_mark() +{ + assert_eq!( the_module::path::is_glob( "file\\?.txt" ), false ); +} + +#[ test ] +fn path_with_unescaped_braces() +{ + assert_eq!( the_module::path::is_glob( "file{a,b}.txt" ), true ); +} + +#[ test ] +fn path_with_escaped_braces() +{ + assert_eq!( the_module::path::is_glob( "file\\{a,b}.txt" ), false ); +} + +#[ test ] +fn path_with_mixed_escaped_and_unescaped_glob_characters() +{ + assert_eq!( the_module::path::is_glob( "file\\*.txt" ), false ); + assert_eq!( the_module::path::is_glob( "file[0-9]\\*.txt" ), true ); +} + +#[ test ] +fn path_with_nested_brackets() +{ + assert_eq!( the_module::path::is_glob( "file[[0-9]].txt" ), true ); +} + +#[ test ] +fn path_with_nested_escaped_brackets() +{ + assert_eq!( the_module::path::is_glob( "file\\[\\[0-9\\]\\].txt" ), false ); +} + +#[ test ] +fn path_with_escaped_backslash_before_glob_characters() +{ + assert_eq!( the_module::path::is_glob( "file\\*.txt" ), false ); +} + +#[ test ] +fn path_with_escaped_double_backslashes_before_glob_characters() +{ + assert_eq!( the_module::path::is_glob( "file\\\\*.txt" ), true ); +} + +#[ test ] +fn path_with_complex_mix_of_escaped_and_unescaped_glob_characters() +{ + assert_eq!( the_module::path::is_glob( "file\\[0-9]*?.txt" ), true ); +} diff --git a/module/core/proper_path_tools/tests/inc/path_join.rs b/module/core/proper_path_tools/tests/inc/path_join.rs new file mode 100644 index 0000000000..4bc1c3db62 --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_join.rs @@ -0,0 +1,252 @@ +use super::*; + + +#[ test ] +fn join_empty() +{ + let ( expected, paths ) = ( "", vec![ "" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + +#[ test ] +fn join_several_empties() +{ + let ( expected, paths ) = ( "", vec![ "", "" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn root_with_absolute() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/", "/a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn root_with_relative() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/", "a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn dir_with_absolute() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/dir", "/a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + + +#[ test ] +fn dir_with_relative() +{ + let ( expected, paths ) = ( "/dir/a/b", vec![ "/dir", "a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn trailed_dir_with_absolute() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/dir/", "/a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + +#[ test ] +fn trailed_dir_with_relative() +{ + let ( expected, paths ) = ( "/dir/a/b", vec![ "/dir/", "a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn dir_with_down() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/dir", "../a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn trailed_dir_with_down() +{ + let ( expected, paths ) = ( "/dir/a/b", vec![ "/dir/", "../a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + + +#[ test ] +fn dir_with_several_down() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/dir/dir2", "../../a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn trailed_dir_with_several_down() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/dir/", "../../a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn dir_with_several_down_go_out_of_root() +{ + let ( expected, paths ) = ( "/../a/b", vec![ "/dir", "../../a/b" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + +#[ test ] +fn trailed_absolute_with_trailed_down() +{ + let ( expected, paths ) = ( "/a/b/", vec![ "/a/b/", "../" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn absolute_with_trailed_down() +{ + let ( expected, paths ) = ( "/a/", vec![ "/a/b", "../" ]) ; + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn trailed_absolute_with_down() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/a/b/", ".." ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn trailed_absolute_with_trailed_here() +{ + let ( expected, paths ) = ( "/a/b/", vec![ "/a/b/", "./" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + + +#[ test ] +fn absolute_with_trailed_here() +{ + let ( expected, paths ) = ( "/a/b/", vec![ "/a/b", "./" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn trailed_absolute_with_here() +{ + let ( expected, paths ) = ( "/a/b", vec![ "/a/b/", "." ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn join_with_empty() +{ + let ( expected, paths ) = ( "/a/b/c", vec![ "", "a/b", "", "c", "" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + +#[ test ] +fn join_windows_os_paths() +{ + let ( expected, paths ) = ( "/c/foo/bar/", vec![ "c:\\", "foo\\", "bar\\" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn join_unix_os_paths() +{ + let ( expected, paths ) = ( "/baz/foo", vec![ "/bar/", "/baz", "foo/", "." ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn join_unix_os_paths_2() +{ + let ( expected, paths ) = ( "/baz/foo/z", vec![ "/bar/", "/baz", "foo/", ".", "z" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn more_complicated_cases_1() +{ + let ( expected, paths ) = ( "/aa/bb//cc", vec![ "/aa", "bb//", "cc" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + + +#[ test ] +fn more_complicated_cases_2() +{ + let ( expected, paths ) = ( "/bb/cc", vec![ "/aa", "/bb", "cc" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn more_complicated_cases_3() +{ + let ( expected, paths ) = ( "//aa/bb//cc//", vec![ "//aa", "bb//", "cc//" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + + +#[ test ] +fn more_complicated_cases_4() +{ + let ( expected, paths ) = ( "/aa/bb//cc", vec![ "/aa", "bb//", "cc", "." ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} + +#[ test ] +fn more_complicated_cases_5() +{ + let ( expected, paths ) = ( "//b//d/..e", vec![ "/", "a", "//b//", "././c", "../d", "..e" ] ); + let result = the_module::path::join_paths( paths.clone().into_iter() ); + assert_eq!( result, std::path::PathBuf::from( expected ), "Test failed. Paths: '{:?}', Expected: '{}', Got: '{}'", paths, expected, result.to_string_lossy() ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/path_normalize.rs b/module/core/proper_path_tools/tests/inc/path_normalize.rs new file mode 100644 index 0000000000..a321a8233d --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_normalize.rs @@ -0,0 +1,188 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn path_consisting_only_of_dot_segments() +{ + + let path = std::path::PathBuf::from( "././." ); + let exp = "."; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_consisting_only_of_dot_segments. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "." ); + let exp = "."; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_consisting_only_of_dot_segments. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "./" ); + let exp = "."; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_consisting_only_of_dot_segments. Expected: '{}', got: '{}'", exp, got ); + +} + +#[ test ] +fn path_consisting_only_of_dotdot_segments() +{ + let path = std::path::PathBuf::from( "../../.." ); + let exp = "../../.."; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_consisting_only_of_dotdot_segments. Expected: '{}', got: '{}'", exp, got ); +} + +#[ test ] +fn dotdot_overflow() +{ + + let path = std::path::PathBuf::from( "../../a" ); + let exp = "../../a"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "?. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "/../../a" ); + let exp = "/../../a"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "?. Expected: '{}', got: '{}'", exp, got ); + +} + +#[ test ] +fn path_with_trailing_dot_or_dotdot_segments() +{ + + let path = std::path::PathBuf::from( "/a/b/c/.." ); + let exp = "/a/b"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_trailing_dot_or_dotdot_segments. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "./a/b/c/.." ); + let exp = "./a/b"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_trailing_dot_or_dotdot_segments. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "a/b/c/.." ); + let exp = "a/b"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_trailing_dot_or_dotdot_segments. Expected: '{}', got: '{}'", exp, got ); + +} + +#[ test ] +fn empty_path() +{ + let path = std::path::PathBuf::new(); + let exp = "."; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: empty_path. Expected: '{}', got: '{}'", exp, got ); +} + +#[ test ] +fn path_with_no_dot_or_dotdot_only_regular_segments() +{ + let path = std::path::PathBuf::from( "/a/b/c" ); + let exp = "/a/b/c"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_no_dot_or_dotdot_only_regular_segments. Expected: '{}', got: '{}'", exp, got ); +} + +#[ test ] +fn path_with_mixed_dotdot_segments_that_resolve_to_valid_path() +{ + let path = std::path::PathBuf::from( "/a/b/../c" ); + let exp = "/a/c"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_mixed_dotdot_segments_that_resolve_to_valid_path. Expected: '{}', got: '{}'", exp, got ); +} + +#[ test ] +fn path_with_dotdot_segments_at_the_beginning() +{ + let path = std::path::PathBuf::from( "../../a/b" ); + let exp = "../../a/b"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_dotdot_segments_at_the_beginning. Expected: '{}', got: '{}'", exp, got ); +} + +#[ test ] +fn path_with_dotdot_segments_that_fully_resolve() +{ + + let path = std::path::PathBuf::from( "/a/b/c/../../.." ); + let exp = "/"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_dotdot_segments_that_fully_resolve_to_root. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "a/b/c/../../.." ); + let exp = "."; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_dotdot_segments_that_fully_resolve_in_relative_path. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "./a/b/c/../../.." ); + let exp = "."; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_dotdot_segments_and_initial_current_dir_that_fully_resolve. Expected: '{}', got: '{}'", exp, got ); + +} + +#[ test ] +fn path_including_non_ascii_characters_or_spaces() +{ + let path = std::path::PathBuf::from( "/a/ö/x/../b/c" ); + let exp = "/a/ö/b/c"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_including_non_ascii_characters_or_spaces. Expected: '{}', got: '{}'", exp, got ); +} + +#[ test ] +fn path_with_dot_or_dotdot_embedded_in_regular_path_segments() +{ + + let path = std::path::PathBuf::from( "/a/b..c/..d/d../x/../e" ); + let exp = "/a/b..c/..d/d../e"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_dot_or_dotdot_embedded_in_regular_path_segments. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "a/b..c/..d/d../x/../e" ); + let exp = "a/b..c/..d/d../e"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_dot_or_dotdot_embedded_in_regular_path_segments. Expected: '{}', got: '{}'", exp, got ); + +} + +#[ test ] +fn path_with_multiple_dot_and_dotdot_segments() +{ + + let path = std::path::PathBuf::from( "/a/./b/.././c/../../d" ); + let exp = "/d"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_multiple_dot_and_dotdot_segments. Expected: '{}', got: '{}'", exp, got ); + + let path = std::path::PathBuf::from( "a/./b/.././c/../../d" ); + let exp = "d"; + let normalized = the_module::path::normalize( &path ); + let got = normalized.to_str().unwrap(); + a_id!( exp, got, "Failed: path_with_multiple_dot_and_dotdot_segments. Expected: '{}', got: '{}'", exp, got ); + +} diff --git a/module/core/proper_path_tools/tests/inc/path_relative.rs b/module/core/proper_path_tools/tests/inc/path_relative.rs new file mode 100644 index 0000000000..7c9f6bfbed --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_relative.rs @@ -0,0 +1,403 @@ +#[ allow( unused_imports ) ] +use super::*; +use std::path::PathBuf; + + +// absolute path relative + +#[ test ] +fn test_absolute_a_minus_b() +{ + let from = "/a"; + let to = "/b"; + let expected = "../b"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( PathBuf::from( expected ) ) ); +} + +#[ test ] +fn test_absolute_root_minus_b() +{ + let from = "/"; + let to = "/b"; + let expected = "b"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_same_path() +{ + let from = "/aa/bb/cc"; + let to = "/aa/bb/cc"; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_same_path_with_trail() +{ + let from = "/aa/bb/cc"; + let to = "/aa/bb/cc/"; + let expected = "./"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_two_trailed_absolute_paths() +{ + let from = "/a/b/"; + let to = "/a/b/"; + let expected = "./"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_two_absolute_paths_with_trail() +{ + let from = "/a/b"; + let to = "/a/b/"; + let expected = "./"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_two_absolute_paths() +{ + let from = "/a/b/"; + let to = "/a/b"; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_same_path_trail_to_not() +{ + let from = "/aa/bb/cc/"; + let to = "/aa/bb/cc"; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_a_to_double_slash_b() +{ + let from = "/a"; + let to = "//b"; + let expected = "..//b"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + + +#[ test ] +fn test_absolute_relative_to_nested() +{ + let from = "/foo/bar/baz/asdf/quux"; + let to = "/foo/bar/baz/asdf/quux/new1"; + let expected = "new1"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_out_of_relative_dir() +{ + let from = "/abc"; + let to = "/a/b/z"; + let expected = "../a/b/z"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_relative_root() +{ + let from = "/"; + let to = "/a/b/z"; + let expected = "a/b/z"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + + +#[ test ] +fn test_long_not_direct() +{ + let from = "/a/b/xx/yy/zz"; + let to = "/a/b/files/x/y/z.txt"; + let expected = "../../../files/x/y/z.txt"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_relative_to_parent_directory() +{ + let from = "/aa/bb/cc"; + let to = "/aa/bb"; + let expected = ".."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_relative_to_parent_directory_file_trailed() +{ + let from = "/aa/bb/cc"; + let to = "/aa/bb/"; + let expected = "../"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_relative_root_to_root() +{ + let from = "/"; + let to = "/"; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_windows_disks() +{ + let from = "d:/"; + let to = "c:/x/y"; + let expected = "../c/x/y"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + + +#[ test ] +fn test_absolute_relative_to_parent_directory_both_trailed() +{ + let from = "/aa/bb/cc/"; + let to = "/aa/bb/"; + let expected = "./../"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + + +#[ test ] +fn test_absolute_a_with_trail_to_double_slash_b_with_trail() +{ + let from = "/a/"; + let to = "//b/"; + let expected = "./..//b/"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_4_down() +{ + let from = "/aa//bb/cc/"; + let to = "//xx/yy/zz/"; + let expected = "./../../../..//xx/yy/zz/"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_same_length_both_trailed() +{ + let from = "/aa//bb/cc/"; + let to = "//xx/yy/zz/"; + let expected = "./../../../..//xx/yy/zz/"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_absolute_relative_to_parent_directory_base_trailed() +{ + let from = "/aa/bb/cc/"; + let to = "/aa/bb"; + let expected = "./.."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + + + + + +// relative_path_relative + +#[ test ] +fn test_relative_dot_to_dot() +{ + let from = "."; + let to = "."; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_to_b() +{ + let from = "a"; + let to = "b"; + let expected = "../b"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_b_to_b_c() +{ + let from = "a/b"; + let to = "b/c"; + let expected = "../../b/c"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_b_to_a_b_c() +{ + let from = "a/b"; + let to = "a/b/c"; + let expected = "c"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_b_c_to_a_b() +{ + let from = "a/b/c"; + let to = "a/b"; + let expected = ".."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_b_c_d_to_a_b_d_c() +{ + let from = "a/b/c/d"; + let to = "a/b/d/c"; + let expected = "../../d/c"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_to_dot_dot_a() +{ + let from = "a"; + let to = "../a"; + let expected = "../../a"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_slash_slash_b_to_a_slash_slash_c() +{ + let from = "a//b"; + let to = "a//c"; + let expected = "../c"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_dot_slash_b_to_a_dot_slash_c() +{ + let from = "a/./b"; + let to = "a/./c"; + let expected = "../c"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_dot_dot_slash_b_to_b() +{ + let from = "a/../b"; + let to = "b"; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_b_to_b_dot_dot_slash_b() +{ + let from = "b"; + let to = "b/../b"; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_to_dot_dot() +{ + let from = "."; + let to = ".."; + let expected = ".."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_to_dot_dot_dot() +{ + let from = "."; + let to = "../.."; + let expected = "../.."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_dot_to_dot_dot() +{ + let from = ".."; + let to = "../.."; + let expected = ".."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_dot_to_dot_dot_dot() +{ + let from = ".."; + let to = ".."; + let expected = "."; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_dot_a_b_to_dot_dot_c_d() +{ + let from = "../a/b"; + let to = "../c/d"; + let expected = "../../c/d"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_to_b() +{ + let from = "."; + let to = "b"; + let expected = "b"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_slash_to_b() +{ + let from = "./"; + let to = "b"; + let expected = "./b"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_to_b_slash() +{ + let from = "."; + let to = "b/"; + let expected = "b/"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_dot_slash_to_b_slash() +{ + let from = "./"; + let to = "b/"; + let expected = "./b/"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} + +#[ test ] +fn test_relative_a_dot_dot_to_b_dot_dot() +{ + let from = "a/../b/.."; + let to = "b"; + let expected = "b"; + assert_eq!( the_module::path::path_relative( from, to ), PathBuf::from( expected ) ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/path_unique_folder_name.rs b/module/core/proper_path_tools/tests/inc/path_unique_folder_name.rs new file mode 100644 index 0000000000..e933af51f0 --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/path_unique_folder_name.rs @@ -0,0 +1,99 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn generates_unique_names_on_consecutive_calls() +{ + let name1 = the_module::path::unique_folder_name().unwrap(); + let name2 = the_module::path::unique_folder_name().unwrap(); + assert_ne!( name1, name2 ); +} + +#[ test ] +fn proper_name() +{ + use regex::Regex; + + let name1 = the_module::path::unique_folder_name().unwrap(); + dbg!( &name1 ); + + assert!( !name1.contains( "Thread" ), "{} has bad illegal chars", name1 ); + assert!( !name1.contains( "thread" ), "{} has bad illegal chars", name1 ); + assert!( !name1.contains( "(" ), "{} has bad illegal chars", name1 ); + assert!( !name1.contains( ")" ), "{} has bad illegal chars", name1 ); + + // let name1 = "_1232_1313_".to_string(); + let re = Regex::new( r"^[0-9_]*$" ).unwrap(); + assert!( re.is_match( &name1 ), "{} has bad illegal chars", name1 ) + + // ThreadId(1) +} + +#[ test ] +fn respects_thread_local_counter_increment() +{ + let initial_name = the_module::path::unique_folder_name().unwrap(); + let counter_value_in_initial_name : usize = initial_name + .split( '_' ) + .last() + .unwrap() + .parse() + .unwrap(); + + // Ensuring the next call increments the counter as expected + let next_name = the_module::path::unique_folder_name().unwrap(); + let counter_value_in_next_name : usize = next_name + .split( '_' ) + .last() + .unwrap() + .parse() + .unwrap(); + + assert_eq!( counter_value_in_next_name, counter_value_in_initial_name + 1 ); +} + +#[ test ] +fn handles_high_frequency_calls() +{ + let mut names = std::collections::HashSet::new(); + + for _ in 0..1000 + { + let name = the_module::path::unique_folder_name().unwrap(); + assert!( names.insert( name ) ); + } + + assert_eq!( names.len(), 1000 ); +} + +#[ test ] +fn format_consistency_across_threads() +{ + let mut handles = vec![]; + + for _ in 0..10 + { + let handle = std::thread::spawn( || + { + the_module::path::unique_folder_name().unwrap() + }); + handles.push( handle ); + } + + let mut format_is_consistent = true; + let mut previous_format = "".to_string(); + for handle in handles + { + let name = handle.join().unwrap(); + let current_format = name.split( '_' ).collect::< Vec< &str > >().len(); + + if previous_format != "" + { + format_is_consistent = format_is_consistent && ( current_format == previous_format.split( '_' ).collect::< Vec< &str > >().len() ); + } + + previous_format = name; + } + + assert!( format_is_consistent ); +} diff --git a/module/core/proper_path_tools/tests/inc/rebase_path.rs b/module/core/proper_path_tools/tests/inc/rebase_path.rs new file mode 100644 index 0000000000..7c8db4350c --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/rebase_path.rs @@ -0,0 +1,57 @@ +#[ allow( unused_imports ) ] +use super::*; +use std::path::PathBuf; + +#[ test ] +fn test_rebase_without_old_path() +{ + let file_path = "/home/user/documents/file.txt"; + let new_path = "/mnt/storage"; + let rebased_path = the_module::path::rebase( &file_path, &new_path, None ).unwrap(); + assert_eq! + ( + rebased_path, + PathBuf::from( "/mnt/storage/home/user/documents/file.txt" ) + ); +} + +#[ test ] +fn test_rebase_with_old_path() +{ + let file_path = "/home/user/documents/file.txt"; + let new_path = "/mnt/storage"; + let old_path = "/home/user"; + let rebased_path = the_module::path::rebase( &file_path, &new_path, Some( &old_path ) ).unwrap(); + assert_eq! + ( + rebased_path, + PathBuf::from( "/mnt/storage/documents/file.txt" ) + ); +} + +#[ test ] +fn test_rebase_invalid_old_path() +{ + let file_path = "/home/user/documents/file.txt"; + let new_path = "/mnt/storage"; + let old_path = "/tmp"; + let rebased_path = the_module::path::rebase( &file_path, &new_path, Some( &old_path ) ).unwrap(); + assert_eq! + ( + rebased_path, + PathBuf::from( "/mnt/storage/home/user/documents/file.txt" ) + ); +} + +#[ test ] +fn test_rebase_non_ascii_paths() +{ + let file_path = "/home/пользователь/documents/файл.txt"; // Non-ASCII file path + let new_path = "/mnt/存储"; // Non-ASCII new base path + let rebased_path = the_module::path::rebase( &file_path, &new_path, None ).unwrap(); + assert_eq! + ( + rebased_path, + PathBuf::from( "/mnt/存储/home/пользователь/documents/файл.txt" ) + ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/inc/without_ext.rs b/module/core/proper_path_tools/tests/inc/without_ext.rs new file mode 100644 index 0000000000..fa1c5bf11e --- /dev/null +++ b/module/core/proper_path_tools/tests/inc/without_ext.rs @@ -0,0 +1,114 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn empty_path() +{ + let path = ""; + let expected = None; + assert_eq!( the_module::path::without_ext( path ), expected ); +} + +#[ test ] +fn txt_extension() +{ + let path = "some.txt"; + let expected = "some"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn path_with_non_empty_dir_name() +{ + let path = "/foo/bar/baz.asdf"; + let expected = "/foo/bar/baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn hidden_file() +{ + let path = "/foo/bar/.baz"; + let expected = "/foo/bar/.baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn file_with_composite_file_name() +{ + let path = "/foo.coffee.md"; + let expected = "/foo.coffee"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn path_without_extension() +{ + let path = "/foo/bar/baz"; + let expected = "/foo/bar/baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_1() +{ + let path = "./foo/.baz"; + let expected = "./foo/.baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_2() +{ + let path = "./.baz"; + let expected = "./.baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_3() +{ + let path = ".baz.txt"; + let expected = ".baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_4() +{ + let path = "./baz.txt"; + let expected = "./baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_5() +{ + let path = "./foo/baz.txt"; + let expected = "./foo/baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_6() +{ + let path = "./foo/"; + let expected = "./foo/"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_7() +{ + let path = "baz"; + let expected = "baz"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} + +#[ test ] +fn relative_path_8() +{ + let path = "baz.a.b"; + let expected = "baz.a"; + assert_eq!( the_module::path::without_ext( path ).unwrap().to_string_lossy(), expected ); +} \ No newline at end of file diff --git a/module/core/proper_path_tools/tests/smoke_test.rs b/module/core/proper_path_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/proper_path_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/proper_path_tools/tests/tests.rs b/module/core/proper_path_tools/tests/tests.rs new file mode 100644 index 0000000000..4ddcd6e1f0 --- /dev/null +++ b/module/core/proper_path_tools/tests/tests.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use proper_path_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/core/reflect_tools/Cargo.toml b/module/core/reflect_tools/Cargo.toml new file mode 100644 index 0000000000..b4ff98aff1 --- /dev/null +++ b/module/core/reflect_tools/Cargo.toml @@ -0,0 +1,52 @@ +[package] +name = "reflect_tools" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/reflect_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/reflect_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/reflect_tools" +description = """ +Collection of mechanisms for reflection. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] + +default = [ + "enabled", + "reflect_reflect", + "reflect_newtype", +] + +full = [ + "enabled", + "reflect_reflect", + "reflect_newtype", +] +enabled = [] +reflect_reflect = [] +reflect_newtype = [] + +[dependencies] +reflect_tools_meta = { workspace = true, features = [ "enabled" ] } +derive_tools = { workspace = true, features = [ "enabled", "derive_from", "derive_inner_from" ] } + +[dev-dependencies] +test_tools = { workspace = true } + +# [build-dependencies] +# cfg_aliases = "0.1.1" diff --git a/module/core/reflect_tools/License b/module/core/reflect_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/reflect_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/reflect_tools/Readme.md b/module/core/reflect_tools/Readme.md new file mode 100644 index 0000000000..624cab03ac --- /dev/null +++ b/module/core/reflect_tools/Readme.md @@ -0,0 +1,28 @@ +# Module :: reflect_tools + + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/reflect_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/reflect_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Freflect_tools%2Fexamples%2Freflect_tools_trivial.rs,RUN_POSTFIX=--example%20reflect_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +### Basic use-case + + + +```rust +// xxx : qqq : write please +``` + +### To add to your project + +```sh +cargo add reflect_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/reflect_tools_trivial +cargo run +``` diff --git a/module/core/reflect_tools/build.rs b/module/core/reflect_tools/build.rs new file mode 100644 index 0000000000..f515253266 --- /dev/null +++ b/module/core/reflect_tools/build.rs @@ -0,0 +1,25 @@ +//! To avoid messing up with long logical expressions in the codebase. + +// use cfg_aliases::cfg_aliases; + +fn main() +{ + // // Setup cfg aliases + // cfg_aliases! + // { + // all_features : + // { + // all + // ( + // feature = "reflect_reflect" + // ) + // }, + // any_feature : + // { + // any + // ( + // feature = "reflect_reflect" + // ) + // }, + // } +} diff --git a/module/core/reflect_tools/examples/reflect_tools_trivial.rs b/module/core/reflect_tools/examples/reflect_tools_trivial.rs new file mode 100644 index 0000000000..59c42f74f7 --- /dev/null +++ b/module/core/reflect_tools/examples/reflect_tools_trivial.rs @@ -0,0 +1,6 @@ +//! xxx : qqq : write please + +fn main() +{ + // xxx : qqq : write please +} diff --git a/module/core/reflect_tools/src/lib.rs b/module/core/reflect_tools/src/lib.rs new file mode 100644 index 0000000000..50f0a2231f --- /dev/null +++ b/module/core/reflect_tools/src/lib.rs @@ -0,0 +1,77 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/reflect_tools/latest/reflect_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "reflect_reflect" ) ] +pub mod reflect; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ cfg( any_derive ) ] + pub use ::reflect_tools_meta; +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ cfg( feature = "reflect_reflect" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::reflect::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ cfg( feature = "reflect_reflect" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::reflect::exposed::*; + + // #[ cfg( any_derive ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::reflect_tools_meta::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + + #[ cfg( feature = "reflect_reflect" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::reflect::prelude::*; + +} diff --git a/module/core/reflect_tools/src/reflect.rs b/module/core/reflect_tools/src/reflect.rs new file mode 100644 index 0000000000..aded0f2009 --- /dev/null +++ b/module/core/reflect_tools/src/reflect.rs @@ -0,0 +1,165 @@ +//! +//! # System of Types for Reflection +//! +//! This crate provides a comprehensive system for runtime type reflection, enabling dynamic type inspection and manipulation. It is designed to facilitate the integration of types into systems that require advanced operations such as serialization, deserialization, object-relational mapping (ORM), and interaction with generic containers and algorithms that operate on heterogeneous collections of entities. +//! +//! ## Features +//! +//! - **Dynamic Type Inspection**: Retrieve detailed type information at runtime, supporting complex scenarios like serialization frameworks that need to dynamically handle different data types. +//! - **Entity Manipulation**: Manipulate entities in a type-safe manner, leveraging Rust's powerful type system to ensure correctness while allowing dynamic behavior. +//! - **Reflection API**: Utilize a rich set of APIs to introspect and manipulate entities based on their runtime type information, enabling patterns that are not possible with static typing alone. +//! - **Support for Primitive and Composite Types**: Handle both primitive types (e.g., integers, floating-point numbers, strings) and composite entities (e.g., structs, arrays, maps) with a unified interface. +//! +//! ## Use Cases +//! +//! - **Serialization/Deserialization**: Automatically convert Rust structs to and from formats like JSON, XML, or binary representations, based on their runtime type information. +//! - **Dynamic ORM**: Map Rust entities to database tables dynamically, enabling flexible schema evolution and complex queries without sacrificing type safety. +//! - **Generic Algorithms**: Implement algorithms that operate on collections of heterogeneous types, performing runtime type checks and conversions as necessary. +//! - **Plugin Architectures**: Build systems that load and interact with plugins or modules of unknown types at compile time, facilitating extensibility and modularity. +//! +//! ## Getting Started +//! +//! To start using the reflection system, define your entities using the provided traits and enums, and then use the `reflect` function to introspect their properties and behavior at runtime. The system is designed to be intuitive for Rust developers familiar with traits and enums, with minimal boilerplate required to make existing types compatible. +//! +//! ## Example +// qqq : for Yulia : no ignore! +//! +//! ```rust, ignore +//! # use reflect_tools::reflect::{ reflect, Entity }; +//! +//! // Define an entity that implements the Instance trait. +//! #[ derive( Debug ) ] +//! struct MyEntity +//! { +//! id : i32, +//! name : String, +//! // other fields +//! } +//! +//! // Implement the required traits for MyEntity. +//! // ... +//! +//! // Use the reflection API to inspect `MyEntity`. +//! let entity = MyEntity { id: 1, name: "Entity Name".to_string() /*, other fields*/ }; +//! let reflected = reflect( &entity ); +//! println!( "{:?}", reflected.type_name() ); // Outputs "MyEntity" +//! ``` +//! +//! ## Extending the System +//! +//! Implement additional traits for your types as needed to leverage the full power of the reflection system. The crate is designed to be extensible, allowing custom types to integrate seamlessly with the reflection mechanism. +//! + +// qqq : make the example working. use tests for inpsisrations + +/// Internal namespace. +pub( crate ) mod private +{ +} + +pub mod axiomatic; +pub mod entity_array; +pub mod entity_slice; +pub mod entity_vec; +pub mod entity_hashmap; +pub mod entity_hashset; +pub mod primitive; + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::axiomatic::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_array::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_slice::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_vec::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_hashmap::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_hashset::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::primitive::orphan::*; + // pub use super::private:: + // { + // }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::axiomatic::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_array::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_slice::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_vec::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_hashmap::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_hashset::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::primitive::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::axiomatic::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_array::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_slice::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_vec::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_hashmap::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::entity_hashset::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::primitive::prelude::*; +} diff --git a/module/core/reflect_tools/src/reflect/axiomatic.rs b/module/core/reflect_tools/src/reflect/axiomatic.rs new file mode 100644 index 0000000000..df63730d59 --- /dev/null +++ b/module/core/reflect_tools/src/reflect/axiomatic.rs @@ -0,0 +1,550 @@ +//! +//! Mechanism for reflection. +//! + +use super::*; + +/// Internal namespace. +pub( crate ) mod private +{ + use super::*; + + /// Provides a reflection of an instance that implements the `Instance` trait. + /// + /// This function is required to distinguish between instances of a type and references to an instance + /// in contexts where `self` is used. Without this function, associated trait functions would not differentiate + /// between `i32` and `&i32`, treating both identically. + /// + /// # Arguments + /// + /// * `src` - A reference to an instance that implements the `Instance` trait. + /// + /// # Returns + /// + /// Returns an entity descriptor that implements the `Entity` trait, providing + /// runtime reflection capabilities for the given instance. + pub fn reflect( src : &impl Instance ) -> impl Entity + { + src._reflect() + } + + /// + /// Trait indicating that an entity is a container. + /// + /// Implementors of `IsContainer` are considered to be container types, + /// which can hold zero or more elements. This trait is typically used in + /// conjunction with reflection mechanisms to dynamically inspect, access, + /// or modify the contents of a container at runtime. + pub trait IsContainer : Instance + { + } + + /// + /// Trait indicating that an entity is a scalar value. + /// + /// Implementors of `IsScalar` are considered to be scalar types, + /// representing single, indivisible values as opposed to composite entities + /// like arrays or structs. This distinction can be useful in reflection-based + /// APIs or generic programming to treat scalar values differently from containers + /// or other complex types. + pub trait IsScalar : Instance + { + } + + /// + /// Represents a trait for enabling runtime reflection of entities. + /// + /// This trait is designed to equip implementing structs with the ability to introspect + /// their properties, type names, and any contained elements. It facilitates runtime inspection + /// and manipulation of entities in a dynamic manner. + /// + pub trait Instance + { + /// The entity descriptor associated with this instance. + type Entity : Entity; + /// Returns a descriptor for the current instance. + /// + /// Don't use manually. + fn _reflect( &self ) -> Self::Entity + { + Self::Reflect() + } + /// Returns a descriptor for the type of the instance. + #[ allow( non_snake_case ) ] + fn Reflect() -> Self::Entity; + } + + impl< T > Instance for T + where + EntityDescriptor< T > : Entity, + T : InstanceMarker, + { + type Entity = EntityDescriptor::< Self >; + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + EntityDescriptor::< Self >::new() + } + } + + /// + /// The `Entity` trait defines a common interface for entities within a system, enabling + /// runtime reflection, inspection, and manipulation of their properties and elements. It + /// serves as a foundational component for dynamic entity handling, where entities can + /// represent data structures, components, or other logical units with introspectable + /// and manipulable state. + /// + /// ## Usage + /// + /// Implementing the `Entity` trait allows a type to be integrated into systems that require + /// dynamic type inspection and manipulation, such as serialization frameworks, object-relational + /// mapping (ORM) systems, or generic containers and algorithms that operate on heterogeneous + /// entity collections. + /// + /// ## Key Concepts + /// + /// - **Containment**: Entities can act as containers for other entities, enabling hierarchical + /// or composite data models. + /// + /// - **Ordering**: The trait distinguishes between ordered and unordered entities, affecting + /// how their elements are iterated over or accessed. + /// + /// - **Reflection**: Through type metadata and element access methods, entities support + /// reflection, allowing programmatic querying and manipulation of their structure and state. + /// + /// ## Implementing `Entity` + /// + /// To implement the `Entity` trait, a type must provide implementations for all non-default + /// methods (`type_name`, `type_id`). The default method implementations assume non-container + /// entities with no elements and predictable ordering. Implementers should override these + /// defaults as appropriate to accurately reflect their specific semantics and behavior. + /// + /// ## Example + /// + /// ``` + /// # use reflect_tools::reflect::Entity; + /// + /// #[ derive(Debug)] + /// struct MyEntity + /// { + /// // Entity fields + /// } + /// + /// impl Entity for MyEntity + /// { + /// + /// #[ inline ] + /// fn type_name( &self ) -> &'static str + /// { + /// "MyEntity" + /// } + /// + /// #[ inline ] + /// fn type_id(&self) -> core::any::TypeId + /// { + /// core::any::TypeId::of::< MyEntity >() + /// } + /// + /// // Additional method implementations as necessary... + /// } + /// ``` + /// + /// This trait is designed to be flexible and extensible, accommodating a wide variety of entity + /// types and use cases. Implementers are encouraged to leverage Rust's type system and trait + /// mechanisms to provide rich, dynamic behavior in a type-safe manner. + /// + pub trait Entity : core::fmt::Debug + { + + /// Determines if the entity acts as a container for other entities. + /// + /// # Returns + /// + /// Returns `true` if the entity can contain other entities (like a struct, vector, etc.), + /// otherwise `false`. + /// + /// By default, this method returns `false`, assuming that the entity does not act as a container. + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + false + } + + /// Determines if the elements of the container are maintained in a specific order. + /// + /// This method indicates whether the container preserves a specific order of its elements. + /// The concept of "order" can refer to: + /// - **Sorted Order**: Where elements are arranged based on a sorting criterion, typically + /// through comparison operations. + /// - **Insertion Order**: Where elements retain the order in which they were added to the container. + /// + /// It is important to distinguish this property in collections to understand how iteration over + /// the elements will proceed and what expectations can be held about the sequence of elements + /// when accessed. + /// + /// # Returns + /// + /// - `true` if the container maintains its elements in a predictable order. This is typically + /// true for data structures like arrays, slices, and vectors, where elements are accessed + /// sequentially or are sorted based on inherent or specified criteria. + /// - `false` for collections where the arrangement of elements does not follow a predictable + /// sequence from the perspective of an observer, such as sets and maps implemented via hashing. + /// In these structures, the order of elements is determined by their hash and internal state, + /// rather than the order of insertion or sorting. + /// + /// By default, this method returns `true`, assuming that the entity behaves like an array, slice, + /// or vector, where the order of elements is consistent and predictable. Implementers should override + /// this behavior for collections where element order is not maintained or is irrelevant. + #[ inline( always ) ] + fn is_ordered( &self ) -> bool + { + true + } + + /// Returns the number of elements contained in the entity. + /// + /// # Returns + /// + /// Returns the count of elements if the entity is a container, otherwise `0`. + /// + /// This method is particularly useful for collections or composite entities. + /// By default, this method returns `0`, assuming the entity contains no elements. + #[ inline( always ) ] + fn len( &self ) -> usize + { + 0 + } + + /// Retrieves the type name. + /// + /// # Returns + /// + /// Returns the type name of the implementing entity as a static string slice. + /// + /// This method leverages Rust's `type_name` function to provide the name at runtime, + /// aiding in debugging and logging purposes. + fn type_name( &self ) -> &'static str; + + /// Retrives the typ id. + fn type_id( &self ) -> core::any::TypeId; + + /// Provides an iterator over the elements contained within the entity, if any. + /// + /// # Returns + /// + /// Returns a boxed iterator over `KeyVal` pairs representing the key-value mappings + /// of the entity's elements. For non-container entities, an empty iterator is returned. + /// + /// This method is crucial for traversing composite entities or collections at runtime, + /// allowing for dynamic inspection and manipulation. + #[ inline( always ) ] + fn elements( &self ) -> Box< dyn Iterator< Item = KeyVal > > + { + Box::new( [].into_iter() ) + } + + /// Returns a descriptor for the type of the instance. + /// + /// # Returns + /// + /// Returns an entity descriptor that implements the `Entity` trait. + #[ inline( always ) ] + fn element( &self, i : usize ) -> KeyVal + { + debug_assert!( i < self.len() ); + self.elements().skip( i ).next().unwrap() + } + + } + + /// + /// Type descriptor + /// + #[ derive( PartialEq, Default, Clone ) ] + pub struct EntityDescriptor< I : Instance > + { + _phantom : core::marker::PhantomData< I >, + } + + impl< I : Instance > EntityDescriptor< I > + { + /// Constructor of the descriptor. + #[ inline( always ) ] + pub fn new() -> Self + { + let _phantom = core::marker::PhantomData::< I >; + Self { _phantom } + } + } + + /// + /// Dynamically sized collection descriptor + /// + #[ derive( PartialEq, Default, Clone ) ] + pub struct CollectionDescriptor< I : Instance > + { + /// Container length. + pub len : usize, + _phantom : core::marker::PhantomData< I >, + } + + impl< I : Instance > CollectionDescriptor< I > + { + /// Constructor of the descriptor of container type. + pub fn new( size : usize ) -> Self + { + let _phantom = core::marker::PhantomData::< I >; + Self + { + _phantom, + len : size, + } + } + } + + /// + /// Dynamically sized key-value collection descriptor + /// + #[ derive( PartialEq, Default, Clone ) ] + pub struct KeyedCollectionDescriptor< I : Instance > + { + /// Container length. + pub len : usize, + /// Container keys. + pub keys : Vec< primitive::Primitive >, + _phantom : core::marker::PhantomData< I >, + } + + impl< I : Instance > KeyedCollectionDescriptor< I > + { + /// Constructor of the descriptor of container type. + pub fn new( size : usize, keys : Vec< primitive::Primitive > ) -> Self + { + let _phantom = core::marker::PhantomData::< I >; + Self + { + _phantom, + len : size, + keys, + } + } + } + + /// Auto-implement descriptor for this type. + trait InstanceMarker {} + + impl< T > Entity for EntityDescriptor< T > + where + T : InstanceMarker + 'static, + { + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< T >() + } + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< T >() + } + } + + impl< T > core::fmt::Debug for EntityDescriptor< T > + where + T : Instance + 'static, + EntityDescriptor< T > : Entity, + { + fn fmt( &self, f: &mut core::fmt::Formatter< '_ > ) -> core::fmt::Result + { + f + .write_str( &format!( "{}#{:?}", self.type_name(), self.type_id() ) ) + } + } + + impl< T > core::fmt::Debug for CollectionDescriptor< T > + where + T : Instance + 'static, + CollectionDescriptor< T > : Entity, + { + fn fmt( &self, f: &mut core::fmt::Formatter< '_ > ) -> core::fmt::Result + { + f + .write_str( &format!( "{}#{:?}", self.type_name(), self.type_id() ) ) + } + } + + impl< T > core::fmt::Debug for KeyedCollectionDescriptor< T > + where + T : Instance + 'static, + KeyedCollectionDescriptor< T > : Entity, + { + fn fmt( &self, f: &mut core::fmt::Formatter< '_ > ) -> core::fmt::Result + { + f + .write_str( &format!( "{}#{:?}", self.type_name(), self.type_id() ) ) + } + } + + /// Represents a key-value pair where the key is a static string slice + /// and the value is a boxed entity that implements the `AnyEntity` trait. + /// + /// This struct is typically used in the context of reflecting over the properties + /// or members of a container entity, allowing for dynamic access and inspection + /// of its contents. + /// + // #[ derive( PartialEq, Debug ) ] + // #[ derive( Default ) ] + pub struct KeyVal + { + /// The key associated with the value in the key-value pair. + pub key : primitive::Primitive, + // pub key : &'static str, + /// The value associated with the key in the key-value pair. + pub val : Box< dyn Entity >, + } + + impl Default for KeyVal + { + fn default() -> Self + { + Self + { + key : primitive::Primitive::default(), + val : Box::new( EntityDescriptor::< i8 >::new() ) as Box::< dyn Entity >, + } + } + } + + impl core::fmt::Debug for KeyVal + { + fn fmt( &self, f: &mut core::fmt::Formatter< '_ > ) -> core::fmt::Result + { + f + .debug_struct( "KeyVal" ) + .field( "key", &self.key ) + .field( "val", &format_args!( "{:?}", &self.val ) ) + .finish() + } + } + + // qqq aaa: added comparison by val + impl PartialEq for KeyVal + { + fn eq( &self, other : &Self ) -> bool + { + let mut equal = self.key == other.key + && self.val.type_id() == other.val.type_id() + && self.val.type_name() == other.val.type_name() + && self.val.len() == other.val.len(); + + if equal + { + for i in 0..self.val.len() + { + equal = equal && ( self.val.element( i ) == other.val.element( i ) ) + } + } + equal + } + } + + impl InstanceMarker for i8 {} + impl InstanceMarker for i16 {} + impl InstanceMarker for i32 {} + impl InstanceMarker for i64 {} + impl InstanceMarker for u8 {} + impl InstanceMarker for u16 {} + impl InstanceMarker for u32 {} + impl InstanceMarker for u64 {} + impl InstanceMarker for f32 {} + impl InstanceMarker for f64 {} + impl InstanceMarker for String {} + impl InstanceMarker for &'static str {} + + impl< T > InstanceMarker for &T + where T : InstanceMarker + {} + + impl IsScalar for i8 {} + impl IsScalar for i16 {} + impl IsScalar for i32 {} + impl IsScalar for i64 {} + impl IsScalar for u8 {} + impl IsScalar for u16 {} + impl IsScalar for u32 {} + impl IsScalar for u64 {} + impl IsScalar for f32 {} + impl IsScalar for f64 {} + impl IsScalar for String {} + impl IsScalar for &'static str {} + + impl< T : Instance + 'static, const N : usize > IsContainer for [ T ; N ] {} + // qqq : aaa : added implementation for slice + impl< T : Instance > IsContainer for &'static [ T ] {} + // qqq : aaa : added implementation for Vec + impl< T : Instance + 'static > IsContainer for Vec< T > {} + // qqq : aaa : added implementation for HashMap + impl< K : IsScalar + Clone + 'static, V : Instance + 'static > IsContainer for std::collections::HashMap< K, V > + where primitive::Primitive : From< K > {} + // qqq : aaa : added implementation for HashSet + impl< V : Instance + 'static > IsContainer for std::collections::HashSet< V > {} + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + // reflect, + IsContainer, + IsScalar, + Instance, + // InstanceMarker, + Entity, + EntityDescriptor, + CollectionDescriptor, + KeyedCollectionDescriptor, + KeyVal, + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + reflect, + }; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/reflect_tools/src/reflect/entity_array.rs b/module/core/reflect_tools/src/reflect/entity_array.rs new file mode 100644 index 0000000000..5c171783e4 --- /dev/null +++ b/module/core/reflect_tools/src/reflect/entity_array.rs @@ -0,0 +1,114 @@ +//! +//! Implementation of Entity for an array. +//! + +use super::*; + +/// Internal namespace. +pub mod private +{ + use super::*; + + impl< T, const N : usize > Instance for [ T ; N ] + where + EntityDescriptor< [ T ; N ] > : Entity, + { + type Entity = EntityDescriptor::< Self >; + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + EntityDescriptor::< Self >::new() + } + } + + impl< T, const N : usize > Entity for EntityDescriptor< [ T ; N ] > + where + T : 'static + Instance, + { + + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + + #[ inline( always ) ] + fn len( &self ) -> usize + { + N + } + + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< [ T ; N ] >() + } + + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< [ T ; N ] >() + } + + #[ inline( always ) ] + fn elements( &self ) -> Box< dyn Iterator< Item = KeyVal > > + { + + // qqq : write optimal implementation + // let mut result : [ KeyVal ; N ] = [ KeyVal::default() ; N ]; +// +// for i in 0..N +// { +// result[ i ] = KeyVal { key : "x", val : Box::new( < T as Instance >::Reflect() ) } +// } + + let result : Vec< KeyVal > = ( 0 .. N ) + .map( | k | KeyVal { key : Primitive::usize( k ), val : Box::new( < T as Instance >::Reflect() ) } ) + .collect(); + + Box::new( result.into_iter() ) + } + + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + // pub use super::private:: + // { + // }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/reflect_tools/src/reflect/entity_hashmap.rs b/module/core/reflect_tools/src/reflect/entity_hashmap.rs new file mode 100644 index 0000000000..696f644db5 --- /dev/null +++ b/module/core/reflect_tools/src/reflect/entity_hashmap.rs @@ -0,0 +1,121 @@ +//! +//! Implementation of Entity for a HashMap. +//! + +use super::*; + +/// Internal namespace. +pub mod private +{ + use super::*; + // qqq : xxx : implement for HashMap + // aaa : added implementation of Instance trait for HashMap + use std::collections::HashMap; + impl< K, V > Instance for HashMap< K, V > + where + KeyedCollectionDescriptor< HashMap< K, V > > : Entity, + primitive::Primitive : From< K >, + K : Clone, + { + type Entity = KeyedCollectionDescriptor::< HashMap< K, V > >; + fn _reflect( &self ) -> Self::Entity + { + KeyedCollectionDescriptor::< Self >::new + ( + self.len(), + self.keys().into_iter().map( | k | primitive::Primitive::from( k.clone() ) ).collect::< Vec< _ > >(), + ) + } + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + KeyedCollectionDescriptor::< Self >::new( 0, Vec::new() ) + } + } + + impl< K, V > Entity for KeyedCollectionDescriptor< HashMap< K, V > > + where + K : 'static + Instance + IsScalar + Clone, + primitive::Primitive : From< K >, + V : 'static + Instance, + { + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + + #[ inline( always ) ] + fn len( &self ) -> usize + { + self.len + } + + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< HashMap< K, V > >() + } + + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< HashMap< K, V > >() + } + + #[ inline( always ) ] + fn elements( &self ) -> Box< dyn Iterator< Item = KeyVal > > + { + let mut result : Vec< KeyVal > = ( 0 .. self.len() ) + .map( | k | KeyVal { key : Primitive::usize( k ), val : Box::new( < V as Instance >::Reflect() ) } ) + .collect(); + + for i in 0..self.len() + { + result[ i ] = KeyVal { key : self.keys[ i ].clone(), val : Box::new( < V as Instance >::Reflect() ) } + } + + Box::new( result.into_iter() ) + } + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + // pub use super::private:: + // { + // }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/reflect_tools/src/reflect/entity_hashset.rs b/module/core/reflect_tools/src/reflect/entity_hashset.rs new file mode 100644 index 0000000000..d51fda1030 --- /dev/null +++ b/module/core/reflect_tools/src/reflect/entity_hashset.rs @@ -0,0 +1,110 @@ +//! +//! Implementation of Entity for a HashSet. +//! + +use super::*; + +/// Internal namespace. +pub mod private +{ + use super::*; + + // qqq : xxx : implement for HashSet + // aaa : added implementation of Instance trait for HashSet + use std::collections::HashSet; + impl< T > Instance for HashSet< T > + where + CollectionDescriptor< HashSet< T > > : Entity, + { + type Entity = CollectionDescriptor::< HashSet< T > >; + fn _reflect( &self ) -> Self::Entity + { + CollectionDescriptor::< Self >::new( self.len() ) + } + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + CollectionDescriptor::< Self >::new( 0 ) + } + } + + impl< T > Entity for CollectionDescriptor< HashSet< T > > + where + T : 'static + Instance, + { + + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + + #[ inline( always ) ] + fn len( &self ) -> usize + { + self.len + } + + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< HashSet< T > >() + } + + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< HashSet< T > >() + } + + #[ inline( always ) ] + fn elements( &self ) -> Box< dyn Iterator< Item = KeyVal > > + { + let result : Vec< KeyVal > = ( 0..self.len() ) + .map( | k | KeyVal { key : Primitive::usize( k ), val : Box::new( < T as Instance >::Reflect() ) } ) + .collect(); + + Box::new( result.into_iter() ) + } + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + // pub use super::private:: + // { + // }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/reflect_tools/src/reflect/entity_slice.rs b/module/core/reflect_tools/src/reflect/entity_slice.rs new file mode 100644 index 0000000000..90416afcbc --- /dev/null +++ b/module/core/reflect_tools/src/reflect/entity_slice.rs @@ -0,0 +1,110 @@ +//! +//! Implementation of Entity for a slice. +//! + +use super::*; + +/// Internal namespace. +pub mod private +{ + use super::*; + + // qqq : xxx : implement for slice + // aaa : added implementation of Instance trait for slice + impl< T > Instance for &'static [ T ] + where + CollectionDescriptor< &'static [ T ] > : Entity, + { + type Entity = CollectionDescriptor::< &'static [ T ] >; + fn _reflect( &self ) -> Self::Entity + { + CollectionDescriptor::< Self >::new( self.len() ) + } + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + CollectionDescriptor::< Self >::new( 1 ) + } + } + + impl< T > Entity for CollectionDescriptor< &'static [ T ] > + where + T : 'static + Instance, + { + + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + + #[ inline( always ) ] + fn len( &self ) -> usize + { + self.len + } + + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< &'static [ T ] >() + } + + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< &'static [ T ] >() + } + + #[ inline( always ) ] + fn elements( &self ) -> Box< dyn Iterator< Item = KeyVal > > + { + + let result : Vec< KeyVal > = ( 0 .. self.len() ) + .map( | k | KeyVal { key : Primitive::usize( k ), val : Box::new( < T as Instance >::Reflect() ) } ) + .collect(); + + Box::new( result.into_iter() ) + } + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + // pub use super::private:: + // { + // }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} \ No newline at end of file diff --git a/module/core/reflect_tools/src/reflect/entity_vec.rs b/module/core/reflect_tools/src/reflect/entity_vec.rs new file mode 100644 index 0000000000..997e32b18c --- /dev/null +++ b/module/core/reflect_tools/src/reflect/entity_vec.rs @@ -0,0 +1,109 @@ +//! +//! Implementation of Entity for a Vec. +//! + +use super::*; + +/// Internal namespace. +pub mod private +{ + use super::*; + + // qqq : xxx : implement for Vec + // aaa : added implementation of Instance trait for Vec + impl< T > Instance for Vec< T > + where + CollectionDescriptor< Vec< T > > : Entity, + { + type Entity = CollectionDescriptor::< Vec< T > >; + fn _reflect( &self ) -> Self::Entity + { + CollectionDescriptor::< Self >::new( self.len() ) + } + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + CollectionDescriptor::< Self >::new( 0 ) + } + } + + impl< T > Entity for CollectionDescriptor< Vec< T > > + where + T : 'static + Instance, + { + + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + + #[ inline( always ) ] + fn len( &self ) -> usize + { + self.len + } + + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< Vec< T > >() + } + + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< Vec< T > >() + } + + #[ inline( always ) ] + fn elements( &self ) -> Box< dyn Iterator< Item = KeyVal > > + { + let result : Vec< KeyVal > = ( 0 .. self.len() ) + .map( | k | KeyVal { key : Primitive::usize( k ), val : Box::new( < T as Instance >::Reflect() ) } ) + .collect(); + + Box::new( result.into_iter() ) + } + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + // pub use super::private:: + // { + // }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/reflect_tools/src/reflect/primitive.rs b/module/core/reflect_tools/src/reflect/primitive.rs new file mode 100644 index 0000000000..f696eccf75 --- /dev/null +++ b/module/core/reflect_tools/src/reflect/primitive.rs @@ -0,0 +1,264 @@ +//! +//! Define primitive and data types. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + /// Represents a general-purpose data container that can hold various primitive types + /// and strings. This enum is designed to encapsulate common data types in a unified + /// format, simplifying the handling of different types of data in generic contexts. + /// + /// # Variants + /// + /// - `i8`, `i16`, `i32`, `i64`, `isize`: Signed integer types. + /// - `u8`, `u16`, `u32`, `u64`, `usize`: Unsigned integer types. + /// - `f32`, `f64`: Floating-point types. + /// - `String`: A heap-allocated string (`String`). + /// - `str`: A borrowed string slice (`&'static str`), typically used for string literals. + /// - `binary`: A borrowed slice of bytes (`&'static [u8]`), useful for binary data. + /// + /// # Example + /// + /// Creating a `Primitive` instance with an integer: + /// + /// ``` + /// # use reflect_tools::reflect::Primitive; + /// let num = Primitive::i32( 42 ); + /// ``` + /// + /// Creating a `Primitive` instance with a string: + /// + /// ``` + /// # use reflect_tools::reflect::Primitive; + /// let greeting = Primitive::String( "Hello, world!".to_string() ); + /// ``` + /// + /// Creating a `Primitive` instance with a binary slice: + /// + /// ``` + /// # use reflect_tools::reflect::Primitive; + /// let bytes = Primitive::binary( &[ 0xde, 0xad, 0xbe, 0xef ] ); + /// ``` + /// + #[ allow( non_camel_case_types ) ] + #[ derive( Debug, PartialEq, Default, Clone ) ] + pub enum Primitive + { + /// None + #[ default ] + None, + /// Represents a signed 8-bit integer. + i8( i8 ), + /// Represents a signed 16-bit integer. + i16( i16 ), + /// Represents a signed 32-bit integer. + i32( i32 ), + /// Represents a signed 64-bit integer. + i64( i64 ), + /// Represents a machine-sized signed integer. + isize( isize ), + /// Represents an unsigned 8-bit integer. + u8( u8 ), + /// Represents an unsigned 16-bit integer. + u16( u16 ), + /// Represents an unsigned 32-bit integer. + u32( u32 ), + /// Represents an unsigned 64-bit integer. + u64( u64 ), + /// Represents a machine-sized unsigned integer. + usize( usize ), + /// Represents a 32-bit floating-point number. + f32( f32 ), + /// Represents a 64-bit floating-point number. + f64( f64 ), + /// Represents a dynamically allocated string. + String( String ), + /// Represents a statically allocated string slice. + str( &'static str ), + /// Represents a statically allocated slice of bytes. + binary( &'static [ u8 ] ), + } + + impl From< i8 > for Primitive + { + fn from( value: i8 ) -> Self + { + Self::i8( value ) + } + } + + impl From< i16 > for Primitive + { + fn from( value: i16 ) -> Self + { + Self::i16( value ) + } + } + + impl From< i32 > for Primitive + { + fn from( value: i32 ) -> Self + { + Self::i32( value ) + } + } + + impl From< i64 > for Primitive + { + fn from( value: i64 ) -> Self + { + Self::i64( value ) + } + } + + impl From< isize > for Primitive + { + fn from( value: isize ) -> Self + { + Self::isize( value ) + } + } + + impl From< u8 > for Primitive + { + fn from( value: u8 ) -> Self + { + Self::u8( value ) + } + } + + impl From< u16 > for Primitive + { + fn from( value: u16 ) -> Self + { + Self::u16( value ) + } + } + + impl From< u32 > for Primitive + { + fn from( value: u32 ) -> Self + { + Self::u32( value ) + } + } + + impl From< u64 > for Primitive + { + fn from( value: u64 ) -> Self + { + Self::u64( value ) + } + } + + impl From< usize > for Primitive + { + fn from( value: usize ) -> Self + { + Self::usize( value ) + } + } + + impl From< f32 > for Primitive + { + fn from( value: f32 ) -> Self + { + Self::f32( value ) + } + } + + impl From< f64 > for Primitive + { + fn from( value: f64 ) -> Self + { + Self::f64( value ) + } + } + + impl From< &'static str > for Primitive + { + fn from( value: &'static str ) -> Self + { + Self::str( value ) + } + } + + impl From< String > for Primitive + { + fn from( value: String ) -> Self + { + Self::String( value ) + } + } + + impl From< &'static [ u8 ] > for Primitive + { + fn from( value: &'static [ u8 ] ) -> Self + { + Self::binary( value ) + } + } + + #[ allow( non_camel_case_types ) ] + #[ derive( Debug, PartialEq ) ] + pub enum Data< const N : usize = 0 > + { + /// None + Primitive( Primitive ), + // /// Array + // array( &'a [ Data ; N ] ), + } + + impl< const N : usize > Default for Data< N > + { + fn default() -> Self + { + Data::Primitive( Primitive::None ) + } + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + pub use super::private:: + { + Primitive, + // Data, + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/core/reflect_tools/tests/inc/mod.rs b/module/core/reflect_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..ba3f3136c9 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/mod.rs @@ -0,0 +1,26 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ cfg( feature = "reflect_newtype" ) ] +mod newtype_experiment; + +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_common_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_primitive_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_struct_manual_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_struct_in_struct_manual_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_struct_with_lifetime_manual_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_slice_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_vec_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_hashset_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_hashmap_test; +#[ cfg( feature = "reflect_reflect" ) ] +mod reflect_array_test; diff --git a/module/core/reflect_tools/tests/inc/newtype_experiment.rs b/module/core/reflect_tools/tests/inc/newtype_experiment.rs new file mode 100644 index 0000000000..dc8bb61d13 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/newtype_experiment.rs @@ -0,0 +1,39 @@ +use super::*; +// pub use the_module::reflect; + +#[ test ] +fn basic() +{ + use derive_tools::{ From, InnerFrom }; + + #[ derive( From, InnerFrom, Debug, PartialEq ) ] + pub struct Voltage( f32 ); + + #[ derive( From, InnerFrom, Debug, PartialEq ) ] + pub struct Resistance( f32 ); + + #[ derive( From, InnerFrom, Debug, PartialEq ) ] + pub struct Pair( f32, f32 ); + + let voltage : Voltage = 1.0.into(); + a_id!( voltage, Voltage( 1.0 ) ); + let resistance : Resistance = 2.0.into(); + a_id!( resistance, Resistance( 2.0 ) ); + let pair : Pair = ( 3.0, 4.0 ).into(); + a_id!( pair, Pair( 3.0, 4.0 ) ); + + #[ derive( From, InnerFrom, Debug, PartialEq ) ] + pub struct Options3 + { + voltage : Voltage, + resistance : Resistance, + pair : Pair, + } + + // Options3::former() + // .set( voltage ) + // .set( resistance ) + // .set( pair ) + // .form(); + +} \ No newline at end of file diff --git a/module/core/reflect_tools/tests/inc/only_test/all.rs b/module/core/reflect_tools/tests/inc/only_test/all.rs new file mode 100644 index 0000000000..5fe5831993 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/only_test/all.rs @@ -0,0 +1,54 @@ + +#[ test ] +fn basic_test() +{ + + let got = IsTransparent::default(); + let exp = IsTransparent( true ); + a_id!( got, exp ); + + // From + + let got = IsTransparent::from( true ); + let exp = IsTransparent( true ); + a_id!( got, exp ); + let got = IsTransparent::from( false ); + let exp = IsTransparent( false ); + a_id!( got, exp ); + + // InnerFrom + + let got : bool = IsTransparent::from( true ).into(); + let exp = true; + a_id!( got, exp ); + let got : bool = IsTransparent::from( false ).into(); + let exp = false; + a_id!( got, exp ); + + // Deref + + let got = IsTransparent( true ); + let exp = true; + a_id!( *got, exp ); + + // DerefMut + + let mut got = IsTransparent( true ); + *got = false; + let exp = false; + a_id!( *got, exp ); + + // AsRef + + let got = IsTransparent( true ); + let exp = true; + a_id!( got.as_ref(), &exp ); + + // AsMut + + let mut got = IsTransparent( true ); + *got.as_mut() = false; + let exp = false; + a_id!( got.0, exp ); + +} diff --git a/module/core/reflect_tools/tests/inc/only_test/reflect_struct.rs b/module/core/reflect_tools/tests/inc/only_test/reflect_struct.rs new file mode 100644 index 0000000000..482ad7bf84 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/only_test/reflect_struct.rs @@ -0,0 +1,28 @@ +#[ test ] +fn reflect_basic_test() +{ + use reflect::Entity; + + let ins = Struct1 + { + f1 : 1, + f2 : "2".into(), + f3 : "3", + }; + + a_id!( reflect::reflect( &ins ).is_container(), true ); + a_id!( reflect::reflect( &ins ).len(), 3 ); + a_id!( reflect::reflect( &ins ).type_name(), "tests::inc::reflect_struct_manual_test::Struct1" ); + let names = reflect::reflect( &ins ).elements().map( | e | e.key ).collect::< Vec< _ > >(); + a_id!( names, vec![ reflect::Primitive::str( "f1" ), reflect::Primitive::str( "f2" ), reflect::Primitive::str( "f3" ) ] ); + let types = reflect::reflect( &ins ).elements().map( | e | e.val.type_name() ).collect::< Vec< _ > >(); + a_id!( types, vec![ "i32", "alloc::string::String", "&str" ] ); + + let f1 = reflect::reflect( &ins ).elements().next().unwrap(); + a_id!( f1.key, reflect::Primitive::str( "f1" ) ); + a_id!( f1.val.is_container(), false ); + a_id!( f1.val.len(), 0 ); + a_id!( f1.val.type_name(), "i32" ); + a_id!( f1.val.elements().collect::< Vec< _ > >(), vec![] ); + +} diff --git a/module/core/reflect_tools/tests/inc/only_test/reflect_struct_in_struct.rs b/module/core/reflect_tools/tests/inc/only_test/reflect_struct_in_struct.rs new file mode 100644 index 0000000000..999c924393 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/only_test/reflect_struct_in_struct.rs @@ -0,0 +1,31 @@ +#[ test ] +fn reflect_struct_in_struct() +{ + use reflect::Entity; + + let ins = Struct1 + { + f1 : 1, + f2 : "2".into(), + f3 : Struct2 { s1 : 10, s2 : "20".into(), s3 : "30" }, + }; + + a_id!( reflect::reflect( &ins ).is_container(), true ); + a_id!( reflect::reflect( &ins ).len(), 3 ); + a_id!( reflect::reflect( &ins ).type_name(), "tests::inc::reflect_struct_in_struct_manual_test::Struct1" ); + let names = reflect::reflect( &ins ).elements().map( | e | e.key ).collect::< Vec< _ > >(); + a_id!( names, vec![ reflect::Primitive::str( "f1" ), reflect::Primitive::str( "f2" ), reflect::Primitive::str( "f3" ) ] ); + let types = reflect::reflect( &ins ).elements().map( | e | e.val.type_name() ).collect::< Vec< _ > >(); + a_id!( types, vec![ "i32", "alloc::string::String", "tests::inc::reflect_struct_in_struct_manual_test::Struct2" ] ); + + let f3 = reflect::reflect( &ins ).elements().skip( 2 ).next().unwrap(); + a_id!( f3.key, reflect::Primitive::str( "f3" ) ); + a_id!( f3.val.is_container(), true ); + a_id!( f3.val.len(), 3 ); + a_id!( f3.val.type_name(), "tests::inc::reflect_struct_in_struct_manual_test::Struct2" ); + let names = f3.val.elements().map( | e | e.key ).collect::< Vec< _ > >(); + a_id!( names, vec![ reflect::Primitive::str( "s1" ), reflect::Primitive::str( "s2" ), reflect::Primitive::str( "s3" ) ] ); + let types = f3.val.elements().map( | e | e.val.type_name() ).collect::< Vec< _ > >(); + a_id!( types, vec![ "i32", "alloc::string::String", "&str" ] ); + +} diff --git a/module/core/reflect_tools/tests/inc/only_test/reflect_struct_with_lifetime.rs b/module/core/reflect_tools/tests/inc/only_test/reflect_struct_with_lifetime.rs new file mode 100644 index 0000000000..64fb941938 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/only_test/reflect_struct_with_lifetime.rs @@ -0,0 +1,49 @@ +#[ test ] +fn reflect_struct_with_lifetime() +{ + use reflect::Entity; + + // assumptions + a_id!( core::any::TypeId::of::< &'static str >(), core::any::TypeId::of::< &str >() ); + + // structure + let x = 1; + let z = "3"; + let ins = Struct1 + { + f1 : &x, + f2 : 2, + f3 : &z, + }; + + // for information + println!( "Struct1 : {:?}", reflect( &ins ).type_id() ); + println!( "Struct1.f1 : {:?}", reflect( &ins ).elements().next().unwrap().val.type_id() ); + println!( "Struct1.f2 : {:?}", reflect( &ins ).elements().skip( 1 ).next().unwrap().val.type_id() ); + println!( "Struct1.f3 : {:?}", reflect( &ins ).elements().skip( 2 ).next().unwrap().val.type_id() ); + + println!( "i32.type_id : {:?}", reflect( &1i32 ).type_id() ); + println!( "i32.type_name : {:?}", reflect( &1i32 ).type_name() ); + println!( "&i32.type_id : {:?}", reflect( &&1i32 ).type_id() ); + println!( "&i32.type_name : {:?}", reflect( &&1i32 ).type_name() ); + + // inspection of structure + a_id!( reflect::reflect( &ins ).is_container(), true ); + a_id!( reflect::reflect( &ins ).len(), 3 ); + a_id!( reflect::reflect( &ins ).type_name(), "tests::inc::reflect_struct_with_lifetime_manual_test::Struct1" ); + a_id!( reflect::reflect( &ins ).type_id(), core::any::TypeId::of::< Struct1< 'static, 'static > >() ); + let names = reflect::reflect( &ins ).elements().map( | e | e.key ).collect::< Vec< _ > >(); + a_id!( names, vec![ reflect::Primitive::str( "f1" ), reflect::Primitive::str( "f2" ), reflect::Primitive::str( "f3" ) ] ); + let types = reflect::reflect( &ins ).elements().map( | e | e.val.type_name() ).collect::< Vec< _ > >(); + a_id!( types, vec![ "&i32", "i32", "&str" ] ); + + // inspection of a field + let f1 = reflect::reflect( &ins ).elements().next().unwrap(); + a_id!( f1.key, reflect::Primitive::str( "f1" ) ); + a_id!( f1.val.is_container(), false ); + a_id!( f1.val.len(), 0 ); + a_id!( f1.val.type_name(), "&i32" ); + a_id!( f1.val.type_id(), core::any::TypeId::of::< &'static i32 >() ); + a_id!( f1.val.elements().collect::< Vec< _ > >(), vec![] ); + +} diff --git a/module/core/reflect_tools/tests/inc/reflect_array_test.rs b/module/core/reflect_tools/tests/inc/reflect_array_test.rs new file mode 100644 index 0000000000..e590ba3c97 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_array_test.rs @@ -0,0 +1,28 @@ +use super::*; +pub use the_module::reflect; + +#[ test ] +fn reflect_array_test() +{ + use reflect::{ Entity, reflect, KeyVal, Instance, Primitive }; + + // for understanding + println!( "TypeId< [ i32; 3 ] > : {:?}", core::any::TypeId::of::< [ i32; 3 ] >() ); + println!( "TypeId< [ &i32; 3 ] > : {:?}", core::any::TypeId::of::< [ &i32; 3 ] >() ); + let arr = [ 1i32, 2, 3 ]; + println!( "reflect( [ i32; 3 ] ) : {:?}", reflect::reflect( &arr ) ); + + a_id!( reflect( &arr ).is_container(), true ); + a_id!( reflect( &arr ).len(), 3 ); + a_id!( reflect( &arr ).type_name(), "[i32; 3]" ); + a_id!( reflect( &arr ).type_id(), core::any::TypeId::of::< [ i32; 3 ] >() ); + + let expected = vec! + [ + KeyVal{ key : Primitive::usize( 0 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 1 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 2 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + ]; + + a_id!( reflect( &arr ).elements().collect::< Vec< _ > >(), expected ); +} \ No newline at end of file diff --git a/module/core/reflect_tools/tests/inc/reflect_common_test.rs b/module/core/reflect_tools/tests/inc/reflect_common_test.rs new file mode 100644 index 0000000000..9a84a69ca4 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_common_test.rs @@ -0,0 +1,155 @@ +use super::*; +pub use the_module::reflect; + +#[ test ] +fn reflect_common_test() +{ + use reflect::{ Entity, reflect }; + + // for understanding + println!( "TypeId< i32 > : {:?}", core::any::TypeId::of::< i32 >() ); + println!( "TypeId< &i32 > : {:?}", core::any::TypeId::of::< & i32 >() ); // qqq : qqq fro Yuliia : problem. should be distinct id + println!( "TypeId< String > : {:?}", core::any::TypeId::of::< String >() ); + println!( "TypeId< &String > : {:?}", core::any::TypeId::of::< & String >() ); + println!( "TypeId< str > : {:?}", core::any::TypeId::of::< str >() ); + println!( "TypeId< &str > : {:?}", core::any::TypeId::of::< & str >() ); + + println!( "reflect( i32 ) : {:?}", reflect::reflect( &1i32 ) ); + println!( "reflect( &i32 ) : {:?}", reflect::reflect( &&1i32 ) ); + + println!( "i32 : {:?}", reflect( &1i32 ).type_id() ); + println!( "&i32 : {:?}", reflect( &&1i32 ).type_id() ); + println!( "String : {:?}", reflect( &"abc" ).type_id() ); + println!( "&String : {:?}", reflect( &( "abc".to_string() ) ).type_id() ); + println!( "str : {:?}", reflect( &"abc" ).type_id() ); + println!( "&str : {:?}", reflect( &&"abc" ).type_id() ); + + // + + a_id!( reflect( &0i8 ).is_container(), false ); + a_id!( reflect( &0i8 ).len(), 0 ); + a_id!( reflect( &0i8 ).type_name(), "i8" ); + a_id!( reflect( &0i8 ).type_id(), core::any::TypeId::of::< i8 >() ); + a_id!( reflect( &0i8 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &0i16 ).is_container(), false ); + a_id!( reflect( &0i16 ).len(), 0 ); + a_id!( reflect( &0i16 ).type_name(), "i16" ); + a_id!( reflect( &0i16 ).type_id(), core::any::TypeId::of::< i16 >() ); + a_id!( reflect( &0i16 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &0i32 ).is_container(), false ); + a_id!( reflect( &0i32 ).len(), 0 ); + a_id!( reflect( &0i32 ).type_name(), "i32" ); + a_id!( reflect( &0i32 ).type_id(), core::any::TypeId::of::< i32 >() ); + a_id!( reflect( &0i32 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &0i64 ).is_container(), false ); + a_id!( reflect( &0i64 ).len(), 0 ); + a_id!( reflect( &0i64 ).type_name(), "i64" ); + a_id!( reflect( &0i64 ).type_id(), core::any::TypeId::of::< i64 >() ); + a_id!( reflect( &0i64 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0i8 ).is_container(), false ); + a_id!( reflect( &&0i8 ).len(), 0 ); + a_id!( reflect( &&0i8 ).type_name(), "&i8" ); + a_id!( reflect( &&0i8 ).type_id(), core::any::TypeId::of::< &i8 >() ); + a_id!( reflect( &&0i8 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0i16 ).is_container(), false ); + a_id!( reflect( &&0i16 ).len(), 0 ); + a_id!( reflect( &&0i16 ).type_name(), "&i16" ); + a_id!( reflect( &&0i16 ).type_id(), core::any::TypeId::of::< &i16 >() ); + a_id!( reflect( &&0i16 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0i32 ).is_container(), false ); + a_id!( reflect( &&0i32 ).len(), 0 ); + a_id!( reflect( &&0i32 ).type_name(), "&i32" ); + a_id!( reflect( &&0i32 ).type_id(), core::any::TypeId::of::< &i32 >() ); + a_id!( reflect( &&0i32 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0i64 ).is_container(), false ); + a_id!( reflect( &&0i64 ).len(), 0 ); + a_id!( reflect( &&0i64 ).type_name(), "&i64" ); + a_id!( reflect( &&0i64 ).type_id(), core::any::TypeId::of::< &i64 >() ); + a_id!( reflect( &&0i64 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + // + + a_id!( reflect( &0u8 ).is_container(), false ); + a_id!( reflect( &0u8 ).len(), 0 ); + a_id!( reflect( &0u8 ).type_name(), "u8" ); + a_id!( reflect( &0u8 ).type_id(), core::any::TypeId::of::< u8 >() ); + a_id!( reflect( &0u8 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &0u16 ).is_container(), false ); + a_id!( reflect( &0u16 ).len(), 0 ); + a_id!( reflect( &0u16 ).type_name(), "u16" ); + a_id!( reflect( &0u16 ).type_id(), core::any::TypeId::of::< u16 >() ); + a_id!( reflect( &0u16 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &0u32 ).is_container(), false ); + a_id!( reflect( &0u32 ).len(), 0 ); + a_id!( reflect( &0u32 ).type_name(), "u32" ); + a_id!( reflect( &0u32 ).type_id(), core::any::TypeId::of::< u32 >() ); + a_id!( reflect( &0u32 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &0u64 ).is_container(), false ); + a_id!( reflect( &0u64 ).len(), 0 ); + a_id!( reflect( &0u64 ).type_name(), "u64" ); + a_id!( reflect( &0u64 ).type_id(), core::any::TypeId::of::< u64 >() ); + a_id!( reflect( &0u64 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0u8 ).is_container(), false ); + a_id!( reflect( &&0u8 ).len(), 0 ); + a_id!( reflect( &&0u8 ).type_name(), "&u8" ); + a_id!( reflect( &&0u8 ).type_id(), core::any::TypeId::of::< &u8 >() ); + a_id!( reflect( &&0u8 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0u16 ).is_container(), false ); + a_id!( reflect( &&0u16 ).len(), 0 ); + a_id!( reflect( &&0u16 ).type_name(), "&u16" ); + a_id!( reflect( &&0u16 ).type_id(), core::any::TypeId::of::< &u16 >() ); + a_id!( reflect( &&0u16 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0u32 ).is_container(), false ); + a_id!( reflect( &&0u32 ).len(), 0 ); + a_id!( reflect( &&0u32 ).type_name(), "&u32" ); + a_id!( reflect( &&0u32 ).type_id(), core::any::TypeId::of::< &u32 >() ); + a_id!( reflect( &&0u32 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0u64 ).is_container(), false ); + a_id!( reflect( &&0u64 ).len(), 0 ); + a_id!( reflect( &&0u64 ).type_name(), "&u64" ); + a_id!( reflect( &&0u64 ).type_id(), core::any::TypeId::of::< &u64 >() ); + a_id!( reflect( &&0u64 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + // + + a_id!( reflect( &0.1f32 ).is_container(), false ); + a_id!( reflect( &0.1f32 ).len(), 0 ); + a_id!( reflect( &0.1f32 ).type_name(), "f32" ); + a_id!( reflect( &0.1f32 ).type_id(), core::any::TypeId::of::< f32 >() ); + a_id!( reflect( &0.1f32 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &0.1f64 ).is_container(), false ); + a_id!( reflect( &0.1f64 ).len(), 0 ); + a_id!( reflect( &0.1f64 ).type_name(), "f64" ); + a_id!( reflect( &0.1f64 ).type_id(), core::any::TypeId::of::< f64 >() ); + a_id!( reflect( &0.1f64 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0.1f32 ).is_container(), false ); + a_id!( reflect( &&0.1f32 ).len(), 0 ); + a_id!( reflect( &&0.1f32 ).type_name(), "&f32" ); + a_id!( reflect( &&0.1f32 ).type_id(), core::any::TypeId::of::< &f32 >() ); + a_id!( reflect( &&0.1f32 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + a_id!( reflect( &&0.1f64 ).is_container(), false ); + a_id!( reflect( &&0.1f64 ).len(), 0 ); + a_id!( reflect( &&0.1f64 ).type_name(), "&f64" ); + a_id!( reflect( &&0.1f64 ).type_id(), core::any::TypeId::of::< &f64 >() ); + a_id!( reflect( &&0.1f64 ).elements().collect::< Vec< _ > >(), Vec::< _ >::new() ); + + // + +} diff --git a/module/core/reflect_tools/tests/inc/reflect_hashmap_test.rs b/module/core/reflect_tools/tests/inc/reflect_hashmap_test.rs new file mode 100644 index 0000000000..1a4fb8774a --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_hashmap_test.rs @@ -0,0 +1,41 @@ +use super::*; +pub use the_module::reflect; + +#[ test ] +fn reflect_hashmap_test() +{ + use reflect::{ Entity, reflect, KeyVal, Primitive, Instance }; + use std::collections::HashMap; + + // for understanding + println!( "TypeId< HashMap< i32, String > > : {:?}", core::any::TypeId::of::< HashMap< i32, String > >() ); + println!( "TypeId< &HashSMap< i32, String > > : {:?}", core::any::TypeId::of::< &HashMap< i32, String > >() ); + println!( "TypeId< HashMap< &i32, String > > : {:?}", core::any::TypeId::of::< HashMap< &i32, String > >() ); + + let map : HashMap< i32, String > = [ ( 1, String::from( "one" ) ), ( 10, String::from( "ten" ) ) ].into_iter().collect(); + println!( "reflect( HashMap< i32, String > ) : {:?}", reflect::reflect( &map ) ); + println!( "HashMap< i32, String > : {:?}", reflect( &map ).type_id() ); + + a_id!( reflect( &map ).is_container(), true ); + a_id!( reflect( &map ).len(), 2 ); + a_id!( reflect( &map ).type_name(), "std::collections::hash::map::HashMap" ); + a_id!( reflect( &map ).type_id(), core::any::TypeId::of::< HashMap< i32, String > >() ); + + let expected = vec! + [ + KeyVal{ key : Primitive::i32( 1 ), val : Box::new( < String as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::i32( 10 ), val : Box::new( < String as Instance >::Reflect() ) }, + ]; + + let elements = reflect( &map ).elements().collect::< Vec< _ > >(); + a_id!( elements.len(), 2 ); + a_true!( elements.contains( &expected[ 0 ] ) && elements.contains( &expected[ 1 ] ) ); + + let empty_map : HashMap< String, String > = HashMap::new(); + a_id!( reflect( &empty_map ).is_container(), true ); + a_id!( reflect( &empty_map ).len(), 0 ); + a_id!( reflect( &empty_map ).type_name(), "std::collections::hash::map::HashMap" ); + a_id!( reflect( &empty_map ).type_id(), core::any::TypeId::of::< HashMap< String, String > >() ); + + a_id!( reflect( &empty_map ).elements().collect::< Vec< _ > >(), Vec::new() ); +} \ No newline at end of file diff --git a/module/core/reflect_tools/tests/inc/reflect_hashset_test.rs b/module/core/reflect_tools/tests/inc/reflect_hashset_test.rs new file mode 100644 index 0000000000..07ce5911c1 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_hashset_test.rs @@ -0,0 +1,39 @@ +use super::*; +pub use the_module::reflect; + +#[ test ] +fn reflect_hashset_test() +{ + use reflect::{ Entity, reflect, KeyVal, Primitive, Instance }; + use std::collections::HashSet; + + // for understanding + println!( "TypeId< HashSet< i32 > > : {:?}", core::any::TypeId::of::< HashSet< i32 > >() ); + println!( "TypeId< &HashSet< i32 > > : {:?}", core::any::TypeId::of::< &HashSet< i32 > >() ); + println!( "TypeId< HashSet< &i32 > > : {:?}", core::any::TypeId::of::< HashSet< &i32 > >() ); + + let set : HashSet< i32 > = [ 1, 10, 100 ].into_iter().collect(); + println!( "reflect( HashSet< i32 > ) : {:?}", reflect::reflect( &set ) ); + println!( "HashSet< i32 > : {:?}", reflect( &set ).type_id() ); + + a_id!( reflect( &set ).is_container(), true ); + a_id!( reflect( &set ).len(), 3 ); + a_id!( reflect( &set ).type_name(), "std::collections::hash::set::HashSet" ); + a_id!( reflect( &set ).type_id(), core::any::TypeId::of::< HashSet< i32 > >() ); + + let expected = vec! + [ + KeyVal{ key : Primitive::usize( 0 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 1 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 2 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + ]; + a_id!( reflect( &set ).elements().collect::< Vec< _ > >(), expected ); + + let empty_set : HashSet< String > = HashSet::new(); + a_id!( reflect( &empty_set ).is_container(), true ); + a_id!( reflect( &empty_set ).len(), 0 ); + a_id!( reflect( &empty_set ).type_name(), "std::collections::hash::set::HashSet" ); + a_id!( reflect( &empty_set ).type_id(), core::any::TypeId::of::< HashSet< String > >() ); + + a_id!( reflect( &empty_set ).elements().collect::< Vec< _ > >(), Vec::new() ); +} \ No newline at end of file diff --git a/module/core/reflect_tools/tests/inc/reflect_primitive_test.rs b/module/core/reflect_tools/tests/inc/reflect_primitive_test.rs new file mode 100644 index 0000000000..d315a5529e --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_primitive_test.rs @@ -0,0 +1,12 @@ +use super::*; +pub use the_module::reflect; + +#[ test ] +fn data_basic() +{ + use reflect::Primitive; + + let got = Primitive::i32( 13i32 ); + a_id!( got, Primitive::i32( 13i32 ) ); + +} diff --git a/module/core/reflect_tools/tests/inc/reflect_slice_test.rs b/module/core/reflect_tools/tests/inc/reflect_slice_test.rs new file mode 100644 index 0000000000..72b0c72eb9 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_slice_test.rs @@ -0,0 +1,30 @@ +use super::*; +pub use the_module::reflect; + +#[ test ] +fn reflect_slice_test() +{ + use reflect::{ Entity, reflect, KeyVal, Primitive, Instance }; + + // for understanding + println!( "TypeId< &[ i32 ] > : {:?}", core::any::TypeId::of::< [ i32 ] >() ); + println!( "TypeId< &[ i32 ] > : {:?}", core::any::TypeId::of::< &[ i32 ] >() ); + println!( "TypeId< &[ &i32 ] > : {:?}", core::any::TypeId::of::< &[ &i32 ] >() ); // qqq : qqq fro Yuliia : problem. should be distinct id + + let slice : &[ i32 ] = &[ 1, 2, 3 ]; + println!( "reflect( &[ i32 ] ) : {:?}", reflect::reflect( &slice ) ); + println!( "&[ i32 ] : {:?}", reflect( &slice ).type_id() ); + + a_id!( reflect( &slice ).is_container(), true ); + a_id!( reflect( &slice ).len(), 3 ); + a_id!( reflect( &slice ).type_name(), "&[i32]" ); + a_id!( reflect( &slice ).type_id(), core::any::TypeId::of::< &[ i32 ] >() ); + + let expected = vec! + [ + KeyVal{ key : Primitive::usize( 0 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 1 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 2 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + ]; + a_id!( reflect( &slice ).elements().collect::< Vec< _ > >(), expected ); +} diff --git a/module/core/reflect_tools/tests/inc/reflect_struct_in_struct_manual_test.rs b/module/core/reflect_tools/tests/inc/reflect_struct_in_struct_manual_test.rs new file mode 100644 index 0000000000..cfbf60b93a --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_struct_in_struct_manual_test.rs @@ -0,0 +1,132 @@ +use super::*; +pub use the_module::reflect; + +#[ derive( Debug, Clone, PartialEq ) ] +pub struct Struct1 +{ + pub f1 : i32, + pub f2 : String, + pub f3 : Struct2, +} + +#[ derive( Debug, Clone, PartialEq ) ] +pub struct Struct2 +{ + pub s1 : i32, + pub s2 : String, + pub s3 : &'static str, +} + +// -- + +#[ derive( PartialEq, Debug ) ] +pub struct EntityDescriptor< I : reflect::Instance > +{ + _phantom : core::marker::PhantomData< I >, +} + +impl< I : reflect::Instance > EntityDescriptor< I > +{ + #[ inline( always ) ] + pub fn new() -> Self + { + let _phantom = core::marker::PhantomData::< I >; + Self { _phantom } + } +} + +// -- + +impl reflect::Instance for Struct1 +{ + type Entity = EntityDescriptor< Struct1 >; + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + EntityDescriptor::< Self >::new() + } +} + +impl reflect::Instance for Struct2 +{ + type Entity = EntityDescriptor< Struct2 >; + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + EntityDescriptor::< Self >::new() + } +} + +impl reflect::Entity for EntityDescriptor< Struct1 > +{ + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + #[ inline( always ) ] + fn len( &self ) -> usize + { + 3 + } + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< Struct1 >() + } + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< Struct1 >() + } + #[ inline( always ) ] + fn elements(&self) -> Box< dyn Iterator< Item = reflect::KeyVal > > + { + let result = vec! + [ + reflect::KeyVal { key: reflect::Primitive::str( "f1" ), val: Box::new( < i32 as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key: reflect::Primitive::str( "f2" ), val: Box::new( < String as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key: reflect::Primitive::str( "f3" ), val: Box::new( < Struct2 as reflect::Instance >::Reflect() ) }, + ]; + Box::new( result.into_iter() ) + } + +} + +impl reflect::Entity for EntityDescriptor< Struct2 > +{ + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + #[ inline( always ) ] + fn len( &self ) -> usize + { + 3 + } + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< Struct2 >() + } + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< Struct2 >() + } + #[ inline( always ) ] + fn elements(&self) -> Box< dyn Iterator< Item = reflect::KeyVal > > + { + let result = vec! + [ + reflect::KeyVal { key: reflect::Primitive::str( "s1" ), val: Box::new( < i32 as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key: reflect::Primitive::str( "s2" ), val: Box::new( < String as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key: reflect::Primitive::str( "s3" ), val: Box::new( < &'static str as reflect::Instance >::Reflect() ) }, + ]; + Box::new( result.into_iter() ) + } + +} + +include!( "./only_test/reflect_struct_in_struct.rs" ); diff --git a/module/core/reflect_tools/tests/inc/reflect_struct_manual_test.rs b/module/core/reflect_tools/tests/inc/reflect_struct_manual_test.rs new file mode 100644 index 0000000000..0d0628ea47 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_struct_manual_test.rs @@ -0,0 +1,107 @@ +use super::*; +pub use the_module::reflect; + +#[ derive( Debug, Clone, PartialEq ) ] +pub struct Struct1 +{ + pub f1 : i32, + pub f2 : String, + pub f3 : &'static str, +} + +// -- + +#[ derive( PartialEq, Debug ) ] +pub struct EntityDescriptor< I : reflect::Instance > +{ + _phantom : core::marker::PhantomData< I >, +} + +// +// xxx : qqq : qqq for Yulia : implement derive Phantom +// +// #[ derive( PartialEq, Debug ) ] +// pub struct EntityDescriptor< I : reflect::Instance > +// { +// _phantom : core::marker::PhantomData< I >, +// } +// +// #[ derive( PartialEq, Debug, Phantom ) ] +// pub struct EntityDescriptor< I : Instance >; +// +// #[ derive( PartialEq, Debug, Phantom ) ] +// pub struct EntityDescriptor< I : Instance > {}; +// +// #[ derive( PartialEq, Debug ) ] +// pub struct EntityDescriptor< 'a, 'b, I : reflect::Instance > +// { +// _phantom : core::marker::PhantomData< ( &'a (), &'b (), I ) >, +// } +// + +impl< I : reflect::Instance > EntityDescriptor< I > +{ + /// Constructor of the descriptor. + #[ inline( always ) ] + pub fn new() -> Self + { + let _phantom = core::marker::PhantomData::< I >; + Self { _phantom } + } +} + +// qqq : qqq for Yulia : implement derive ReflectInstance +impl reflect::Instance for Struct1 +{ + type Entity = EntityDescriptor::< Self >; + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + EntityDescriptor::< Self >::new() + } +} + +// -- + +impl reflect::Entity for EntityDescriptor< Struct1 > +{ + + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + + #[ inline( always ) ] + fn len( &self ) -> usize + { + 3 + } + + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< Struct1 >() + } + + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< Struct1 >() + } + + #[ inline( always ) ] + fn elements(&self) -> Box< dyn Iterator< Item = reflect::KeyVal > > + { + let result = vec! + [ + reflect::KeyVal { key : reflect::Primitive::str( "f1" ), val : Box::new( < i32 as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key : reflect::Primitive::str( "f2" ), val : Box::new( < String as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key : reflect::Primitive::str( "f3" ), val : Box::new( < &'static str as reflect::Instance >::Reflect() ) }, + ]; + Box::new( result.into_iter() ) + } + +} + +include!( "./only_test/reflect_struct.rs" ); diff --git a/module/core/reflect_tools/tests/inc/reflect_struct_with_lifetime_manual_test.rs b/module/core/reflect_tools/tests/inc/reflect_struct_with_lifetime_manual_test.rs new file mode 100644 index 0000000000..d05b211421 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_struct_with_lifetime_manual_test.rs @@ -0,0 +1,85 @@ +use super::*; +pub use the_module::reflect; + +#[ derive( Debug, Clone, PartialEq ) ] +pub struct Struct1< 'a, 'b > +{ + pub f1 : &'a i32, + pub f2 : i32, + pub f3 : &'b str, +} + +// -- + +#[ derive( PartialEq, Debug ) ] +pub struct EntityDescriptor< 'a, 'b, I : reflect::Instance > +{ + _phantom : core::marker::PhantomData< ( &'a (), &'b (), I ) >, +} + +impl< 'a, 'b, I : reflect::Instance > EntityDescriptor< 'a, 'b, I > +{ + /// Constructor of the descriptor. + #[ inline( always ) ] + pub fn new() -> Self + { + let _phantom = core::marker::PhantomData::< ( &'a (), &'b (), I ) >; + Self { _phantom } + } +} + +// qqq : qqq for Yulia : implement derive ReflectInstance +impl< 'a, 'b > reflect::Instance for Struct1< 'a, 'b > +{ + type Entity = EntityDescriptor::< 'a, 'b, Self >; + #[ inline( always ) ] + fn Reflect() -> Self::Entity + { + EntityDescriptor::< Self >::new() + } +} + +// -- + +impl< 'a, 'b > reflect::Entity for EntityDescriptor< 'a, 'b, Struct1< 'a, 'b > > +{ + + #[ inline( always ) ] + fn is_container( &self ) -> bool + { + true + } + + #[ inline( always ) ] + fn len( &self ) -> usize + { + 3 + } + + #[ inline( always ) ] + fn type_name( &self ) -> &'static str + { + core::any::type_name::< Struct1< 'a, 'b > >() + } + + #[ inline( always ) ] + fn type_id( &self ) -> core::any::TypeId + { + core::any::TypeId::of::< Struct1< 'static, 'static > >() + } + + #[ inline( always ) ] + fn elements(&self) -> Box< dyn Iterator< Item = reflect::KeyVal > > + { + let result = vec! + [ + reflect::KeyVal { key : reflect::Primitive::str( "f1" ), val : Box::new( < &'static i32 as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key : reflect::Primitive::str( "f2" ), val : Box::new( < i32 as reflect::Instance >::Reflect() ) }, + reflect::KeyVal { key : reflect::Primitive::str( "f3" ), val : Box::new( < &'static str as reflect::Instance >::Reflect() ) }, + ]; + Box::new( result.into_iter() ) + } + +} + +include!( "./only_test/reflect_struct_with_lifetime.rs" ); diff --git a/module/core/reflect_tools/tests/inc/reflect_vec_test.rs b/module/core/reflect_tools/tests/inc/reflect_vec_test.rs new file mode 100644 index 0000000000..48ac9a3477 --- /dev/null +++ b/module/core/reflect_tools/tests/inc/reflect_vec_test.rs @@ -0,0 +1,38 @@ +use super::*; +pub use the_module::reflect; + +#[ test ] +fn reflect_vec_test() +{ + use reflect::{ Entity, reflect, KeyVal, Primitive, Instance }; + + // for understanding + println!( "TypeId< Vec< i32 > > : {:?}", core::any::TypeId::of::< Vec< i32 > >() ); + println!( "TypeId< &Vec< i32 > > : {:?}", core::any::TypeId::of::< &Vec< i32 > >() ); + println!( "TypeId< Vec< &i32 > > : {:?}", core::any::TypeId::of::< Vec< &i32 > >() ); + + let vec : Vec< i32 > = vec![ 1, 2, 3 ]; + println!( "reflect( Vec< i32 > ) : {:?}", reflect::reflect( &vec ) ); + println!( "Vec< i32 > : {:?}", reflect( &vec ).type_id() ); + + a_id!( reflect( &vec ).is_container(), true ); + a_id!( reflect( &vec ).len(), 3 ); + a_id!( reflect( &vec ).type_name(), "alloc::vec::Vec" ); + a_id!( reflect( &vec ).type_id(), core::any::TypeId::of::< Vec< i32 > >() ); + + let expected = vec! + [ + KeyVal{ key : Primitive::usize( 0 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 1 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + KeyVal{ key : Primitive::usize( 2 ), val : Box::new( < i32 as Instance >::Reflect() ) }, + ]; + a_id!( reflect( &vec ).elements().collect::< Vec< _ > >(), expected ); + + let vec : Vec< String > = Vec::new(); + a_id!( reflect( &vec ).is_container(), true ); + a_id!( reflect( &vec ).len(), 0 ); + a_id!( reflect( &vec ).type_name(), "alloc::vec::Vec" ); + a_id!( reflect( &vec ).type_id(), core::any::TypeId::of::< Vec< String > >() ); + + a_id!( reflect( &vec ).elements().collect::< Vec< _ > >(), Vec::new() ); +} \ No newline at end of file diff --git a/module/core/reflect_tools/tests/smoke_test.rs b/module/core/reflect_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/reflect_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/reflect_tools/tests/tests.rs b/module/core/reflect_tools/tests/tests.rs new file mode 100644 index 0000000000..b8bdcf97f4 --- /dev/null +++ b/module/core/reflect_tools/tests/tests.rs @@ -0,0 +1,9 @@ + +#[ allow( unused_imports ) ] +use reflect_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; + diff --git a/module/core/reflect_tools_meta/Cargo.toml b/module/core/reflect_tools_meta/Cargo.toml new file mode 100644 index 0000000000..75a842e9a1 --- /dev/null +++ b/module/core/reflect_tools_meta/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "reflect_tools_meta" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/reflect_tools_meta" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/reflect_tools_meta" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/reflect_tools_meta" +description = """ +Collection of mechanisms for reflection. Its meta module. Don't use directly. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[lib] +proc-macro = true + +[features] + +default = [ + "enabled", + "reflect_reflect", +] + +full = [ + "enabled", + "reflect_reflect", +] +enabled = [] +reflect_reflect = [] + +[dependencies] +# iter_tools = { workspace = true, features = [ "full" ] } +# xxx : qqq : optimize features set + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/reflect_tools_meta/License b/module/core/reflect_tools_meta/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/reflect_tools_meta/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/reflect_tools_meta/Readme.md b/module/core/reflect_tools_meta/Readme.md new file mode 100644 index 0000000000..9d7ee04fc9 --- /dev/null +++ b/module/core/reflect_tools_meta/Readme.md @@ -0,0 +1,9 @@ + +# Module :: reflect_tools_meta + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_meta_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_meta_push.yml) [![docs.rs](https://img.shields.io/docsrs/reflect_tools_meta?color=e3e8f0&logo=docs.rs)](https://docs.rs/reflect_tools_meta) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of mechanisms for reflection. Its meta module. Don't use directly. + +Don't use it directly. Instead use `reflect_tools` which is front-end for `reflect_tools_meta`. diff --git a/module/core/reflect_tools_meta/src/implementation/reflect.rs b/module/core/reflect_tools_meta/src/implementation/reflect.rs new file mode 100644 index 0000000000..6016ff192a --- /dev/null +++ b/module/core/reflect_tools_meta/src/implementation/reflect.rs @@ -0,0 +1,26 @@ + +// use macro_tools::proc_macro2::TokenStream; +use super::*; +use macro_tools::{ Result, format_ident, attr, diag }; + +// + +pub fn reflect( input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + let original_input = input.clone(); + let parsed = syn::parse::< syn::ItemStruct >( input )?; + let has_debug = attr::has_debug( parsed.attrs.iter() )?; + let item_name = parsed.ident; + + let result = qt! + { + }; + + if has_debug + { + let about = format!( "derive : Reflect\nstructure : {item_name}" ); + diag::report_print( about, &original_input, &result ); + } + + Ok( result ) +} diff --git a/module/core/reflect_tools_meta/src/lib.rs b/module/core/reflect_tools_meta/src/lib.rs new file mode 100644 index 0000000000..c2efaadb8a --- /dev/null +++ b/module/core/reflect_tools_meta/src/lib.rs @@ -0,0 +1,46 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/clone_dyn_meta/latest/clone_dyn_meta/" ) ] +// #![ allow( non_snake_case ) ] +// #![ allow( non_upper_case_globals ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg +( + any + ( + feature = "reflect_relfect", + ) +)] +#[ cfg( feature = "enabled" ) ] +mod implementation; +#[ cfg +( + any + ( + feature = "reflect_relfect", + ) +)] +#[ cfg( feature = "enabled" ) ] +use implementation::*; + +/// +/// Reflect structure of any kind. +/// +/// ### Sample :: trivial. +/// +/// qqq : write, please +/// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( feature = "derive_reflect" ) ] +#[ proc_macro_derive( Reflect, attributes( debug ) ) ] +pub fn derive_reflect( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = reflect::reflect( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} diff --git a/module/core/reflect_tools_meta/tests/smoke_test.rs b/module/core/reflect_tools_meta/tests/smoke_test.rs new file mode 100644 index 0000000000..663dd6fb9f --- /dev/null +++ b/module/core/reflect_tools_meta/tests/smoke_test.rs @@ -0,0 +1,12 @@ + +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/strs_tools/Cargo.toml b/module/core/strs_tools/Cargo.toml new file mode 100644 index 0000000000..09308568ad --- /dev/null +++ b/module/core/strs_tools/Cargo.toml @@ -0,0 +1,63 @@ +[package] +name = "strs_tools" +version = "0.14.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/strs_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/strs_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/strs_tools" +description = """ +Tools to manipulate strings. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ + "enabled", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +full = [ + "enabled", + "use_alloc", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] + +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +string_indentation = [ "enabled" ] +string_isolate = [ "enabled" ] +string_parse_request = [ "string_split", "string_isolate", "enabled" ] +string_parse_number = [ "lexical", "enabled" ] +string_split = [ "string_parse_request", "enabled" ] + +[dependencies] +former = { workspace = true, features = [ "default" ] } +lexical = { version = "~6.1", optional = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/strs_tools/License b/module/core/strs_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/strs_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/strs_tools/Readme.md b/module/core/strs_tools/Readme.md new file mode 100644 index 0000000000..b070a0bd34 --- /dev/null +++ b/module/core/strs_tools/Readme.md @@ -0,0 +1,57 @@ + + +# Module :: strs_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/strs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/strs_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fstrs_tools%2Fexamples%2Fstrs_tools_trivial.rs,RUN_POSTFIX=--example%20strs_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools to manipulate strings. + +### Basic use-case + + + +```rust +#[ cfg( all( feature = "split", not( feature = "no_std" ) ) ) ] +{ + /* delimeter exists */ + let src = "abc def"; + let iter = strs_tools::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .perform(); + let iterated = iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc", " ", "def" ] ); + + /* delimeter not exists */ + let src = "abc def"; + let iter = strs_tools::string::split() + .src( src ) + .delimeter( "g" ) + .perform(); + let iterated = iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc def" ] ); +} +``` + +### To add to your project + +```sh +cargo add strs_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/wstring_tools_trivial +cargo run +``` + +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Fstrs_tools_trivial,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/strs_tools) diff --git a/module/core/strs_tools/examples/strs_tools_trivial.rs b/module/core/strs_tools/examples/strs_tools_trivial.rs new file mode 100644 index 0000000000..c24ce60979 --- /dev/null +++ b/module/core/strs_tools/examples/strs_tools_trivial.rs @@ -0,0 +1,28 @@ +//! qqq : write proper description +#[ allow( unused_imports ) ] +use strs_tools::*; + +fn main() +{ + #[ cfg( all( feature = "string_split", not( feature = "no_std" ) ) ) ] + { + /* delimeter exists */ + let src = "abc def"; + let iter = string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .perform(); + let iterated = iter.map( String::from ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc", " ", "def" ] ); + + /* delimeter not exists */ + let src = "abc def"; + let iter = string::split() + .src( src ) + .delimeter( "g" ) + .perform(); + let iterated = iter.map( String::from ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc def" ] ); + } +} \ No newline at end of file diff --git a/module/core/strs_tools/src/lib.rs b/module/core/strs_tools/src/lib.rs new file mode 100644 index 0000000000..1c5bc9300e --- /dev/null +++ b/module/core/strs_tools/src/lib.rs @@ -0,0 +1,45 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/strs_tools/latest/strs_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// String tools. +#[ cfg( feature = "enabled" ) ] +pub mod string; + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; + pub use super::string::orphan::*; +} + +/// Parented namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + pub use super::string::exposed::*; +} + +/// Namespace of the module to include with `use module::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + pub use super::string::prelude::*; +} diff --git a/module/core/strs_tools/src/string/indentation.rs b/module/core/strs_tools/src/string/indentation.rs new file mode 100644 index 0000000000..16f7208663 --- /dev/null +++ b/module/core/strs_tools/src/string/indentation.rs @@ -0,0 +1,120 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// Adds indentation and optional prefix/postfix to each line of the given string. + /// + /// This function iterates over each line in the input string and applies the specified + /// prefix and postfix to it, effectively indenting the string and optionally wrapping + /// each line with additional content. + /// + /// # Parameters + /// - `prefix` : The string to prepend to each line, typically used for indentation. + /// - `src` : The source string to be indented and modified. + /// - `postfix` : The string to append to each line, can be used for line terminators or other suffixes. + /// + /// # Type Parameters + /// - `Prefix` : A type that can be referenced as a string slice, for the prefix. + /// - `Src` : A type that can be referenced as a string slice, for the source string. + /// - `Postfix` : A type that can be referenced as a string slice, for the postfix. + /// + /// # Returns + /// A `String` that represents the original `src` string with `prefix` and `postfix` applied to each line. + /// + /// # Example + /// ``` + /// use strs_tools::exposed::*; + /// + /// let input = "Line 1\nLine 2\nLine 3"; + /// let indented = indentation( " ", input, ";" ); + /// assert_eq!( indented, " Line 1;\n Line 2;\n Line 3;" ); + /// + /// // Demonstrating the function's handling of trailing newlines + /// let input_with_newline = "Line 1\nLine 2\nLine 3\n"; + /// let indented_with_newline = indentation( " ", input_with_newline, ";" ); + /// assert_eq!( indented_with_newline, " Line 1;\n Line 2;\n Line 3;\n ;" ); + /// ``` + /// + /// In the example above, `indentation` is used to add two spaces before each line + /// and a semicolon at the end of each line. The function also demonstrates handling + /// of input strings that end with a newline character by appending an additional line + /// consisting only of the prefix and postfix. + + pub fn indentation< Prefix, Src, Postfix >( prefix : Prefix, src : Src, postfix : Postfix ) -> String + where + Prefix : AsRef< str >, + Src : AsRef< str >, + Postfix : AsRef< str >, + { + let prefix = prefix.as_ref(); + let postfix = postfix.as_ref(); + let src = src.as_ref(); + + let mut result = src + .lines() + .enumerate() + .fold( String::new(), | mut a, b | + { + if b.0 > 0 + { + a.push_str( "\n" ); + } + a.push_str( prefix ); + a.push_str( &b.1 ); + a.push_str( postfix ); + a + }); + + if src.ends_with( "\n" ) || src.ends_with( "\n\r" ) || src.ends_with( "\r\n" ) + { + result.push_str( "\n" ); + result.push_str( prefix ); + result.push_str( postfix ); + } + + result + } + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + pub use super::orphan::*; + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as indentation; + + #[ allow( unused_imports ) ] + pub use super::private:: + { + indentation, + }; +} + +/// Namespace of the module to include with `use module::*`. +pub mod prelude +{ +} diff --git a/module/core/strs_tools/src/string/isolate.rs b/module/core/strs_tools/src/string/isolate.rs new file mode 100644 index 0000000000..78d23f6658 --- /dev/null +++ b/module/core/strs_tools/src/string/isolate.rs @@ -0,0 +1,216 @@ + +pub( crate ) mod private +{ + + /// + /// Options for isolate. + /// + + #[ allow( dead_code ) ] + #[ derive( Debug, former::Former ) ] + #[ perform( fn isolate( &self ) -> ( &'a str, Option<&'a str>, &'a str ) ) ] + pub struct IsolateOptions<'a> + { + #[ former( default = "" ) ] + src : &'a str, + #[ former( default = " " ) ] + delimeter : &'a str, + #[ former( default = true ) ] + quote : bool, + #[ former( default = true ) ] + left : bool, + #[ former( default = 1 ) ] + times : u8, /* rrr : Dmytro : former do not form u16, u32, u64, usize, replace after fix */ + #[ former( default = true ) ] + none : bool, + } + + /// + /// Adapter for IsolateOptions. + /// + + pub trait IsolateOptionsAdapter< 'a > + { + /// Do isolate. + fn isolate( &self ) -> ( &'a str, Option<&'a str>, &'a str ) + where + Self : Sized, + { + ( "", None, "" ) + } + } + + impl< 'a > IsolateOptionsAdapter< 'a > for IsolateOptions< 'a > + { + fn isolate( &self ) -> ( &'a str, Option<&'a str>, &'a str ) + { + let times = self.times + 1; + let result; + + /* */ + + let left_none_result = | src : &'a str | -> ( &'a str, Option<&'a str>, &'a str ) + { + if self.none + { + ( "", None, src ) + } + else + { + ( src, None, "" ) + } + }; + + /* */ + + let right_none_result = | src : &'a str | -> ( &'a str, Option<&'a str>, &'a str ) + { + if self.none + { + ( src, None, "" ) + } + else + { + ( "", None, src ) + } + }; + + /* */ + + let count_parts_len = | parts : &Vec<&str> | -> usize + { + let mut len = 0; + for i in 0..self.times + { + let i = i as usize; + if i > 0 + { + len += self.delimeter.len(); + } + len += parts[ i ].len(); + } + len + }; + + if self.left + { + let parts : Vec<&str> = self.src.trim().splitn( times.into(), self.delimeter ).collect(); + if parts.len() == 1 + { + result = left_none_result( parts[ 0 ] ); + } + else + { + let len = count_parts_len( &parts ); + let max_len = len + self.delimeter.len(); + if max_len <= self.src.len() + { + result = ( &self.src[ 0..len ], Some( self.delimeter ), &self.src[ max_len.. ] ); + } + else + { + result = left_none_result( self.src ); + } + } + } + else + { + let parts : Vec<&str> = self.src.trim().rsplitn( times.into(), self.delimeter ).collect(); + if parts.len() == 1 + { + result = right_none_result( parts[ 0 ] ); + } + else + { + let len = count_parts_len( &parts ); + if len + self.delimeter.len() <= self.src.len() + { + result = ( parts[ parts.len() - 1 ], Some( self.delimeter ), &self.src[ self.src.len() - len.. ] ); + } + else + { + result = right_none_result( self.src ); + } + } + } + + result + } + } + + /// + /// Function to split a string with some delimeter. + /// + /// It produces former. To convert former into options and run algorithm of splitting call `perform()`. + /// + + pub fn isolate<'a>() -> IsolateOptionsFormer<'a> + { + IsolateOptions::former() + } + + /// + /// Function to split a string with some delimeter. Routine splits string from left. + /// + /// It produces former. To convert former into options and run algorithm of splitting call `perform()`. + /// + + pub fn isolate_left<'a>() -> IsolateOptionsFormer<'a> + { + IsolateOptions::former() + .left( true ) + } + + /// + /// Function to split a string with some delimeter. Routine splits string from right. + /// + /// It produces former. To convert former into options and run algorithm of splitting call `perform()`. + /// + + pub fn isolate_right<'a>() -> IsolateOptionsFormer<'a> + { + IsolateOptions::former() + .left( false ) + } +} + +/// Owned namespace of the module. +pub mod protected +{ + use super::private as i; + + pub use i::IsolateOptions; + pub use i::IsolateOptionsAdapter; + pub use i::isolate; + pub use i::isolate_left; + pub use i::isolate_right; +} + +pub use protected::*; + +/// Parented namespace of the module. +pub mod orphan +{ + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as isolate; + + use super::private as i; + + pub use i::IsolateOptionsAdapter; + pub use i::isolate; + pub use i::isolate_left; + pub use i::isolate_right; +} + +/// Namespace of the module to include with `use module::*`. +pub mod prelude +{ + use super::private as i; + + pub use i::IsolateOptionsAdapter; +} diff --git a/module/core/strs_tools/src/string/mod.rs b/module/core/strs_tools/src/string/mod.rs new file mode 100644 index 0000000000..d15f35b69e --- /dev/null +++ b/module/core/strs_tools/src/string/mod.rs @@ -0,0 +1,88 @@ + +/// Add indentation to each line. +#[ cfg( all( feature = "string_indentation", not( feature = "no_std" ) ) ) ] +pub mod indentation; +/// Isolate parts of string. +#[ cfg( all( feature = "string_isolate", not( feature = "no_std" ) ) ) ] +pub mod isolate; +/// Parsing of numbers. +#[ cfg( all( feature = "string_parse_number", not( feature = "no_std" ) ) ) ] +pub mod number; +/// Parse string. +#[ cfg( all( feature = "string_parse_request", not( feature = "no_std" ) ) ) ] +pub mod parse_request; +/// Spit string with a delimeter. +#[ cfg( all( feature = "string_split", not( feature = "no_std" ) ) ) ] +pub mod split; + +// /// Set of modules. +// pub( crate ) mod modules +// { +// pub use super::indentation; +// pub use super::isolate; +// pub use super::number; +// pub use super::parse_request; +// pub use super::split; +// } + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ cfg( all( feature = "string_indentation", not( feature = "no_std" ) ) ) ] + pub use super::indentation::orphan::*; + #[ cfg( all( feature = "string_isolate", not( feature = "no_std" ) ) ) ] + pub use super::isolate::orphan::*; + #[ cfg( all( feature = "string_parse_number", not( feature = "no_std" ) ) ) ] + #[ allow( unused_imports ) ] + pub use super::number::orphan::*; + #[ cfg( all( feature = "string_parse_request", not( feature = "no_std" ) ) ) ] + pub use super::parse_request::orphan::*; + #[ cfg( all( feature = "string_split", not( feature = "no_std" ) ) ) ] + pub use super::split::orphan::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ cfg( all( feature = "string_indentation", not( feature = "no_std" ) ) ) ] + #[ allow( unused_imports ) ] + pub use super::indentation::exposed::*; + #[ cfg( all( feature = "string_isolate", not( feature = "no_std" ) ) ) ] + pub use super::isolate::exposed::*; + #[ cfg( all( feature = "string_parse_number", not( feature = "no_std" ) ) ) ] + #[ allow( unused_imports ) ] + pub use super::number::exposed::*; + #[ cfg( all( feature = "string_parse_request", not( feature = "no_std" ) ) ) ] + pub use super::parse_request::exposed::*; + #[ cfg( all( feature = "string_split", not( feature = "no_std" ) ) ) ] + pub use super::split::exposed::*; +} + +/// Namespace of the module to include with `use module::*`. +pub mod prelude +{ + #[ cfg( all( feature = "string_indentation", not( feature = "no_std" ) ) ) ] + #[ allow( unused_imports ) ] + pub use super::indentation::prelude::*; + #[ cfg( all( feature = "string_isolate", not( feature = "no_std" ) ) ) ] + pub use super::isolate::prelude::*; + #[ cfg( all( feature = "string_parse_number", not( feature = "no_std" ) ) ) ] + #[ allow( unused_imports ) ] + pub use super::number::prelude::*; + #[ cfg( all( feature = "string_parse_request", not( feature = "no_std" ) ) ) ] + pub use super::parse_request::prelude::*; + #[ cfg( all( feature = "string_split", not( feature = "no_std" ) ) ) ] + pub use super::split::prelude::*; +} diff --git a/module/core/strs_tools/src/string/number.rs b/module/core/strs_tools/src/string/number.rs new file mode 100644 index 0000000000..29da7a5520 --- /dev/null +++ b/module/core/strs_tools/src/string/number.rs @@ -0,0 +1,50 @@ +/// Internal namespace. +pub( crate ) mod private +{ +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; + #[ cfg( all( feature = "string_parse_number" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use lexical::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as number; + + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Namespace of the module to include with `use module::*`. +pub mod prelude +{ +} diff --git a/module/core/strs_tools/src/string/parse_request.rs b/module/core/strs_tools/src/string/parse_request.rs new file mode 100644 index 0000000000..e3c68de8f9 --- /dev/null +++ b/module/core/strs_tools/src/string/parse_request.rs @@ -0,0 +1,524 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use string:: + { + split::*, + // isolate::isolate_right, + }; + use std::collections::HashMap; + + /// + /// Wrapper types to make transformation. + /// + + #[ derive( Debug, Clone, PartialEq, Eq ) ] + pub enum OpType< T > + { + /// Wrapper over single element of type < T >. + Primitive( T ), + /// Wrapper over vector of elements of type < T >. + Vector( Vec< T > ), + /// Wrapper over hash map of elements of type < T >. + Map( HashMap ), + } + + impl Default for OpType< T > + { + fn default() -> Self + { + OpType::Primitive( T::default() ) + } + } + + impl< T > From< T > for OpType< T > + { + fn from( value: T ) -> Self + { + OpType::Primitive( value ) + } + } + + impl< T > From> for OpType< T > + { + fn from( value: Vec< T > ) -> Self + { + OpType::Vector( value ) + } + } + + impl< T > Into > for OpType< T > + { + fn into( self ) -> Vec< T > + { + match self + { + OpType::Vector( vec ) => vec, + _ => unimplemented!( "not implemented" ), + } + } + } + + impl OpType< T > + { + /// Append item of OpType to current value. If current type is `Primitive`, then it will be converted to + /// `Vector`. + pub fn append( mut self, item : OpType< T > ) -> OpType< T > + { + let mut mut_item = item; + match self + { + OpType::Primitive( value ) => + { + match mut_item + { + OpType::Primitive( ins ) => + { + let vector = vec![ value, ins ]; + OpType::Vector( vector ) + } + OpType::Vector( ref mut vector ) => + { + vector.insert( 0, value ); + mut_item + }, + OpType::Map( _ ) => panic!( "Unexpected operation. Please, use method `insert` to insert item in hash map." ), + } + }, + OpType::Vector( ref mut vector ) => + { + match mut_item + { + OpType::Primitive( ins ) => + { + vector.push( ins ); + self + } + OpType::Vector( ref mut ins_vec ) => + { + vector.append( ins_vec ); + self + }, + OpType::Map( _ ) => panic!( "Unexpected operation. Please, use method `insert` to insert item in hash map." ), + } + }, + OpType::Map( _ ) => panic!( "Unexpected operation. Please, use method `insert` to insert item in hash map." ), + } + } + + /// Unwrap primitive value. Consumes self. + pub fn primitive( self ) -> Option< T > + { + match self + { + OpType::Primitive( v ) => Some( v ), + _ => None, + } + } + + /// Unwrap vector value. Consumes self. + pub fn vector( self ) -> Option> + { + match self + { + OpType::Vector( vec ) => Some( vec ), + _ => None, + } + } + } + + /// + /// Parsed request data. + /// + + #[ allow( dead_code ) ] + #[ derive( Debug, Default, PartialEq, Eq ) ] + pub struct Request< 'a > + { + /// Original request string. + pub original : &'a str, + /// Delimeter for pairs `key:value`. + pub key_val_delimeter : &'a str, + /// Delimeter for commands. + pub commands_delimeter : &'a str, + /// Parsed subject of first command. + pub subject : String, + /// All subjects of the commands in request. + pub subjects : Vec< String >, + /// Options map of first command. + pub map : HashMap>, + /// All options maps of the commands in request. + pub maps : Vec>>, + } + + /// + /// Options for parser. + /// + + #[ derive( Debug, former::Former ) ] + #[ perform( fn parse( mut self ) -> Request< 'a > ) ] + pub struct ParseOptions< 'a > + { + #[ former( default = "" ) ] + src : &'a str, + #[ former( default = ":" ) ] + key_val_delimeter : &'a str, + #[ former( default = ";" ) ] + commands_delimeter : &'a str, + #[ former( default = true ) ] + quoting : bool, + #[ former( default = true ) ] + unquoting : bool, + #[ former( default = true ) ] + parsing_arrays : bool, + #[ former( default = false ) ] + several_values : bool, + #[ former( default = false ) ] + subject_win_paths_maybe : bool, + } + + /// + /// Adapter for ParseOptions. + /// + + pub trait ParseOptionsAdapter< 'a > + { + /// A string to parse. + fn src( &self ) -> &'a str; + /// A delimeter for pairs `key:value`. + fn key_val_delimeter( &self ) -> &'a str; + /// Delimeter for commands. + fn commands_delimeter( &self ) -> &'a str; + /// Quoting of strings. + fn quoting( &self ) -> bool; + /// Unquoting of string. + fn unquoting( &self ) -> bool; + /// Parse arrays of values. + fn parsing_arrays( &self ) -> bool; + /// Append to a vector a values. + fn several_values( &self ) -> bool; + /// Parse subject on Windows taking into account colon in path. + fn subject_win_paths_maybe( &self ) -> bool; + + /// Do parsing. + fn parse( self ) -> Request< 'a > + where + Self : Sized, + { + Request::default() + } + } + + impl< 'a > ParseOptionsAdapter< 'a > for ParseOptions< 'a > + { + fn src( &self ) -> &'a str + { + self.src + } + fn key_val_delimeter( &self ) -> &'a str + { + self.key_val_delimeter + } + fn commands_delimeter( &self ) -> &'a str + { + self.commands_delimeter + } + fn quoting( &self ) -> bool + { + self.quoting + } + fn unquoting( &self ) -> bool + { + self.unquoting + } + fn parsing_arrays( &self ) -> bool + { + self.parsing_arrays + } + fn several_values( &self ) -> bool + { + self.several_values + } + fn subject_win_paths_maybe( &self ) -> bool + { + self.subject_win_paths_maybe + } + + fn parse( mut self ) -> Request< 'a > + where + Self : Sized, + { + let mut result = Request + { + original : self.src(), + key_val_delimeter : self.key_val_delimeter(), + commands_delimeter : self.commands_delimeter(), + ..Default::default() + }; + + self.src = self.src.trim(); + + if self.src.is_empty() + { + return result; + } + + let commands = + if self.commands_delimeter.trim().is_empty() + { + vec![ self.src().to_string() ] + } + else + { + let iter = split() + .src( self.src() ) + .delimeter( self.commands_delimeter() ) + .quoting( self.quoting() ) + .stripping( true ) + .preserving_empty( false ) + .preserving_delimeters( false ) + .perform(); + iter.map( String::from ).collect::< Vec< _ > >() + }; + + for command in commands + { + let mut map_entries; + if self.key_val_delimeter.trim().is_empty() + { + map_entries = ( command.as_str(), None, "" ); + } + else + { + map_entries = match command.split_once( self.key_val_delimeter ) + { + Some( entries ) => ( entries.0, Some( self.key_val_delimeter ), entries.1 ), + None => ( command.as_str(), None, "" ), + }; + } + + let subject; + let mut map : HashMap> = HashMap::new(); + + if map_entries.1.is_some() + { + let subject_and_key = isolate_right() + .src( map_entries.0.trim() ) + .delimeter( " " ) + .none( false ) + .perform(); + subject = subject_and_key.0; + map_entries.0 = subject_and_key.2; + + let mut join = String::from( map_entries.0 ); + join.push_str( map_entries.1.unwrap() ); + join.push_str( map_entries.2 ); + + let mut splits = split() + .src( join.as_str() ) + .delimeter( self.key_val_delimeter ) + .stripping( false ) + .quoting( self.quoting ) + .preserving_empty( true ) + .preserving_delimeters( true ) + .preserving_quoting( true ) + .perform() + .map( String::from ).collect::< Vec< _ > >(); + + + let mut pairs = vec![]; + for a in ( 0..splits.len() - 2 ).step_by( 2 ) + { + let mut right = splits[ a + 2 ].clone(); + + while a < ( splits.len() - 3 ) + { + let cuts = isolate_right() + .src( right.trim() ) + .delimeter( " " ) + .none( false ) + .perform(); + + if cuts.1.is_none() + { + let mut joined = splits[ a + 2 ].clone(); + joined.push_str( splits[ a + 3 ].as_str() ); + joined.push_str( splits[ a + 4 ].as_str() ); + + splits[ a + 2 ] = joined; + right = splits[ a + 2 ].clone(); + splits.remove( a + 3 ); + splits.remove( a + 4 ); + continue; + } + + splits[ a + 2 ] = cuts.2.to_string(); + right = cuts.0.to_string(); + break; + } + + let left = splits[ a ].clone(); + let right = right.trim().to_string(); + if self.unquoting + { + if left.contains( '\"' ) || left.contains( '\'' ) || right.contains( '\"' ) || right.contains( '\'' ) + { + unimplemented!( "not implemented" ); + } + // left = str_unquote( left ); + // right = str_unquote( right ); + } + + pairs.push( left ); + pairs.push( right ); + } + + /* */ + + let str_to_vec_maybe = | src : &str | -> Option> + { + if !src.starts_with( '[' ) || !src.ends_with( ']' ) + { + return None; + } + + let splits = split() + .src( &src[ 1..src.len() - 1 ] ) + .delimeter( "," ) + .stripping( true ) + .quoting( self.quoting ) + .preserving_empty( false ) + .preserving_delimeters( false ) + .preserving_quoting( false ) + .perform() + .map( | e | String::from( e ).trim().to_owned() ).collect::< Vec< String > >(); + + Some( splits ) + }; + + /* */ + + for a in ( 0..pairs.len() - 1 ).step_by( 2 ) + { + let left = &pairs[ a ]; + let right_str = &pairs[ a + 1 ]; + let mut right = OpType::Primitive( pairs[ a + 1 ].to_string() ); + + if self.parsing_arrays + { + if let Some( vector ) = str_to_vec_maybe( right_str ) + { + right = OpType::Vector( vector ); + } + } + + if self.several_values + { + if let Some( op ) = map.get( left ) + { + let value = op.clone().append( right ); + map.insert( left.to_string(), value ); + } + else + { + map.insert( left.to_string(), right ); + } + } + else + { + map.insert( left.to_string(), right ); + } + } + } + else + { + subject = map_entries.0; + } + + if self.unquoting + { + if subject.contains( '\"' ) || subject.contains( '\'' ) + { + unimplemented!( "not implemented" ); + } + // subject = _.strUnquote( subject ); + } + + if self.subject_win_paths_maybe + { + unimplemented!( "not implemented" ); + // subject = win_path_subject_check( subject, map ); + } + + result.subjects.push( subject.to_string() ); + result.maps.push( map ); + } + + if !result.subjects.is_empty() + { + result.subject = result.subjects[ 0 ].clone(); + } + if !result.maps.is_empty() + { + result.map = result.maps[ 0 ].clone(); + } + + result + } + } + + /// + /// Function to parse a string with command request. + /// + /// It produces former. To convert former into options and run algorithm of splitting call `perform()`. + /// + + pub fn request_parse<'a>() -> ParseOptionsFormer<'a> + { + ParseOptions::former() + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; + pub use super::private:: + { + OpType, + Request, + ParseOptions, + ParseOptionsAdapter, + request_parse, + }; +} + +/// Parented namespace of the module. +pub mod orphan +{ + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as parse_request; + + pub use super::private:: + { + ParseOptionsAdapter, + request_parse, + }; +} + +/// Namespace of the module to include with `use module::*`. +pub mod prelude +{ + pub use super::private::ParseOptionsAdapter; +} diff --git a/module/core/strs_tools/src/string/split.rs b/module/core/strs_tools/src/string/split.rs new file mode 100644 index 0000000000..fc9135fdf5 --- /dev/null +++ b/module/core/strs_tools/src/string/split.rs @@ -0,0 +1,688 @@ +/// Private namespace. +pub( crate ) mod private +{ + + use crate::string::parse_request::OpType; + + /// + /// Either delimeter or delimeted with the slice on its string. + /// + + #[ allow( dead_code ) ] + #[ derive( Debug ) ] + pub struct Split< 'a > + { + string : &'a str, + typ : SplitType, + } + + impl< 'a > From< Split< 'a > > for String + { + fn from( src : Split< '_ > ) -> Self + { + src.string.into() + } + } + + /// + /// Either delimeter or delimeted + /// + + #[ derive( Debug ) ] + pub enum SplitType + { + /// Substring of the original string with text inbetween delimeters. + Delimeted, + /// Delimeter. + Delimeter, + } + + /// + /// Find first match in the string. + /// + + pub trait Searcher + { + /// Find positions of delimeter. + fn pos( &self, src : &str ) -> Option< ( usize, usize ) >; + } + + impl Searcher for &str + { + fn pos( &self, src : &str ) -> Option< ( usize, usize ) > + { + src.find( self ).map( | start | ( start, start + self.len() ) ) + } + } + + impl Searcher for String + { + fn pos( &self, src : &str ) -> Option< ( usize, usize ) > + { + src.find( self ).map( | start | ( start, start + self.len() ) ) + } + } + + impl Searcher for Vec<&str> + { + fn pos( &self, src : &str ) -> Option< ( usize, usize ) > + { + let mut r = vec![]; + for pat in self + { + if let Some( x ) = src.find( pat ) + { + r.push( ( x, x + pat.len() ) ) + } + } + + if r.is_empty() + { + return None; + } + + r.into_iter().reduce( | accum, item | + { + if accum.0 > item.0 || accum.1 > item.1 + { + item + } + else + { + accum + } + }) + } + } + + /// + /// Split iterator. + /// + + #[ derive( Debug ) ] + pub struct SplitFastIterator< 'a, D > + where + D : Searcher + { + iterable : &'a str, + counter : i32, + delimeter : D, + preserving_empty : bool, + preserving_delimeters : bool, + stop_empty : bool, + } + + // + + impl< 'a, D : Searcher + Clone > SplitFastIterator< 'a, D > + { + #[ allow( dead_code ) ] + fn new( o : impl SplitOptionsAdapter< 'a, D > ) -> Self + { + Self + { + iterable : o.src(), + delimeter : o.delimeter(), + counter : 0, + preserving_empty : o.preserving_empty(), + preserving_delimeters : o.preserving_delimeters(), + stop_empty : false, + } + } + } + + // + + impl< 'a, D > Iterator for SplitFastIterator< 'a, D > + where + D : Searcher + { + type Item = Split< 'a >; + + fn next( &mut self ) -> Option< Self::Item > + { + self.counter += 1; + + if self.counter % 2 == 1 + { + let positions = self.delimeter.pos( self.iterable ); + if let Some( ( mut start, end ) ) = positions + { + if self.iterable.is_empty() && start == end + { + if self.stop_empty + { + return None; + } + else + { + self.counter -= 1; + self.stop_empty = true; + return Some( Split { string : "", typ : SplitType::Delimeted } ); + } + } + + if start == 0 && end != 0 + { + return self.next(); + } + + let mut next = &self.iterable[ ..start ]; + if start == end && self.counter >= 3 + { + next = &self.iterable[ ..start + 1 ]; + start += 1; + } + + self.iterable = &self.iterable[ start.. ]; + + if !self.preserving_empty && next.is_empty() + { + return self.next(); + } + + Some( Split { string : next, typ : SplitType::Delimeted } ) + } + else if self.iterable.is_empty() + { + None + } + else + { + let r = Split { string : self.iterable, typ : SplitType::Delimeted }; + self.iterable = ""; + Some( r ) + } + } + else + { + if self.delimeter.pos( self.iterable ).is_none() + { + self.iterable = ""; + return None; + } + + let ( start, end ) = self.delimeter.pos( self.iterable ).unwrap(); + let string = &self.iterable[ start..end ]; + self.iterable = &self.iterable[ end.. ]; + + if !self.preserving_empty && string.is_empty() + { + return self.next(); + } + + if self.preserving_delimeters + { + Some( Split { string, typ : SplitType::Delimeter } ) + } + else + { + self.next() + // return self.next_odd_split(); + } + } + } + } + + /// + /// Split iterator. + /// + + #[ derive( Debug ) ] + pub struct SplitIterator< 'a > + { + iterator : SplitFastIterator< 'a, Vec< &'a str > >, + src : &'a str, + stripping : bool, + preserving_empty : bool, + preserving_delimeters : bool, + #[ allow( dead_code ) ] + preserving_quoting : bool, + quoting : bool, + quoting_prefixes : Vec< &'a str >, + quoting_postfixes : Vec< &'a str >, + } + + // + + impl< 'a > SplitIterator< 'a > + { + fn new( o : impl SplitOptionsAdapter< 'a, Vec< &'a str > > ) -> Self + { + let iterator; + if !o.stripping() && !o.quoting() /* && !onDelimeter */ + { + iterator = SplitFastIterator + { + iterable : o.src(), + delimeter : o.delimeter(), + counter : 0, + preserving_empty : o.preserving_empty(), + preserving_delimeters : o.preserving_delimeters(), + stop_empty : false, + }; + } + else + { + let mut delimeter; + if o.quoting() + { + delimeter = o.quoting_prefixes().clone(); + delimeter.extend( o.quoting_postfixes().clone() ); + delimeter.extend( o.delimeter() ); + } + else + { + delimeter = o.delimeter(); + } + + iterator = SplitFastIterator + { + iterable : o.src(), + delimeter, + counter : 0, + preserving_empty : true, + preserving_delimeters : true, + stop_empty : false, + }; + } + + Self + { + iterator, + src : o.src(), + stripping : o.stripping(), + preserving_empty : o.preserving_empty(), + preserving_delimeters : o.preserving_delimeters(), + preserving_quoting : o.preserving_quoting(), + quoting : o.quoting(), + quoting_prefixes : o.quoting_prefixes().clone(), + quoting_postfixes : o.quoting_postfixes().clone(), + } + } + } + + impl< 'a > Iterator for SplitIterator< 'a > + { + type Item = Split< 'a >; + + fn next( &mut self ) -> Option< Self::Item > + { + if let Some( mut split ) = self.iterator.next() + { + if self.quoting + { + split = self.quoted_split( split.string ); + } + + if self.stripping + { + split.string = split.string.trim(); + if !self.preserving_empty && split.string.is_empty() + { + return self.next(); + } + } + else if !self.quoting + { + return Some( split ); + } + + if !self.preserving_delimeters + { + match self.iterator.delimeter.pos( split.string ) + { + Some( ( s, e ) ) => + { + if s == 0 && e == split.string.len() + { + return self.next(); + } + else + { + return Some( split ); + } + }, + None => + { + return Some( split ); + }, + } + } + + if !self.preserving_empty && split.string.is_empty() + { + return self.next(); + } + + Some( split ) + } + else + { + None + } + } + } + + impl< 'a > SplitIterator< 'a > + { + pub fn quoted_split( &mut self, split_str : &'a str ) -> Split< 'a > + { + match self.quoting_prefixes.iter().position( | "e | quote == split_str ) + { + Some( index ) => + { + let postfix = self.quoting_postfixes[ index ]; + let pos = self.src.find( self.iterator.iterable ).unwrap(); + let start = pos - split_str.len(); + let end = self.iterator.iterable.find( postfix ); + + if let Some( end ) = end + { + while self.iterator.next().unwrap().string != postfix {} + if self.preserving_quoting + { + Split { string : &self.src[ start..pos + end + postfix.len() ], typ : SplitType::Delimeted } + } + else + { + Split { string : &self.src[ start + split_str.len() ..pos + end ], typ : SplitType::Delimeted } + } + } + else + { + self.iterator.iterable = ""; + Split { string : &self.src[ start.. ], typ : SplitType::Delimeted } + } + }, + None => Split { string : split_str, typ : SplitType::Delimeted }, + } + } + } + + /// + /// Options of function split. + /// + + #[ derive( Debug ) ] + pub struct SplitOptions< 'a, D > + where + D : Searcher + Default + Clone, + { + src : &'a str, + delimeter : D, + preserving_empty : bool, + preserving_delimeters : bool, + preserving_quoting : bool, + stripping : bool, + quoting : bool, + quoting_prefixes : Vec< &'a str >, + quoting_postfixes : Vec< &'a str >, + } + + impl< 'a > SplitOptions< 'a, Vec< &'a str > > + { + /// Produces SplitIterator. + pub fn split( self ) -> SplitIterator< 'a > + where + Self : Sized, + { + SplitIterator::new( self ) + } + } + + impl< 'a, D > SplitOptions< 'a, D > + where + D : Searcher + Default + Clone + { + /// Produces SplitFastIterator. + pub fn split_fast( self ) -> SplitFastIterator< 'a, D > + where + Self : Sized, + { + SplitFastIterator::new( self ) + } + } + + /// + /// Adapter for Split Options. + /// + + pub trait SplitOptionsAdapter< 'a, D > + where + D : Clone + { + /// A string to split. + fn src( &self ) -> &'a str; + /// A delimeter to split string. + fn delimeter( &self ) -> D; + /// Preserving or dropping empty splits. + fn preserving_empty( &self ) -> bool; + /// Preserving or dropping delimeters. + fn preserving_delimeters( &self ) -> bool; + /// Preserving or dropping quotes. + fn preserving_quoting( &self ) -> bool; + /// Stripping. + fn stripping( &self ) -> bool; + /// Quoting. + fn quoting( &self ) -> bool; + /// Quoting prefixes. + fn quoting_prefixes( &self ) -> &Vec< &'a str >; + /// Quoting postfixes. + fn quoting_postfixes( &self ) -> &Vec< &'a str >; + } + + // + + impl< 'a, D : Searcher + Clone + Default > SplitOptionsAdapter< 'a, D > for SplitOptions< 'a, D > + { + fn src( &self ) -> &'a str + { + self.src + } + fn delimeter( &self ) -> D + { + self.delimeter.clone() + } + fn preserving_empty( &self ) -> bool + { + self.preserving_empty + } + fn preserving_delimeters( &self ) -> bool + { + self.preserving_delimeters + } + fn preserving_quoting( &self ) -> bool + { + self.preserving_quoting + } + fn stripping( &self ) -> bool + { + self.stripping + } + fn quoting( &self ) -> bool + { + self.quoting + } + fn quoting_prefixes( &self ) -> &Vec< &'a str > + { + &self.quoting_prefixes + } + fn quoting_postfixes( &self ) -> &Vec< &'a str > + { + &self.quoting_postfixes + } + } + + // + + macro_rules! builder_impls_from + { + ( $name : ident, $( ( $field : ident, $type : ty ) ),* $( , )? ) => + { + impl< 'a > $name< 'a > + { + $( + pub fn $field( &mut self, value : $type ) -> &mut $name< 'a > + { + self.$field = value; + self + } + )* + + pub fn form( &mut self ) -> SplitOptions< 'a, Vec< &'a str > > + { + if self.quoting + { + if self.quoting_prefixes.is_empty() + { + self.quoting_prefixes = vec![ "\"", "`", "'" ]; + } + if self.quoting_postfixes.is_empty() + { + self.quoting_postfixes = vec![ "\"", "`", "'" ]; + } + } + SplitOptions + { + src : self.src, + delimeter : self.delimeter.clone().vector().unwrap(), + preserving_empty : self.preserving_empty, + preserving_delimeters : self.preserving_delimeters, + preserving_quoting : self.preserving_quoting, + stripping : self.stripping, + quoting : self.quoting, + quoting_prefixes : self.quoting_prefixes.clone(), + quoting_postfixes : self.quoting_postfixes.clone(), + } + } + } + } + } + + /// + /// Former for SplitOptions. + /// + + #[ derive( Debug ) ] + pub struct SplitOptionsFormer< 'a > + { + src : &'a str, + delimeter : OpType< &'a str >, + preserving_empty : bool, + preserving_delimeters : bool, + preserving_quoting : bool, + stripping : bool, + quoting : bool, + quoting_prefixes : Vec< &'a str >, + quoting_postfixes : Vec< &'a str >, + } + builder_impls_from! + ( + SplitOptionsFormer, + ( src, &'a str ), + ( preserving_empty, bool ), + ( preserving_delimeters, bool ), + ( preserving_quoting, bool ), + ( stripping, bool ), + ( quoting, bool ), + ( quoting_prefixes, Vec< &'a str > ), + ( quoting_postfixes, Vec< &'a str > ), + ); + + impl< 'a > SplitOptionsFormer< 'a > + { + pub fn new< D : Into< OpType< &'a str > > >( delimeter : D ) -> SplitOptionsFormer< 'a > + { + let op_vec : OpType<&'a str> = OpType::Vector( vec![] ); + Self + { + src : "", + delimeter : op_vec.append( delimeter.into() ), + preserving_empty : true, + preserving_delimeters : true, + preserving_quoting : true, + stripping : true, + quoting : true, + quoting_prefixes : vec![], + quoting_postfixes : vec![], + } + } + + pub fn delimeter< D : Into< OpType< &'a str > > >( &mut self, value : D ) -> &mut SplitOptionsFormer< 'a > + { + let op_vec : OpType<&'a str> = OpType::Vector( vec![] ); + let op : OpType<&'a str> = value.into(); + self.delimeter = op_vec.append( op ); + self + } + + pub fn perform( &mut self ) -> SplitIterator< 'a > + { + let opts = self.form(); + opts.split() + } + } + + /// + /// Function to split a string. + /// + /// It produces former. To convert former into options and run algorithm of splitting call `form()`. + /// + /// # Sample + /// ``` + /// let iter = strs_tools::string::split() + /// .src( "abc def" ) + /// .delimeter( " " ) + /// .perform(); + /// ``` + + pub fn split< 'a >() -> SplitOptionsFormer< 'a > + { + SplitOptionsFormer::new( < &str >::default() ) + } +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ allow( unused_imports ) ] + pub use super::orphan::*; + pub use super::private:: + { + Split, + SplitType, + SplitFastIterator, + SplitOptions, + SplitOptionsAdapter, + split, + }; +} + +/// Parented namespace of the module. +pub mod orphan +{ + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::protected as split; + + pub use super::private:: + { + SplitOptionsAdapter, + split, + }; +} + +/// Namespace of the module to include with `use module::*`. +pub mod prelude +{ + pub use super::private::SplitOptionsAdapter; +} diff --git a/module/core/strs_tools/tests/inc/indentation_test.rs b/module/core/strs_tools/tests/inc/indentation_test.rs new file mode 100644 index 0000000000..f1342813fc --- /dev/null +++ b/module/core/strs_tools/tests/inc/indentation_test.rs @@ -0,0 +1,63 @@ + +use super::*; + +// + +#[ cfg( not( feature = "no_std" ) ) ] +#[ test ] +fn basic() +{ + use the_module::string::indentation; + + /* test.case( "basic" ) */ + { + let src = "a\nbc"; + let exp = "---a\n---bc"; + let got = indentation( "---", src, "" ); + a_id!( got, exp ); + } + + /* test.case( "empty string" ) */ + { + let src = ""; + let exp = ""; + let got = indentation( "---", src, "" ); + a_id!( got, exp ); + } + + /* test.case( "two strings" ) */ + { + let src = "a\nb"; + let exp = "---a+++\n---b+++"; + let got = indentation( "---", src, "+++" ); + a_id!( got, exp ); + } + + /* test.case( "last empty" ) */ + { + let src = "a\n"; + let exp = "---a+++\n---+++"; + let got = indentation( "---", src, "+++" ); + // println!( "got : '{}'", got ); + a_id!( got, exp ); + } + + /* test.case( "first empty" ) */ + { + let src = "\nb"; + let exp = "---+++\n---b+++"; + let got = indentation( "---", src, "+++" ); + // println!( "got : '{}'", got ); + a_id!( got, exp ); + } + + /* test.case( "two empty string" ) */ + { + let src = "\n"; + let exp = "---+++\n---+++"; + let got = indentation( "---", src, "+++" ); + // println!( "got : '{}'", got ); + a_id!( got, exp ); + } + +} diff --git a/module/core/strs_tools/tests/inc/isolate_test.rs b/module/core/strs_tools/tests/inc/isolate_test.rs new file mode 100644 index 0000000000..2752667136 --- /dev/null +++ b/module/core/strs_tools/tests/inc/isolate_test.rs @@ -0,0 +1,186 @@ + +use super::*; + +// + +tests_impls! +{ + fn basic() + { + let src = ""; + let req = the_module::string::isolate_left() + .src( src ) + .perform(); + let mut exp = ( "", None, "" ); + assert_eq!( req, exp ); + } + + // + + fn isolate_left_or_none() + { + /* no entry */ + let src = "abaca"; + let req = the_module::string::isolate_left() + .src( src ) + .delimeter( "f" ) + .none( true ) + .perform(); + let mut exp = ( "", None, "abaca" ); + assert_eq!( req, exp ); + + /* default */ + let src = "abaca"; + let req = the_module::string::isolate_left() + .src( src ) + .delimeter( "a" ) + .none( true ) + .perform(); + let mut exp = ( "", Some( "a" ), "baca" ); + assert_eq!( req, exp ); + + /* times - 0 */ + let src = "abaca"; + let req = the_module::string::isolate_left() + .src( src ) + .delimeter( "a" ) + .times( 0 ) + .none( true ) + .perform(); + let mut exp = ( "", None, "abaca" ); + assert_eq!( req, exp ); + + /* times - 1 */ + let src = "abaca"; + let req = the_module::string::isolate_left() + .src( src ) + .delimeter( "a" ) + .times( 1 ) + .none( true ) + .perform(); + let mut exp = ( "", Some( "a" ), "baca" ); + assert_eq!( req, exp ); + + /* times - 2 */ + let src = "abaca"; + let req = the_module::string::isolate_left() + .src( src ) + .delimeter( "a" ) + .times( 2 ) + .none( true ) + .perform(); + let mut exp = ( "ab", Some( "a" ), "ca" ); + assert_eq!( req, exp ); + + /* times - 3 */ + let src = "abaca"; + let req = the_module::string::isolate_left() + .src( src ) + .delimeter( "a" ) + .times( 3 ) + .none( true ) + .perform(); + let mut exp = ( "abac", Some( "a" ), "" ); + assert_eq!( req, exp ); + + /* times - 4 */ + let src = "abaca"; + let req = the_module::string::isolate_left() + .src( src ) + .delimeter( "a" ) + .times( 4 ) + .none( true ) + .perform(); + let mut exp = ( "", None, "abaca" ); + assert_eq!( req, exp ); + } + + // + + fn isolate_right_or_none() + { + /* no entry */ + let src = "abaca"; + let req = the_module::string::isolate_right() + .src( src ) + .delimeter( "f" ) + .none( true ) + .perform(); + let mut exp = ( "abaca", None, "" ); + assert_eq!( req, exp ); + + /* default */ + let src = "abaca"; + let req = the_module::string::isolate_right() + .src( src ) + .delimeter( "a" ) + .none( true ) + .perform(); + let mut exp = ( "abac", Some( "a" ), "" ); + assert_eq!( req, exp ); + + /* times - 0 */ + let src = "abaca"; + let req = the_module::string::isolate_right() + .src( src ) + .delimeter( "a" ) + .times( 0 ) + .none( true ) + .perform(); + let mut exp = ( "abaca", None, "" ); + assert_eq!( req, exp ); + + /* times - 1 */ + let src = "abaca"; + let req = the_module::string::isolate_right() + .src( src ) + .delimeter( "a" ) + .times( 1 ) + .none( true ) + .perform(); + let mut exp = ( "abac", Some( "a" ), "" ); + assert_eq!( req, exp ); + + /* times - 2 */ + let src = "abaca"; + let req = the_module::string::isolate_right() + .src( src ) + .delimeter( "a" ) + .times( 2 ) + .none( true ) + .perform(); + let mut exp = ( "ab", Some( "a" ), "ca" ); + assert_eq!( req, exp ); + + /* times - 3 */ + let src = "abaca"; + let req = the_module::string::isolate_right() + .src( src ) + .delimeter( "a" ) + .times( 3 ) + .none( true ) + .perform(); + let mut exp = ( "", Some( "a" ), "baca" ); + assert_eq!( req, exp ); + + /* times - 4 */ + let src = "abaca"; + let req = the_module::string::isolate_right() + .src( src ) + .delimeter( "a" ) + .times( 4 ) + .none( true ) + .perform(); + let mut exp = ( "abaca", None, "" ); + assert_eq!( req, exp ); + } +} + +// + +tests_index! +{ + basic, + isolate_left_or_none, + isolate_right_or_none, +} diff --git a/module/core/strs_tools/tests/inc/mod.rs b/module/core/strs_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..31ec58bc03 --- /dev/null +++ b/module/core/strs_tools/tests/inc/mod.rs @@ -0,0 +1,22 @@ +// #[ cfg( feature = "string" ) ] +// use super::*; +// use crate::the_module::string as the_module; + +// #[ cfg( feature = "string" ) ] +// mod inc; + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use super::*; + +#[ cfg( all( feature = "string_indentation", not( feature = "no_std" ) ) ) ] +mod indentation_test; +#[ cfg( all( feature = "string_isolate", not( feature = "no_std" ) ) ) ] +mod isolate_test; +#[ cfg( all( feature = "string_parse_number", not( feature = "no_std" ) ) ) ] +mod number_test; +#[ cfg( all( feature = "string_parse", not( feature = "no_std" ) ) ) ] +mod parse_test; +#[ cfg( all( feature = "string_split", not( feature = "no_std" ) ) ) ] +mod split_test; diff --git a/module/core/strs_tools/tests/inc/number_test.rs b/module/core/strs_tools/tests/inc/number_test.rs new file mode 100644 index 0000000000..cc8bf03006 --- /dev/null +++ b/module/core/strs_tools/tests/inc/number_test.rs @@ -0,0 +1,60 @@ +use super::*; + +// + +tests_impls! +{ + #[ test ] + fn basic() + { + + /* test.case( "parse" ); */ + { + a_id!( the_module::number::parse::< f32, _ >( "1.0" ), Ok( 1.0 ) ); + } + + /* test.case( "parse_partial" ); */ + { + a_id!( the_module::number::parse_partial::< i32, _ >( "1a" ), Ok( ( 1, 1 ) ) ); + } + + /* test.case( "parse_partial_with_options" ); */ + { + const FORMAT : u128 = the_module::number::format::STANDARD; + let options = the_module::number::ParseFloatOptions::builder() + .exponent( b'^' ) + .decimal_point( b',' ) + .build() + .unwrap(); + let got = the_module::number::parse_partial_with_options::< f32, _, FORMAT >( "0", &options ); + let exp = Ok( ( 0.0, 1 ) ); + a_id!( got, exp ); + } + + /* test.case( "parse_with_options" ); */ + { + const FORMAT: u128 = the_module::number::format::STANDARD; + let options = the_module::number::ParseFloatOptions::builder() + .exponent( b'^' ) + .decimal_point( b',' ) + .build() + .unwrap(); + let got = the_module::number::parse_with_options::< f32, _, FORMAT >( "1,2345", &options ); + let exp = Ok( 1.2345 ); + a_id!( got, exp ); + } + + /* test.case( "to_string" ); */ + { + a_id!( the_module::number::to_string( 5 ), "5" ); + } + + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/strs_tools/tests/inc/parse_test.rs b/module/core/strs_tools/tests/inc/parse_test.rs new file mode 100644 index 0000000000..bacb866a56 --- /dev/null +++ b/module/core/strs_tools/tests/inc/parse_test.rs @@ -0,0 +1,355 @@ +use super::*; +use super::the_module::string::parse_request as parse; +use std::collections::HashMap; + +// + +tests_impls! +{ + fn op_type_from_into() + { + let got = parse::OpType::from( 1 ); + let exp = parse::OpType::Primitive( 1 ); + a_id!( got, exp ); + + let got = parse::OpType::from( vec![ 1, 2 ] ); + let exp = parse::OpType::Vector( vec![ 1, 2 ] ); + a_id!( got, exp ); + + /* */ + + let op = parse::OpType::from( vec![ 1, 2 ] ); + let got : Vec< isize > = op.into(); + a_id!( got, vec![ 1, 2 ] ); + + /* */ + + let op = parse::OpType::from( 1 ); + let got = op.primitive(); /* rrr : for Dmytro : does not work properly, find better way to convert types */ + a_id!( got.unwrap(), 1 ); + + let op = parse::OpType::from( vec![ 1, 2 ] ); + let got : Vec< isize > = op.vector().unwrap(); + a_id!( got, vec![ 1, 2 ] ); + + let op = parse::OpType::from( 1 ); + let got = op.vector(); + a_id!( got, None ); + + let op : parse::OpType< usize > = parse::OpType::from( vec![ 1, 2 ] ); + let got = op.primitive(); + a_id!( got, None ); + } + + // + + fn basic() + { + let src = ""; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut exp = parse::Request::default(); + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = " "; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut exp = parse::Request::default(); + exp.original = " "; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = " \t "; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut exp = parse::Request::default(); + exp.original = " \t "; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + } + + // + + fn with_subject_and_map() + { + let src = "subj"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut exp = parse::Request::default(); + exp.original = "subj"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.maps = vec![ HashMap::new() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj with space"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut exp = parse::Request::default(); + exp.original = "subj with space"; + exp.subject = "subj with space".to_string(); + exp.subjects = vec![ "subj with space".to_string() ]; + exp.maps = vec![ HashMap::new() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj v:1"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Primitive( String::from( "1" ) ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:1"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj v:1 r:some"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Primitive( String::from( "1" ) ) ); + options.insert( String::from( "r" ), parse::OpType::Primitive( String::from( "some" ) ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:1 r:some"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + /* */ + + let src = "subj1 ; subj2"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut exp = parse::Request::default(); + exp.original = "subj1 ; subj2"; + exp.subject = "subj1".to_string(); + exp.subjects = vec![ "subj1".to_string(), "subj2".to_string() ]; + exp.maps = vec![ HashMap::new(), HashMap::new() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj1 v:1 ; subj2"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Primitive( String::from( "1" ) ) ); + let mut exp = parse::Request::default(); + exp.original = "subj1 v:1 ; subj2"; + exp.subject = "subj1".to_string(); + exp.subjects = vec![ "subj1".to_string(), "subj2".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone(), HashMap::new() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj1 v:1 ; subj2 v:2"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut options1 = HashMap::new(); + options1.insert( String::from( "v" ), parse::OpType::Primitive( String::from( "1" ) ) ); + let mut options2 = HashMap::new(); + options2.insert( String::from( "v" ), parse::OpType::Primitive( String::from( "2" ) ) ); + let mut exp = parse::Request::default(); + exp.original = "subj1 v:1 ; subj2 v:2"; + exp.subject = "subj1".to_string(); + exp.subjects = vec![ "subj1".to_string(), "subj2".to_string() ]; + exp.map = options1.clone(); + exp.maps = vec![ options1.clone(), options2.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj1 v:1 ne:-2 ; subj2 v:2 r:some"; + let req = the_module::string::request_parse() + .src( src ) + .perform(); + let mut options1 = HashMap::new(); + options1.insert( String::from( "v" ), parse::OpType::Primitive( String::from( "1" ) ) ); + options1.insert( String::from( "ne" ), parse::OpType::Primitive( String::from( "-2" ) ) ); + let mut options2 = HashMap::new(); + options2.insert( String::from( "v" ), parse::OpType::Primitive( String::from( "2" ) ) ); + options2.insert( String::from( "r" ), parse::OpType::Primitive( String::from( "some" ) ) ); + let mut exp = parse::Request::default(); + exp.original = "subj1 v:1 ne:-2 ; subj2 v:2 r:some"; + exp.subject = "subj1".to_string(); + exp.subjects = vec![ "subj1".to_string(), "subj2".to_string() ]; + exp.map = options1.clone(); + exp.maps = vec![ options1.clone(), options2.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + } + + // + + fn with_several_values() + { + let src = "subj v:1 v:2"; + let req = the_module::string::request_parse() + .src( src ) + .several_values( false ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Primitive( "2".to_string() ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:1 v:2"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj v:1 v:2"; + let req = the_module::string::request_parse() + .src( src ) + .several_values( true ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Vector( vec![ "1".to_string(), "2".to_string() ] ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:1 v:2"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + } + + // + + fn with_parsing_arrays() + { + let src = "subj v:[1,2]"; + let req = the_module::string::request_parse() + .src( src ) + .parsing_arrays( false ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Primitive( "[1,2]".to_string() ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:[1,2]"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj v:[1,2]"; + let req = the_module::string::request_parse() + .src( src ) + .parsing_arrays( true ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Vector( vec![ "1".to_string(), "2".to_string() ] ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:[1,2]"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + /* */ + + let src = "subj v:[1,2] v:3"; + let req = the_module::string::request_parse() + .src( src ) + .parsing_arrays( true ) + .several_values( true ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Vector( vec![ "1".to_string(), "2".to_string(), "3".to_string() ] ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:[1,2] v:3"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj v:3 v:[1,2]"; + let req = the_module::string::request_parse() + .src( src ) + .parsing_arrays( true ) + .several_values( true ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Vector( vec![ "3".to_string(), "1".to_string(), "2".to_string() ] ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:3 v:[1,2]"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + + let src = "subj v:[1,2] v:[3,4]"; + let req = the_module::string::request_parse() + .src( src ) + .parsing_arrays( true ) + .several_values( true ) + .perform(); + let mut options = HashMap::new(); + options.insert( String::from( "v" ), parse::OpType::Vector( vec![ "1".to_string(), "2".to_string(), "3".to_string(), "4".to_string() ] ) ); + let mut exp = parse::Request::default(); + exp.original = "subj v:[1,2] v:[3,4]"; + exp.subject = "subj".to_string(); + exp.subjects = vec![ "subj".to_string() ]; + exp.map = options.clone(); + exp.maps = vec![ options.clone() ]; + exp.key_val_delimeter = ":"; + exp.commands_delimeter = ";"; + a_id!( req, exp ); + } +} + +// + +tests_index! +{ + op_type_from_into, + basic, + with_subject_and_map, + with_several_values, + with_parsing_arrays, +} diff --git a/module/core/strs_tools/tests/inc/split_test.rs b/module/core/strs_tools/tests/inc/split_test.rs new file mode 100644 index 0000000000..19ca58fb77 --- /dev/null +++ b/module/core/strs_tools/tests/inc/split_test.rs @@ -0,0 +1,395 @@ + +use super::*; + +// + +tests_impls! +{ + fn basic() + { + let src = "abc"; + let iter = the_module::string::split() + .src( src ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "", "", "a", "", "b", "", "c", "", "", ] ); + } + + // + + fn basic_form_and_methods() + { + let src = "abc"; + let opts = the_module::string::split() + .src( src ) + .form(); + let iter = opts.split(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "", "", "a", "", "b", "", "c", "", "", ] ); + + let src = "abc"; + let opts = the_module::string::split() + .src( src ) + .form(); + let iter = opts.split_fast(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "", "", "a", "", "b", "", "c", "", "", ] ); + } + + // + + fn split_with_option_preserving_empty() + { + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .preserving_empty( true ) + .stripping( false ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "b", " ", "c" ] ); + + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .preserving_empty( false ) + .stripping( false ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "b", " ", "c" ] ); + + /* */ + + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .preserving_empty( true ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "", "b", "", "c" ] ); + + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .preserving_empty( false ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "b", "c" ] ); + } + + // + + fn split_with_option_preserving_delimeters() + { + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .preserving_delimeters( true ) + .stripping( false ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "b", " ", "c" ] ); + + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .preserving_delimeters( false ) + .stripping( false ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "b", "c" ] ); + } + + // + + fn split_with_option_preserving_quoting() + { + let src = "a 'b' c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .quoting( false ) + .preserving_delimeters( false ) + .preserving_empty( false ) + .preserving_quoting( true ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b'", "c" ] ); + + let src = "a 'b' c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .quoting( false ) + .preserving_delimeters( false ) + .preserving_empty( false ) + .preserving_quoting( false ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b'", "c" ] ); + + let src = "a 'b' c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .quoting( true ) + .preserving_delimeters( false ) + .preserving_empty( false ) + .preserving_quoting( true ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b'", "c" ] ); + + let src = "a 'b' c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .quoting( true ) + .preserving_delimeters( false ) + .preserving_empty( false ) + .preserving_quoting( false ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "b", "c" ] ); + } + + // + + fn split_with_option_stripping() + { + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "", "b", "", "c" ] ); + + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "b", " ", "c" ] ); + + /* */ + + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( "b" ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "b", "c" ] ); + + let src = "a b c"; + let iter = the_module::string::split() + .src( src ) + .delimeter( "b" ) + .preserving_delimeters( false ) + .stripping( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "c" ] ); + } + + // + + fn split_with_option_quoting() + { + let src = "a b c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "b", " ", "c", " ", "d" ] ); + + let src = "a 'b' c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( true ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "'b'", " ", "c", " ", "d" ] ); + + let src = "a 'b ' c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( true ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "'b '", " ", "c", " ", "d" ] ); + + let src = "a 'b 'c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( true ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", " ", "'b '", "c", " ", "d" ] ); + + let src = "'a 'b 'c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( true ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "'a '", "b", " ", "'c d" ] ); + + /* */ + + let src = "a b c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( false ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "b", "c", "d" ] ); + + let src = "a 'b' c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( false ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b'", "c", "d" ] ); + + let src = "a 'b ' c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( false ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b '", "c", "d" ] ); + + let src = "a 'b 'c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( false ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b '", "c", "d" ] ); + + let src = "'a 'b 'c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .preserving_delimeters( false ) + .preserving_empty( true ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "'a '", "b", "'c d" ] ); + + /* */ + + let src = "a 'b' c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( true ) + .preserving_delimeters( true ) + .preserving_empty( false ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b'", "c", "d" ] ); + + let src = "a 'b ' c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( true ) + .preserving_delimeters( true ) + .preserving_empty( false ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b '", "c", "d" ] ); + + let src = "a 'b 'c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( true ) + .preserving_delimeters( true ) + .preserving_empty( false ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "'b '", "c", "d" ] ); + + let src = "'a 'b 'c d"; + let iter = the_module::string::split() + .src( src ) + .delimeter( " " ) + .stripping( true ) + .preserving_delimeters( true ) + .preserving_empty( false ) + .quoting( true ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "'a '", "b", "'c d" ] ); + } + + // + + fn basic_split_with_vector() + { + let src = "abc"; + let iter = the_module::string::split() + .src( src ) + .delimeter( vec![] ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "abc", ] ); + + let src = "abc"; + let iter = the_module::string::split() + .src( src ) + .delimeter( vec![ "a", "b", "" ] ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "", "", "a", "", "b", "", "c", "", "", ] ); + + let src = "abc"; + let iter = the_module::string::split() + .src( src ) + .delimeter( vec![ "b", "d" ] ) + .perform(); + assert_eq!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "b", "c" ] ); + } +} + +// + +tests_index! +{ + basic, + basic_form_and_methods, + split_with_option_preserving_empty, + split_with_option_preserving_delimeters, + split_with_option_preserving_quoting, + split_with_option_stripping, + split_with_option_quoting, + basic_split_with_vector, +} diff --git a/module/core/strs_tools/tests/smoke_test.rs b/module/core/strs_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/strs_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/strs_tools/tests/strs_tools_tests.rs b/module/core/strs_tools/tests/strs_tools_tests.rs new file mode 100644 index 0000000000..314d7daa72 --- /dev/null +++ b/module/core/strs_tools/tests/strs_tools_tests.rs @@ -0,0 +1,5 @@ + + +#[ allow( unused_imports ) ] +use strs_tools as the_module; +mod inc; diff --git a/module/core/test_tools/Cargo.toml b/module/core/test_tools/Cargo.toml new file mode 100644 index 0000000000..18c79678fc --- /dev/null +++ b/module/core/test_tools/Cargo.toml @@ -0,0 +1,89 @@ +[package] +name = "test_tools" +version = "0.9.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/test_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/test_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/test_tools" +description = """ +Tools for writing and running tests. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "testing" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +# = features + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [ + # "error_tools/no_std", + # "meta_tools/no_std", + # "mem_tools/no_std", + # "typing_tools/no_std", + # "data_type/no_std", + # "diagnostics_tools/no_std", + # "process_tools_published/no_std", + # "former_stable/use_alloc", +] +use_alloc = [ + "no_std", + # "error_tools/use_alloc", + # "meta_tools/use_alloc", + # "mem_tools/use_alloc", + # "typing_tools/use_alloc", + # "data_type/use_alloc", + # "diagnostics_tools/use_alloc", + # "process_tools_published/use_alloc", + # "former_stable/use_alloc", +] +enabled = [ + "error_tools/enabled", + "meta_tools/enabled", + "mem_tools/enabled", + "typing_tools/enabled", + "data_type/enabled", + "diagnostics_tools/enabled", + "process_tools_published/enabled", +] +# nightly = [ "typing_tools/nightly" ] + +[dependencies] + +## external + +paste = "~1.0" # zzz : remove laster +rustversion = "~1.0" +# anyhow = "~1.0" +num-traits = "~0.2" +trybuild = { version = "1.0.85", features = [ "diff" ] } +rand = "0.8.5" + +## internal + +error_tools = { workspace = true, features = [ "full" ] } +meta_tools = { workspace = true, features = [ "full" ] } +mem_tools = { workspace = true, features = [ "full" ] } +typing_tools = { workspace = true, features = [ "full" ] } +data_type = { workspace = true, features = [ "full" ] } +diagnostics_tools = { workspace = true, features = [ "full" ] } +process_tools_published = { workspace = true, features = [ "full" ] } +# former_stable = { workspace = true, features = [ "full" ] } + +[build-dependencies] +rustc_version = "0.4" diff --git a/module/core/test_tools/License b/module/core/test_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/test_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/test_tools/Readme.md b/module/core/test_tools/Readme.md new file mode 100644 index 0000000000..e54c622c81 --- /dev/null +++ b/module/core/test_tools/Readme.md @@ -0,0 +1,63 @@ + + +# Module :: test_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/test_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftest_tools%2Fexamples%2Ftest_tools_trivial.rs,RUN_POSTFIX=--example%20test_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools for writing and running tests. + +### Basic use-case + + + +```rust +use test_tools::*; + +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +tests_impls! +{ + fn pass1() + { + assert_eq!( true, true ); + } + + // + + fn pass2() + { + assert_eq!( 1, 1 ); + } +} + +// +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +tests_index! +{ + pass1, + pass2, +} +``` + +### To add to your project + +```sh +cargo add test_tools --dev +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/test_trivial +cargo run +``` + +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Ftest_tools_trivial,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/test_tools) diff --git a/module/core/test_tools/build.rs b/module/core/test_tools/build.rs new file mode 100644 index 0000000000..43860208a5 --- /dev/null +++ b/module/core/test_tools/build.rs @@ -0,0 +1,31 @@ +//! To have information about channel of Rust compiler. + +use rustc_version::{ version, version_meta, Channel }; + +fn main() +{ + // Assert we haven't travelled back in time + assert!( version().unwrap().major >= 1 ); + + // Set cfg flags depending on release channel + match version_meta().unwrap().channel + { + Channel::Stable => + { + println!("cargo:rustc-cfg=RUSTC_IS_STABLE"); + } + Channel::Beta => + { + println!("cargo:rustc-cfg=RUSTC_IS_BETA"); + } + Channel::Nightly => + { + println!("cargo:rustc-cfg=RUSTC_IS_NIGHTLY"); + } + Channel::Dev => + { + println!("cargo:rustc-cfg=RUSTC_IS_DEV"); + } + } + +} \ No newline at end of file diff --git a/module/core/test_tools/examples/test_tools_trivial.rs b/module/core/test_tools/examples/test_tools_trivial.rs new file mode 100644 index 0000000000..d69ffd9120 --- /dev/null +++ b/module/core/test_tools/examples/test_tools_trivial.rs @@ -0,0 +1,4 @@ +//! Example of using `test_tools`. +fn main() +{ +} diff --git a/module/core/test_tools/src/lib.rs b/module/core/test_tools/src/lib.rs new file mode 100644 index 0000000000..babcb96c49 --- /dev/null +++ b/module/core/test_tools/src/lib.rs @@ -0,0 +1,99 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/test_tools/latest/test_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + + // zzz : exclude later + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::paste; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::trybuild; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::rustversion; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::error_tools; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::meta_tools; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::mem_tools; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::typing_tools; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::num_traits; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::diagnostics_tools; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::process_tools_published; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::process_tools_published as process_tools; + +} + +#[ cfg( feature = "enabled" ) ] +// #[ cfg( not( feature = "no_std" ) ) ] +::meta_tools::mod_interface! +{ + // #![ debug ] + + protected use super::dependency::*; + + layer test; + + // xxx : comment out + use super::exposed::meta; + use super::exposed::mem; + use super::exposed::typing; + use super::exposed::dt; + use super::exposed::diagnostics; + // use super::exposed::process; + + // prelude use ::rustversion::{ nightly, stable }; + + // // xxx : eliminate need to do such things, putting itself to proper category + // exposed use super::test::compiletime; + // exposed use super::test::helper; + // exposed use super::test::smoke_test; + + prelude use ::meta_tools as meta; + prelude use ::mem_tools as mem; + prelude use ::typing_tools as typing; + prelude use ::data_type as dt; + prelude use ::diagnostics_tools as diagnostics; + // prelude use ::process_tools as process; + + prelude use ::meta_tools:: + { + impls, + index, + tests_impls, + tests_impls_optional, + tests_index, + }; + prelude use ::typing_tools::{ implements }; + +} + +// xxx : use module namespaces +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( not( feature = "no_std" ) ) ] +// pub use test::{ compiletime, helper, smoke_test }; diff --git a/module/core/test_tools/src/test/asset.rs b/module/core/test_tools/src/test/asset.rs new file mode 100644 index 0000000000..929ff1f382 --- /dev/null +++ b/module/core/test_tools/src/test/asset.rs @@ -0,0 +1,47 @@ + +//! +//! Test asset helper. +//! + +/// Internal namespace. +// #[ cfg( not( feature = "no_std" ) ) ] +pub( crate ) mod private +{ + +// use std:: +// { +// env::consts::EXE_EXTENSION, +// path::{ Path, PathBuf }, +// process::Command, +// }; +// +// // xxx : qqq : ? +// /// poorly described function +// pub fn path_to_exe( temp_path : &Path, name : &Path, ) -> PathBuf +// { +// +// _ = Command::new( "rustc" ) +// .current_dir( temp_path ) +// .arg( name ) +// .status() +// .unwrap(); +// +// PathBuf::from( temp_path ) +// .join( name.file_name().unwrap() ) +// .with_extension( EXE_EXTENSION ) +// } + +} + + +// +// #[ cfg( not( feature = "no_std" ) ) ] +crate::mod_interface! +{ + + // exposed use super; + exposed use super::super::asset; + + // protected use path_to_exe; + +} diff --git a/module/core/test_tools/src/test/compiletime.rs b/module/core/test_tools/src/test/compiletime.rs new file mode 100644 index 0000000000..6b32d232b4 --- /dev/null +++ b/module/core/test_tools/src/test/compiletime.rs @@ -0,0 +1,24 @@ + +//! +//! Try building a program for negative testing. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + #[ doc( inline ) ] + pub use ::trybuild::*; +} + +// + +crate::mod_interface! +{ + // xxx : make it working + // exposed use super; + exposed use super::super::compiletime; + protected use + { + * + }; +} diff --git a/module/core/test_tools/src/test/helper.rs b/module/core/test_tools/src/test/helper.rs new file mode 100644 index 0000000000..902ca3e01c --- /dev/null +++ b/module/core/test_tools/src/test/helper.rs @@ -0,0 +1,90 @@ + +//! +//! Helpers for testing. +//! + +// use super::*; + +/// Internal namespace. +pub( crate ) mod private +{ + + // zzz : move here test tools + + // /// Pass only if callback fails either returning error or panicing. + // + // pub fn should_throw< R, F : FnOnce() -> anyhow::Result< R > >( f : F ) -> anyhow::Result< R > + // { + // f() + // } + + // + + // #[panic_handler] + // fn panic( info : &core::panic::PanicInfo ) -> ! + // { + // println!( "{:?}", info ); + // loop {} + // } + + // pub use test_suite; + // pub use test_suite_internals; + // pub use index; + + /// + /// Required to convert integets to floats. + /// + + #[ macro_export ] + macro_rules! num + { + + () => + { + }; + + ( $num : expr ) => + { + num_traits::cast::< _, T >( $num ).unwrap() + }; + + ( $( $num : expr ),+ ) => + {( + $( num_traits::cast::< _, T >( $num ).unwrap() ),+ + )}; + + } + + /// + /// Test a file with documentation. + /// + + #[ macro_export ] + macro_rules! doc_file_test + { + ( $file:expr ) => + { + #[ allow( unused_doc_comments ) ] + #[ cfg( doctest ) ] + #[ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", $file ) ) ] + extern { } + }; + } + + pub use num; + pub use doc_file_test; +} + +// + +crate::mod_interface! +{ + // exposed use super; + exposed use super::super::helper; + + prelude use + { + num, + doc_file_test, + }; +} diff --git a/module/core/test_tools/src/test/mod.rs b/module/core/test_tools/src/test/mod.rs new file mode 100644 index 0000000000..60ec182ac4 --- /dev/null +++ b/module/core/test_tools/src/test/mod.rs @@ -0,0 +1,14 @@ + +//! +//! Tools for testing. +//! + +// #[ cfg( not( feature = "no_std" ) ) ] +crate::mod_interface! +{ + layer asset; + layer compiletime; + layer helper; + layer smoke_test; + layer version; +} diff --git a/module/core/test_tools/src/test/smoke_test.rs b/module/core/test_tools/src/test/smoke_test.rs new file mode 100644 index 0000000000..29016a79bf --- /dev/null +++ b/module/core/test_tools/src/test/smoke_test.rs @@ -0,0 +1,332 @@ + +//! +//! Smoke test checking health of a module. +//! + +// qqq : does not work in parallel, fix +// qqq : make a command for willbe + +// xxx2 : use process_tools to build and run rust programs, introduce program_ + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use dependency::process_tools::environment; + // zzz : comment out + // pub mod environment + // { + // pub fn is_cicd() -> bool + // { + // false + // } + // } + + /// Context for smoke testing of a module. + #[ derive( Debug ) ] + pub struct SmokeModuleTest< 'a > + { + /// Name of module. + pub dependency_name : &'a str, + /// Version of module. + pub version : &'a str, + /// Local path to the module. + pub local_path_clause : &'a str, + /// Code to run during smoke testing. + pub code : String, + /// Path to temp directory to put all files. + pub test_path : std::path::PathBuf, + /// Postfix to add to name. + pub test_postfix : &'a str, + } + + impl< 'a > SmokeModuleTest< 'a > + { + /// Constructor of a context for smoke testing. + pub fn new( dependency_name : &'a str ) -> SmokeModuleTest< 'a > + { + let test_postfix = "_smoke_test"; + + use rand::prelude::*; + let mut rng = rand::thread_rng(); + let y: f64 = rng.gen(); + + let smoke_test_path = format!( "{}{}_{}", dependency_name, test_postfix, y ); + let mut test_path = std::env::temp_dir(); + test_path.push( smoke_test_path ); + + SmokeModuleTest + { + dependency_name, + version : "*", + local_path_clause : "", + code : format!( "use {dependency_name};" ).to_string(), + test_path, + test_postfix, + } + } + + /// Set version. + pub fn version( &mut self, version : &'a str ) -> &mut SmokeModuleTest< 'a > + { + self.version = version; + self + } + + /// Set local path. + pub fn local_path_clause( &mut self, local_path_clause : &'a str ) -> &mut SmokeModuleTest< 'a > + { + self.local_path_clause = local_path_clause; + self + } + + /// Set postfix to add to name of test. + pub fn test_postfix( &mut self, test_postfix : &'a str ) -> &mut SmokeModuleTest< 'a > + { + self.test_postfix = test_postfix; + + use rand::prelude::*; + let mut rng = rand::thread_rng(); + let y: f64 = rng.gen(); + + let smoke_test_path = format!( "{}{}_{}", self.dependency_name, test_postfix, y ); + self.test_path.pop(); + self.test_path.push( smoke_test_path ); + self + } + + /// Get code. + pub fn code( &mut self, code : String ) -> &mut SmokeModuleTest< 'a > + { + self.code = code; + self + } + + /// Prepare files at temp dir for smoke testing. + pub fn form( &mut self ) -> Result< (), &'static str > + { + std::fs::create_dir( &self.test_path ).unwrap(); + + let mut test_path = self.test_path.clone(); + + /* create binary test module */ + let test_name = format!( "{}{}", self.dependency_name, self.test_postfix ); + // println!( "test_name:{test_name}" ); + + // dbg!( &test_path ); + + let output = std::process::Command::new( "cargo" ) + .current_dir( &test_path ) + .args([ "new", "--bin", &test_name ]) + .output() + .expect( "Failed to execute command" ) + ; + println!( "{}", std::str::from_utf8( &output.stderr ).expect( "Invalid UTF-8" ) ); + + test_path.push( test_name ); + + /* setup config */ + #[ cfg( target_os = "windows" ) ] + let local_path_clause = if self.local_path_clause == "" { "".to_string() } else { format!( ", path = \"{}\"", self.local_path_clause.escape_default() ) }; + #[ cfg( not( target_os = "windows" ) ) ] + let local_path_clause = if self.local_path_clause == "" { "".to_string() } else { format!( ", path = \"{}\"", self.local_path_clause ) }; + let dependencies_section = format!( "{} = {{ version = \"{}\" {} }}", self.dependency_name, self.version, &local_path_clause ); + let config_data = format! + ( + "[package] + edition = \"2021\" + name = \"{}_smoke_test\" + version = \"0.0.1\" + + [dependencies] + {}", + &self.dependency_name, + &dependencies_section + ); + let mut config_path = test_path.clone(); + config_path.push( "Cargo.toml" ); + println!( "\n{}\n", config_data ); + std::fs::write( config_path, config_data ).unwrap(); + + /* write code */ + test_path.push( "src" ); + test_path.push( "main.rs" ); + if self.code == "" + { + self.code = format!( "use ::{}::*;", self.dependency_name ); + } + let code = format! + ( + "#[ allow( unused_imports ) ] + fn main() + {{ + {} + }}", + self.code, + ); + println!( "\n{}\n", code ); + std::fs::write( &test_path, code ).unwrap(); + + Ok( () ) + } + + /// Do smoke testing. + pub fn perform( &self ) -> Result<(), &'static str> + { + let mut test_path = self.test_path.clone(); + + let test_name = format!( "{}{}", self.dependency_name, self.test_postfix ); + test_path.push( test_name ); + + let output = std::process::Command::new( "cargo" ) + .current_dir( test_path.clone() ) + .args([ "test" ]) + .output() + .unwrap() + ; + println!( "status : {}", output.status ); + println!( "{}", std::str::from_utf8( &output.stdout ).expect( "Invalid UTF-8" ) ); + println!( "{}", std::str::from_utf8( &output.stderr ).expect( "Invalid UTF-8" ) ); + assert!( output.status.success(), "Smoke test failed" ); + + let output = std::process::Command::new( "cargo" ) + .current_dir( test_path ) + .args([ "run", "--release" ]) + .output() + .unwrap() + ; + println!( "status : {}", output.status ); + println!( "{}", std::str::from_utf8( &output.stdout ).expect( "Invalid UTF-8" ) ); + println!( "{}", std::str::from_utf8( &output.stderr ).expect( "Invalid UTF-8" ) ); + assert!( output.status.success(), "Smoke test failed" ); + + Ok( () ) + } + + /// Cleaning temp directory after testing. + pub fn clean( &self, force : bool ) -> Result<(), &'static str> + { + let result = std::fs::remove_dir_all( &self.test_path ); + if force + { + result.unwrap_or_default(); + } + else + { + let msg = format!( "Cannot remove temporary directory {}. Please, remove it manually", &self.test_path.display() ); + result.expect( &msg ); + } + Ok( () ) + } + + } + + /// Run smoke test for the module. + + pub fn smoke_test_run( local : bool ) + { + let module_name = std::env::var( "CARGO_PKG_NAME" ).unwrap(); + let module_path = std::env::var( "CARGO_MANIFEST_DIR" ).unwrap(); + let test_name = match local + { + false => "_published_smoke_test", + true => "_local_smoke_test", + }; + println!( "smoke_test_run module_name:{module_name} module_path:{module_path}" ); + + let mut t = SmokeModuleTest::new( module_name.as_str() ); + t.test_postfix( test_name ); + t.clean( true ).unwrap(); + + t.version( "*" ); + if local + { + t.local_path_clause( module_path.as_str() ); + } + t.form().unwrap(); + t.perform().unwrap(); + t.clean( false ).unwrap(); + } + + /// Run smoke test for both published and local version of the module. + + pub fn smoke_tests_run() + { + smoke_test_for_local_run(); + smoke_test_for_published_run(); + } + + /// Run smoke test for local version of the module. + + pub fn smoke_test_for_local_run() + { + println!( "smoke_test_for_local_run : {:?}", std::env::var( "WITH_SMOKE" ) ); + let run = if let Ok( value ) = std::env::var( "WITH_SMOKE" ) + { + match value.as_str() + { + "0" => false, + "1" => true, + "false" => false, + "local" => true, + "published" => false, + _ => false, + } + } + else + { + // qqq : xxx : use is_cicd() and return false if false + // true + environment::is_cicd() + }; + if run + { + smoke_test_run( true ); + } + } + + /// Run smoke test for published version of the module. + + pub fn smoke_test_for_published_run() + { + let run = if let Ok( value ) = std::env::var( "WITH_SMOKE" ) + { + match value.as_str() + { + "0" => false, + "1" => true, + "false" => false, + "local" => false, + "published" => true, + _ => false, + } + } + else + { + environment::is_cicd() + // qqq : xxx : use is_cicd() and return false if false + // true + }; + if run + { + smoke_test_run( false ); + } + } + +} + + +// +crate::mod_interface! +{ + + // exposed use super; + exposed use super::super::smoke_test; + + exposed use SmokeModuleTest; + exposed use smoke_test_run; + exposed use smoke_tests_run; + exposed use smoke_test_for_local_run; + exposed use smoke_test_for_published_run; + +} diff --git a/module/core/test_tools/src/test/version.rs b/module/core/test_tools/src/test/version.rs new file mode 100644 index 0000000000..36caf6823c --- /dev/null +++ b/module/core/test_tools/src/test/version.rs @@ -0,0 +1,23 @@ + +//! +//! Version of Rust compiler +//! + +/// Internal namespace. +// #[ cfg( not( feature = "no_std" ) ) ] +pub( crate ) mod private +{ +} + + +// +// #[ cfg( not( feature = "no_std" ) ) ] +crate::mod_interface! +{ + + // exposed use super; + exposed use super::super::version; + + prelude use ::rustversion::{ nightly, stable }; + +} diff --git a/module/core/test_tools/tests/inc/basic_test.rs b/module/core/test_tools/tests/inc/basic_test.rs new file mode 100644 index 0000000000..8e631611f4 --- /dev/null +++ b/module/core/test_tools/tests/inc/basic_test.rs @@ -0,0 +1,66 @@ +// +// use super::*; +// +// #[ path = "../dynamic/basic.rs" ] +// mod basic; +// +// // +// +// the_module::tests_index! +// { +// trybuild_test, +// } + +#[ allow( unused_imports ) ] +use super::*; +use ::test_tools as the_module; + + +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +the_module::tests_impls! +{ + + // + + fn pass1_test() + { + the_module::a_id!( true, true ); + } + + // + + fn fail1_test() + { + // the_module::a_id!( true, false ); + } + + // + + #[cfg(any())] + fn never_test() + { + println!( "never_test" ); + } + + // + + #[cfg(all())] + fn always_test() + { + println!( "always_test" ); + } + +} + +// + +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +the_module::tests_index! +{ + pass1_test, + fail1_test, + never_test, + always_test, +} diff --git a/module/core/test_tools/tests/inc/dynamic/basic.rs b/module/core/test_tools/tests/inc/dynamic/basic.rs new file mode 100644 index 0000000000..f741adf982 --- /dev/null +++ b/module/core/test_tools/tests/inc/dynamic/basic.rs @@ -0,0 +1,47 @@ +#[ allow( unused_imports ) ] +use super::the_module::*; + +tests_impls! +{ + + // + + fn pass1_test() + { + a_id!( true, true ); + } + + // + + fn fail1_test() + { + // a_id!( true, false ); + } + + // + + #[cfg(any())] + fn never_test() + { + println!( "never_test" ); + } + + // + + #[cfg(all())] + fn always_test() + { + println!( "always_test" ); + } + +} + +// + +tests_index! +{ + pass1_test, + fail1_test, + never_test, + always_test, +} diff --git a/module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.rs b/module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.rs new file mode 100644 index 0000000000..f09853be90 --- /dev/null +++ b/module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.rs @@ -0,0 +1,23 @@ +use wtest_basic::exposed::exposed::*; + +// + +tests_impls! +{ + fn pass() + { + assert_eq!( true, true ); + } +} + +// + +tests_index! +{ + pass, +} + +#[ allow( dead_code ) ] +fn main() +{ +} diff --git a/module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.stderr b/module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.stderr new file mode 100644 index 0000000000..2c127f9595 --- /dev/null +++ b/module/core/test_tools/tests/inc/dynamic/namespace_does_not_exists.stderr @@ -0,0 +1,31 @@ +error[E0433]: failed to resolve: use of undeclared crate or module `wtest_basic` + --> tests/inc/dynamic/namespace_does_not_exists.rs:1:5 + | +1 | use wtest_basic::exposed::exposed::*; + | ^^^^^^^^^^^ use of undeclared crate or module `wtest_basic` + +error: cannot find macro `tests_index` in this scope + --> tests/inc/dynamic/namespace_does_not_exists.rs:15:1 + | +15 | tests_index! + | ^^^^^^^^^^^ + | +help: consider importing one of these items + | +1 + use meta_tools::tests_index; + | +1 + use test_tools::tests_index; + | + +error: cannot find macro `tests_impls` in this scope + --> tests/inc/dynamic/namespace_does_not_exists.rs:5:1 + | +5 | tests_impls! + | ^^^^^^^^^^^ + | +help: consider importing one of these items + | +1 + use meta_tools::tests_impls; + | +1 + use test_tools::tests_impls; + | diff --git a/module/core/test_tools/tests/inc/dynamic/trybuild.rs b/module/core/test_tools/tests/inc/dynamic/trybuild.rs new file mode 100644 index 0000000000..2613ef2cc7 --- /dev/null +++ b/module/core/test_tools/tests/inc/dynamic/trybuild.rs @@ -0,0 +1,23 @@ +use test_tools::*; + +// + +tests_impls! +{ + fn pass() + { + assert_eq!( true, true ); + } +} + +// + +tests_index! +{ + pass, +} + +#[ allow( dead_code ) ] +fn main() +{ +} diff --git a/module/core/test_tools/tests/inc/mod.rs b/module/core/test_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..bf3d2e3d78 --- /dev/null +++ b/module/core/test_tools/tests/inc/mod.rs @@ -0,0 +1,8 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic_test; +mod try_build_test; +// mod wtest_utility; + +// qqq : include tests of all internal dependencies diff --git a/module/core/test_tools/tests/inc/try_build_test.rs b/module/core/test_tools/tests/inc/try_build_test.rs new file mode 100644 index 0000000000..b0167dc774 --- /dev/null +++ b/module/core/test_tools/tests/inc/try_build_test.rs @@ -0,0 +1,14 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +#[ ::test_tools::nightly ] +#[ test ] +fn trybuild_test() +{ + // let t = trybuild::TestCases::new(); + let t = ::test_tools::compiletime::TestCases::new(); + t.pass( "tests/inc/dynamic/trybuild.rs" ); + t.compile_fail( "tests/inc/dynamic/namespace_does_not_exists.rs" ); +} diff --git a/module/core/test_tools/tests/smoke_test.rs b/module/core/test_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..8d83b8d34e --- /dev/null +++ b/module/core/test_tools/tests/smoke_test.rs @@ -0,0 +1,18 @@ + +// #[ cfg( feature = "default" ) ] +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/test_tools/tests/tests.rs b/module/core/test_tools/tests/tests.rs new file mode 100644 index 0000000000..3cdbd75627 --- /dev/null +++ b/module/core/test_tools/tests/tests.rs @@ -0,0 +1,12 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use test_tools as the_module; +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +#[ cfg( not( feature = "no_std" ) ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/core/time_tools/Cargo.toml b/module/core/time_tools/Cargo.toml new file mode 100644 index 0000000000..e12847049c --- /dev/null +++ b/module/core/time_tools/Cargo.toml @@ -0,0 +1,71 @@ +[package] +name = "time_tools" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/time_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/time_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/time_tools" +description = """ +Collection of general purpose time tools. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] +# include = [ +# "/rust/impl/time", +# "/Cargo.toml", +# "/Readme.md", +# "/License", +# ] + +[features] +default = [ + "time_now", + "enabled" +] +full = [ + "use_alloc", + "time_now", + "enabled" +] + +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +time_now = [ + "enabled" +] + +# [lib] +# name = "time_tools" +# path = "src/time/time_tools_lib.rs" + +# [[test]] +# name = "time_tools_test" +# path = "tests/time/tests.rs" + +# [[test]] +# name = "time_tools_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +# [[example]] +# name = "time_tools_trivial" +# path = "examples/time_tools_trivial/src/main.rs" + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/time_tools/License b/module/core/time_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/time_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/time_tools/Readme.md b/module/core/time_tools/Readme.md new file mode 100644 index 0000000000..903a8482e0 --- /dev/null +++ b/module/core/time_tools/Readme.md @@ -0,0 +1,50 @@ + + +# Module :: time_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/time_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/time_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftime_tools%2Fexamples%2Ftime_tools_trivial.rs,RUN_POSTFIX=--example%20time_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose time tools. + +### Basic use-case + + + +```rust +#[ cfg( feature = "chrono" ) ] +{ + use time_tools::*; + + /* get milliseconds from UNIX epoch */ + let now = time::now(); + println!( "now {}", now ); + + /* get nanoseconds from UNIX epoch */ + let now = time::now(); + let now_ns = time::ns::now(); + assert_eq!( now, now_ns / 1000000 ); + + /* get seconds from UNIX epoch */ + let now = time::now(); + let now_s = time::s::now(); + assert_eq!( now / 1000, now_s ); +} +``` + + + +### To add to your project + +```sh +cargo add time_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/time_tools_trivial +cargo run +``` diff --git a/module/core/time_tools/examples/time_tools_trivial.rs b/module/core/time_tools/examples/time_tools_trivial.rs new file mode 100644 index 0000000000..55c8e78a90 --- /dev/null +++ b/module/core/time_tools/examples/time_tools_trivial.rs @@ -0,0 +1,22 @@ +//! qqq : write proper description +fn main() +{ + #[ cfg( feature = "chrono" ) ] + { + use time_tools as the_module; + + /* get milliseconds from UNIX epoch */ + let now = the_module::now(); + println!( "now {}", now ); + + /* get nanoseconds from UNIX epoch */ + let now = the_module::now(); + let now_ns = the_module::ns::now(); + assert_eq!( now, now_ns / 1000000 ); + + /* get seconds from UNIX epoch */ + let now = the_module::now(); + let now_s = the_module::s::now(); + assert_eq!( now / 1000, now_s ); + } +} diff --git a/module/core/time_tools/src/lib.rs b/module/core/time_tools/src/lib.rs new file mode 100644 index 0000000000..9af60e8522 --- /dev/null +++ b/module/core/time_tools/src/lib.rs @@ -0,0 +1,68 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/time_tools/latest/time_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Collection of time tools. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Operates over current time. +#[ cfg( feature = "time_now" ) ] +#[ path = "./now.rs" ] +#[ cfg( feature = "enabled" ) ] +pub mod now; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Shared with parent namespace of the module +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ cfg( feature = "time_now" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::now::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ +} diff --git a/module/core/time_tools/src/now.rs b/module/core/time_tools/src/now.rs new file mode 100644 index 0000000000..4c67c05e6f --- /dev/null +++ b/module/core/time_tools/src/now.rs @@ -0,0 +1,70 @@ +#[ cfg( not( feature = "no_std" ) ) ] +use std::time; + +/// +/// Get current time. Units are milliseconds. +/// +#[ cfg( not( feature = "no_std" ) ) ] +pub fn now() -> i64 +{ + time::SystemTime::now() + .duration_since( time::UNIX_EPOCH ).unwrap() + .as_millis() as i64 +} + +/// +/// Default units are seconds. +/// + +pub mod s +{ + use super::*; + + /// Get current time. Units are seconds. + #[ cfg( not( feature = "no_std" ) ) ] + pub fn now() -> i64 + { + time::SystemTime::now() + .duration_since( time::UNIX_EPOCH ).unwrap() + .as_secs() as i64 + } +} + +/// +/// Default units are milliseconds. +/// + +pub mod ms +{ + use super::*; + + /// Get current time. Units are milliseconds. + #[ cfg( not( feature = "no_std" ) ) ] + pub fn now() -> i64 + { + time::SystemTime::now() + .duration_since( time::UNIX_EPOCH ).unwrap() + .as_millis() as i64 + } +} + +// xxx : qqq for Dima : problem. ms should not be part of `wtools::ms`, something is wrong. fix it, please +/* aaa : Dmytro : all routines and modules is inside wtools and wtools::time, added test suite to test it */ + +/// +/// Default units are nanoseconds. +/// + +pub mod ns +{ + use super::*; + + /// Get current time. Units are nanoseconds. + #[ cfg( not( feature = "no_std" ) ) ] + pub fn now() -> i64 + { + time::SystemTime::now() + .duration_since( time::UNIX_EPOCH ).unwrap() + .as_nanos() as i64 + } +} diff --git a/module/core/time_tools/tests/inc/basic.rs b/module/core/time_tools/tests/inc/basic.rs new file mode 100644 index 0000000000..06ed4f2b81 --- /dev/null +++ b/module/core/time_tools/tests/inc/basic.rs @@ -0,0 +1,38 @@ + +use test_tools::exposed::*; + +tests_impls! +{ + #[ cfg( feature = "time_now" ) ] + #[ cfg( not( feature = "no_std" ) ) ] + fn basic() + { + use crate::the_module; + // test.case( "wtools::now" ); + let got = the_module::now(); + a_true!( got > 0 ); + + // test.case( "wtools::ms::now" ); + let got1 = the_module::now(); + let got2 = the_module::ms::now(); + a_true!( got2 - got2 <= 10 ); + + // // test.case( "wtools::ns::now" ); + let got1 = the_module::now(); + let got2 = the_module::ns::now(); + a_true!( got2 / 1_000_000 - got1 <= 10 ); + // zzz : use equal! + + // test.case( "time::s::now" ); + let got1 = the_module::now(); + let got2 = the_module::s::now(); + a_id!( got1 / 1000, got2 ); + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/time_tools/tests/inc/mod.rs b/module/core/time_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..73716878fe --- /dev/null +++ b/module/core/time_tools/tests/inc/mod.rs @@ -0,0 +1,15 @@ + +// #[ cfg( feature = "time" ) ] +// #[ allow( unused_imports ) ] +// use wtools::time as the_module; + +// #[ cfg( feature = "time" ) ] +// mod inc; + +// #[ cfg( feature = "time" ) ] +// mod basic; + +use super::*; + +pub mod basic; +pub mod now_test; diff --git a/module/core/time_tools/tests/inc/now_test.rs b/module/core/time_tools/tests/inc/now_test.rs new file mode 100644 index 0000000000..4c41d16863 --- /dev/null +++ b/module/core/time_tools/tests/inc/now_test.rs @@ -0,0 +1,42 @@ + +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + + #[ cfg( any( feature = "chrono", feature = "time_chrono" ) ) ] + fn basic() + { + use the_module::*; + + // test.case( "time::now" ); + let got = time::now(); + a_true!( got > 0 ); + + // test.case( "time::ms::now" ); + let got1 = time::now(); + let got2 = time::ms::now(); + a_true!( got2 - got2 <= 10 ); + + // // test.case( "time::ns::now" ); + let got1 = time::now(); + let got2 = time::ns::now(); + a_true!( got2 / 1_000_000 - got1 <= 10 ); + // zzz : use equal! + + // test.case( "time::s::now" ); + let got1 = time::now(); + let got2 = time::s::now(); + a_id!( got1 / 1000, got2 ); + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/core/time_tools/tests/smoke_test.rs b/module/core/time_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/time_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/time_tools/tests/time_tests.rs b/module/core/time_tools/tests/time_tests.rs new file mode 100644 index 0000000000..c07e158be6 --- /dev/null +++ b/module/core/time_tools/tests/time_tests.rs @@ -0,0 +1,6 @@ + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +use time_tools as the_module; + +mod inc; diff --git a/module/core/typing_tools/Cargo.toml b/module/core/typing_tools/Cargo.toml new file mode 100644 index 0000000000..22f2d3f982 --- /dev/null +++ b/module/core/typing_tools/Cargo.toml @@ -0,0 +1,64 @@ + +[package] +name = "typing_tools" +version = "0.8.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/typing_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/typing_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/typing_tools" +description = """ +Collection of general purpose tools for type checking. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] + +default = [ + "enabled", + "typing_implements", + "typing_is_slice", + "typing_inspect_type", + # "nightly", +] + +full = [ + "enabled", + "typing_implements", + "typing_is_slice", + "typing_inspect_type", + # "nightly", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +typing_inspect_type = [ "inspect_type/enabled" ] +typing_is_slice = [ "is_slice/enabled" ] +typing_implements = [ "implements/enabled" ] +# nightly = [ "inspect_type/nightly" ] + +[dependencies] + +## internal +inspect_type = { workspace = true } +is_slice = { workspace = true } +implements = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/typing_tools/License b/module/core/typing_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/typing_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/typing_tools/Readme.md b/module/core/typing_tools/Readme.md new file mode 100644 index 0000000000..33bd604df3 --- /dev/null +++ b/module/core/typing_tools/Readme.md @@ -0,0 +1,37 @@ + + +# Module :: typing_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/typing_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/typing_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftyping_tools%2Fexamples%2Ftyping_tools_trivial.rs,RUN_POSTFIX=--example%20typing_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose tools for type checking. + +### Basic use-case + + + +```rust +use typing_tools::*; + +let src = Box::new( true ); +assert_eq!( implements!( src => Copy ), false ); +assert_eq!( implements!( src => Clone ), true ); +``` + + + +### To add to your project + +```sh +cargo add typing_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/typing_tools_trivial +cargo run +``` diff --git a/module/core/typing_tools/examples/typing_tools_trivial.rs b/module/core/typing_tools/examples/typing_tools_trivial.rs new file mode 100644 index 0000000000..26d1756e3c --- /dev/null +++ b/module/core/typing_tools/examples/typing_tools_trivial.rs @@ -0,0 +1,9 @@ +//! qqq : write proper description +use typing_tools::*; + +fn main() +{ + let src = Box::new( true ); + assert!( !implements!( src => Copy ) ); + assert!( implements!( src => Clone ) ); +} diff --git a/module/core/typing_tools/src/lib.rs b/module/core/typing_tools/src/lib.rs new file mode 100644 index 0000000000..0b54e804ec --- /dev/null +++ b/module/core/typing_tools/src/lib.rs @@ -0,0 +1,77 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/typing_tools/latest/typing_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Collection of general purpose tools for type checking. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Collection of general purpose tools for type checking. +#[ cfg( feature = "enabled" ) ] +pub mod typing; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ cfg( feature = "typing_inspect_type" ) ] + pub use ::inspect_type; + #[ cfg( feature = "typing_is_slice" ) ] + pub use ::is_slice; + #[ cfg( feature = "typing_implements" ) ] + pub use ::implements; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::typing::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::typing::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::typing::prelude::*; +} diff --git a/module/core/typing_tools/src/typing.rs b/module/core/typing_tools/src/typing.rs new file mode 100644 index 0000000000..2e434594ae --- /dev/null +++ b/module/core/typing_tools/src/typing.rs @@ -0,0 +1,69 @@ + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ cfg( feature = "typing_inspect_type" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::inspect_type::orphan::*; + #[ cfg( feature = "typing_is_slice" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::is_slice::orphan::*; + #[ cfg( feature = "typing_implements" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::implements::orphan::*; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "typing_inspect_type" ) ] + pub use ::inspect_type::exposed::*; + #[ cfg( feature = "typing_is_slice" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::is_slice::exposed::*; + #[ cfg( feature = "typing_implements" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::implements::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ cfg( feature = "typing_inspect_type" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::inspect_type::prelude::*; + #[ cfg( feature = "typing_is_slice" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::is_slice::prelude::*; + #[ cfg( feature = "typing_implements" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::implements::prelude::*; +} diff --git a/module/core/typing_tools/tests/inc/mod.rs b/module/core/typing_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..f6849e47df --- /dev/null +++ b/module/core/typing_tools/tests/inc/mod.rs @@ -0,0 +1,14 @@ + +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use the_module::typing as the_module; + +#[ path = "../../../../core/implements/tests/inc/mod.rs" ] +mod implements_test; + +#[ path = "../../../../core/inspect_type/tests/inc/mod.rs" ] +mod inspect_type_test; + +#[ path = "../../../../core/is_slice/tests/inc/mod.rs" ] +mod is_slice_test; diff --git a/module/core/typing_tools/tests/smoke_test.rs b/module/core/typing_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/typing_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/typing_tools/tests/tests.rs b/module/core/typing_tools/tests/tests.rs new file mode 100644 index 0000000000..9f9c82cedc --- /dev/null +++ b/module/core/typing_tools/tests/tests.rs @@ -0,0 +1,10 @@ +// xxx +#![ cfg_attr( feature = "type_name_of_val", feature( type_name_of_val ) ) ] +// // #![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] + +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use typing_tools as the_module; + +mod inc; diff --git a/module/core/variadic_from/Cargo.toml b/module/core/variadic_from/Cargo.toml new file mode 100644 index 0000000000..3f41686cfe --- /dev/null +++ b/module/core/variadic_from/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "variadic_from" +version = "0.19.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/variadic_from" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/variadic_from" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/variadic_from" +description = """ +Variadic from. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] + +default = [ + "enabled", + "derive_variadic_from", + "type_variadic_from", +] + +full = [ + "enabled", + "derive_variadic_from", + "type_variadic_from", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +type_variadic_from = [] +derive_variadic_from = [ "type_variadic_from", "derive_tools_meta/derive_variadic_from" ] + +[dependencies] + +## internal +derive_tools_meta = { workspace = true, features = [ "enabled", "derive_variadic_from" ] } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/variadic_from/License b/module/core/variadic_from/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/variadic_from/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/variadic_from/Readme.md b/module/core/variadic_from/Readme.md new file mode 100644 index 0000000000..c06be02938 --- /dev/null +++ b/module/core/variadic_from/Readme.md @@ -0,0 +1,155 @@ +# Module :: variadic_from + + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml) [![docs.rs](https://img.shields.io/docsrs/variadic_from?color=e3e8f0&logo=docs.rs)](https://docs.rs/variadic_from) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fvariadic_from%2Fexamples%2Fvariadic_from_trivial.rs,RUN_POSTFIX=--example%20variadic_from_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +The variadic from is designed to provide a way to implement the From-like traits for structs with a variable number of fields, allowing them to be constructed from tuples of different lengths or from individual arguments. This functionality is particularly useful for creating flexible constructors that enable different methods of instantiation for a struct. By automating the implementation of traits crate reduces boilerplate code and enhances code readability and maintainability. + +Currently it support up to 3 arguments. If your structure has more than 3 fields derive generates nothing. Also it supports tuple conversion, allowing structs to be instantiated from tuples by leveraging the `From` and `Into` traits for seamless conversion. + +### Basic use-case. + + + + + +This example demonstrates the use of the `variadic_from` macro to implement flexible +constructors for a struct, allowing it to be instantiated from different numbers of +arguments or tuples. It also showcases how to derive common traits like `Debug`, +`PartialEq`, `Default`, and `VariadicFrom` for the struct. + +```rust +#[ cfg( not( all(feature = "enabled", feature = "type_variadic_from", feature = "derive_variadic_from" ) ) ) ] +fn main(){} +#[ cfg( all( feature = "enabled", feature = "type_variadic_from", feature = "derive_variadic_from" ) )] +fn main() +{ + use variadic_from::exposed::*; + + // Define a struct `MyStruct` with fields `a` and `b`. + // The struct derives common traits like `Debug`, `PartialEq`, `Default`, and `VariadicFrom`. + #[ derive( Debug, PartialEq, Default, VariadicFrom ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + struct MyStruct + { + a : i32, + b : i32, + } + + // Implement the `From1` trait for `MyStruct`, which allows constructing a `MyStruct` instance + // from a single `i32` value by assigning it to both `a` and `b` fields. + + impl From1< i32 > for MyStruct + { + fn from1( a : i32 ) -> Self { Self { a, b : a } } + } + + let got : MyStruct = from!(); + let exp = MyStruct { a : 0, b : 0 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13 ); + let exp = MyStruct { a : 13, b : 13 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13, 14 ); + let exp = MyStruct { a : 13, b : 14 }; + assert_eq!( got, exp ); + + dbg!( exp ); + //> MyStruct { + //> a: 13, + //> b: 14, + //> } + +} +``` + +
    +The code above will be expanded to this + +```rust +#[ cfg( not( all(feature = "enabled", feature = "type_variadic_from" ) ) ) ] +fn main(){} +#[ cfg( all( feature = "enabled", feature = "type_variadic_from" ) )] +fn main() +{ + use variadic_from::exposed::*; + + // Define a struct `MyStruct` with fields `a` and `b`. + // The struct derives common traits like `Debug`, `PartialEq`, `Default` + // `VariadicFrom` defined manually. + #[ derive( Debug, PartialEq, Default ) ] + struct MyStruct + { + a : i32, + b : i32, + } + + // Implement the `From1` trait for `MyStruct`, which allows constructing a `MyStruct` instance + // from a single `i32` value by assigning it to both `a` and `b` fields. + impl From1< i32 > for MyStruct + { + fn from1( a : i32 ) -> Self { Self { a, b : a } } + } + + // == begin of generated + + impl From2< i32, i32 > for MyStruct + { + fn from2( a : i32, b : i32 ) -> Self { Self{ a : a, b : b } } + } + + impl From< ( i32, i32 ) > for MyStruct + { + #[ inline( always ) ] + fn from( ( a, b ) : ( i32, i32 ) ) -> Self + { + Self::from2( a, b ) + } + } + + // == end of generated + + let got : MyStruct = from!(); + let exp = MyStruct { a : 0, b : 0 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13 ); + let exp = MyStruct { a : 13, b : 13 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13, 14 ); + let exp = MyStruct { a : 13, b : 14 }; + assert_eq!( got, exp ); + + dbg!( exp ); + //> MyStruct { + //> a: 13, + //> b: 14, + //> } + +} +``` + +
    + +Try out `cargo run --example variadic_from_trivial`. +
    +[See code](./examples/variadic_from_trivial.rs). + +### To add to your project + +```sh +cargo add variadic_from +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example variadic_from_trivial +``` diff --git a/module/core/variadic_from/examples/variadic_from_trivial.rs b/module/core/variadic_from/examples/variadic_from_trivial.rs new file mode 100644 index 0000000000..a1c68018ec --- /dev/null +++ b/module/core/variadic_from/examples/variadic_from_trivial.rs @@ -0,0 +1,52 @@ +// variadic_from_trivial.rs + +//! This example demonstrates the use of the `variadic_from` macro to implement flexible +//! constructors for a struct, allowing it to be instantiated from different numbers of +//! arguments or tuples. It also showcases how to derive common traits like `Debug`, +//! `PartialEq`, `Default`, and `VariadicFrom` for the struct. + +#[ cfg( not( all(feature = "enabled", feature = "type_variadic_from", feature = "derive_variadic_from" ) ) ) ] +fn main(){} +#[ cfg( all( feature = "enabled", feature = "type_variadic_from", feature = "derive_variadic_from" ) )] +fn main() +{ + use variadic_from::exposed::*; + + // Define a struct `MyStruct` with fields `a` and `b`. + // The struct derives common traits like `Debug`, `PartialEq`, `Default`, and `VariadicFrom`. + #[ derive( Debug, PartialEq, Default, VariadicFrom ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + struct MyStruct + { + a : i32, + b : i32, + } + + // Implement the `From1` trait for `MyStruct`, which allows constructing a `MyStruct` instance + // from a single `i32` value by assigning it to both `a` and `b` fields. + + impl From1< i32 > for MyStruct + { + fn from1( a : i32 ) -> Self { Self { a, b : a } } + } + + let got : MyStruct = from!(); + let exp = MyStruct { a : 0, b : 0 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13 ); + let exp = MyStruct { a : 13, b : 13 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13, 14 ); + let exp = MyStruct { a : 13, b : 14 }; + assert_eq!( got, exp ); + + dbg!( exp ); + //> MyStruct { + //> a: 13, + //> b: 14, + //> } + +} diff --git a/module/core/variadic_from/examples/variadic_from_trivial_expanded.rs b/module/core/variadic_from/examples/variadic_from_trivial_expanded.rs new file mode 100644 index 0000000000..3f32182add --- /dev/null +++ b/module/core/variadic_from/examples/variadic_from_trivial_expanded.rs @@ -0,0 +1,66 @@ +//! This example demonstrates the use of the `variadic_from` macro to implement flexible +//! constructors for a struct, allowing it to be instantiated from different numbers of +//! arguments or tuples. It also showcases how to derive common traits like `Debug`, +//! `PartialEq`, `Default`, and `VariadicFrom` for the struct. + +#[ cfg( not( all(feature = "enabled", feature = "type_variadic_from" ) ) ) ] +fn main(){} +#[ cfg( all( feature = "enabled", feature = "type_variadic_from" ) )] +fn main() +{ + use variadic_from::exposed::*; + + // Define a struct `MyStruct` with fields `a` and `b`. + // The struct derives common traits like `Debug`, `PartialEq`, `Default` + // `VariadicFrom` defined manually. + #[ derive( Debug, PartialEq, Default ) ] + struct MyStruct + { + a : i32, + b : i32, + } + + // Implement the `From1` trait for `MyStruct`, which allows constructing a `MyStruct` instance + // from a single `i32` value by assigning it to both `a` and `b` fields. + impl From1< i32 > for MyStruct + { + fn from1( a : i32 ) -> Self { Self { a, b : a } } + } + + // == begin of generated + + impl From2< i32, i32 > for MyStruct + { + fn from2( a : i32, b : i32 ) -> Self { Self{ a : a, b : b } } + } + + impl From< ( i32, i32 ) > for MyStruct + { + #[ inline( always ) ] + fn from( ( a, b ) : ( i32, i32 ) ) -> Self + { + Self::from2( a, b ) + } + } + + // == end of generated + + let got : MyStruct = from!(); + let exp = MyStruct { a : 0, b : 0 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13 ); + let exp = MyStruct { a : 13, b : 13 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13, 14 ); + let exp = MyStruct { a : 13, b : 14 }; + assert_eq!( got, exp ); + + dbg!( exp ); + //> MyStruct { + //> a: 13, + //> b: 14, + //> } + +} diff --git a/module/core/variadic_from/src/lib.rs b/module/core/variadic_from/src/lib.rs new file mode 100644 index 0000000000..e05fa1bee2 --- /dev/null +++ b/module/core/variadic_from/src/lib.rs @@ -0,0 +1,74 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/derive_tools/latest/derive_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +pub mod variadic; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ cfg( derive_variadic_from ) ] + pub use ::derive_tools_meta; +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::variadic::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + // #[ cfg( any_derive ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::derive_tools_meta::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::variadic::prelude::*; + // #[ doc( no_inline ) ] + // pub use super::variadic; + // #[ doc( no_inline ) ] + // pub use ::derive_tools_meta::VariadicFrom; + +} diff --git a/module/core/variadic_from/src/variadic.rs b/module/core/variadic_from/src/variadic.rs new file mode 100644 index 0000000000..ed30e42677 --- /dev/null +++ b/module/core/variadic_from/src/variadic.rs @@ -0,0 +1,431 @@ +//! +//! Variadic constructor. Constructor with n arguments. Like Default, but with arguments. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + +// /// +// /// Constructor without arguments. Alias of Default. +// /// +// +// #[ allow( non_camel_case_types ) ] +// pub trait From_0 +// where +// Self : Sized, +// { +// // /// Constructor without arguments. +// // fn from() -> Self +// // { +// // Self::from_0() +// // } +// /// Constructor without arguments. +// fn from_0() -> Self; +// } +// +// impl< All > From_0 for All +// where +// All : Default, +// { +// /// Constructor without arguments. +// fn from_0() -> Self +// { +// Self::default() +// } +// } + + /// + /// Constructor with single argument. + /// + + #[ allow( non_camel_case_types ) ] + pub trait From1< Arg > + where + Self : Sized, + { + /// Constructor with a single arguments. + fn from1( arg : Arg ) -> Self; + } + + impl< T, All > From1< ( T, ) > for All + where + All : From1< T >, + { + fn from1( arg : ( T, ) ) -> Self + { + From1::< T >::from1( arg.0 ) + } + } + + impl< All > From1< () > for All + where + All : Default, + { + fn from1( _a : () ) -> Self { Self::default() } + } + + // impl< All > From< () > for All + // where + // All : Default, + // { + // fn from( _a : () ) -> Self { Self::default() } + // } + + // impl< T, All > From1< T > for All + // where + // All : core::convert::From< T >, + // { + // fn from1( arg : T ) -> Self + // { + // core::convert::From::< T >::from( arg ) + // } + // } + + // impl< T1, T2, All > From1< ( T1, T2 ) > for All + // where + // All : core::convert::From< ( T1, T2 ) >, + // { + // fn from1( arg : ( T1, T2 ) ) -> Self + // { + // core::convert::From::< ( T1, T2 ) >::from( arg ) + // } + // } + + /// value-to-value conversion that consumes the input value. Change left and rught, but keep semantic of `From1``. + #[ allow( non_camel_case_types ) ] + pub trait Into1< T > : Sized + { + /// Converts this type into the (usually inferred) input type. + fn to( self ) -> T; + } + + impl< All, F > Into1< F > for All + where + F : From1< All >, + { + #[ inline ] + fn to( self ) -> F + { + F::from1( self ) + } + } + + // impl< All, F > Into1< F > for All + // where + // F : From1< F >, + // F : From< All >, + // { + // #[ inline ] + // fn to( self ) -> F + // { + // F::from1( From::from( self ) ) + // } + // } + + // impl< T, All > From< ( T, ) > for All + // where + // All : From1< T >, + // { + // } + + /// + /// Constructor with two arguments. + /// + + #[ allow( non_camel_case_types ) ] + pub trait From2< Arg1, Arg2 > + where + Self : Sized, + { + // /// Constructor with two arguments. + // fn from( arg1 : Arg1, arg2 : Arg2 ) -> Self + // { + // Self::from2( arg1, arg2 ) + // } + /// Constructor with two arguments. + fn from2( arg1 : Arg1, arg2 : Arg2 ) -> Self; + } + + impl< T1, T2, All > From1< ( T1, T2 ) > for All + where + All : From2< T1, T2 >, + { + fn from1( arg : ( T1, T2 ) ) -> Self + { + From2::< T1, T2 >::from2( arg.0, arg.1 ) + } + } + + /// + /// Constructor with three arguments. + /// + + #[ allow( non_camel_case_types ) ] + pub trait From3< Arg1, Arg2, Arg3 > + where + Self : Sized, + { + // /// Constructor with three arguments. + // fn from( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3 ) -> Self + // { + // Self::from3( arg1, arg2, arg3 ) + // } + /// Constructor with three arguments. + fn from3( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3 ) -> Self; + } + + impl< T1, T2, T3, All > From1< ( T1, T2, T3 ) > for All + where + All : From3< T1, T2, T3 >, + { + fn from1( arg : ( T1, T2, T3 ) ) -> Self + { + From3::< T1, T2, T3 >::from3( arg.0, arg.1, arg.2 ) + } + } + +// /// +// /// Constructor with four arguments. +// /// +// +// #[ allow( non_camel_case_types ) ] +// pub trait From4< Arg1, Arg2, Arg3, Arg4 > +// where +// Self : Sized, +// { +// /// Constructor with four arguments. +// fn from( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3, arg4 : Arg4 ) -> Self +// { +// Self::from4( arg1, arg2, arg3, arg4 ) +// } +// /// Constructor with four arguments. +// fn from4( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3, arg4 : Arg4 ) -> Self; +// } + + // impl< T, E > From< ( E, ) > for T + // where + // T : From1< ( E, ) >, + // { + // /// Returns the argument unchanged. + // #[ inline( always ) ] + // fn from( src : T ) -> Self + // { + // Self::from1( src ) + // } + // } + + // not possible + // + // impl< T, F > From< T > for F + // where + // F : From1< T >, + // { + // /// Returns the argument unchanged. + // #[ inline( always ) ] + // fn from( src : T ) -> Self + // { + // Self::from1( src ) + // } + // } + + /// + /// Variadic constructor. + /// + /// Implement traits [`From1`] from tuple with fields and [std::convert::From] from tuple with fields to provide the interface to construct your structure with a different set of arguments. + /// In this example structure, Struct1 could be constructed either without arguments, with a single argument, or with two arguments. + /// - Constructor without arguments fills fields with zero. + /// - Constructor with a single argument sets both fields to the value of the argument. + /// - Constructor with 2 arguments set individual values of each field. + /// + /// ```rust + /// # #[ cfg( all( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] + /// # { + /// use variadic_from::prelude::*; + /// + /// #[ derive( Debug, PartialEq ) ] + /// struct Struct1 + /// { + /// a : i32, + /// b : i32, + /// } + /// + /// impl Default for Struct1 + /// { + /// fn default() -> Self + /// { + /// Self { a : 0, b : 0 } + /// } + /// } + /// + /// impl From1< i32 > for Struct1 + /// { + /// fn from1( val : i32 ) -> Self + /// { + /// Self { a : val, b : val } + /// } + /// } + /// + /// impl From2< i32, i32 > for Struct1 + /// { + /// fn from2( val1 : i32, val2 : i32 ) -> Self + /// { + /// Self { a : val1, b : val2 } + /// } + /// } + /// + /// let got : Struct1 = from!(); + /// let exp = Struct1{ a : 0, b : 0 }; + /// assert_eq!( got, exp ); + /// + /// let got : Struct1 = from!( 13 ); + /// let exp = Struct1{ a : 13, b : 13 }; + /// assert_eq!( got, exp ); + /// + /// let got : Struct1 = from!( 1, 3 ); + /// let exp = Struct1{ a : 1, b : 3 }; + /// assert_eq!( got, exp ); + /// # } + /// + /// ``` + /// + /// ### To add to your project + /// + /// ``` shell + /// cargo add type_constructor + /// ``` + /// + /// ## Try out from the repository + /// + /// ``` shell test + /// git clone https://github.com/Wandalen/wTools + /// cd wTools + /// cd examples/type_constructor_trivial + /// cargo run + /// ``` + + #[ macro_export ] + macro_rules! from + { + + ( + $(,)? + ) + => + { + ::core::default::Default::default(); + }; + + ( + $Arg1 : expr $(,)? + ) + => + { + $crate::From1::from1( $Arg1 ); + }; + + ( + $Arg1 : expr, $Arg2 : expr $(,)? + ) + => + { + $crate::From2::from2( $Arg1, $Arg2 ); + }; + + ( + $Arg1 : expr, $Arg2 : expr, $Arg3 : expr $(,)? + ) + => + { + $crate::From3::from3( $Arg1, $Arg2, $Arg3 ); + }; + + // ( + // $Arg1 : expr, $Arg2 : expr, $Arg3 : expr, $Arg4 : expr $(,)? + // ) + // => + // { + // $crate::From4::from4( $Arg1, $Arg2, $Arg3, $Arg4 ); + // }; + + ( + $( $Rest : tt )+ + ) + => + { + compile_error! + ( + concat! + ( + "Variadic constructor supports up to 3 arguments.\n", + "Open an issue if you need more.\n", + "You passed:\n", + stringify! + ( + from!( $( $Rest )+ ) + ) + ) + ); + }; + + } + + pub use from; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; + +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + + // From_0, + From1, + Into1, + From2, + From3, + + from, + + }; + + // pub use type_constructor_from_meta::VariadicFrom; +} diff --git a/module/core/variadic_from/tests/inc/auto_std_named_derive.rs b/module/core/variadic_from/tests/inc/auto_std_named_derive.rs new file mode 100644 index 0000000000..e194bc94b8 --- /dev/null +++ b/module/core/variadic_from/tests/inc/auto_std_named_derive.rs @@ -0,0 +1,17 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ allow( unused_imports ) ] +use the_module::exposed::*; + +#[ derive( Debug, PartialEq, Default, VariadicFrom ) ] +struct Struct1 +{ + a : i32, + b : i32, +} + +// Standard From and Into auto derive From1 and To_1. + +include!( "./only_test/from2_named.rs" ); +include!( "./only_test/from2_std_named.rs" ); diff --git a/module/core/variadic_from/tests/inc/auto_std_named_manual.rs b/module/core/variadic_from/tests/inc/auto_std_named_manual.rs new file mode 100644 index 0000000000..cade6e7496 --- /dev/null +++ b/module/core/variadic_from/tests/inc/auto_std_named_manual.rs @@ -0,0 +1,37 @@ +#[ allow( unused_imports ) ] +use super::*; + + +#[ allow( unused_imports ) ] +use the_module::exposed::*; + +#[ derive( Debug, PartialEq, Default ) ] +struct Struct1 +{ + a : i32, + b : i32, +} + +impl the_module::From1< i32 > for Struct1 +{ + fn from1( a : i32 ) -> Self { Self{ a : a, b : a } } +} + +impl the_module::From2< i32, i32 > for Struct1 +{ + fn from2( a : i32, b : i32 ) -> Self { Self{ a : a, b : b } } +} + +impl From< ( i32, i32 ) > for Struct1 +{ + #[ inline( always ) ] + fn from( ( a, b ) : ( i32, i32 ) ) -> Self + { + Self { a, b } + } +} + +// Standard From and Into auto derive From1 and To_1. + +include!( "./only_test/from2_named.rs" ); +include!( "./only_test/from2_std_named.rs" ); diff --git a/module/core/variadic_from/tests/inc/exports.rs b/module/core/variadic_from/tests/inc/exports.rs new file mode 100644 index 0000000000..cf498e0ac6 --- /dev/null +++ b/module/core/variadic_from/tests/inc/exports.rs @@ -0,0 +1,22 @@ +#[ allow( unused_imports ) ] +use super::*; + +// make sure all entities are exported + +mod m1 +{ + use super::*; + use the_module::variadic::{ From1, Into1, From2, From3, from }; +} + +mod m2 +{ + use super::*; + use the_module::prelude::{ From1, Into1, From2, From3, from }; +} + +mod m3 +{ + use super::*; + use the_module::exposed::{ From1, Into1, From2, From3, from }; +} diff --git a/module/core/variadic_from/tests/inc/from0_named_derive.rs b/module/core/variadic_from/tests/inc/from0_named_derive.rs new file mode 100644 index 0000000000..65009608d6 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from0_named_derive.rs @@ -0,0 +1,13 @@ +#[ allow( unused_imports ) ] +use super::*; +use the_module::exposed::*; + +#[ derive( Debug, PartialEq, Default, VariadicFrom ) ] +struct Struct1; + +impl From< () > for Struct1 +{ + fn from( _a : () ) -> Self { Self::default() } +} + +include!( "./only_test/from0.rs" ); diff --git a/module/core/variadic_from/tests/inc/from0_named_manual.rs b/module/core/variadic_from/tests/inc/from0_named_manual.rs new file mode 100644 index 0000000000..11decd7b28 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from0_named_manual.rs @@ -0,0 +1,14 @@ +#[ allow( unused_imports ) ] +use super::*; +use the_module::exposed::*; + +// #[ derive( Debug, PartialEq, Default, VariadicFrom ) ] +#[ derive( Debug, PartialEq, Default ) ] +struct Struct1; + +impl From< () > for Struct1 +{ + fn from( _a : () ) -> Self { Self::default() } +} + +include!( "./only_test/from0.rs" ); diff --git a/module/core/variadic_from/tests/inc/from0_unnamed_derive.rs b/module/core/variadic_from/tests/inc/from0_unnamed_derive.rs new file mode 100644 index 0000000000..0e6c6d7e74 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from0_unnamed_derive.rs @@ -0,0 +1,13 @@ +#[ allow( unused_imports ) ] +use super::*; +use the_module::exposed::*; + +#[ derive( Debug, PartialEq, Default, VariadicFrom ) ] +struct Struct1(); + +impl From< () > for Struct1 +{ + fn from( _a : () ) -> Self { Self::default() } +} + +include!( "./only_test/from0.rs" ); diff --git a/module/core/variadic_from/tests/inc/from2_named_derive.rs b/module/core/variadic_from/tests/inc/from2_named_derive.rs new file mode 100644 index 0000000000..650d0a0189 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from2_named_derive.rs @@ -0,0 +1,14 @@ +#[ allow( unused_imports ) ] +use super::*; + +use variadic_from::{ from, From1, From2, Into1 }; + + +#[ derive( Debug, PartialEq, variadic_from::VariadicFrom ) ] +struct Struct1 +{ + a : i32, + b : i32, +} + +include!( "./only_test/from2_named.rs" ); diff --git a/module/core/variadic_from/tests/inc/from2_named_manual.rs b/module/core/variadic_from/tests/inc/from2_named_manual.rs new file mode 100644 index 0000000000..fd206064e7 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from2_named_manual.rs @@ -0,0 +1,27 @@ +#[ allow( unused_imports ) ] +use super::*; + +use variadic_from::{ from, From1, From2, Into1 }; + +#[ derive( Debug, PartialEq ) ] +struct Struct1 +{ + a : i32, + b : i32, +} + +impl variadic_from::From2< i32, i32 > for Struct1 +{ + fn from2( a : i32, b : i32 ) -> Self { Self{ a : a, b : b } } +} + +impl From< ( i32, i32 ) > for Struct1 +{ + #[ inline( always ) ] + fn from( ( a, b ) : ( i32, i32 ) ) -> Self + { + Self::from2( a, b ) + } +} + +include!( "./only_test/from2_named.rs" ); diff --git a/module/core/variadic_from/tests/inc/from2_unnamed_derive.rs b/module/core/variadic_from/tests/inc/from2_unnamed_derive.rs new file mode 100644 index 0000000000..159aaf4188 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from2_unnamed_derive.rs @@ -0,0 +1,10 @@ +#[ allow( unused_imports ) ] +use super::*; + +use variadic_from::{ from, From1, From2, Into1 }; + + +#[ derive( Debug, PartialEq, variadic_from::VariadicFrom ) ] +struct Struct1( i32, i32 ); + +include!( "./only_test/from2_unnamed.rs" ); diff --git a/module/core/variadic_from/tests/inc/from2_unnamed_manual.rs b/module/core/variadic_from/tests/inc/from2_unnamed_manual.rs new file mode 100644 index 0000000000..6f4c678f8e --- /dev/null +++ b/module/core/variadic_from/tests/inc/from2_unnamed_manual.rs @@ -0,0 +1,23 @@ +#[ allow( unused_imports ) ] +use super::*; + +use variadic_from::{ from, From1, From2, Into1 }; + +#[ derive( Debug, PartialEq ) ] +struct Struct1( i32, i32 ); + +impl variadic_from::From2< i32, i32 > for Struct1 +{ + fn from2( a : i32, b : i32 ) -> Self { Self( a, b ) } +} + +impl From< ( i32, i32 ) > for Struct1 +{ + #[ inline( always ) ] + fn from( ( a, b ) : ( i32, i32 ) ) -> Self + { + Self::from2( a, b ) + } +} + +include!( "./only_test/from2_unnamed.rs" ); diff --git a/module/core/variadic_from/tests/inc/from4_beyond_named.rs b/module/core/variadic_from/tests/inc/from4_beyond_named.rs new file mode 100644 index 0000000000..76ddaa059b --- /dev/null +++ b/module/core/variadic_from/tests/inc/from4_beyond_named.rs @@ -0,0 +1,115 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// IMPORTANT: length of struct should always be larget by one than +/// maximum number of supported arguments by `VariadicFrom`. +/// Currently it's 3, but if the length will be increased test should be extended too. +/// +/// `VariadicFrom` generates nothing in this case. +#[ test ] +fn from_named4() +{ + use the_module::{ Into1, VariadicFrom }; + + #[ derive( Default, Debug, PartialEq, VariadicFrom ) ] + // #[ debug ] + struct Struct1 + { + a : i32, + b : i32, + c : i32, + d : i32, + } + + impl the_module::From1< i32 > for Struct1 + { + fn from1( a : i32 ) -> Self { Self{ a, b : a, c : a, d : a } } + } + + impl the_module::From2< i32, i32 > for Struct1 + { + fn from2( a : i32, b : i32 ) -> Self { Self{ a, b, c : b, d : b } } + } + + impl the_module::From3< i32, i32, i32 > for Struct1 + { + fn from3( a : i32, b : i32, c : i32 ) -> Self { Self{ a, b, c, d : c } } + } + + // 0 + + let got : Struct1 = the_module::from!(); + let exp = Struct1{ a : 0, b : 0, c : 0, d : 0 }; + a_id!( got, exp ); + + // 1 + + let got : Struct1 = the_module::from!( 13 ); + let exp = Struct1{ a : 13, b : 13, c : 13, d : 13 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( 13, ) ); + let exp = Struct1{ a : 13, b : 13, c : 13, d : 13 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( ( 13, ), ) ); + let exp = Struct1{ a : 13, b : 13, c : 13, d : 13 }; + a_id!( got, exp ); + + let got : Struct1 = 13.to(); + let exp = Struct1{ a : 13, b : 13, c : 13, d : 13 }; + a_id!( got, exp ); + + let got : Struct1 = ( 13, ).to(); + let exp = Struct1{ a : 13, b : 13, c : 13, d : 13 }; + a_id!( got, exp ); + + let got : Struct1 = ( ( 13, ), ).to(); + let exp = Struct1{ a : 13, b : 13, c : 13, d : 13 }; + a_id!( got, exp ); + + // 2 + + let got : Struct1 = the_module::from!( 0, 1 ); + let exp = Struct1{ a : 0, b : 1, c : 1, d : 1 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( 0, 1 ) ); + let exp = Struct1{ a : 0, b : 1, c : 1, d : 1 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( ( 0, 1 ), ) ); + let exp = Struct1{ a : 0, b : 1, c : 1, d : 1 }; + a_id!( got, exp ); + + let got : Struct1 = ( 0, 1 ).to(); + let exp = Struct1{ a : 0, b : 1, c : 1, d : 1 }; + a_id!( got, exp ); + + let got : Struct1 = ( ( 0, 1 ), ).to(); + let exp = Struct1{ a : 0, b : 1, c : 1, d : 1 }; + a_id!( got, exp ); + + // 3 + + let got : Struct1 = the_module::from!( 0, 1, 2 ); + let exp = Struct1{ a : 0, b : 1, c : 2, d : 2 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( 0, 1, 2 ) ); + let exp = Struct1{ a : 0, b : 1, c : 2, d : 2 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( ( 0, 1, 2 ), ) ); + let exp = Struct1{ a : 0, b : 1, c : 2, d : 2 }; + a_id!( got, exp ); + + let got : Struct1 = ( 0, 1, 2 ).to(); + let exp = Struct1{ a : 0, b : 1, c : 2, d : 2 }; + a_id!( got, exp ); + + let got : Struct1 = ( ( 0, 1, 2 ), ).to(); + let exp = Struct1{ a : 0, b : 1, c : 2, d : 2 }; + a_id!( got, exp ); + +} diff --git a/module/core/variadic_from/tests/inc/from4_beyond_unnamed.rs b/module/core/variadic_from/tests/inc/from4_beyond_unnamed.rs new file mode 100644 index 0000000000..249a5f9e96 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from4_beyond_unnamed.rs @@ -0,0 +1,115 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// IMPORTANT: length of struct should always be larget by one than +/// maximum number of supported arguments by `VariadicFrom`. +/// Currently it's 3, but if the length will be increased test should be extended too. +/// +/// `VariadicFrom` generates nothing in this case. +#[ test ] +fn from_named4() +{ + use the_module::{ Into1, VariadicFrom }; + + #[ derive( Default, Debug, PartialEq, VariadicFrom ) ] + // #[ debug ] + struct Struct1 + ( + i32, + i32, + i32, + i32, + ); + + impl the_module::From1< i32 > for Struct1 + { + fn from1( a : i32 ) -> Self { Self( a, a, a, a ) } + } + + impl the_module::From2< i32, i32 > for Struct1 + { + fn from2( a : i32, b : i32 ) -> Self { Self( a, b, b, b ) } + } + + impl the_module::From3< i32, i32, i32 > for Struct1 + { + fn from3( a : i32, b : i32, c : i32 ) -> Self { Self( a, b, c, c ) } + } + + // 0 + + let got : Struct1 = the_module::from!(); + let exp = Struct1( 0, 0, 0, 0 ); + a_id!( got, exp ); + + // 1 + + let got : Struct1 = the_module::from!( 13 ); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( 13, ) ); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( ( 13, ), ) ); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + + let got : Struct1 = 13.to(); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + + let got : Struct1 = ( 13, ).to(); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + + let got : Struct1 = ( ( 13, ), ).to(); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + + // 2 + + let got : Struct1 = the_module::from!( 0, 1 ); + let exp = Struct1( 0, 1, 1, 1 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( 0, 1 ) ); + let exp = Struct1( 0, 1, 1, 1 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( ( 0, 1 ), ) ); + let exp = Struct1( 0, 1, 1, 1 ); + a_id!( got, exp ); + + let got : Struct1 = ( 0, 1 ).to(); + let exp = Struct1( 0, 1, 1, 1 ); + a_id!( got, exp ); + + let got : Struct1 = ( ( 0, 1 ), ).to(); + let exp = Struct1( 0, 1, 1, 1 ); + a_id!( got, exp ); + + // 3 + + let got : Struct1 = the_module::from!( 0, 1, 2 ); + let exp = Struct1( 0, 1, 2, 2 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( 0, 1, 2 ) ); + let exp = Struct1( 0, 1, 2, 2 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( ( 0, 1, 2 ), ) ); + let exp = Struct1( 0, 1, 2, 2 ); + a_id!( got, exp ); + + let got : Struct1 = ( 0, 1, 2 ).to(); + let exp = Struct1( 0, 1, 2, 2 ); + a_id!( got, exp ); + + let got : Struct1 = ( ( 0, 1, 2 ), ).to(); + let exp = Struct1( 0, 1, 2, 2 ); + a_id!( got, exp ); + +} diff --git a/module/core/variadic_from/tests/inc/from4_named_manual.rs b/module/core/variadic_from/tests/inc/from4_named_manual.rs new file mode 100644 index 0000000000..d1f5a62637 --- /dev/null +++ b/module/core/variadic_from/tests/inc/from4_named_manual.rs @@ -0,0 +1,43 @@ +#[ allow( unused_imports ) ] +use super::*; +use the_module::variadic::Into1; + +#[ derive( Debug, PartialEq ) ] +struct Struct1 +{ + a : i32, + b : i32, + c : i32, + d : i32, +} + +impl Default for Struct1 +{ + fn default() -> Self + { + let a = Default::default(); + let b = Default::default(); + let c = Default::default(); + let d = Default::default(); + Self{ a, b, c, d } + } +} + +impl the_module::From1< i32 > for Struct1 +{ + fn from1( a : i32 ) -> Self { Self{ a, b : a, c : a, d : a } } +} + +// impl the_module::From2< i32, i32 > for Struct1 +// { +// fn from2( a : i32, b : i32 ) -> Self { Self{ a, b, c : b, d : b } } +// } +// +// impl the_module::From3< i32, i32, i32 > for Struct1 +// { +// fn from3( a : i32, b : i32, c : i32 ) -> Self { Self{ a, b, c, d : c } } +// } + +include!( "./only_test/from4_named.rs" ); + +// diff --git a/module/core/variadic_from/tests/inc/from4_unnamed_manual.rs b/module/core/variadic_from/tests/inc/from4_unnamed_manual.rs new file mode 100644 index 0000000000..b6f50062ea --- /dev/null +++ b/module/core/variadic_from/tests/inc/from4_unnamed_manual.rs @@ -0,0 +1,37 @@ +#[ allow( unused_imports ) ] +use super::*; +use the_module::prelude::Into1; + +#[ derive( Debug, PartialEq ) ] +struct Struct1( i32, i32, i32, i32 ); + +impl Default for Struct1 +{ + fn default() -> Self + { + let a = Default::default(); + let b = Default::default(); + let c = Default::default(); + let d = Default::default(); + Self( a, b, c, d ) + } +} + +impl the_module::From1< i32 > for Struct1 +{ + fn from1( a : i32 ) -> Self { Self( a, a, a, a ) } +} + +// impl the_module::From2< i32, i32 > for Struct1 +// { +// fn from2( a : i32, b : i32 ) -> Self { Self( a, b, b, b ) } +// } +// +// impl the_module::From3< i32, i32, i32 > for Struct1 +// { +// fn from3( a : i32, b : i32, c : i32 ) -> Self { Self( a, b, c, c ) } +// } + +include!( "./only_test/from4_unnamed.rs" ); + +// diff --git a/module/core/variadic_from/tests/inc/mod.rs b/module/core/variadic_from/tests/inc/mod.rs new file mode 100644 index 0000000000..ed70959fd2 --- /dev/null +++ b/module/core/variadic_from/tests/inc/mod.rs @@ -0,0 +1,35 @@ +#![ allow( unused_imports ) ] + +use super::*; + +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod from2_named_manual; +#[ cfg( all( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] +mod from2_named_derive; + +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod from2_unnamed_manual; +#[ cfg( all( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] +mod from2_unnamed_derive; + +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod from4_named_manual; +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod from4_unnamed_manual; + +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod from4_beyond_named; +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod from4_beyond_unnamed; + +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod from0_named_manual; +#[ cfg( all( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] +mod from0_named_derive; +#[ cfg( all( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] +mod from0_unnamed_derive; + +#[ cfg( all( feature = "derive_variadic_from", feature = "type_variadic_from" ) ) ] +mod sample; +#[ cfg( all( feature = "type_variadic_from" ) ) ] +mod exports; diff --git a/module/core/variadic_from/tests/inc/only_test/from0.rs b/module/core/variadic_from/tests/inc/only_test/from0.rs new file mode 100644 index 0000000000..24c2d4ca76 --- /dev/null +++ b/module/core/variadic_from/tests/inc/only_test/from0.rs @@ -0,0 +1,50 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn from0() +{ + + // - from2 + + let got : Struct1 = from!(); + let exp = Struct1{}; + a_id!( got, exp ); + + let got : Struct1 = Struct1::default(); + let exp = Struct1{}; + a_id!( got, exp ); + + let got : Struct1 = Default::default(); + let exp = Struct1{}; + a_id!( got, exp ); + + // - from unit + + let got : Struct1 = from!( () ); + let exp = Struct1{}; + a_id!( got, exp ); + + let got : Struct1 = from!( ( (), ) ); + let exp = Struct1{}; + a_id!( got, exp ); + + let got : Struct1 = ().to(); + let exp = Struct1{}; + a_id!( got, exp ); + + let got : Struct1 = ( (), ).to(); + let exp = Struct1{}; + a_id!( got, exp ); + + // - std from unit + + let got : Struct1 = ().into(); + let exp = Struct1{}; + a_id!( got, exp ); + + let got : Struct1 = From::from( () ); + let exp = Struct1{}; + a_id!( got, exp ); + +} diff --git a/module/core/variadic_from/tests/inc/only_test/from2_named.rs b/module/core/variadic_from/tests/inc/only_test/from2_named.rs new file mode 100644 index 0000000000..451b501e94 --- /dev/null +++ b/module/core/variadic_from/tests/inc/only_test/from2_named.rs @@ -0,0 +1,53 @@ +#[ test ] +fn from2_named() +{ + + // - from2 + + let got : Struct1 = from!( 13, 14 ); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + let got : Struct1 = Struct1::from2( 13, 14 ); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + let got : Struct1 = from!( ( 13, 14 ) ); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + // - from1 + + let got : Struct1 = Struct1::from1( ( 13, 14 ) ); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + let got : Struct1 = from!( ( ( 13, 14 ), ) ); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + let got : Struct1 = Struct1::from1( ( ( 13, 14 ), ) ); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + // - to + + let got : Struct1 = ( 13, 14 ).to(); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + let got : Struct1 = ( ( 13, 14 ), ).to(); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + // - std + + let got : Struct1 = From::from( ( 13, 14 ) ); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + + let got : Struct1 = ( 13, 14 ).into(); + let exp = Struct1{ a : 13, b : 14 }; + a_id!( got, exp ); + +} diff --git a/module/core/variadic_from/tests/inc/only_test/from2_unnamed.rs b/module/core/variadic_from/tests/inc/only_test/from2_unnamed.rs new file mode 100644 index 0000000000..7063417045 --- /dev/null +++ b/module/core/variadic_from/tests/inc/only_test/from2_unnamed.rs @@ -0,0 +1,53 @@ +#[ test ] +fn from2_named() +{ + + // - from2 + + let got : Struct1 = from!( 13, 14 ); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + let got : Struct1 = Struct1::from2( 13, 14 ); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + let got : Struct1 = from!( ( 13, 14 ) ); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + // - from1 + + let got : Struct1 = Struct1::from1( ( 13, 14 ) ); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + let got : Struct1 = from!( ( ( 13, 14 ), ) ); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + let got : Struct1 = Struct1::from1( ( ( 13, 14 ), ) ); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + // - to + + let got : Struct1 = ( 13, 14 ).to(); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + let got : Struct1 = ( ( 13, 14 ), ).to(); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + // - std + + let got : Struct1 = From::from( ( 13, 14 ) ); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + + let got : Struct1 = ( 13, 14 ).into(); + let exp = Struct1( 13, 14 ); + a_id!( got, exp ); + +} diff --git a/module/core/variadic_from/tests/inc/only_test/from4_named.rs b/module/core/variadic_from/tests/inc/only_test/from4_named.rs new file mode 100644 index 0000000000..70f84650ec --- /dev/null +++ b/module/core/variadic_from/tests/inc/only_test/from4_named.rs @@ -0,0 +1,47 @@ +#[ test ] +fn from4_named_fields() +{ + + let got : Struct1 = the_module::from!(); + let exp = Struct1{ a : 0, b : 0, c : 0, d : 0 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( 13 ); + let exp = Struct1{ a : 13, b : 13, c : 13, d : 13 }; + a_id!( got, exp ); + + // - from unit + + let got : Struct1 = the_module::from!( () ); + let exp = Struct1{ a : 0, b : 0, c : 0, d : 0 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( (), ) ); + let exp = Struct1{ a : 0, b : 0, c : 0, d : 0 }; + a_id!( got, exp ); + + let got : Struct1 = ().to(); + let exp = Struct1{ a : 0, b : 0, c : 0, d : 0 }; + a_id!( got, exp ); + + let got : Struct1 = ( (), ).to(); + let exp = Struct1{ a : 0, b : 0, c : 0, d : 0 }; + a_id!( got, exp ); + + // - negative + +// let got : Struct1 = the_module::from!( 0, 1 ); +// let exp = Struct1{ a : 0, b : 1, c : 1, d : 1 }; +// a_id!( got, exp ); +// +// let got : Struct1 = the_module::from!( 0, 1, 2 ); +// let exp = Struct1{ a : 0, b : 1, c : 2, d : 2 }; +// a_id!( got, exp ); +// +// let got : Struct1 = the_module::from!( 0, 1, 2, 3 ); +// let exp = Struct1{ a : 0, b : 1, c : 2, d : 3 }; +// a_id!( got, exp ); + + // qqq : write negative test + +} diff --git a/module/core/variadic_from/tests/inc/only_test/from4_unnamed.rs b/module/core/variadic_from/tests/inc/only_test/from4_unnamed.rs new file mode 100644 index 0000000000..ae9a26314e --- /dev/null +++ b/module/core/variadic_from/tests/inc/only_test/from4_unnamed.rs @@ -0,0 +1,50 @@ +#[ test ] +fn from4_tuple() +{ + + // #[ derive( Debug, PartialEq ) ] + // struct Struct1( i32, i32, i32, i32 ); + + let got : Struct1 = the_module::from!(); + let exp = Struct1( 0, 0, 0, 0 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( 13 ); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + + // - from unit + + let got : Struct1 = the_module::from!( () ); + let exp = Struct1( 0, 0, 0, 0 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( ( (), ) ); + let exp = Struct1( 0, 0, 0, 0 ); + a_id!( got, exp ); + + let got : Struct1 = ().to(); + let exp = Struct1( 0, 0, 0, 0 ); + a_id!( got, exp ); + + let got : Struct1 = ( (), ).to(); + let exp = Struct1( 0, 0, 0, 0 ); + a_id!( got, exp ); + + // - negative + +// let got : Struct1 = the_module::from!( 0, 1 ); +// let exp = Struct1( 0, 1, 1, 1 ); +// a_id!( got, exp ); +// +// let got : Struct1 = the_module::from!( 0, 1, 2 ); +// let exp = Struct1( 0, 1, 2, 2 ); +// a_id!( got, exp ); +// +// let got : Struct1 = the_module::from!( 0, 1, 2, 3 ); +// let exp = Struct1( 0, 1, 2, 3 ); +// a_id!( got, exp ); + + // qqq : write negative test + +} diff --git a/module/core/variadic_from/tests/inc/sample.rs b/module/core/variadic_from/tests/inc/sample.rs new file mode 100644 index 0000000000..103aff658e --- /dev/null +++ b/module/core/variadic_from/tests/inc/sample.rs @@ -0,0 +1,49 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// This test function validates the `VariadicFrom` trait implementation for the `MyStruct` struct. +/// It checks the conversion from tuples and individual values into an instance of `MyStruct`. +#[ test ] +fn sample() +{ + use variadic_from::exposed::*; + + // Define a struct `MyStruct` with fields `a` and `b`. + // The struct derives common traits like `Debug`, `PartialEq`, `Default`, and `VariadicFrom`. + #[ derive( Debug, PartialEq, Default, VariadicFrom ) ] + // Use `#[ debug ]` to expand and debug generate code. + // #[ debug ] + struct MyStruct + { + a : i32, + b : i32, + } + + // Implement the `From1` trait for `MyStruct`, which allows constructing a `MyStruct` instance + // from a single `i32` value by assigning it to both `a` and `b` fields. + impl From1< i32 > for MyStruct + { + fn from1( a : i32 ) -> Self { Self { a, b : a } } + } + + let got : MyStruct = from!(); + let exp = MyStruct { a : 0, b : 0 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13 ); + let exp = MyStruct { a : 13, b : 13 }; + assert_eq!( got, exp ); + + let got : MyStruct = from!( 13, 14 ); + let exp = MyStruct { a : 13, b : 14 }; + assert_eq!( got, exp ); + + let got : MyStruct = From::from( ( 13, 14 ) ); + let exp = MyStruct { a : 13, b : 14 }; + assert_eq!( got, exp ); + + let got : MyStruct = ( 13, 14 ).into(); + let exp = MyStruct { a : 13, b : 14 }; + assert_eq!( got, exp ); + +} diff --git a/module/core/variadic_from/tests/smoke_test.rs b/module/core/variadic_from/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/variadic_from/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/variadic_from/tests/variadic_from_tests.rs b/module/core/variadic_from/tests/variadic_from_tests.rs new file mode 100644 index 0000000000..463bba061f --- /dev/null +++ b/module/core/variadic_from/tests/variadic_from_tests.rs @@ -0,0 +1,10 @@ + +#[ allow( unused_imports ) ] +use variadic_from as the_module; +#[ allow( unused_imports ) ] +use variadic_from; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/core/wtools/Cargo.toml b/module/core/wtools/Cargo.toml new file mode 100644 index 0000000000..3d2ec71314 --- /dev/null +++ b/module/core/wtools/Cargo.toml @@ -0,0 +1,450 @@ +[package] +name = "wtools" +version = "0.2.20" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wtools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/wtools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/wtools" +description = """ +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# rustdoc-args = [] + +# exclude = [ "/tests", "/examples", "-*" ] + +# = features + +[features] + +# iter + +iter = [ "iter_tools" ] +iter_default = [ + "iter", + # "iter_use_std", + "iter_tools/default", +] +iter_full = [ + "iter", + # "iter_use_std", + # "iter_use_alloc", +] +iter_no_std = [ "iter_tools/no_std" ] +# iter_no_std = [ "iter", "iter_tools/no_std" ] +iter_use_alloc = [ "iter", "iter_tools/use_alloc" ] + +# meta + +meta = [ "meta_tools" ] +meta_default = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +meta_full = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +# meta_use_std = [ "meta", "meta_tools/use_std" ] +meta_no_std = [ "meta", "meta_tools/no_std" ] +meta_use_alloc = [ "meta", "meta_tools/use_alloc" ] + +meta_for_each = [ "meta", "meta_tools/meta_for_each" ] +meta_impls_index = [ "meta", "meta_tools/meta_impls_index" ] +meta_mod_interface = [ "meta" ] +# meta_mod_interface = [ "meta", "meta_tools/mod_interface" ] +meta_constructors = [ "meta", "meta_tools/meta_constructors" ] +meta_idents_concat = [ "meta", "meta_tools/meta_idents_concat" ] +# meta_former = [ "meta", "meta_tools/former" ] +# meta_options = [ "meta", "meta_tools/options" ] + +# mem + +mem = [ "mem_tools" ] +mem_default = [ + "mem", +] +mem_full = [ + "mem", +] +# mem_use_std = [ "mem", "mem_tools/use_std" ] +mem_no_std = [ "mem", "mem_tools/no_std" ] +mem_use_alloc = [ "mem", "mem_tools/use_alloc" ] + +# typing + +typing = [ "typing_tools" ] +typing_default = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_full = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_no_std = [ "typing", "typing_tools/no_std" ] +typing_use_alloc = [ "typing", "typing_tools/use_alloc" ] + +# typing_nightly = [ "typing", "nightly", "typing_tools/nightly", ] +typing_inspect_type = [ "typing", "typing_tools/typing_inspect_type" ] +typing_is_slice = [ "typing", "typing_tools/typing_is_slice" ] +typing_implements = [ "typing", "typing_tools/typing_implements" ] + +# time + +time = [ "time_tools" ] +time_default = [ + "time", + "time_now", +] +time_full = [ + "time", + "time_now", +] +# time_use_std = [ "time", "time_tools/use_std" ] +time_no_std = [ "time", "time_tools/no_std" ] +time_use_alloc = [ "time", "time_tools/use_alloc" ] + +time_now = [ "time", "time_tools/time_now" ] + +# string + +string = [ "strs_tools" ] +string_default = [ + "string", + # "string_use_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +string_full = [ + "string", + # "string_use_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +# string_use_std = [ "string", "strs_tools/use_std" ] +string_no_std = [ "string", "strs_tools/no_std" ] +string_use_alloc = [ "string", "strs_tools/use_alloc" ] + +string_indentation = [ "string", "strs_tools/string_indentation" ] +string_isolate = [ "string", "strs_tools/string_isolate" ] +string_parse_request = [ "string", "string_isolate", "strs_tools/string_parse_request" ] +string_parse_number = [ "string", "strs_tools/string_parse_number" ] +string_split = [ "string", "strs_tools/string_split", "strs_tools/string_parse_request" ] + +# error + +error = [ "error_tools" ] +error_default = [ + "error", + "error_for_lib", + "error_for_app", + # "error_use_std", +] +error_full = [ + "error", + "error_for_lib", + "error_for_app", + # "error_use_std", +] +# error_use_std = [ "error", "error_tools/use_std" ] +error_no_std = [ "error", "error_tools/no_std" ] +#error_use_alloc = [ "error", "error_tools/use_alloc" ] + +error_for_lib = [ "error", "error_tools/error_for_lib" ] +error_for_app = [ "error", "error_tools/error_for_app" ] + +# derive + +derive = [ "derive_tools" ] +derive_full = [ + + "derive", + # "derive_nightly", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_use_std", + +] +derive_default = [ + + "derive", + # "derive_nightly", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_use_std", + +] + +# derive_use_std = [ "derive", "derive_tools/use_std" ] +derive_no_std = [ "derive", "derive_tools/no_std" ] +derive_use_alloc = [ "derive", "derive_tools/use_alloc" ] + +# derive_nightly = [ "derive", "nightly", "derive_tools/nightly" ] +# derive_enable_track_caller = [ "derive", "derive_tools/enable_track_caller" ] + +derive_add_assign = [ "derive", "derive_tools/derive_add_assign" ] +derive_add = [ "derive", "derive_tools/derive_add" ] +derive_as_mut = [ "derive", "derive_tools/derive_as_mut" ] +derive_as_ref = [ "derive", "derive_tools/derive_as_ref" ] +derive_constructor = [ "derive", "derive_tools/derive_constructor" ] +derive_deref = [ "derive", "derive_tools/derive_deref" ] +derive_deref_mut = [ "derive", "derive_tools/derive_deref_mut" ] +derive_error = [ "derive", "derive_tools/derive_error" ] +derive_from = [ "derive", "derive_tools/derive_from" ] +derive_index = [ "derive", "derive_tools/derive_index" ] +derive_index_mut = [ "derive", "derive_tools/derive_index_mut" ] +derive_inner_from = [ "derive", "derive_tools/derive_inner_from" ] +derive_into_iterator = [ "derive", "derive_tools/derive_into_iterator" ] +# derive_iterator = [ "derive", "derive_tools/derive_iterator" ] +derive_mul_assign = [ "derive", "derive_tools/derive_mul_assign" ] +derive_mul = [ "derive", "derive_tools/derive_mul" ] +derive_not = [ "derive", "derive_tools/derive_not" ] +derive_sum = [ "derive", "derive_tools/derive_sum" ] +derive_try_into = [ "derive", "derive_tools/derive_try_into" ] +derive_is_variant = [ "derive", "derive_tools/derive_is_variant" ] +derive_unwrap = [ "derive", "derive_tools/derive_unwrap" ] +# derive_convert_case = [ "derive", "derive_tools/derive_convert_case" ] + +derive_strum = [ "derive", "derive_tools/derive_strum" ] +derive_strum_phf = [ "derive", "derive_tools/strum_phf" ] + +derive_display = [ "derive", "derive_tools/derive_display", "parse-display" ] +derive_from_str = [ "derive", "derive_tools/derive_from_str", "parse-display" ] + +derive_clone_dyn = [ "derive", "derive_tools/derive_clone_dyn" ] +# derive_clone_dyn_use_std = [ "derive_clone_dyn", "derive_tools/derive_clone_dyn_use_std" ] +# derive_clone_dyn_use_alloc = [ "derive_clone_dyn", "derive_tools/derive_clone_dyn_use_alloc" ] + +# dt + +dt = [ "data_type" ] +dt_default = [ + "dt", + # "dt_use_std", + "data_type/default", + "dt_either", + "dt_prelude", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] +dt_full = [ + "dt", + # "dt_use_std", + "data_type/full", + "dt_either", + "dt_prelude", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] + +# dt_no_std = [ "dt", "data_type/no_std" ] +# dt_use_std = [ "dt", "data_type/use_std" ] +dt_use_alloc = [ "dt", "data_type/use_alloc" ] + +dt_either = [ "dt", "data_type/dt_either" ] +dt_prelude = [ "dt", "data_type/dt_prelude" ] +# dt_type_constructor = [ "dt", "data_type/dt_type_constructor" ] +# dt_make = [ "dt", "data_type/dt_make" ] +# dt_vectorized_from = [ "dt", "data_type/dt_vectorized_from" ] +dt_interval = [ "dt", "data_type/dt_interval" ] + +# diagnostics + +diagnostics = [ "diagnostics_tools" ] +diagnostics_full = [ + "diagnostics", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +diagnostics_default = [ + "diagnostics", + "diagnostics_tools/default", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +# diagnostics_use_std = [ "diagnostics", "diagnostics_tools/use_std" ] +diagnostics_no_std = [ "diagnostics", "diagnostics_tools/no_std" ] +diagnostics_use_alloc = [ "diagnostics", "diagnostics_tools/use_alloc" ] + +diagnostics_runtime_assertions = [ "diagnostics_tools/diagnostics_runtime_assertions" ] +diagnostics_compiletime_assertions = [ "diagnostics_tools/diagnostics_compiletime_assertions" ] + +# common + +nightly = [] # must be empty + +no_std = [] +use_alloc = [ "no_std", "derive_tools/use_alloc" ] +enabled = [] + +# xxx : qqq : should it be filled by all non_std? +# iter_no_std = [ "iter", "iter_tools/no_std" ] +# iter_use_alloc = [ "iter", "iter_tools/use_alloc" ] + +full = [ + "iter_full", + "meta_full", + "mem_full", + "typing_full", + "time_full", + "string_full", + "error_full", + "derive_full", + "dt_full", + "diagnostics_full", + # "use_std", + # "use_alloc", +] + +default = [ + "iter_default", + "meta_default", + "mem_default", + "typing_default", + "time_default", + "string_default", + "error_default", + "derive_default", + "dt_default", + "diagnostics_default", + # "use_std", +] + +[dependencies] + +# iter +iter_tools = { workspace = true, optional = true, features = [ "default" ] } + +# meta +meta_tools = { workspace = true, optional = true, features = [ "default" ] } +impls_index = { workspace = true } # despite impls_index is imported by meta_tools it should also be imported immediatly +# qqq : fix that + +# mem +mem_tools = { workspace = true, optional = true, features = [ "default" ] } + +# typing +typing_tools = { workspace = true, optional = true, features = [ "default" ] } + +# time +time_tools = { workspace = true, optional = true, features = [ "default" ] } + +# sting +strs_tools = { workspace = true, optional = true, features = [ "default" ] } + +# err +error_tools = { workspace = true, optional = true, features = [ "default" ] } + +# derive +derive_tools = { workspace = true, optional = true, features = [ "default" ] } + +# data_type +data_type = { workspace = true, optional = true, features = [ "default" ] } + +# diagnostics +diagnostics_tools = { workspace = true, optional = true, features = [ "default" ] } + +# external +parse-display = { version = "~0.5", optional = true, features = [ "default" ] } # have to be here because of problem with FromStr + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/wtools/License b/module/core/wtools/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/core/wtools/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/wtools/Readme.md b/module/core/wtools/Readme.md new file mode 100644 index 0000000000..114861dea7 --- /dev/null +++ b/module/core/wtools/Readme.md @@ -0,0 +1,23 @@ + + +# Module :: wtools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml) [![docs.rs](https://img.shields.io/docsrs/wtools?color=e3e8f0&logo=docs.rs)](https://docs.rs/wtools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fwtools%2Fexamples%2Fwtools_trivial.rs,RUN_POSTFIX=--example%20wtools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. + +### To add to your project + +```sh +cargo add wtools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/wtools_trivial +cargo run +``` diff --git a/module/core/wtools/examples/wtools_trivial.rs b/module/core/wtools/examples/wtools_trivial.rs new file mode 100644 index 0000000000..ab8e745c40 --- /dev/null +++ b/module/core/wtools/examples/wtools_trivial.rs @@ -0,0 +1,14 @@ +//! qqq : write proper description +// #[ cfg( feature = "typing" ) ] +// use wtools::*; +#[ cfg( any( feature = "typing_implements", feature = "typing") ) ] +use wtools::implements; + +fn main() +{ + #[ cfg( feature = "typing" ) ] + { + println!( "implements!( 13_i32 => Copy ) : {}", implements!( 13_i32 => Copy ) ); + println!( "implements!( Box::new( 13_i32 ) => Copy ) : {}", implements!( Box::new( 13_i32 ) => Copy ) ); + } +} diff --git a/module/core/wtools/src/lib.rs b/module/core/wtools/src/lib.rs new file mode 100644 index 0000000000..6f8412f139 --- /dev/null +++ b/module/core/wtools/src/lib.rs @@ -0,0 +1,215 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] // zzz +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico")] +#![ doc( html_root_url = "https://docs.rs/wtools/latest/wtools/")] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! wTools - Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ cfg( any( feature = "former", feature = "meta_former" ) ) ] + pub use ::meta_tools::former; + #[ cfg( any( feature = "options", feature = "meta_options" ) ) ] + pub use ::meta_tools::options; + #[ cfg( feature = "meta" ) ] + pub use ::meta_tools; + #[ cfg( feature = "mem" ) ] + pub use ::mem_tools; + // zzz + // #[ cfg( feature = "impls_index" ) ] + // pub use ::impls_index; + // // #[ cfg( feature = "mod_interface" ) ] + // pub use ::mod_interface; + #[ cfg( feature = "typing" ) ] + pub use ::typing_tools; + #[ cfg( feature = "time" ) ] + pub use ::time_tools; + #[ cfg( feature = "string" ) ] + pub use ::strs_tools; + #[ cfg( feature = "error" ) ] + pub use ::error_tools; + // #[ cfg( feature = "winterval" ) ] + // pub use ::winterval; + #[ cfg( feature = "derive" ) ] + pub use ::derive_tools; + #[ cfg( feature = "diagnostics" ) ] + pub use ::diagnostics_tools; + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + + #[ cfg( feature = "iter" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::iter_tools as iter; + #[ cfg( feature = "meta" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::meta_tools as meta; + #[ cfg( feature = "mem" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::mem_tools as mem; + #[ cfg( feature = "typing" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::typing_tools as typing; + #[ cfg( feature = "diagnostics" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::diagnostics_tools as diagnostics; + #[ cfg( any( feature = "dt", feature = "data_type" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::data_type as dt; + #[ cfg( feature = "time" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::time_tools as time; + #[ cfg( feature = "error" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::error_tools as error; + #[ cfg( feature = "string" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::strs_tools as string; + #[ cfg( feature = "derive" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::derive_tools as derive; + + #[ cfg( any( feature = "former", feature = "meta_former" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::meta_tools::former as former; + #[ cfg( any( feature = "options", feature = "meta_options" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::meta_tools::options as options; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ cfg( feature = "iter" ) ] + pub use super::iter::exposed::*; + #[ cfg( feature = "meta" ) ] + pub use super::meta::exposed::*; + #[ cfg( feature = "mem" ) ] + pub use super::mem::exposed::*; + #[ cfg( feature = "typing" ) ] + pub use super::typing::exposed::*; + #[ cfg( feature = "diagnostics" ) ] + pub use super::diagnostics::diag::exposed::*; + #[ cfg( any( feature = "dt", feature = "data_type" ) ) ] + pub use super::dt::exposed::*; + #[ cfg( feature = "time" ) ] + pub use super::time::exposed::*; + #[ cfg( feature = "error" ) ] + pub use super::error::exposed::*; + #[ cfg( feature = "string" ) ] + pub use super::string::exposed::*; + #[ cfg( feature = "derive" ) ] + pub use super::derive::exposed::*; + + #[ cfg( any( feature = "former", feature = "meta_former" ) ) ] + pub use super::former::exposed::*; + #[ cfg( any( feature = "options", feature = "meta_options" ) ) ] + pub use super::options::exposed::*; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ cfg( feature = "iter" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::iter::prelude::*; + #[ cfg( feature = "meta" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::meta::prelude::*; + #[ cfg( feature = "mem" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::mem::prelude::*; + #[ cfg( feature = "typing" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::typing::prelude::*; + #[ cfg( feature = "diagnostics" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::diagnostics::diag::prelude::*; + #[ cfg( any( feature = "dt", feature = "data_type" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::dt::prelude::*; + #[ cfg( feature = "time" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::time::prelude::*; + #[ cfg( feature = "error" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::error::prelude::*; + #[ cfg( feature = "string" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::string::prelude::*; + + #[ cfg( feature = "derive" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::derive::prelude::*; + // zzz + #[ cfg( feature = "derive_clone_dyn" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::derive::prelude::clone_dyn; + + #[ cfg( any( feature = "former", feature = "meta_former" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::former::prelude::*; + #[ cfg( any( feature = "options", feature = "meta_options" ) ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::options::prelude::*; +} diff --git a/module/core/wtools/tests/smoke_test.rs b/module/core/wtools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/wtools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/wtools/tests/wtools_tests.rs b/module/core/wtools/tests/wtools_tests.rs new file mode 100644 index 0000000000..a43dc170db --- /dev/null +++ b/module/core/wtools/tests/wtools_tests.rs @@ -0,0 +1,58 @@ +#![ allow( unused_imports ) ] + +// #![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] + +use wtools as the_module; +use test_tools::exposed::*; + +/// A struct for testing purpose. +// #[ derive( Debug, PartialEq ) ] +// pub struct CrateStructForTesting1 +// { +// } + +#[ cfg( feature = "iter_tools" ) ] +#[ path = "../../../core/iter_tools/tests/tests.rs" ] +mod iter_tools; + +#[ cfg( feature = "meta_tools" ) ] +#[ path = "../../../core/meta_tools/tests/meta_tools_tests.rs" ] +mod meta_tools; + +#[ cfg( feature = "mem_tools" ) ] +#[ path = "../../../core/mem_tools/tests/mem_tools_tests.rs" ] +mod mem_tools; + +#[ cfg( feature = "typing_tools" ) ] +#[ path = "../../../core/typing_tools/tests/tests.rs" ] +mod typing_tools; + +#[ cfg( feature = "time_tools" ) ] +#[ path = "../../../core/time_tools/tests/time_tests.rs" ] +mod time_tools; + +#[ cfg( feature = "strs_tools" ) ] +#[ path = "../../../core/strs_tools/tests/strs_tools_tests.rs" ] +mod strs_tools; + +#[ cfg( feature = "error_tools" ) ] +#[ cfg( not( feature = "error_no_std" ) ) ] +#[ path = "../../../core/error_tools/tests/error_tools_tests.rs" ] +mod error_tools; + +#[ cfg( feature = "derive_tools" ) ] +#[ path = "../../../core/derive_tools/tests/tests.rs" ] +mod derive_tools; + +#[ cfg( feature = "data_type" ) ] +#[ path = "../../../core/data_type/tests/data_type_tests.rs" ] +mod data_type; + +#[ cfg( feature = "diagnostics_tools" ) ] +#[ cfg( not( feature = "meta_tools" ) ) ] +#[ path = "../../../core/diagnostics_tools/tests/diagnostics_tests.rs" ] +mod diag_tools; + + +#[ cfg( feature = "meta_tools" ) ] +pub use meta_tools::*; diff --git a/module/move/crates_tools/Cargo.toml b/module/move/crates_tools/Cargo.toml new file mode 100644 index 0000000000..4120a358df --- /dev/null +++ b/module/move/crates_tools/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "crates_tools" +version = "0.10.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Bogdan Balushkin ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/crates_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/crates_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/move/crates_tools" +description = """ +Tools to analyse crate files. +""" +categories = [] +keywords = [] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled", "network" ] +enabled = [ "network" ] +network = [ "ureq" ] + +[dependencies] +flate2 = "~1.0" +tar = "~0.4" +ureq = { version = "~2.9", optional = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/move/crates_tools/License b/module/move/crates_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/crates_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/crates_tools/Readme.md b/module/move/crates_tools/Readme.md new file mode 100644 index 0000000000..dabc50fb6c --- /dev/null +++ b/module/move/crates_tools/Readme.md @@ -0,0 +1,59 @@ + + +# Module :: crates_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/crates_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/crates_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fcrates_tools%2Fexamples%2Fcrates_tools_trivial.rs,RUN_POSTFIX=--example%20crates_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools to analyse crate files. + +A crate file is a package of Rust source code that can be downloaded from crates.io, the official Rust package registry. A crate file has the extension `.crate` and contains a compressed archive of the source code and other files needed to compile and run the crate. + +`crate_tools` allows you to download and read and decode the `.crate` files. You can then use the `CrateArchive` struct to list and access the contents of the file as bytes. + +This crate is useful for developers who want to inspect and analyze Rust crates. +Some possible use cases are: + +- Compare the source code of different versions of a crate to see what has changed; +- Search for leftover confidential data before publishing; +- Analyze the size of packed files. + +## Sample :: show crate content + + + +```rust +use crates_tools::*; + +fn main() +{ + #[ cfg( feature = "enabled" ) ] + { + // download a package with specific version from `crates.io` + let crate_archive = CrateArchive::download_crates_io( "test_experimental_c", "0.1.0" ).unwrap(); + + for path in crate_archive.list() + { + // take content from a specific file from the archive + let bytes = crate_archive.content_bytes( path ).unwrap(); + let string = std::str::from_utf8( bytes ).unwrap(); + + println!("# {}\n```\n{}```", path.display(), string); + } + } +} +``` + +### To add to your project + +```bash +cargo add crates_tools +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools/module/move/crates_tools +cargo r --example show_crate_content +``` diff --git a/module/move/crates_tools/examples/crates_tools_trivial.rs b/module/move/crates_tools/examples/crates_tools_trivial.rs new file mode 100644 index 0000000000..32298192bb --- /dev/null +++ b/module/move/crates_tools/examples/crates_tools_trivial.rs @@ -0,0 +1,20 @@ +#![ allow( missing_docs ) ] +use crates_tools::*; + +fn main() +{ + #[ cfg( feature = "enabled" ) ] + { + // download a package with specific version from `crates.io` + let crate_archive = CrateArchive::download_crates_io( "test_experimental_c", "0.1.0" ).unwrap(); + + for path in crate_archive.list() + { + // take content from a specific file from the archive + let bytes = crate_archive.content_bytes( path ).unwrap(); + let string = std::str::from_utf8( bytes ).unwrap(); + + println!("# {}\n```\n{}```", path.display(), string); + } + } +} diff --git a/module/move/crates_tools/src/lib.rs b/module/move/crates_tools/src/lib.rs new file mode 100644 index 0000000000..20a89cd7cf --- /dev/null +++ b/module/move/crates_tools/src/lib.rs @@ -0,0 +1,166 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/crates_tools/latest/crates_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Internal namespace. +#[ cfg( feature = "enabled" ) ] +pub( crate ) mod private +{ + use std::collections::HashMap; + use std::fmt::Formatter; + use std::io::Read; + use std::path::{ Path, PathBuf }; + use std::time::Duration; + use ureq::{ Agent, AgentBuilder }; + + /// Represents a `.crate` archive, which is a collection of files and their contents. + #[ derive( Default, Clone, PartialEq ) ] + pub struct CrateArchive( HashMap< PathBuf, Vec< u8 > > ); + + impl std::fmt::Debug for CrateArchive + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + f.debug_struct( "CrateArchive" ).field( "files", &self.0.keys() ).finish() + } + } + + impl CrateArchive + { + /// Reads and decode a `.crate` archive from a given path. + pub fn read< P >( path : P ) -> std::io::Result< Self > + where + P : AsRef< Path >, + { + let mut file = std::fs::File::open( path )?; + let mut buf = vec![]; + file.read_to_end( &mut buf )?; + + Self::decode( buf ) + } + + #[ cfg( feature = "network" ) ] + /// Downloads and decodes a `.crate` archive from a given url. + pub fn download< Url >( url : Url ) -> Result< Self, ureq::Error > + where + Url : AsRef< str >, + { + let agent: Agent = AgentBuilder::new() + .timeout_read( Duration::from_secs( 5 ) ) + .timeout_write( Duration::from_secs( 5 ) ) + .build(); + + let resp = agent.get( url.as_ref() ).call()?; + + let mut buf = vec![]; + resp.into_reader().read_to_end( &mut buf )?; + + Ok( Self::decode( buf )? ) + } + + /// Downloads and decodes a `.crate` archive from `crates.io` repository by given name and version of the package. + /// Requires the full version of the package, in the format of `"x.y.z"` + /// + /// Returns error if the package with specified name and version - not exists. + #[ cfg( feature = "network" ) ] + pub fn download_crates_io< N, V >( name : N, version : V ) -> Result< Self, ureq::Error > + where + N : std::fmt::Display, + V : std::fmt::Display, + { + Self::download( format!( "https://static.crates.io/crates/{name}/{name}-{version}.crate" ) ) + } + + /// Decodes a bytes that represents a `.crate` file. + pub fn decode< B >( bytes : B ) -> std::io::Result< Self > + where + B : AsRef<[ u8 ]>, + { + use std::io::prelude::*; + use flate2::bufread::GzDecoder; + use tar::Archive; + + let bytes = bytes.as_ref(); + if bytes.is_empty() + { + return Ok( Self::default() ) + } + + let gz = GzDecoder::new( bytes ); + let mut archive = Archive::new( gz ); + + let mut output = HashMap::new(); + + for file in archive.entries()? + { + let mut file = file?; + + let mut contents = vec![]; + file.read_to_end( &mut contents )?; + + output.insert( file.path()?.to_path_buf(), contents ); + } + + Ok( Self( output ) ) + } + } + + impl CrateArchive + { + /// Returns a list of files from the `.crate` file. + pub fn list( &self ) -> Vec< &Path > + { + self.0.keys().map( PathBuf::as_path ).collect() + } + + /// Returns content of file by specified path from the `.crate` file in bytes representation. + pub fn content_bytes< P >( &self, path : P ) -> Option< &[ u8 ] > + where + P : AsRef< Path >, + { + self.0.get( path.as_ref() ).map( Vec::as_ref ) + } + } +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private::CrateArchive; +} diff --git a/module/move/crates_tools/tests/crates_tools_tests.rs b/module/move/crates_tools/tests/crates_tools_tests.rs new file mode 100644 index 0000000000..1abe21482f --- /dev/null +++ b/module/move/crates_tools/tests/crates_tools_tests.rs @@ -0,0 +1,24 @@ +use std::path::Path; +#[ cfg( feature = "enabled" ) ] +use crates_tools::CrateArchive; + +#[ cfg( feature = "enabled" ) ] +#[ test ] +fn download() +{ + let crate_archive = CrateArchive::download_crates_io( "test_experimental_c", "0.1.0" ).unwrap(); + + let mut expected_files : Vec< &Path > = vec! + [ + "test_experimental_c-0.1.0/.cargo_vcs_info.json".as_ref(), + "test_experimental_c-0.1.0/src/lib.rs".as_ref(), + "test_experimental_c-0.1.0/Cargo.toml".as_ref(), + "test_experimental_c-0.1.0/Cargo.toml.orig".as_ref(), + ]; + expected_files.sort(); + + let mut actual_files = crate_archive.list(); + actual_files.sort(); + + assert_eq!( expected_files, actual_files ); +} diff --git a/module/move/crates_tools/tests/smoke_test.rs b/module/move/crates_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..781e173398 --- /dev/null +++ b/module/move/crates_tools/tests/smoke_test.rs @@ -0,0 +1,15 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ ignore ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/deterministic_rand/Cargo.toml b/module/move/deterministic_rand/Cargo.toml new file mode 100644 index 0000000000..d0cc6d1fe5 --- /dev/null +++ b/module/move/deterministic_rand/Cargo.toml @@ -0,0 +1,50 @@ +[package] +name = "deterministic_rand" +version = "0.5.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Viktor Dudnik ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/deterministic_rand" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/deterministic_rand" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/deterministic_rand" +description = """ +Hierarchical random number generators for concurrent simulations with switchable determinism. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled", "determinism" ] +full = [ "enabled", "determinism" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] +determinism = [ "rand_chacha", "rand_seeder", "iter_tools" ] + +[dependencies] +mod_interface = { workspace = true, features = [ "default" ] } +iter_tools = { workspace = true, features = [ "default" ], optional = true } +rand = "0.8.5" +rand_chacha = { version = "0.3.1", optional = true } +rand_seeder = { version = "0.2.3", optional = true } +sealed = "0.5.0" + +[dev-dependencies] +test_tools = { workspace = true } +rayon = "1.8.0" + +[[example]] +name = "sample_deterministic_rand_trivial" +path = "examples/deterministic_rand_trivial.rs" diff --git a/module/move/deterministic_rand/License b/module/move/deterministic_rand/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/deterministic_rand/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/deterministic_rand/Readme.md b/module/move/deterministic_rand/Readme.md new file mode 100644 index 0000000000..4d52d1cc38 --- /dev/null +++ b/module/move/deterministic_rand/Readme.md @@ -0,0 +1,182 @@ +# Module :: deterministic_rand + + + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml) [![docs.rs](https://img.shields.io/docsrs/deterministic_rand?color=e3e8f0&logo=docs.rs)](https://docs.rs/deterministic_rand) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fdeterministic_rand%2Fexamples%2Fdeterministic_rand_trivial.rs,RUN_POSTFIX=--example%20deterministic_rand_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Hierarchical random number generators for concurrent simulations with switchable determinism. + +This library introduces hierarchical random number generators designed for concurrent simulations, offering the flexibility of switchable determinism. + +### Rationale + +Deterministic randomness, also known as pseudo-randomness, finds its application in various fields beyond algorithmic solutions for NP-hard problems and multiplayer gaming. Here are some other notable applications: + +*Cryptography*: In cryptography, deterministic randomness is essential for generating secure keys, cryptographic nonces, and for various encryption algorithms. Pseudo-random number generators (PRNGs) need to produce output that is indistinguishable from true randomness to ensure security. + +*Simulation and Modeling*: In scientific simulations, such as those in physics, biology, or economics, deterministic randomness is used to model complex systems with inherent uncertainties. This allows for reproducibility of results, which is crucial for verification and validation of models. + +*Computer Graphics*: In procedural generation, such as terrain or texture generation in computer graphics, deterministic randomness can create diverse yet consistent visuals. This is widely used in video games and simulations. + +*Load Testing*: In software engineering, deterministic randomness is used in load and stress testing of systems. By simulating user behavior or system inputs in a controlled, repeatable manner, developers can identify and rectify potential performance issues. + +*Machine Learning*: Some machine learning algorithms, especially those involving stochastic processes like stochastic gradient descent, use deterministic randomness to ensure reproducibility of results while still benefiting from randomness in the training process. + +*Statistical Sampling*: In statistics, pseudo-random number generators are used for random sampling and other statistical methods where reproducibility is essential. + +*Quantum Computing Simulation*: Simulating quantum computers on classical machines often requires deterministic randomness to emulate the probabilistic nature of quantum mechanics. + +*Algorithmic Art*: In generative art, deterministic randomness helps in creating complex and appealing patterns and images that are reproducible. + +*Financial Modeling*: In finance, deterministic randomness is used in Monte Carlo simulations for risk assessment and option pricing, where numerous scenarios are generated to model the behavior of financial markets. + +*Educational Tools and Demonstrations*: In teaching concepts of probability and randomness, deterministic algorithms allow educators to demonstrate principles using repeatable experiments. + +These applications leverage the balance that deterministic randomness provides between unpredictability and reproducibility, making it a versatile tool in many fields. + +### Sources of non-determinism + +A random number generator is the most obvious source of randomness, but it's not the only one. Among the sources of randomness in programs are: + +- Random Number Generator (e.g., `rand`) +- Parallelism (e.g., `rayon`) +- Standard Library (e.g., keys of HashMap and HashSet) +- System Time +- Memory Addresses +- Database Query Results +- Quantum Randomness + +The `deterministic_rand` provides means to address the first three sources of randomness. + +### Basic use-case + +The most trivial use case. Just generating a random number. + +```rust +#[ cfg( not( feature = "no_std" ) ) ] +{ + // `Rng`` is re-exported from `rand` and `Hrng` stands for hierarchical random number generators. + use deterministic_rand::{ Rng, Hrng }; + // Make master random number generator with a seed. + let hrng = Hrng::master_with_seed( "master1".into() ); + // Get a reference to the current random number generator using a reference counter and mutex. + let rng_ref = hrng.rng_ref(); + // Lock it producing a guard. + let mut rng = rng_ref.lock().unwrap(); + // Generate a number. + let got : u64 = rng.gen(); + // If determinism is enabled then sequence of generated rundom numbers will be the same. + #[ cfg( feature = "determinism" ) ] + assert_eq!( got, 8185996568056992464 ); +} +``` + +### How to deal with parallelism-caused non-determinism + +To address the non-determinism caused by parallelism, HRNG create a child random number generator for each dataflow lane. The key is to tie the generator not to the thread ID but to the batch ID. This ensures that no matter which thread handles the job, the sequence of random numbers remains consistent and is determined solely by the batch ID. + +Internally, a hierarchical random number generator employs a dedicated RNG to produce offspring. This ensures consistent outcomes regardless of when a child generator is created. Additionally, this approach enhances performance by minimizing concurrent clashes between the parent and child generators over shared resources. + +If you don't have batch ID consider enumerating your items to and use key as batch ID. + +```rust +// Import necessary traits and modules from the `rayon` and `deterministic_rand` crates. +use rayon::prelude::*; +use deterministic_rand::{ distributions::Uniform, Rng, Hrng }; + +// Define a range for random number generation between -1.0 and 1.0. +let range = Uniform::new( -1.0f64, 1.0 ); + +// Create a master hierarchical random number generator (HRNG). +let manager = Hrng::master(); + +// Launch a parallel iteration over a range of numbers (0 to 999). +let got = ( 0..1000 ) +.into_par_iter() +.map +( + | i | + { + // For each barch, create a child HRNG tied to the current batch ID. + let child = manager.child( i ); + // Get a reference to current RNG. + let rng = child.rng_ref(); + // Lock the RNG to ensure safe access in the concurrent context. + let mut rng = rng.lock().unwrap(); + + // Initialize a counter for each iteration. + let mut count = 0; + // Perform 10,000 random draws. + for _ in 0..10_000 + { + // Sample two numbers from the range and calculate their positions. + let a = rng.sample( &range ); + let b = rng.sample( &range ); + + // If the point (a, b) lies within a unit circle, increment the count. + if a * a + b * b <= 1.0 + { + count += 1; + } + } + + // Return the count for this iteration. + count + } +) +// Sum the counts from all iterations. +.sum::< u64 >(); + +// Calculate an approximation of Pi using the Monte Carlo method. +let got_pi = 4. * ( got as f64 ) / ( ( 10_000 * 1000 ) as f64 ); + +// If determinism is enabled, assert that the calculated value of Pi matches the expected result. +#[ cfg( not( feature = "no_std" ) ) ] +#[ cfg( feature = "determinism" ) ] +assert_eq!( got_pi, 3.1410448 ); + +// Print the calculated value of Pi. +println!( "PI = {got_pi}" ); +``` + +### How to deal with STD non-determinism + +In the standard library, randomness can also be a factor; for instance, iterating over the keys of a hashmap or hashset is non-deterministic. To achieve deterministic enumeration, you can use the `deterministic_rand::IfDeterminismIteratorExt` extension for iterators. By applying `if_determinism_then_sort` or `if_determinism_then_sort_by` before processing the keys, you can ensure a consistent order. The `if_determinism_then_sort_by` method acts as a no-op (no operation) when determinism is off, but it performs sorting when the determinism feature is on. + +```rust +// Import the necessary modules from the standard library and the `deterministic_rand` crate. +use std::collections::HashMap; +use deterministic_rand::IfDeterminismIteratorExt; + +// Create a HashMap with three key-value pairs. +let map: HashMap<_, _> = HashMap::from_iter( [ ( 1, "first" ), ( 2, "second" ), ( 3, "third" ) ] ); + +// Convert the HashMap into an iterator, apply deterministic sorting to the keys, +// and then map each (key, value) pair to just the value. +let keys: Vec< _ > = map +.into_iter() +.if_determinism_then_sort_by( | ( a, _ ), ( b, _ ) | a.cmp( &b ) ) +.map( | e | e.1 ) +.collect(); + +// If the 'determinism' feature is enabled, assert that the sorted keys match the expected order. +// This is a conditional compilation check that ensures the code block is compiled and run only +// if the 'determinism' feature is enabled. +#[ cfg( feature = "determinism" ) ] +assert_eq!( keys, vec![ "first", "second", "third" ] ); +``` + +### To add to your project + +```bash +cargo add deterministic_rand +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example sample_deterministic_rand_trivial +``` diff --git a/module/move/deterministic_rand/examples/deterministic_rand_trivial.rs b/module/move/deterministic_rand/examples/deterministic_rand_trivial.rs new file mode 100644 index 0000000000..06513fd894 --- /dev/null +++ b/module/move/deterministic_rand/examples/deterministic_rand_trivial.rs @@ -0,0 +1,24 @@ +//! +//! The most trivial use case. Just generating a random number. +//! + +// `Rng`` is re-exported from `rand` and `Hrng` stands for hierarchical random number generators. +use deterministic_rand::{ Rng, Hrng }; + +fn main() +{ + #[ cfg( not( feature = "no_std" ) ) ] + { + // Make master random number generator with a seed. + let hrng = Hrng::master_with_seed( "master1".into() ); + // Get a reference to the current random number generator using a reference counter and mutex. + let rng_ref = hrng.rng_ref(); + // Lock it producing a guard. + let mut rng = rng_ref.lock().unwrap(); + // Generate a number. + let _got : u64 = rng.gen(); + // If determinism is enabled then sequence of generated rundom numbers will be the same. + #[ cfg( feature = "determinism" ) ] + assert_eq!( _got, 6165676721551962567 ); + } +} diff --git a/module/move/deterministic_rand/examples/sample_deterministic_rand_rayon.rs b/module/move/deterministic_rand/examples/sample_deterministic_rand_rayon.rs new file mode 100644 index 0000000000..c2a2042732 --- /dev/null +++ b/module/move/deterministic_rand/examples/sample_deterministic_rand_rayon.rs @@ -0,0 +1,71 @@ +//! Example usage of deterministic rand with parallel iterators. +//! +//! Monte Carlo method for approximate value of PI. +//! +//! To address the non-determinism caused by parallelism, HRNG create a child random number generator for each dataflow lane. The key is to tie the generator not to the thread ID but to the batch ID. This ensures that no matter which thread handles the job, the sequence of random numbers remains consistent and is determined solely by the batch ID. +//! +//! Internally, a hierarchical random number generator employs a dedicated RNG to produce offspring. This ensures consistent outcomes regardless of when a child generator is created. Additionally, this approach enhances performance by minimizing concurrent clashes between the parent and child generators over shared resources. +//! +//! If you don't have batch ID consider enumerating your items to and use key as batch ID. + +// Import necessary traits and modules from the `rayon` and `deterministic_rand` crates. +use rayon::prelude::*; +use deterministic_rand::{ distributions::Uniform, Rng, Hrng }; + +fn main() +{ + + // Define a range for random number generation between -1.0 and 1.0. + let range = Uniform::new( -1.0f64, 1.0 ); + + // Create a master hierarchical random number generator (HRNG). + let manager = Hrng::master(); + + // Launch a parallel iteration over a range of numbers (0 to 999). + let got = ( 0..1000 ) + .into_par_iter() + .map + ( + | i | + { + // For each barch, create a child HRNG tied to the current batch ID. + let child = manager.child( i ); + // Get a reference to current RNG. + let rng = child.rng_ref(); + // Lock the RNG to ensure safe access in the concurrent context. + let mut rng = rng.lock().unwrap(); + + // Initialize a counter for each iteration. + let mut count = 0; + // Perform 10,000 random draws. + for _ in 0..10_000 + { + // Sample two numbers from the range and calculate their positions. + let a = rng.sample( &range ); + let b = rng.sample( &range ); + + // If the point (a, b) lies within a unit circle, increment the count. + if a * a + b * b <= 1.0 + { + count += 1; + } + } + + // Return the count for this iteration. + count + } + ) + // Sum the counts from all iterations. + .sum::< u64 >(); + + // Calculate an approximation of Pi using the Monte Carlo method. + let got_pi = 4. * ( got as f64 ) / ( ( 10_000 * 1000 ) as f64 ); + + // If determinism is enabled, assert that the calculated value of Pi matches the expected result. + #[ cfg( feature = "determinism" ) ] + assert_eq!( got_pi, 3.1410448 ); + + // Print the calculated value of Pi. + println!( "PI = {got_pi}" ); + +} diff --git a/module/move/deterministic_rand/examples/sample_deterministic_rand_std.rs b/module/move/deterministic_rand/examples/sample_deterministic_rand_std.rs new file mode 100644 index 0000000000..87325d2cd3 --- /dev/null +++ b/module/move/deterministic_rand/examples/sample_deterministic_rand_std.rs @@ -0,0 +1,28 @@ +//! Dealing with non-determinism in STD. +//! +//! In the standard library, randomness can also be a factor; for instance, iterating over the keys of a hashmap or hashset is non-deterministic. To achieve deterministic enumeration, you can use the `deterministic_rand::IfDeterminismIteratorExt` extension for iterators. By applying `if_determinism_then_sort` or `if_determinism_then_sort_by` before processing the keys, you can ensure a consistent order. The `if_determinism_then_sort_by` method acts as a no-op (no operation) when determinism is off, but it performs sorting when the determinism feature is on. + +// Import the necessary modules from the standard library and the `deterministic_rand` crate. +use std::collections::HashMap; +use deterministic_rand::IfDeterminismIteratorExt; + +fn main() +{ + // Create a HashMap with three key-value pairs. + let map: HashMap<_, _> = HashMap::from_iter( [ ( 1, "first" ), ( 2, "second" ), ( 3, "third" ) ] ); + + // Convert the HashMap into an iterator, apply deterministic sorting to the keys, + // and then map each (key, value) pair to just the value. + let _keys: Vec< _ > = map + .into_iter() + .if_determinism_then_sort_by( | ( a, _ ), ( b, _ ) | a.cmp( &b ) ) + .map( | e | e.1 ) + .collect(); + + // If the 'determinism' feature is enabled, assert that the sorted keys match the expected order. + // This is a conditional compilation check that ensures the code block is compiled and run only + // if the 'determinism' feature is enabled. + #[ cfg( feature = "determinism" ) ] + assert_eq!( _keys, vec![ "first", "second", "third" ] ); + +} diff --git a/module/move/deterministic_rand/src/hrng_deterministic.rs b/module/move/deterministic_rand/src/hrng_deterministic.rs new file mode 100644 index 0000000000..35af6c490c --- /dev/null +++ b/module/move/deterministic_rand/src/hrng_deterministic.rs @@ -0,0 +1,204 @@ + +//! +//! Hierarchical random number generators itself. +//! +//! There are two versions of HRNG: deterministic and non-deterministic. +//! Both have the same interface and are interchengable by switching on/off a feature `determinsim`. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + use crate::*; + #[ cfg( not( feature = "no_std" ) ) ] + use std::sync::{ Arc, Mutex, RwLock }; + use rand_chacha::ChaCha8Rng; + + /// + /// Generator under mutex and reference counter. + /// + + pub type SharedGenerator = Arc< Mutex< ChaCha8Rng > >; + // qqq : parametrize, use ChaCha8Rng by default, but allow to specify other + + /// Hierarchical random number generator. + /// + /// Produce deterministic random series of numbers with uniform distribution. + /// Handy to be used for paralelism. + /// + /// Master random number generator produce children and each child might produce more children as much as dataflows in progam. + /// + + #[ derive( Debug, Clone ) ] + pub struct Hrng + { + /// List of child generators produced by this hierarchical random number generator. + children : Arc< RwLock< Vec< Hrng > > >, + /// Current main generator used for number generation. + generator : SharedGenerator, + /// Current generator used for child creation. + /// + /// Different generators are used for generating data and generating children for performance + /// and to make sure that child with the same index of a parent produce always same sequence of random numbers. + children_generator : SharedGenerator, + // /// Current index of the generator in the list of children of parent. + // index : usize, + } + + impl Hrng + { + + /// Construct master hierarchical random number generator with default seed phrase. + /// + /// ### Example + /// ``` + /// use deterministic_rand::{ Hrng, Rng }; + /// let hrng = Hrng::master(); + /// let rng_ref = hrng.rng_ref(); + /// let mut rng = rng_ref.lock().unwrap(); + /// let got : u64 = rng.gen(); + /// ``` + + pub fn master() -> Self + { + Self::master_with_seed( Seed::default() ) + } + + /// Construct hierarchical random number generator with help of seed phrase. + /// + /// ### Example + /// ``` + /// use deterministic_rand::{ Hrng, Rng }; + /// let hrng = Hrng::master_with_seed( "master1".into() ); + /// let rng_ref = hrng.rng_ref(); + /// let mut rng = rng_ref.lock().unwrap(); + /// let got : u64 = rng.gen(); + /// ``` + + pub fn master_with_seed( seed : Seed ) -> Self + { + let mut _generator : ChaCha8Rng = rand_seeder::Seeder::from( seed.into_inner() ).make_rng(); + let _children_generator = ChaCha8Rng::seed_from_u64( _generator.next_u64() ); + let generator = Arc::new( Mutex::new( _generator ) ); + let children_generator = Arc::new( Mutex::new( _children_generator ) ); + Self + { + children : Default::default(), + generator, + children_generator, + // index: 0, + } + } + + /// Construct hierarchical random number generator with help of short seed. + fn _with_short_seed( seed : u64 ) -> Self + { + let rng = ChaCha8Rng::seed_from_u64( seed ); + Self::_with_generator( rng ) + } + + /// Construct hierarchical random number generator with help of RNG. + fn _with_generator( mut rng : ChaCha8Rng ) -> Self + { + // Use another sequence for seed generation to improve uniformness. + rng.set_stream( 1 ); + let _children_generator = ChaCha8Rng::seed_from_u64( rng.next_u64() ); + rng.set_stream( 0 ); + let generator = Arc::new( Mutex::new( rng ) ); + let children_generator = Arc::new( Mutex::new( _children_generator ) ); + Self + { + children : Default::default(), + generator, + children_generator, + // index: 0, + } + } + + /// Get a reference to the current random number generator using a reference counter and mutex. + /// + /// Returns a shared `Arc>`. + /// + /// ### Example + /// + /// ``` + /// # use deterministic_rand::{ Hrng, Rng }; + /// # let hrng = Hrng::default(); + /// let rng_ref = hrng.rng_ref(); + /// let mut rng = rng_ref.lock().unwrap(); + /// let got : u64 = rng.gen(); + /// ``` + + #[ inline( always ) ] + pub fn rng_ref( &self ) -> SharedGenerator + { + self.generator.clone() + } + + /// Creates new child hierarchical random number generator by index seed. + pub fn child( &self, index : usize ) -> Self + { + let children = self.children.read().unwrap(); + if children.len() > index + { + return children[ index ].clone(); + } + + // To acquire a write lock, read lock should be released first + drop( children ); + let mut rng = self.children_generator.lock().unwrap(); + let mut children = self.children.write().unwrap(); + let len = children.len(); + + // After the second lock it can happen that the child already exists. + if len > index + { + return children[ index ].clone(); + } + + children.reserve( index + 1 - len ); + for _ in len..( index + 1 ) + { + children.push( Self::_with_short_seed( rng.next_u64() ) ) + } + children[ index ].clone() + + } + +// // xxx : remove, maybe +// /// Creates new child hierarchical random number generator by index seed, index is deduced from the contexst. +// /// Index is new child is index of current newest child plus one. +// pub fn child_new( &self ) -> Self +// { +// self.child( self.children.read().unwrap().len() ) +// } + + /// Returns number of children created by this generator. Used only for diagnostics. + pub fn _children_len( &self ) -> usize + { + self.children.read().unwrap().len() + } + +// // xxx : remove, maybe +// /// Returns current index of the generator. +// pub fn index( &self ) -> usize +// { +// self.index +// } + } + + impl Default for Hrng + { + fn default() -> Self + { + Hrng::master() + } + } + +} + +crate::mod_interface! +{ + orphan use Hrng; +} diff --git a/module/move/deterministic_rand/src/hrng_non_deterministic.rs b/module/move/deterministic_rand/src/hrng_non_deterministic.rs new file mode 100644 index 0000000000..a270d424a2 --- /dev/null +++ b/module/move/deterministic_rand/src/hrng_non_deterministic.rs @@ -0,0 +1,180 @@ + +//! +//! Hierarchical random number generators itself. +//! +//! There are two versions of HRNG: deterministic and non-deterministic. +//! Both have the same interface and are interchengable by switching on/off a feature `determinsim`. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + use crate::*; + use core::{ ops::Deref, ops::DerefMut }; + + /// Emulates behavior of `Arc>` for compatibility. + + #[ derive( Debug ) ] + pub struct SharedGenerator; + + + impl SharedGenerator + { + /// Emulate lock of a mutex. + #[ inline( always ) ] + pub fn lock( &self ) -> SharedGeneratorLock + { + SharedGeneratorLock + } + } + + /// Emulates behavior of `Arc>` for compatibility. + + #[ derive( Debug) ] + pub struct SharedGeneratorLock; + + impl SharedGeneratorLock + { + /// Emulate unwrap of a result of guard produced my locking a mutex. + #[ inline( always ) ] + pub fn unwrap( &self ) -> DerefRng + { + DerefRng( rand::thread_rng() ) + } + } + + /// Placeholder structure that is used when `determinism` feature is not enabled. + /// + /// Used for code compatibility for both deterministic and non-deterministic modes. + + #[ derive( Debug ) ] + pub struct DerefRng( rand::rngs::ThreadRng ); + + impl Deref for DerefRng + { + type Target = rand::rngs::ThreadRng; + #[ inline( always ) ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl DerefMut for DerefRng + { + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + impl Default for Hrng + { + fn default() -> Self + { + Hrng::master() + } + } + + /// Placeholder of a deterministic hierarchical random number generator + /// for then the `determinism` feature is not enabled + /// + /// Always returns `rand::thread_rng` + + #[ derive( Debug, Clone ) ] + pub struct Hrng; + + impl Hrng + { + + /// Construct master hierarchical random number generator with default seed phrase. + /// + /// ### Example + /// ``` + /// use deterministic_rand::{ Hrng, Rng }; + /// let hrng = Hrng::master(); + /// let rng_ref = hrng.rng_ref(); + /// let mut rng = rng_ref.lock().unwrap(); + /// let got : u64 = rng.gen(); + /// ``` + + #[ inline( always ) ] + pub fn master() -> Self + { + Self + } + + /// Construct hierarchical random number generator with help of seed phrase. + /// + /// ### Example + /// ``` + /// use deterministic_rand::{ Hrng, Rng }; + /// let hrng = Hrng::master_with_seed( "master1".into() ); + /// let rng_ref = hrng.rng_ref(); + /// let mut rng = rng_ref.lock().unwrap(); + /// let got : u64 = rng.gen(); + /// ``` + + #[ cfg( not( feature = "no_std" ) ) ] + #[ inline( always ) ] + pub fn master_with_seed( _ : Seed ) -> Self + { + Self + } + + /// Get a reference to the current random number generator using a reference counter and mutex. + /// + /// Returns a shared `Arc>`. + /// + /// ### Example + /// + /// ``` + /// # use deterministic_rand::{ Hrng, Rng }; + /// # let hrng = Hrng::default(); + /// let rng_ref = hrng.rng_ref(); + /// let mut rng = rng_ref.lock().unwrap(); + /// let got : u64 = rng.gen(); + /// ``` + + #[ inline( always ) ] + pub fn rng_ref( &self ) -> SharedGenerator + { + SharedGenerator + } + + /// Creates new child hierarchical random number generator by index seed. + #[ inline( always ) ] + pub fn child( &self, _ : usize ) -> Self + { + Self + } + +// /// Creates new child hierarchical random number generator by index seed, index is deduced from the contexst. +// /// Index is new child is index of current newest child plus one. +// pub fn child_new( &self ) -> Self +// { +// self.child( 0 ) +// } + + /// Returns number of children created by this generator. + #[ inline( always ) ] + pub fn _children_len( &self ) -> usize + { + 0 + } + +// /// Returns current index of the generator. +// #[ inline( always ) ] +// pub fn index( &self ) -> usize +// { +// 0 +// } + } + +} + +crate::mod_interface! +{ + orphan use Hrng; +} diff --git a/module/move/deterministic_rand/src/iter.rs b/module/move/deterministic_rand/src/iter.rs new file mode 100644 index 0000000000..9c69a2c80b --- /dev/null +++ b/module/move/deterministic_rand/src/iter.rs @@ -0,0 +1,83 @@ + +//! +//! Extensions of iterator for determinism. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + use core::cmp::Ordering; + #[ cfg( feature = "determinism" ) ] + extern crate alloc; + #[ cfg( feature = "determinism" ) ] + use alloc::vec::IntoIter; + #[ cfg( feature = "determinism" ) ] + use iter_tools::exposed::Itertools; + + /// Extensions of iterator to sort items of the iterator. Replaced by a no-op when determinism is switched off. + /// Useful, for example, to eliminate non-deterministic iteration of `HashMap` and `HashSet` keys. + #[ sealed::sealed ] + pub trait IfDeterminismIteratorExt : Iterator + { + /// Sorts the slice. Replaced by a no-op when determinism is switched off. + /// Useful, for example, to eliminate non-deterministic iteration of `HashMap` and `HashSet` keys. + #[ cfg( feature = "determinism" ) ] + #[ inline( always ) ] + fn if_determinism_then_sort( self ) -> IntoIter< Self::Item > + where + Self : Sized, + Self::Item : Ord, + { + self.sorted() + } + + /// Sorts the slice. Replaced by a no-op when determinism is switched off. + /// Useful, for example, to eliminate non-deterministic iteration of `HashMap` and `HashSet` keys. + #[ cfg( not( feature = "determinism" ) ) ] + #[ inline( always ) ] + fn if_determinism_then_sort( self ) -> Self + where + Self : Sized, + Self::Item : Ord, + { + self + } + + /// Sorts the slice with a comparator function. Replaced by a no-op when determinism is switched off. + /// Useful, for example, to eliminate non-deterministic iteration of `HashMap` and `HashSet` keys. + #[ cfg( feature = "determinism" ) ] + #[ inline( always ) ] + fn if_determinism_then_sort_by< F >( self, cmp : F ) -> IntoIter< Self::Item > + where + Self : Sized, + F : FnMut( &Self::Item, &Self::Item ) -> Ordering, + { + self.sorted_by( cmp ) + } + + /// Sorts the slice with a comparator function. Replaced by a no-op when determinism is switched off. + /// Useful, for example, to eliminate non-deterministic iteration of `HashMap` and `HashSet` keys. + #[ cfg( not( feature = "determinism" ) ) ] + #[ inline( always ) ] + fn if_determinism_then_sort_by< F >( self, _ : F ) -> Self + where + Self : Sized, + F : FnMut( &Self::Item, &Self::Item ) -> Ordering, + { + self + } + } + + #[ sealed::sealed ] + impl< T : ?Sized > IfDeterminismIteratorExt for T + where T : Iterator + { + } + +} + +crate::mod_interface! +{ + prelude use IfDeterminismIteratorExt; +} diff --git a/module/move/deterministic_rand/src/lib.rs b/module/move/deterministic_rand/src/lib.rs new file mode 100644 index 0000000000..bb9a097fe9 --- /dev/null +++ b/module/move/deterministic_rand/src/lib.rs @@ -0,0 +1,43 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/deterministic_rand/latest/deterministic_rand/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +use mod_interface::mod_interface; + +#[ cfg( not( feature = "no_std" ) ) ] +#[ cfg( feature = "determinism" ) ] +pub mod hrng_deterministic; +#[ cfg( any( not( feature = "determinism" ), feature = "no_std" ) ) ] +pub mod hrng_non_deterministic; + +#[ cfg( not( feature = "no_std" ) ) ] +#[ cfg( feature = "determinism" ) ] +pub use hrng_deterministic as hrng; +#[ cfg( any( not( feature = "determinism" ), feature = "no_std" ) ) ] +pub use hrng_non_deterministic as hrng; + +mod_interface! +{ + + protected use ::rand::*; + + use super::hrng; + + // xxx : make it working + // #[ cfg( feature = "determinism" ) ] + // use super::hrng_deterministic as hrng; + // #[ cfg( not( feature = "determinism" ) ) ] + // use super::hrng_non_deterministic as hrng; + + // xxx : make it working + // #[ cfg( feature = "determinism" ) ] + // layer hrng_deterministic as hrng; + // #[ cfg( not( feature = "determinism" ) ) ] + // layer hrng_non_deterministic as hrng; + + layer iter; + #[ cfg( not( feature = "no_std" ) ) ] + layer seed; +} diff --git a/module/move/deterministic_rand/src/seed.rs b/module/move/deterministic_rand/src/seed.rs new file mode 100644 index 0000000000..196c92ea58 --- /dev/null +++ b/module/move/deterministic_rand/src/seed.rs @@ -0,0 +1,79 @@ + +//! +//! Master seed. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + #[ cfg( feature = "no_std" ) ] + extern crate alloc; + #[ cfg( feature = "no_std" ) ] + use alloc::string; + + /// Master seed. + #[ derive( Clone, Debug, PartialEq, Eq ) ] + pub struct Seed( String ); + + impl Seed + { + /// Creates new seed from a string. + pub fn new< IntoString >( value : IntoString ) -> Self + where + IntoString : Into< String >, + { + Self( value.into() ) + } + + /// Used for simplifying seed creation from a [`u64`] seed. + pub fn from_integer( src : u64 ) -> Self + { + Self( format!( "master_seed_{}", src ) ) + } + + /// Random string as seed. + pub fn random() -> Self + { + use rand::{ distributions::Alphanumeric, Rng }; + let str : String = rand::thread_rng() + .sample_iter( &Alphanumeric ) + .take( 16 ) + .map(char::from) + .collect(); + debug_assert!( str.len() > 0 ); + Self( str ) + } + + /// Returns inner seed string value. + pub fn into_inner( self ) -> String + { + self.0 + } + } + + impl Default for Seed + { + fn default() -> Self + { + Self( "master_seed".to_owned() ) + } + } + + impl< IntoString > From< IntoString > for Seed + where + IntoString : Into< String >, + { + #[ inline( always ) ] + fn from( src : IntoString ) -> Self + { + Self::new( src ) + } + } + + +} + +crate::mod_interface! +{ + orphan use Seed; +} diff --git a/module/move/deterministic_rand/tests/assumption_test.rs b/module/move/deterministic_rand/tests/assumption_test.rs new file mode 100644 index 0000000000..4cb488375f --- /dev/null +++ b/module/move/deterministic_rand/tests/assumption_test.rs @@ -0,0 +1,246 @@ + +use rand::Rng; +use deterministic_rand::Hrng; + +#[ test ] +fn assumption_gen() +{ + let rng = Hrng::master().rng_ref(); + let mut rng = rng.lock().unwrap(); + let _got : u64 = rng.gen(); + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + assert_eq!( _got, 6165676721551962567 ); + let _got : u64 = rng.gen(); + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + assert_eq!( _got, 15862033778988354993 ); + + let rng = Hrng::master().rng_ref(); + let mut rng = rng.lock().unwrap(); + let _got : u64 = rng.gen(); + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + assert_eq!( _got, 6165676721551962567 ); + let _got : u64 = rng.gen(); + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + assert_eq!( _got, 15862033778988354993 ); +} + +#[ test ] +fn assumption_choose() +{ + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + { + use rand::seq::IteratorRandom; + let rng = Hrng::master().rng_ref(); + let mut rng = rng.lock().unwrap(); + let got = ( 1..1000 ).choose( &mut *rng ).unwrap(); + assert_eq!( got, 334 ); + let got = ( 1..1000 ).choose( &mut *rng ).unwrap(); + assert_eq!( got, 421 ); + let got : u64 = rng.gen(); + assert_eq!( got, 11385630238607229870 ); + } +} + +#[ test ] +fn assumption_choose_stable() +{ + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + { + use rand::seq::IteratorRandom; + let rng = Hrng::master().rng_ref(); + let mut rng = rng.lock().unwrap(); + let got = ( 1..1000 ).choose_stable( &mut *rng ).unwrap(); + assert_eq!( got, 704 ); + let got = ( 1..1000 ).choose_stable( &mut *rng ).unwrap(); + assert_eq!( got, 511 ); + let got : u64 = rng.gen(); + assert_eq!( got, 18025856250180898108 ); + } +} + +#[ test ] +fn assumption_choose_multiple() +{ + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + { + use rand::seq::{ IteratorRandom, SliceRandom }; + let rng = Hrng::master().rng_ref(); + let mut rng = rng.lock().unwrap(); + let got = ( 1..1000 ).choose_multiple( &mut *rng, 10 ); + assert_eq!( got, vec![ 704, 2, 359, 578, 198, 219, 884, 649, 696, 532 ] ); + + let got = ( 1..1000 ).choose_multiple( &mut *rng, 10 ); + assert_eq!( got, vec![ 511, 470, 835, 820, 26, 776, 261, 278, 828, 765 ] ); + + let got = ( 1..1000 ) + .collect::< Vec< _ > >() + .choose_multiple( &mut *rng, 10 ) + .copied() + .collect::< Vec< _ > >(); + assert_eq!( got, vec![ 141, 969, 122, 311, 926, 11, 987, 184, 888, 423 ] ); + + let got = ( 1..1000 ) + .collect::< Vec< _ > >() + .choose_multiple( &mut *rng, 10 ) + .copied() + .collect::< Vec< _ > >(); + assert_eq!( got, vec![ 637, 798, 886, 412, 652, 688, 71, 854, 639, 282 ] ); + } +} + +#[ test ] +fn assumption_choose_weighted() +{ + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + { + use deterministic_rand::seq::SliceRandom; + let rng = Hrng::master().rng_ref(); + let mut rng = rng.lock().unwrap(); + let got = ( 1..1000 ) + .zip( ( 1..1000 ).rev() ) + .into_iter() + .collect::< Vec< _ > >() + .choose_weighted( &mut *rng, |w| w.0 ) + .map( |( i, j )| ( *i, *j ) ) + .unwrap(); + assert_eq!( got, ( 800, 200 ) ); + + let got = ( 1..1000 ) + .zip( ( 1..1000 ).rev() ) + .into_iter() + .collect::< Vec< _ > >() + .choose_weighted( &mut *rng, |w| w.0 ) + .map( |( i, j )| ( *i, *j ) ) + .unwrap(); + assert_eq!( got, ( 578, 422 ) ); + } +} + +#[ test ] +fn assumption_choose_multiple_weighted() +{ + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + { + use deterministic_rand::seq::SliceRandom; + let rng = Hrng::master().rng_ref(); + let mut rng = rng.lock().unwrap(); + let got = ( 1..10 ) + .zip( ( 1..10 ).rev() ) + .into_iter() + .collect::< Vec< _ > >() + .choose_multiple_weighted( &mut *rng, 10, |w| w.0 ) + .unwrap() + .map( |( i, j )| ( *i, *j ) ) + .collect::< Vec< _ > >(); + assert_eq! + ( + got, + vec! + [ + ( 8, 2 ), + ( 7, 3 ), + ( 9, 1 ), + ( 5, 5 ), + ( 2, 8 ), + ( 3, 7 ), + ( 4, 6 ), + ( 6, 4 ), + ( 1, 9 ) + ] + ); + + let got = ( 1..10 ) + .zip( ( 1..10 ).rev() ) + .into_iter() + .collect::< Vec< _ > >() + .choose_multiple_weighted( &mut *rng, 10, |w| w.0 ) + .unwrap() + .map( |( i, j )| ( *i, *j ) ) + .collect::< Vec< _ > >(); + assert_eq! + ( + got, + vec! + [ + ( 5, 5 ), + ( 6, 4 ), + ( 8, 2 ), + ( 7, 3 ), + ( 2, 8 ), + ( 3, 7 ), + ( 9, 1 ), + ( 4, 6 ), + ( 1, 9 ) + ] + ); + } +} + +#[ cfg( feature = "determinism" ) ] +#[ test ] +fn assumption_streams_switching() +{ + use rand::{ RngCore, SeedableRng }; + use rand_chacha::ChaCha8Rng; + + let a = 6234031553773679537; + let b = 5421492469564588225; + + let mut master = ChaCha8Rng::seed_from_u64( 13 ); + master.set_stream( 0 ); + let got = master.next_u64(); + assert_eq!( got, a ); + master.set_stream( 1 ); + let _got = master.next_u64(); + master.set_stream( 0 ); + let got = master.next_u64(); + assert_eq!( got, b ); + + let mut master = ChaCha8Rng::seed_from_u64( 13 ); + master.set_stream( 0 ); + let got = master.next_u64(); + assert_eq!( got, a ); + master.set_stream( 0 ); + let _got = master.next_u64(); + master.set_stream( 0 ); + let got = master.next_u64(); + assert_eq!( got, b ); +} + +#[ cfg( feature = "determinism" ) ] +#[ test ] +fn assumption_streams_same_source() +{ + use rand::{ RngCore, SeedableRng }; + use rand_chacha::ChaCha8Rng; + + let a = 6234031553773679537; + let b = 2305422516838604614; + + let mut master = ChaCha8Rng::seed_from_u64( 13 ); + master.set_stream( 0 ); + let got = master.next_u64(); + assert_eq!( got, a ); + master.set_stream( 1 ); + let got = master.next_u64(); + assert_eq!( got, b ); + + let mut master = ChaCha8Rng::seed_from_u64( 13 ); + master.set_stream( 1 ); + let got = master.next_u64(); + assert_ne!( got, a ); + assert_ne!( got, b ); + master.set_stream( 0 ); + let got = master.next_u64(); + assert_ne!( got, a ); + assert_ne!( got, b ); +} diff --git a/module/move/deterministic_rand/tests/basic_test.rs b/module/move/deterministic_rand/tests/basic_test.rs new file mode 100644 index 0000000000..5ebfffd9f6 --- /dev/null +++ b/module/move/deterministic_rand/tests/basic_test.rs @@ -0,0 +1,147 @@ + +use rand::distributions::Uniform; +use rayon::prelude::*; + +#[test] +fn test_rng_manager() +{ + use deterministic_rand::{ Hrng, Rng }; + let range = Uniform::new( -1.0f64, 1.0 ); + + let hrng = Hrng::master(); + let got = ( 0..100 ) + .into_par_iter() + .map( |i| + { + let child = hrng.child( i ); + let rng_ref = child.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let mut count = 0; + for _ in 0..1000 + { + let a = rng.sample( &range ); + let b = rng.sample( &range ); + if a * a + b * b <= 1.0 + { + count += 1; + } + } + count + } ) + .sum::< u64 >(); + let _got_pi = 4. * ( got as f64 ) / ( ( 100 * 1000 ) as f64 ); + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + assert_eq!( _got_pi, 3.1438 ) +} + +#[ cfg( not( feature = "no_std" ) ) ] +#[ cfg( feature = "determinism" ) ] +#[test] +fn test_reusability() +{ + use deterministic_rand::{ Hrng, Rng }; + let mut expected: [u64; 4] = [0; 4]; + + let hrng = Hrng::master(); + { + let child1 = hrng.child( 0 ); + let child1_ref = child1.rng_ref(); + let mut rng1 = child1_ref.lock().unwrap(); + let got = rng1.gen::< u64 >(); + expected[0] = got; + let got = rng1.gen::< u64 >(); + expected[1] = got; + } + { + let child1 = hrng.child( 0 ); + let child1_ref = child1.rng_ref(); + let mut rng1 = child1_ref.lock().unwrap(); + let got = rng1.gen::< u64 >(); + expected[2] = got; + let got = rng1.gen::< u64 >(); + expected[3] = got; + } + #[ cfg( not( feature = "no_std" ) ) ] + #[ cfg( feature = "determinism" ) ] + assert_eq!( hrng._children_len(), 1 ); + #[ cfg( not( feature = "determinism" ) ) ] + assert_eq!( hrng._children_len(), 0 ); + + let hrng = Hrng::master(); + { + let child1 = hrng.child( 0 ); + let child1_ref = child1.rng_ref(); + let mut rng1 = child1_ref.lock().unwrap(); + let got = rng1.gen::< u64 >(); + assert_eq!( got, expected[0] ); + let got = rng1.gen::< u64 >(); + assert_eq!( got, expected[1] ); + } + { + let child1 = hrng.child( 0 ); + let child1_ref = child1.rng_ref(); + let mut rng1 = child1_ref.lock().unwrap(); + let got = rng1.gen::< u64 >(); + assert_eq!( got, expected[2] ); + let got = rng1.gen::< u64 >(); + assert_eq!( got, expected[3] ); + } + #[ cfg( feature = "determinism" ) ] + assert_eq!( hrng._children_len(), 1 ); + #[ cfg( not( feature = "determinism" ) ) ] + assert_eq!( hrng._children_len(), 0 ); +} + +#[ cfg( not( feature = "no_std" ) ) ] +#[ cfg( feature = "determinism" ) ] +#[test] +fn test_par() +{ + use std::sync::{ Arc, Mutex }; + use deterministic_rand::{ Hrng, Rng }; + let expected: ( Arc>, Arc> ) = + ( Arc::new( Mutex::new( ( 0, 0 ) ) ), Arc::new( Mutex::new( ( 0, 0 ) ) ) ); + + let hrng = Hrng::master(); + ( 1..=2 ) + .into_par_iter() + .map( |i| ( i, hrng.child( i ) ) ) + .for_each( |( i, child )| + { + let got1 = child.rng_ref().lock().unwrap().gen::< u64 >(); + let got2 = child.rng_ref().lock().unwrap().gen::< u64 >(); + match i { + 1 => *expected.0.lock().unwrap() = ( got1, got2 ), + 2 => *expected.1.lock().unwrap() = ( got1, got2 ), + _ => unreachable!(), + } + } ); + + let hrng = Hrng::master(); + ( 1..=2 ) + .into_par_iter() + .map( |i| ( i, hrng.child( i ) ) ) + .for_each( |( i, child )| + { + let got1 = child.rng_ref().lock().unwrap().gen::< u64 >(); + let got2 = child.rng_ref().lock().unwrap().gen::< u64 >(); + match i + { + 1 => assert_eq!( ( got1, got2 ), *expected.0.lock().unwrap() ), + 2 => assert_eq!( ( got1, got2 ), *expected.1.lock().unwrap() ), + _ => unreachable!(), + } + } ); +} + +#[ cfg( not( feature = "no_std" ) ) ] +#[ cfg( feature = "determinism" ) ] +#[test] +fn seed() +{ + use deterministic_rand::Seed; + let seed = Seed::random(); + println!( "{seed:?}" ); + assert!( seed.into_inner().len() == 16 ); +} diff --git a/module/move/deterministic_rand/tests/smoke_test.rs b/module/move/deterministic_rand/tests/smoke_test.rs new file mode 100644 index 0000000000..663dd6fb9f --- /dev/null +++ b/module/move/deterministic_rand/tests/smoke_test.rs @@ -0,0 +1,12 @@ + +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/graphs_tools/Cargo.toml b/module/move/graphs_tools/Cargo.toml new file mode 100644 index 0000000000..64e17ebbd0 --- /dev/null +++ b/module/move/graphs_tools/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "graphs_tools" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/graphs_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/graphs_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/graphs_tools" +description = """ +Graphs tools. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ + "enabled" +] +full = [ + "enabled", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [ "meta_tools/enabled", "iter_tools/enabled", "data_type/enabled", "strs_tools/enabled" ] + +[dependencies] +indexmap = "~1.8" +meta_tools = { workspace = true, features = [ "default" ] } +iter_tools = { workspace = true, features = [ "default" ] } +data_type = { workspace = true, features = [ "default" ] } +strs_tools = { workspace = true, features = [ "default" ] } +derive_tools = { workspace = true, features = [ "default" ] } +# type_constructor ={ workspace = true, features = [ "default" ] } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/move/graphs_tools/License b/module/move/graphs_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/graphs_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/graphs_tools/Readme.md b/module/move/graphs_tools/Readme.md new file mode 100644 index 0000000000..d65e2f6913 --- /dev/null +++ b/module/move/graphs_tools/Readme.md @@ -0,0 +1,39 @@ + + +# Module :: graphs_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/graphs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/graphs_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20graphs_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Graphs tools. + +### Basic use-case + + + +```rust +#[ cfg( all( feature = "cell_factory", feature = "use_std" ) ) ] +{ + use graphs_tools::prelude::*; + use wtools::prelude::*; + let node : graphs_tools::canonical::Node = from!( 13 ); + assert_eq!( node.id(), 13.into() ); + println!( "{:?}", node ); + /* print : node::13 */ +} +``` + +### To add to your project + +```bash +cargo add graphs_tools +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/graphs_tools_trivial +cargo run +``` diff --git a/module/move/graphs_tools/examples/graphs_tools_trivial.rs b/module/move/graphs_tools/examples/graphs_tools_trivial.rs new file mode 100644 index 0000000000..b985090463 --- /dev/null +++ b/module/move/graphs_tools/examples/graphs_tools_trivial.rs @@ -0,0 +1,11 @@ +//! qqq : write proper description +fn main() +{ + // xxx : fix me + // use graphs_tools::prelude::*; + // let node : graphs_tools::canonical::Node = from!( 13 ); + // assert_eq!( node.id(), 13.into() ); + // println!( "{:?}", node ); + /* print : node::13 */ +} + diff --git a/module/move/graphs_tools/src/abs/edge.rs b/module/move/graphs_tools/src/abs/edge.rs new file mode 100644 index 0000000000..62a67f83a8 --- /dev/null +++ b/module/move/graphs_tools/src/abs/edge.rs @@ -0,0 +1,65 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + use core::fmt; + use core::hash::Hash; + + /// + /// Kind of a edge. + /// + + pub trait EdgeKindInterface + where + Self : + 'static + + Copy + + fmt::Debug + + PartialEq + + Hash + + Default + + , + { + } + + impl< T > EdgeKindInterface for T + where + T : + 'static + + Copy + + fmt::Debug + + PartialEq + + Hash + + Default + + , + { + } + + /// + /// No kind for edges. + /// + + #[ derive( Debug, PartialEq, Eq, Copy, Clone, Hash, Default ) ] + pub struct EdgeKindless(); + + /// + /// Edge of a graph. + /// + + pub trait EdgeBasicInterface + where + Self : + HasId + + { + } +} + +// + +crate::mod_interface! +{ + exposed use EdgeKindless; + prelude use EdgeKindInterface; + prelude use EdgeBasicInterface; +} + diff --git a/module/move/graphs_tools/src/abs/factory.rs b/module/move/graphs_tools/src/abs/factory.rs new file mode 100644 index 0000000000..5da1f1b90d --- /dev/null +++ b/module/move/graphs_tools/src/abs/factory.rs @@ -0,0 +1,444 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use core::ops::Deref; + + macro_rules! NODE_ID + { + () => { < < Self as GraphNodesNominalInterface >::NodeHandle as HasId >::Id }; + } + + macro_rules! EDGE_ID + { + () => { < < Self as GraphEdgesNominalInterface >::EdgeHandle as HasId >::Id }; + } + + /// + /// Graph which know how to iterate neighbourhood of a node and capable to convert id of a node into a node. + /// + + pub trait GraphNodesNominalInterface + { + + /// Handle of a node - entity representing a node or the node itself. + /// It's not always possible to operate a node directly, for example it it has to be wrapped by cell ref. For that use NodeHandle. + /// Otherwise NodeHandle could be &Node. + type NodeHandle : NodeBasicInterface; + + // /// Convert argument into node id. + // #[ allow( non_snake_case ) ] + // #[ inline ] + // fn NodeId< Id >( id : Id ) -> NODE_ID!() + // where + // Id : Into< NODE_ID!() > + // { + // id.into() + // } + + /// Convert argument into node id. + #[ inline ] + fn node_id< Id >( &self, id : Id ) -> NODE_ID!() + where + Id : Into< NODE_ID!() > + { + id.into() + } + + /// Get node with id. + fn node< Id >( &self, id : Id ) -> &Self::NodeHandle + where + Id : Into< NODE_ID!() > + ; + + // type NodeId; + // // type OutNodesIdsIterator : Iterator< Item = ( &'it < Graph::NodeHandle as HasId >::Id, &'it Graph::NodeHandle ) >; + // type OutNodesIdsIterator : Iterator< Item = Self::NodeId >; + // /// Iterate over all nodes. + // fn out_nodes_ids< Id >( &self, node_id : Id ) -> Self::OutNodesIdsIterator + // where + // Id : Into< NODE_ID!() > + // ; + + // type NodeId; + // type OutNodesIdsIterator : Iterator< Item = Self::NodeId >; + // /// Iterate over all nodes. + // fn out_nodes_ids_2< Id >( &self, node_id : Id ) -> Self::OutNodesIdsIterator + // where + // Id : Into< NODE_ID!() > + // ; + + /// Iterate over neighbourhood of the node. Callback gets ids of nodes in neighbourhood of a picked node. + fn out_nodes_ids< 'a, 'b, Id >( &'a self, node_id : Id ) + -> + Box< dyn Iterator< Item = NODE_ID!() > + 'b > + where + Id : Into< NODE_ID!() >, + 'a : 'b, + ; + + /// Iterate over neighbourhood of the node. Callback gets ids and reference on itself of nodes in neighbourhood of a picked node. + fn out_nodes< 'a, 'b, Id >( &'a self, node_id : Id ) + -> + Box< dyn Iterator< Item = ( NODE_ID!(), &< Self as GraphNodesNominalInterface >::NodeHandle ) > + 'b > + where + Id : Into< NODE_ID!() >, + 'a : 'b, + { + Box::new( self.out_nodes_ids( node_id ).map( | id | + { + ( id, self.node( id ) ) + })) + } + + } + +// /// +// /// Graph which know how to iterate neighbourhood of a node and capable to convert id of a node into a node. +// /// +// +// pub trait GraphNodesNominalInterface2< T > +// where +// Self : Deref< Target = T >, +// T : GraphNodesNominalInterface, +// { +// +// /// Iterator to iterate ids of nodes. +// type OutNodesIdsIterator : Iterator< Item = < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id >; +// /// Iterate over all nodes. +// fn out_nodes_ids_2< Id >( self, node_id : Id ) -> Self::OutNodesIdsIterator +// where +// Id : Into< < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id > +// ; +// +// /// Reference on a node handle. +// type RefNode; +// /// Iterator to iterate pairs id - node +// type OutNodesIterator : Iterator< Item = ( < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id, Self::RefNode ) >; +// +// // /// Iterate over neighbourhood of the node. Callback gets ids and reference on itself of nodes in neighbourhood of a picked node. +// // fn out_nodes_2< Id >( self, node_id : Id ) +// // -> +// // Self::OutNodesIdsIterator +// // where +// // Self : Sized, +// // Id : Into< < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id > +// // ; +// +// } + + /// + /// Graph which know how to iterate neighbourhood of a node and capable to convert id of a node into a node. + /// + + pub trait GraphEdgesNominalInterface + where + Self : GraphNodesNominalInterface, + { + + /// Handle of an edge - entity representing an edge or the edge itself. + /// It's not always possible to operate an edge directly, for example it it has to be wrapped by cell ref. For that use NodeHandle. + /// Otherwise EdgeHandle could be &Node. + type EdgeHandle : EdgeBasicInterface; + + // /// Convert argument into edge id. + // #[ allow( non_snake_case ) ] + // #[ inline ] + // fn EdgeId< Id >( id : Id ) -> EDGE_ID!() + // where + // Id : Into< EDGE_ID!() > + // { + // id.into() + // } + + /// Convert argument into edge id. + #[ inline ] + fn edge_id< Id >( &self, id : Id ) -> EDGE_ID!() + where + Id : Into< EDGE_ID!() > + { + id.into() + // Self::EdgeId( id ) + } + + /// Get edge with id. + fn edge< Id >( &self, id : Id ) -> &Self::EdgeHandle + where + Id : Into< EDGE_ID!() > + ; + + /// Iterate over output edges of the node. Callback gets ids of nodes in neighbourhood of a picked node. + fn out_edges_ids< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = EDGE_ID!() > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + ; + + /// Iterate over output edges of the node. Callback gets ids and references of edges in neighbourhood of a picked node. + fn out_edges< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = ( EDGE_ID!(), &< Self as GraphEdgesNominalInterface >::EdgeHandle ) > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + { + Box::new( self.out_edges_ids( node_id ).map( | id | + { + ( id, self.edge( id ) ) + })) + } + + } + +// /// Into iterator of nodes. +// +// pub trait IntoIteratorOfNodes +// { +// type NodesIteratorItem; +// type NodesIterator : Iterator< Item = Self::NodesIteratorItem >; +// // /// Iterate over all nodes. +// // fn nodes( self ) -> Self::NodesIterator; +// } +// +// // +// +// impl< 'it, Graph > IntoIteratorOfNodes +// for &'it Graph +// where +// Graph : GraphNodesNominalInterface, +// { +// type NodesIteratorItem = ( &'it < Graph::NodeHandle as HasId >::Id, &'it Graph::NodeHandle ); +// type NodesIterator = std::collections::hash_map::Iter< 'it, < Graph::NodeHandle as HasId >::Id, Graph::NodeHandle >; +// // fn nodes( self ) -> Self::NodesIterator +// // { +// // self.map.iter() +// // } +// } + + /// + /// Graph nodes of which is possible to enumerate. + /// + + // pub trait GraphNodesEnumerableInterface< 'it, 'it2, It > + pub trait GraphNodesEnumerableInterface + where + Self : GraphNodesNominalInterface, + // It : Iterator< Item = &'it2 ( NODE_ID!(), &'it < Self as GraphNodesNominalInterface >::NodeHandle ) >, + // < Self as GraphNodesNominalInterface >::NodeHandle : 'it, + // 'it : 'it2, + { + + // type NodesIteratorItem; + // // type NodesIterator : Iterator< Item = ( &'it < Graph::NodeHandle as HasId >::Id, &'it Graph::NodeHandle ) >; + // type NodesIterator : Iterator< Item = Self::NodesIteratorItem >; + // /// Iterate over all nodes. + // fn nodes( self ) -> Self::NodesIterator; + + /// Iterate over all nodes. + fn nodes< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( NODE_ID!(), &< Self as GraphNodesNominalInterface >::NodeHandle ) > + 'b > + where + 'a : 'b, + ; + + /// Number of nodes. Order of the graph. + fn nnodes( &self ) -> usize + { + self.nodes().count() + } + + } + + /// + /// Graph edges of which is possible to enumerate. + /// + + pub trait GraphEdgesEnumerableInterface + where + Self : + GraphNodesNominalInterface + + GraphEdgesNominalInterface + + , + { + + /// Iterate over all edges. + fn edges< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( EDGE_ID!(), &< Self as GraphEdgesNominalInterface >::EdgeHandle ) > + 'b > + where + 'a : 'b, + ; + + /// Number of edges. Size of the graph. + fn nedges( &self ) -> usize + { + self.edges().count() + } + + } + + /// + /// Graph interface which allow to add more nodes. Know nothing about edges. + /// + + pub trait GraphNodesExtendableInterface + where + Self : + GraphNodesNominalInterface + + , + { + + /// Get node with id mutably. + fn node_mut< Id >( &mut self, id : Id ) -> &mut Self::NodeHandle + where + Id : Into< NODE_ID!() > + ; + + /// Add out nodes to the node. + fn node_add_out_nodes< IntoId1, IntoId2, Iter > + ( + &mut self, + node_id : IntoId1, + out_nodes_iter : Iter, + ) + where + IntoId1 : Into< NODE_ID!() >, + IntoId2 : Into< NODE_ID!() >, + Iter : IntoIterator< Item = IntoId2 >, + Iter::IntoIter : Clone, + ; + + /// Add out edges to the node. + fn node_add_out_node< IntoId1, IntoId2 > + ( + &mut self, + node_id : IntoId1, + out_node_id : IntoId2, + ) + where + IntoId1 : Into< NODE_ID!() >, + IntoId1 : Clone, + IntoId2 : Into< NODE_ID!() >, + IntoId2 : Clone, + { + self.node_add_out_nodes( node_id, core::iter::once( out_node_id ) ); + } + + /// Either make new or get existing node. + fn node_making< Id >( &mut self, id : Id ) -> NODE_ID!() + where + Id : Into< NODE_ID!() > + ; + + /// Make edges. + fn make_with_edge_list< IntoIter, Id >( &mut self, into_iter : IntoIter ) + where + Id : Into< NODE_ID!() >, + IntoIter : IntoIterator< Item = Id >, + IntoIter::IntoIter : core::iter::ExactSizeIterator< Item = Id >, + { + // use wtools::iter::prelude::*; + use crate::iter::prelude::*; + let iter = into_iter.into_iter(); + debug_assert_eq!( iter.len() % 2, 0 ); + for mut chunk in &iter.chunks( 2 ) + { + let id1 = chunk.next().unwrap().into(); + let id2 = chunk.next().unwrap().into(); + self.node_making( id1 ); + self.node_making( id2 ); + self.node_add_out_node( id1, id2 ); + } + + } + + } + + /// + /// Graph interface which allow to add more edges. + /// + + pub trait GraphEdgesExtendableInterface + where + Self : + GraphNodesNominalInterface + + GraphEdgesNominalInterface + + GraphNodesExtendableInterface + + , + { + + // /// Either make new or get existing edge for specified nodes. + // fn _edge_id_generate( &mut self, node1 : NODE_ID!(), node2 : NODE_ID!() ) -> EDGE_ID!(); + + /// Either make new or get existing edge for specified nodes. + fn _edge_add( &mut self, node1 : NODE_ID!(), node2 : NODE_ID!() ) -> EDGE_ID!(); + + /// Either make new or get existing edge for specified nodes. + #[ inline ] + fn _edge_make_for_nodes< IntoNodeId1, IntoNodeId2 >( &mut self, node1 : IntoNodeId1, node2 : IntoNodeId2 ) -> EDGE_ID!() + where + IntoNodeId1 : Into< NODE_ID!() >, + IntoNodeId2 : Into< NODE_ID!() >, + { + let node1 = node1.into(); + let node2 = node2.into(); + // let edge = self._edge_id_generate( node1, node2 ); + let edge = self._edge_add( node1, node2 ); + edge + } + + } + +// /// +// /// Graph nodes of which has a kind. +// /// +// +// pub trait GraphNodesKindGetterInterface +// where +// Self : GraphNodesNominalInterface, +// { +// /// Enumerate kinds of the node. +// type NodeKind : crate::NodeKindInterface; +// /// Get kind of the node. +// fn node_kind( &self, node_id : NODE_ID!() ) -> Self::NodeKind; +// } +// +// /// +// /// Graph nodes of which has a kind. +// /// +// +// pub trait GraphEdgesKindGetterInterface +// where +// Self : +// GraphNodesNominalInterface + +// GraphEdgesNominalInterface + +// , +// { +// /// Enumerate kinds of the node. +// type EdgeKind : crate::EdgeKindInterface; +// /// Get kind of the node. +// fn edge_kind( &self, edge_id : EDGE_ID!() ) -> Self::EdgeKind; +// } + +} + +// + +crate::mod_interface! +{ + prelude use super::private:: + { + GraphNodesNominalInterface, + // GraphNodesNominalInterface2, + GraphEdgesNominalInterface, + GraphNodesEnumerableInterface, + GraphEdgesEnumerableInterface, + GraphNodesExtendableInterface, + GraphEdgesExtendableInterface, + // GraphNodesKindGetterInterface, + // GraphEdgesKindGetterInterface, + }; +} diff --git a/module/move/graphs_tools/src/abs/id_generator.rs b/module/move/graphs_tools/src/abs/id_generator.rs new file mode 100644 index 0000000000..28b1be7fc2 --- /dev/null +++ b/module/move/graphs_tools/src/abs/id_generator.rs @@ -0,0 +1,52 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::prelude::*; + // use core::fmt; + // use core::hash::Hash; + // use core::cmp::{ PartialEq, Eq }; + use crate::IdentityInterface; + + /// Has ID generator. + + pub trait HasIdGenerator< Id > + where + Id : IdentityInterface, + { + /// Associated id generator. + type Generator : IdGeneratorTrait< Id >; + } + + /// Interface to generate ids. + + pub trait IdGeneratorTrait< Id > + where + Id : IdentityInterface, + Self : Default, + { + /// Generate a new id. + fn id_next( &mut self ) -> Id; + /// Check is id valid. + fn is_id_valid( &self, src : Id ) -> bool; + } + + // impl< T, G > HasIdGenerator< T > for T + // where + // G : IdGeneratorTrait< T >, + // { + // type Generator = G; + // } + +} + +// + +crate::mod_interface! +{ + prelude use super::private:: + { + HasIdGenerator, + IdGeneratorTrait, + // IdGeneratorInt, + }; +} diff --git a/module/move/graphs_tools/src/abs/identity.rs b/module/move/graphs_tools/src/abs/identity.rs new file mode 100644 index 0000000000..806096847e --- /dev/null +++ b/module/move/graphs_tools/src/abs/identity.rs @@ -0,0 +1,104 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::prelude::*; + use core::fmt; + use core::hash::Hash; + use core::cmp::{ PartialEq, Eq }; + + /// + /// Interface to identify an instance of somthing, for exampel a node. + /// + + pub trait IdentityInterface + where + Self : + 'static + + Copy + + Hash + + fmt::Debug + + PartialEq + + Eq + , + { + } + + impl< T > IdentityInterface for T + where + T : + 'static + + Copy + + Hash + + fmt::Debug + + PartialEq + + Eq + , + { + } +// +// /// +// /// Interface to identify an instance of somthing with ability to increase it to generate a new one. +// /// +// +// pub trait IdentityGenerableInterface +// where +// // Self : Default, +// // Self : IdentityInterface + Default, +// { +// /// Generate a new identity based on the current increasing it. +// fn next( &self ) -> Self; +// /// Generate the first identity. +// fn first() -> Self +// { +// Default::default() +// } +// /// Check is the identity valid. +// fn is_valid( &self ) -> bool; +// } + + /// + /// Interface to identify an instance of something with ability to increase it to generate a new one. + /// + + pub trait IdentityGeneratorInterface< Id > + where + Id : IdentityInterface + Default, + // Self : Default, + // Self : IdentityInterface + Default, + { + /// Generate a new identity based on the current increasing it. + fn next( &mut self ) -> Id; + /// Generate the first identity. + fn first( &mut self ) -> Id + { + Default::default() + } + /// Check is the identity valid. + fn id_is_valid( &self, id : Id ) -> bool; + } + + /// + /// Instance has an id. + /// + + pub trait HasId + { + /// Id of the node. + type Id : IdentityInterface; + /// Get id. + fn id( &self ) -> Self::Id; + } + +} + +// + +crate::mod_interface! +{ + prelude use super::private:: + { + IdentityInterface, + IdentityGeneratorInterface, + HasId, + }; +} diff --git a/module/move/graphs_tools/src/abs/mod.rs b/module/move/graphs_tools/src/abs/mod.rs new file mode 100644 index 0000000000..6037ef807f --- /dev/null +++ b/module/move/graphs_tools/src/abs/mod.rs @@ -0,0 +1,17 @@ +crate::mod_interface! +{ + /// Edge interface. + layer edge; + /// Factory of nodes. + layer factory; + // /// Interface of a graph. + // layer graph; + /// Simple ID generator. + layer id_generator; + /// Interface to identify an instance of somthging, for exampel a node. + layer identity; + /// Node interface. + layer node; + // /// Node in a ref counted cell. + // layer node_cell; +} diff --git a/module/move/graphs_tools/src/abs/node.rs b/module/move/graphs_tools/src/abs/node.rs new file mode 100644 index 0000000000..5ab8d56937 --- /dev/null +++ b/module/move/graphs_tools/src/abs/node.rs @@ -0,0 +1,72 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use core::fmt; + // use core::hash::Hash; + +// /// +// /// Kind of a node. +// /// +// +// pub trait NodeKindInterface +// where +// Self : +// 'static + +// Copy + +// fmt::Debug + +// PartialEq + +// // Eq + +// // xxx +// Hash + +// Default + +// , +// { +// } +// +// impl< T > NodeKindInterface for T +// where +// T : +// 'static + +// Copy + +// fmt::Debug + +// PartialEq + +// // Eq + +// Hash + +// Default + +// , +// { +// } + +// /// +// /// No kind for nodes. +// /// +// +// #[ derive( Debug, PartialEq, Eq, Copy, Clone, Hash, Default ) ] +// pub struct NodeKindless(); + + /// + /// Node of a graph. + /// + + pub trait NodeBasicInterface + where + Self : + HasId + + { + } + +} + +// + +crate::mod_interface! +{ + + // exposed use NodeKindless; + prelude use super::private:: + { + // NodeKindInterface, + NodeBasicInterface, + }; +} diff --git a/module/move/graphs_tools/src/algo/dfs.rs b/module/move/graphs_tools/src/algo/dfs.rs new file mode 100644 index 0000000000..d87d69a095 --- /dev/null +++ b/module/move/graphs_tools/src/algo/dfs.rs @@ -0,0 +1,29 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use core::fmt::Debug; + // use core::iter::Iterator; + + /// + /// Implementation of depth-first search algorithm. + /// + + pub trait DfsAlgorithm + where + Self : NodeBasicInterface, + { + // fn dfs( roots : Iterator< IdInterface > ) + // { + // + // } + } + +} + +// + +crate::mod_interface! +{ + prelude use DfsAlgorithm; +} diff --git a/module/move/graphs_tools/src/algo/mod.rs b/module/move/graphs_tools/src/algo/mod.rs new file mode 100644 index 0000000000..9c423ccbce --- /dev/null +++ b/module/move/graphs_tools/src/algo/mod.rs @@ -0,0 +1,5 @@ +crate::mod_interface! +{ + /// Depth-first search. + layer dfs; +} diff --git a/module/move/graphs_tools/src/canonical/edge.rs b/module/move/graphs_tools/src/canonical/edge.rs new file mode 100644 index 0000000000..36aec4b15c --- /dev/null +++ b/module/move/graphs_tools/src/canonical/edge.rs @@ -0,0 +1,84 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + + // macro_rules! NODE_ID + // { + // () => { < Node as HasId >::Id }; + // } + + /// + /// Canonical implementation of edge. + /// + + #[ derive( Debug, Copy, Clone ) ] + pub struct Edge< EdgeId = crate::IdentityWithInt, NodeId = crate::IdentityWithInt > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + { + /// Input node. + pub in_node : NodeId, + /// Output node. + pub out_node : NodeId, + // /// Kind of the edge. + // pub kind : Kind, + /// Identifier. + pub id : EdgeId, + } + + // + + impl< EdgeId, NodeId > HasId + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + + { + type Id = EdgeId; + fn id( &self ) -> Self::Id + { + self.id + } + } + + // + + impl< EdgeId, NodeId > EdgeBasicInterface + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + { + } + + // + + impl< EdgeId, NodeId > PartialEq + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + { + fn eq( &self, other : &Self ) -> bool + { + self.id() == other.id() + } + } + + impl< EdgeId, NodeId > Eq + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + {} +} + +// + +crate::mod_interface! +{ + orphan use super::private::Edge; +} diff --git a/module/move/graphs_tools/src/canonical/factory_generative.rs b/module/move/graphs_tools/src/canonical/factory_generative.rs new file mode 100644 index 0000000000..41b35a9549 --- /dev/null +++ b/module/move/graphs_tools/src/canonical/factory_generative.rs @@ -0,0 +1,202 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use crate::canonical::*; + use crate::canonical; + use crate::meta::*; + // use wtools::prelude::*; + use core::fmt; + use indexmap::IndexMap; + use std::default::Default; + // use core::ops::Deref; + + include!( "./factory_impl.rs" ); + + /// + /// Generative node factory. + /// + + #[ derive( Default ) ] + pub struct GenerativeNodeFactory< NodeId = crate::IdentityWithInt, EdgeId = crate::IdentityWithInt > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + GenerativeNodeFactory< NodeId, EdgeId > : crate::GraphNodesNominalInterface, + { + /// Map id to node. + pub id_to_node_map : IndexMap< NodeId, crate::canonical::Node< NodeId, EdgeId > >, + /// Map id to edge. + pub id_to_edge_map : IndexMap< EdgeId, crate::canonical::Edge< EdgeId, NodeId > >, + /// Generator of node ids. + pub _node_id_generator : NodeId::Generator, + /// Generator of edge ids. + pub _edge_id_generator : EdgeId::Generator, + } + + // xxx : ? + + impl< NodeId, EdgeId > + AsRef< GenerativeNodeFactory< NodeId, EdgeId > > + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + { + fn as_ref( &self ) -> &Self + { + self + } + } + + // + + impl< NodeId, EdgeId > GraphNodesNominalInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + { + type NodeHandle = crate::canonical::Node< NodeId, EdgeId >; + index! + { + node, + out_nodes_ids, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesNominalInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + + { + type EdgeHandle = crate::canonical::Edge< EdgeId, NodeId >; + index! + { + edge, + out_edges_ids, + } + } + + // + + impl< NodeId, EdgeId > GraphNodesEnumerableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + + { + index! + { + nodes, + nnodes, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesEnumerableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + + { + index! + { + edges, + nedges, + } + } + + // + + impl< NodeId, EdgeId > GraphNodesExtendableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + + { + + index! + { + node_mut, + node_add_out_nodes, + node_making, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesExtendableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + + { + + index! + { + // _edge_id_generate, + _edge_add, + } + + } + + // + + impl< NodeId, EdgeId > fmt::Debug + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + { + index!( fmt ); + } + + // + + // impl< NodeId, EdgeId > From_0 + // for GenerativeNodeFactory< NodeId, EdgeId > + // where + // NodeId : IdentityInterface + HasIdGenerator< NodeId >, + // EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + // { + // index! + // { + // // from_0, + // } + // fn from_0() -> Self + // { + // let id_to_node_map = IndexMap::new(); + // let id_to_edge_map = IndexMap::new(); + // let _node_id_generator = Default::default(); + // let _edge_id_generator = Default::default(); + // Self + // { + // id_to_node_map, + // id_to_edge_map, + // _node_id_generator, + // _edge_id_generator, + // } + // } + // } + +} + +// + +crate::mod_interface! +{ + orphan use GenerativeNodeFactory; +} diff --git a/module/move/graphs_tools/src/canonical/factory_impl.rs b/module/move/graphs_tools/src/canonical/factory_impl.rs new file mode 100644 index 0000000000..d54e5b6f71 --- /dev/null +++ b/module/move/graphs_tools/src/canonical/factory_impl.rs @@ -0,0 +1,267 @@ +use crate::string; + +macro_rules! NODE_ID +{ + () => { < < Self as GraphNodesNominalInterface >::NodeHandle as HasId >::Id }; +} + +macro_rules! EDGE_ID +{ + () => { < < Self as GraphEdgesNominalInterface >::EdgeHandle as HasId >::Id }; +} + +impls3! +{ + + // + + fn node< IntoId >( &self, id : IntoId ) -> &Self::NodeHandle + where + IntoId : Into< NODE_ID!() >, + { + let id = id.into(); + let got = self.id_to_node_map.get( &id ); + if got.is_some() + { + let result : &Self::NodeHandle = got.unwrap(); + return result; + } + unreachable!( "No node with id {:?} found", id ); + } + + // + + fn nodes< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( NODE_ID!(), &< Self as GraphNodesNominalInterface >::NodeHandle ) > + 'b > + // core::slice::Iter< 'a, ( NODE_ID!(), &'b < Self as GraphNodesNominalInterface >::NodeHandle ) > + where + 'a : 'b, + { + Box::new( self.id_to_node_map.iter().map( | el | ( *el.0, el.1) ) ) + } + + // + + fn nnodes( &self ) -> usize + { + self.id_to_node_map.len() + } + + // + + fn edge< IntoId >( &self, id : IntoId ) -> &Self::EdgeHandle + where + IntoId : Into< EDGE_ID!() >, + { + let id = id.into(); + let got = self.id_to_edge_map.get( &id ); + if got.is_some() + { + let result : &Self::EdgeHandle = got.unwrap(); + return result; + } + unreachable!( "No edge with id {:?} found", id ); + } + + // + + fn edges< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( EDGE_ID!(), &Self::EdgeHandle ) > + 'b > + where + 'a : 'b, + { + Box::new( self.id_to_edge_map.iter().map( | el | ( *el.0, el.1) ) ) + } + + // + + fn nedges( &self ) -> usize + { + self.id_to_edge_map.len() + } + + // + + ? fn node_mut< IntoId >( &mut self, id : IntoId ) -> &mut Self::NodeHandle + where + IntoId : Into< NODE_ID!() > + { + let id = id.into(); + let got = self.id_to_node_map.get_mut( &id ); + if got.is_some() + { + let result : &mut Self::NodeHandle = got.unwrap(); + return result; + } + unreachable!( "No node with id {:?} found", id ); + } + + // + + ? fn node_making< IntoId >( &mut self, id : IntoId ) -> NODE_ID!() + where + IntoId : Into< NODE_ID!() >, + { + let id = id.into(); + + let result = self.id_to_node_map + .entry( id ) + .or_insert_with( || canonical::Node::_make_with_id( id ).into() ) + // .or_insert_with( || canonical::Node::make_with_id( id ).into() ) + ; + result.id() + } + + // + + // fn _edge_id_generate( &mut self, _in_node : NODE_ID!(), _out_node : NODE_ID!() ) -> EDGE_ID!() + // { + // while self.id_to_edge_map.contains_key( &self._current_edge_id ) + // { + // self._current_edge_id = self._current_edge_id.next(); + // assert!( self._current_edge_id.is_valid(), "Not more space for ids" ); + // } + // self._current_edge_id + // } + + // + + fn _edge_add( &mut self, in_node : NODE_ID!(), out_node : NODE_ID!() ) -> EDGE_ID!() + { + let edge_id = self._edge_id_generator.id_next(); + + self.id_to_edge_map + .entry( edge_id ) + .and_modify( | _ | { panic!( "Edge {:?} already exists", edge_id ) } ) + .or_insert_with( || + { + canonical::Edge + { + id : edge_id, + in_node, + out_node, + // kind : Default::default(), + } + }); + + edge_id + } + + // + + // fn from_0() -> Self + // { + // let id_to_node_map = IndexMap::new(); + // let id_to_edge_map = IndexMap::new(); + // let _node_id_generator = Default::default(); + // let _edge_id_generator = Default::default(); + // // let _current_edge_id = EdgeId::first(); + // Self + // { + // id_to_node_map, + // id_to_edge_map, + // _node_id_generator, + // _edge_id_generator, + // // ..default() + // // _current_edge_id, + // // _p : core::marker::PhantomData, + // } + // } + + // + + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "GenerativeNodeFactory\n" ) )?; + let mut first = true; + for ( _id, node ) in self.nodes() + { + if !first + { + f.write_str( "\n" )?; + } + first = false; + f.write_str( &string::indentation( " ", format!( "{:?}", node ), "" ) )?; + } + f.write_str( "" ) + } + + ? + + /// + /// Iterate output nodes of the node. + /// + + fn node_add_out_nodes< IntoId1, IntoId2, Iter > + ( + &mut self, + in_node_id : IntoId1, + out_nodes_iter : Iter, + ) + where + IntoId1 : Into< NODE_ID!() >, + IntoId2 : Into< NODE_ID!() >, + Iter : IntoIterator< Item = IntoId2 >, + Iter::IntoIter : Clone, + { + + let in_node_id = in_node_id.into(); + let iter = out_nodes_iter.into_iter(); + + let out_ids : Vec< _ > = iter + .map( | out_node_id | + { + let out_node_id = out_node_id.into(); + #[ cfg( debug_assertions ) ] + let _ = self.node( out_node_id ); + let out_edge_id = self._edge_make_for_nodes( in_node_id, out_node_id ); + ( out_edge_id, out_node_id ) + }) + .collect() + ; + + let in_node = self.node_mut( in_node_id ); + + for out_id in out_ids + { + in_node.out_edges.insert( out_id.0 ); + in_node.out_nodes.insert( out_id.1 ); + } + + } + + // + + fn out_nodes_ids< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = NODE_ID!() > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + { + let node = self.node( node_id ); + let iterator + : Box< dyn Iterator< Item = NODE_ID!() > > + = Box::new( node.out_nodes.iter().cloned() ); + iterator + } + + // + + fn out_edges_ids< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = EDGE_ID!() > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + { + let node = self.node( node_id ); + let iterator + : Box< dyn Iterator< Item = EDGE_ID!() > > + = Box::new( node.out_edges.iter().cloned() ); + iterator + } + +} diff --git a/module/move/graphs_tools/src/canonical/factory_readable.rs b/module/move/graphs_tools/src/canonical/factory_readable.rs new file mode 100644 index 0000000000..83d9535a2e --- /dev/null +++ b/module/move/graphs_tools/src/canonical/factory_readable.rs @@ -0,0 +1,185 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use crate::canonical::*; + // use crate::canonical; + // use wtools::prelude::*; + use core::fmt; + use indexmap::IndexMap; + // use std::default::Default; + // use core::ops::Deref; + use crate::meta::*; + + include!( "./factory_impl.rs" ); + + /// + /// Radable node factory. + /// + + #[ derive( Default ) ] + pub struct ReadableNodeFactory< NodeId = crate::IdentityWithInt, EdgeId = crate::IdentityWithInt > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + ReadableNodeFactory< NodeId, EdgeId > : crate::GraphNodesNominalInterface, + { + /// Map id to node. + pub id_to_node_map : IndexMap< NodeId, crate::canonical::Node< NodeId, EdgeId > >, + /// Map id to edge. + pub id_to_edge_map : IndexMap< EdgeId, crate::canonical::Edge< EdgeId, NodeId > >, + } + + // + + impl< NodeId, EdgeId > GraphNodesNominalInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + type NodeHandle = crate::canonical::Node< NodeId, EdgeId >; + index! + { + node, + out_nodes_ids, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesNominalInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + + { + type EdgeHandle = crate::canonical::Edge< EdgeId, NodeId >; + index! + { + edge, + out_edges_ids, + } + } + + // + + impl< NodeId, EdgeId > GraphNodesEnumerableInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + index! + { + nodes, + nnodes, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesEnumerableInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + + { + index! + { + edges, + nedges, + } + } + + // + +// impl< NodeId, EdgeId > GraphNodesNominalInterface +// for ReadableNodeFactory< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// { +// } +// +// // +// +// impl< NodeId, EdgeId > GraphNodesNominalInterface +// for GenerativeNodeFactory< NodeId, EdgeId > +// where +// NodeId : IdentityInterface + HasIdGenerator< NodeId >, +// EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, +// { +// } + + // + + impl< NodeId, EdgeId > fmt::Debug + for ReadableNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + index!( fmt ); + } + + // + +// impl< NodeId, EdgeId > Default +// for ReadableNodeFactory< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// { +// +// fn default() -> Self +// { +// let id_to_node_map = IndexMap::new(); +// let id_to_edge_map = IndexMap::new(); +// Self +// { +// id_to_node_map, +// id_to_edge_map, +// } +// } +// +// } + +// impl< NodeId, EdgeId > From_0 +// for ReadableNodeFactory< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// { +// +// index! +// { +// // from_0, +// } +// +// fn from_0() -> Self +// { +// let id_to_node_map = IndexMap::new(); +// let id_to_edge_map = IndexMap::new(); +// Self +// { +// id_to_node_map, +// id_to_edge_map, +// } +// } +// +// } + +} + +// + +crate::mod_interface! +{ + orphan use ReadableNodeFactory; +} diff --git a/module/move/graphs_tools/src/canonical/identity.rs b/module/move/graphs_tools/src/canonical/identity.rs new file mode 100644 index 0000000000..d95c774912 --- /dev/null +++ b/module/move/graphs_tools/src/canonical/identity.rs @@ -0,0 +1,202 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + use core::fmt; + use core::hash::Hash; + use core::cmp::{ PartialEq, Eq }; + #[ allow( unused_imports ) ] + use crate::dt::prelude::*; + + // types! + // { + // /// Identify an instance by name. + // #[ derive( PartialEq, Eq, Copy, Clone, Hash, Default, Debug ) ] + // pub single IdentityWithPointer : usize; + // } + + /// + /// Identify an instance by its location in memory. + /// + + #[ derive( Debug, PartialEq, Eq, Copy, Clone, Hash, Default ) ] + pub struct IdentityWithPointer( usize ); + + impl IdentityWithPointer + { + + /// Construct from an arbitrary reference. + #[ inline ] + pub fn make< T >( src : &T ) -> Self + { + // Safety : it differentiate different instances. + let ptr = unsafe + { + core::mem::transmute::< _, usize >( src ) + }; + Self( ptr ) + } + + } + + impl< 'a, T > From< &'a T > for IdentityWithPointer + { + fn from( src : &'a T ) -> Self + { + let ptr = unsafe + { + core::mem::transmute::< _, usize >( src ) + }; + Self( ptr ) + } + } + + // + + // zzz : implement IdentityGenerableInterface for other identities. make it working + // zzz : use type constructors + + // types! + // { + // /// Identify an instance by name. + // #[ derive( PartialEq, Eq, Copy, Clone, Hash, Default ) ] + // pub single IdentityWithName : &'static str; + // } + + /// + /// Identify an instance by name. + /// + + #[ derive( PartialEq, Eq, Copy, Clone, Hash ) ] + pub struct IdentityWithName( pub &'static str ) + ; + + impl IdentityWithName + { + + /// Construct from an arbitrary reference. + #[ inline ] + pub fn make( val : &'static str ) -> Self + { + Self( val ) + } + + } + + impl From< &'static str > for IdentityWithName + { + fn from( src : &'static str ) -> Self + { + Self( src ) + } + } + + impl< Src > From< &Src > for IdentityWithName + where + Src : Clone, + IdentityWithName : From< Src >, + { + fn from( src : &Src ) -> Self + { + From::< Src >::from( src.clone() ) + } + } + + impl fmt::Debug for IdentityWithName + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "{}", self.0 ) ) + } + } + + // + // = + // + + // type_constructor::types! + // { + // /// Identify an instance by integer. + // #[ derive( PartialEq, Eq, Copy, Clone, Hash ) ] + // pub single IdentityWithInt : isize; + // } + + + /// Identify an instance by integer. + #[ derive( PartialEq, Eq, Copy, Clone, Hash, derive_tools::From, derive_tools::Deref ) ] + pub struct IdentityWithInt( isize ); + + /// + /// Interface to to generate a new IDs for IdentityWithInt + /// + + #[ derive( Debug, Copy, Clone, Default ) ] + pub struct IdGeneratorInt + { + counter : IdentityWithInt, + } + + impl IdGeneratorTrait< IdentityWithInt > for IdGeneratorInt + { + /// Generate a new identity based on the current increasing it. + fn id_next( &mut self ) -> IdentityWithInt + { + self.counter.0 += 1; + self.counter + } + /// Check is the identity valid. + fn is_id_valid( &self, src : IdentityWithInt ) -> bool + { + src.0 >= 0 && src.0 < self.counter.0 + } + } + + impl HasIdGenerator< IdentityWithInt > for IdentityWithInt + { + type Generator = IdGeneratorInt; + } + +// impl IdentityGenerableInterface for IdentityWithInt +// { +// +// fn next( &self ) -> Self +// { +// let result = Self( self.0 + 1 ); +// assert!( self.is_valid() ); +// result +// } +// +// fn is_valid( &self ) -> bool +// { +// self.0 > 0 +// } +// +// } + + impl Default for IdentityWithInt + { + fn default() -> Self { Self( 1 ) } + } + + impl fmt::Debug for IdentityWithInt + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "{}", self.0 ) ) + } + } + +} + +// + +crate::mod_interface! +{ + exposed use super::private:: + { + IdentityWithPointer, + IdentityWithName, + IdentityWithInt, + IdGeneratorInt, + }; +} diff --git a/module/move/graphs_tools/src/canonical/mod.rs b/module/move/graphs_tools/src/canonical/mod.rs new file mode 100644 index 0000000000..369dd0afd8 --- /dev/null +++ b/module/move/graphs_tools/src/canonical/mod.rs @@ -0,0 +1,20 @@ +crate::mod_interface! +{ + // Implements canonical factory where each node in a cell. + // #[ cfg( feature = "cell_factory" ) ] + // layer cell_factory; + /// Implements canonical edge. + layer edge; + /// Implements canonical factory. + layer factory_generative; + /// Implements canonical factory to read re. + layer factory_readable; + + /// Implements several identities. + layer identity; + /// Implements canonical node. + layer node; + // Implements node cell. + // #[ cfg( feature = "cell_factory" ) ] + // layer node_cell; +} diff --git a/module/move/graphs_tools/src/canonical/node.rs b/module/move/graphs_tools/src/canonical/node.rs new file mode 100644 index 0000000000..5fc2185a73 --- /dev/null +++ b/module/move/graphs_tools/src/canonical/node.rs @@ -0,0 +1,187 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use wtools::prelude::*; + use indexmap::IndexSet; + use core::fmt; + + /// + /// Canonical implementation of node. + /// + + pub struct Node< NodeId = crate::IdentityWithInt, EdgeId = crate::IdentityWithInt > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + /// Input node. + pub out_nodes : IndexSet< NodeId >, + /// Input node. + pub out_edges : IndexSet< EdgeId >, + // /// Kind of the node. + // pub kind : Kind, + /// Identifier. + pub id : NodeId, + } + + // + +// impl< NodeId, EdgeId > Node< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// // +// { +// +// /// Construct an instance of the node with id. +// pub fn make_with_id< Name >( id : Name ) ->Self +// where +// Name : Into< < Self as HasId >::Id >, +// { +// let out_nodes = IndexSet::new(); +// let out_edges = IndexSet::new(); +// Self +// { +// out_nodes, +// out_edges, +// id : id.into(), +// } +// } +// +// } + + // + + impl< NodeId, EdgeId > Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + /// Construct canonical node using id. + pub fn _make_with_id< IntoId >( id : IntoId ) -> Self + where + IntoId : Into< < Self as HasId >::Id >, + { + let out_nodes = Default::default(); + let out_edges = Default::default(); + Node { out_nodes, out_edges, id : id.into() } + // Self::make_with_id( id ) + } + } + +// impl< NodeId, EdgeId, IntoId > From_1< IntoId > +// for Node< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// +// IntoId : Into< < Self as HasId >::Id >, +// { +// fn from_1( id : IntoId ) -> Self +// { +// let out_nodes = Default::default(); +// let in_nodes = Default::default(); +// Node { out_nodes, in_nodes, id } +// // Self::make_with_id( id ) +// } +// } + + // + + impl< NodeId, EdgeId > HasId + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + type Id = NodeId; + fn id( &self ) -> Self::Id + { + self.id + } + } + + // + + impl< NodeId, EdgeId > NodeBasicInterface + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + } + + // + + // impl< NodeId, EdgeId > Extend< < Self as HasId >::Id > + // for Node< NodeId, EdgeId > + // where + // NodeId : IdentityInterface, + // EdgeId : IdentityInterface, + // + // { + // fn extend< Iter >( &mut self, iter : Iter ) + // where + // Iter : IntoIterator< Item = < Self as HasId >::Id > + // { + // for node_id in iter + // { + // self.out_nodes.insert( node_id ); + // } + // } + // } + + // + + impl< NodeId, EdgeId > fmt::Debug + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "node::{:?}", self.id() ) )?; + for e in &self.out_nodes + { + f.write_fmt( format_args!( "\n - {:?}", e ) )?; + } + f.write_fmt( format_args!( "" ) ) + } + } + + // + + impl< NodeId, EdgeId > PartialEq + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + fn eq( &self, other : &Self ) -> bool + { + self.id() == other.id() + } + } + + impl< NodeId, EdgeId > Eq + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + {} + +} + +// + +crate::mod_interface! +{ + orphan use Node; +} + diff --git a/module/move/graphs_tools/src/lib.rs b/module/move/graphs_tools/src/lib.rs new file mode 100644 index 0000000000..0fbf24553d --- /dev/null +++ b/module/move/graphs_tools/src/lib.rs @@ -0,0 +1,56 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/graphs_tools/latest/graphs_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] +#![ deny( unused_imports ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( type_alias_impl_trait ) ] +// #![ feature( trace_macros ) ] + +//! +//! Implementation of automata. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#![ allow( unused_imports ) ] +use iter_tools::iter; +use data_type::dt; +use meta_tools::meta; +use strs_tools::string; + +use meta_tools::mod_interface; +mod_interface! +{ + /// Abstract layer. + #[ cfg( not( feature = "no_std" ) ) ] + layer abs; + /// Canonical representation. + #[ cfg( not( feature = "no_std" ) ) ] + layer canonical; + /// Algorithms. + #[ cfg( not( feature = "no_std" ) ) ] + layer algo; + + protected( crate ) use ::meta_tools::prelude::*; +} + +// zzz : implement checks +// +// - graph is connected +// - graph is complete +// - graph is isomorphic with another graph +// - graph get regularity degree +// - graph is bipartite +// - graph decomposition on cycles +// - graph decomposition on connected components +// +// - node get open neighbourhood? +// - node get closed neighbourhood? +// - node get degree ( nodes ) +// - node get size ( edges ) +// diff --git a/module/move/graphs_tools/tests/graphs_tools_tests.rs b/module/move/graphs_tools/tests/graphs_tools_tests.rs new file mode 100644 index 0000000000..74cedc3fe6 --- /dev/null +++ b/module/move/graphs_tools/tests/graphs_tools_tests.rs @@ -0,0 +1,10 @@ + +// #![ feature( type_name_of_val ) ] +// #![ feature( type_alias_impl_trait ) ] + +#[ allow( unused_imports ) ] +use graphs_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/move/graphs_tools/tests/inc/canonical_node_test.rs b/module/move/graphs_tools/tests/inc/canonical_node_test.rs new file mode 100644 index 0000000000..b56f8cba23 --- /dev/null +++ b/module/move/graphs_tools/tests/inc/canonical_node_test.rs @@ -0,0 +1,37 @@ +// use super::*; +// +// #[ cfg( feature = "cell_factory" ) ] +// tests_impls! +// { +// +// fn node_make() +// { +// use the_module::prelude::*; +// +// let node : the_module::canonical::Node = from!( 13 ); +// a_id!( node.id(), 13.into() ); +// +// } +// +// fn nodecell_make() +// { +// use the_module::prelude::*; +// +// let node : the_module::canonical::Node = from!( 13 ); +// a_id!( node.id(), 13.into() ); +// let cellnode : the_module::NodeCell< _ > = from!( node ); +// +// } +// +// } +// +// // +// +// #[ cfg( feature = "cell_factory" ) ] +// tests_index! +// { +// +// node_make, +// nodecell_make, +// +// } diff --git a/module/move/graphs_tools/tests/inc/cell_factory_test.rs b/module/move/graphs_tools/tests/inc/cell_factory_test.rs new file mode 100644 index 0000000000..68c8609774 --- /dev/null +++ b/module/move/graphs_tools/tests/inc/cell_factory_test.rs @@ -0,0 +1,39 @@ +// use super::*; +// #[ cfg( feature = "canonical" ) ] +// use the_module::canonical::CellNodeFactory as GenerativeNodeFactory; +// +// #[ cfg( feature = "canonical" ) ] +// include!( "./factory_impls.rs" ); +// +// #[ cfg( feature = "canonical" ) ] +// tests_impls! +// { +// +// fn nodecell_make() +// { +// use the_module::prelude::*; +// +// let node : the_module::canonical::Node = from!( 13 ); +// a_id!( node.id(), 13.into() ); +// let cellnode : < the_module::canonical::CellNodeFactory as GraphNodesNominalInterface >::NodeHandle = from!( node ); +// +// } +// +// } +// +// // +// +// #[ cfg( feature = "canonical" ) ] +// tests_index! +// { +// +// node, +// basic, +// make_default, +// make_with_edge_list, +// make_with_edge_list_string, +// graph_print, +// +// nodecell_make, +// +// } diff --git a/module/move/graphs_tools/tests/inc/factory_impls.rs b/module/move/graphs_tools/tests/inc/factory_impls.rs new file mode 100644 index 0000000000..a11b60ccd2 --- /dev/null +++ b/module/move/graphs_tools/tests/inc/factory_impls.rs @@ -0,0 +1,189 @@ +// use super::*; + +// tests_impls! +// { + + +// fn node() +// { +// use the_module::prelude::*; +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::from(); + +// let n1 = factory.node_making( 1 ); +// let n1b = factory.node( 1 ); +// a_id!( n1, n1b.id() ); +// dbg!( &n1 ); + +// let node1a = factory.node( 1 ); +// let node1b = factory.node( 1 ); +// a_id!( node1a, node1b ); + +// let node1a = factory.node( &1 ); +// let node1b = factory.node( &&1 ); +// a_id!( node1a, node1b ); + +// } + +// // + + +// fn make_default() +// { +// use the_module::prelude::*; +// use type_constructor::from; + +// let mut factory : GenerativeNodeFactory::< the_module::IdentityWithInt > = from!(); +// let n1 = factory.node_making( 1 ); +// let n1b = factory.node( 1 ); +// a_id!( n1, n1b.id() ); + +// } + +// // + + +// fn basic() +// { +// use the_module::prelude::*; +// use type_constructor::from; + +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::from(); + +// let a = factory.node_making( 1 ); +// let b = factory.node_making( 2 ); + +// factory.node_add_out_node( a, b ); +// factory.node_add_out_nodes( b, [ a, b ].into_iter() ); + +// a_id!( factory.nnodes(), 2 ); +// a_id!( factory.nedges(), 3 ); + +// dbg!( factory.node( a ) ); +// dbg!( factory.node( b ) ); + +// let got : HashSet< _ > = factory.out_nodes_ids( a ).collect(); +// let exp = hset![ b ]; +// a_id!( got, exp ); +// let got : HashSet< _ > = factory.out_nodes_ids( b ).collect(); +// let exp = hset![ a, b ]; +// a_id!( got, exp ); + +// // let got : HashSet< _ > = factory.out_nodes_ids_2( a ).collect(); +// // let exp = hset![ b ]; +// // a_id!( got, exp ); +// // let got : HashSet< _ > = factory.out_nodes_ids_2( b ).collect(); +// // let exp = hset![ a, b ]; +// // a_id!( got, exp ); + +// let got : HashSet< _ > = factory.out_edges( a ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( a, b ) ]; +// a_id!( got, exp ); +// let got : HashSet< _ > = factory.out_edges( b ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( b, a ), ( b, b ) ]; +// a_id!( got, exp ); + +// // let got = factory.out_nodes_ids_2( a ).map( | id | +// // { +// // // 13_i32 +// // ( id, factory.node( id ) ) +// // }); +// // use test_tools::inspect_type_of; +// // inspect_type_of!( got ); + +// } + +// // xxx : fix test make_with_edge_list + +// fn make_with_edge_list() +// { +// use the_module::prelude::*; +// use type_constructor::from; + +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::from(); + +// factory.make_with_edge_list +// ([ +// 1, 2, +// 2, 1, +// 2, 2, +// ]); + +// dbg!( factory.node( 1 ) ); +// dbg!( factory.node( 2 ) ); + +// let exp = hset![ 2 ]; +// let got : HashSet< _ > = factory.out_nodes_ids( 1 ).collect(); +// a_id!( got, exp ); +// let exp = hset![ 1, 2 ]; +// let got : HashSet< _ > = factory.out_nodes_ids( 2 ).collect(); +// a_id!( got, exp ); + +// let got : HashSet< _ > = factory.out_edges( 1 ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( factory.edge_id( 1 ), factory.edge_id( 2 ) ) ]; +// a_id!( got, exp ); +// let got : HashSet< _ > = factory.out_edges( 2 ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( factory.edge_id( 2 ), factory.edge_id( 1 ) ), ( factory.edge_id( 2 ), factory.edge_id( 2 ) ) ]; +// // let exp = hset![ factory.edge_ids( 2, 1 ), factory.edge_ids( 2, 2 ) ]; +// // let exp : HashSet< ( the_module::IdentityWithInt, the_module::IdentityWithInt ) > = hset![ ( 2, 1 ).into(), ( 2, 2 ).into() ]; +// a_id!( got, exp ); + +// } + +// // + +// // xxx : fix it +// // +// // fn make_with_edge_list_string() +// // { +// // use the_module::prelude::*; +// // +// // let mut factory = ReadableNodeFactory::< the_module::IdentityWithName >::make(); +// // +// // factory.make_with_edge_list +// // ([ +// // "A", "B", +// // "B", "A", +// // "B", "B", +// // ]); +// // +// // dbg!( factory.node( "A" ) ); +// // dbg!( factory.node( "B" ) ); +// // +// // let exp = hset![ "B" ]; +// // let got : HashSet< _ > = factory.out_nodes_ids( "A" ).collect(); +// // a_id!( got, exp ); +// // +// // let exp = hset![ "A", "B" ]; +// // let got : HashSet< _ > = factory.out_nodes_ids( "B" ).collect(); +// // a_id!( got, exp ); +// // } + +// // + + +// fn graph_print() +// { +// use the_module::prelude::*; + +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::from(); + +// factory.make_with_edge_list +// ([ +// 1, 2, +// 2, 1, +// 2, 2, +// ]); + +// let exp = r#"GenerativeNodeFactory +// node::1 +// - 2 +// node::2 +// - 1 +// - 2"#; +// let got = format!( "{:?}", factory ); +// println!( "{}", got ); +// a_id!( got, exp ); + +// } + +// } diff --git a/module/move/graphs_tools/tests/inc/factory_test.rs b/module/move/graphs_tools/tests/inc/factory_test.rs new file mode 100644 index 0000000000..e1f257a5ed --- /dev/null +++ b/module/move/graphs_tools/tests/inc/factory_test.rs @@ -0,0 +1,17 @@ +use super::*; +use the_module::canonical::ReadableNodeFactory as ReadableNodeFactory; +use the_module::canonical::GenerativeNodeFactory as GenerativeNodeFactory; + +include!( "./factory_impls.rs" ); + +// + +tests_index! +{ + // node, + // basic, + // make_default, + // make_with_edge_list, + // // make_with_edge_list_string, + // graph_print, +} diff --git a/module/move/graphs_tools/tests/inc/identity_test.rs b/module/move/graphs_tools/tests/inc/identity_test.rs new file mode 100644 index 0000000000..aa85003e52 --- /dev/null +++ b/module/move/graphs_tools/tests/inc/identity_test.rs @@ -0,0 +1,132 @@ +// use test_tools::exposed::*; +use super::*; + +// + +tests_impls! +{ + + fn identity_with_int() + { + use the_module::exposed::*; + + /* test.case( "basic" ) */ + { + let src1 = IdentityWithInt::from( 3 ); + let src2 = IdentityWithInt::from( 3 ); + // is_identity( src1 ); + // fn is_identity< T : IdentityInterface >( _ : T ){} + a_true!( implements!( src1 => IdentityInterface ) ); + a_id!( src1, src2 ); + + let src1 = IdentityWithInt::from( 3 ); + let src2 = IdentityWithInt::from( 1 ); + a_not_id!( src1, src2 ); + } + + /* test.case( "from" ) */ + { + let src = IdentityWithInt::from( 3 ); + fn check_into< Src >( src : Src ) -> IdentityWithInt + where Src : Into< IdentityWithInt >, + { + src.into() + } + a_id!( src, check_into( 3 ) ); + a_not_id!( src, check_into( 1 ) ); + a_id!( src, check_into( IdentityWithInt::from( 3 ) ) ); + a_not_id!( src, check_into( IdentityWithInt::from( 1 ) ) ); + } + + // zzz + // /* test.case( "from pair" ) */ + // { + // let src = Pair::from_2( 1, 3 ); + // let got : Pair< IdentityWithInt, IdentityWithInt > = src.into(); + // let exp = Pair::from_2( IdentityWithInt::make( 1 ), IdentityWithInt::make( 3 ) ); + // a_id!( got, exp ); + // } + + // /* test.case( "from x1 tupple" ) */ + // { + // let src = ( 1, ); + // let got : ( IdentityWithInt, ) = src.into(); + // let exp = ( IdentityWithInt::make( 1 ) ); + // a_id!( got, exp ); + // } + + /* test.case( "from x2 tupple" ) */ + // { + // //use type_constructor::VectorizedInto; + // let src = ( 1, 3 ); + // let got : ( IdentityWithInt, IdentityWithInt ) = src.into(); + // let exp = ( IdentityWithInt::from( 1 ), IdentityWithInt::from( 3 ) ); + // a_id!( got, exp ); + // } + + // /* test.case( "from x3 tupple" ) */ + // { + // let src = ( 1, 2, 3 ); + // let got : ( IdentityWithInt, IdentityWithInt, IdentityWithInt ) = src.into(); + // let exp = ( IdentityWithInt::make( 1 ), IdentityWithInt::make( 2 ), IdentityWithInt::make( 3 ) ); + // a_id!( got, exp ); + // } + + } + + // + + fn identity_implemented_for_identity_by_pointer() + { + use the_module::exposed::*; + + let x = 1; + let y = 1; + let src1 = IdentityWithPointer::from( &x ); + let src2 = IdentityWithPointer::from( &y ); + check( src1 ); + fn check< T : IdentityInterface >( _ : T ){} + a_not_id!( src1, src2 ); + } + + // + + fn identity_implemented_for_identity_by_name() + { + use the_module::exposed::*; + + let src1 = IdentityWithName::from( "abc" ); + let src2 = IdentityWithName::from( "abc" ); + check( src1 ); + fn check< T : IdentityInterface >( _ : T ){} + assert_eq!( src1, src2 ); + } + + // + + + fn identity_implemented_for_identity_by_int() + { + use the_module::exposed::*; + + let src1 = IdentityWithInt::from( 3 ); + let src2 = IdentityWithInt::from( 3 ); + check( src1 ); + fn check< T : IdentityInterface >( _ : T ){} + assert_eq!( src1, src2 ); + } + +} + +// + +tests_index! +{ + + identity_with_int, + + identity_implemented_for_identity_by_pointer, + identity_implemented_for_identity_by_name, + identity_implemented_for_identity_by_int, + +} diff --git a/module/move/graphs_tools/tests/inc/mod.rs b/module/move/graphs_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..56d3aaf445 --- /dev/null +++ b/module/move/graphs_tools/tests/inc/mod.rs @@ -0,0 +1,15 @@ +#![ allow( unused_imports ) ] + +use super::*; +use std::collections::HashSet; +// use wtools::prelude::*; + +#[ cfg( not( feature = "no_std" ) ) ] +mod canonical_node_test; +#[ cfg( not( feature = "no_std" ) ) ] +// mod cell_factory_test; +// #[ cfg( not( feature = "no_std" ) ) ] +mod factory_test; +#[ cfg( not( feature = "no_std" ) ) ] +mod identity_test; +mod factory_impls; diff --git a/module/move/graphs_tools/tests/smoke_test.rs b/module/move/graphs_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/move/graphs_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/optimization_tools/.cargo/config.toml b/module/move/optimization_tools/.cargo/config.toml new file mode 100644 index 0000000000..ce93c42ac4 --- /dev/null +++ b/module/move/optimization_tools/.cargo/config.toml @@ -0,0 +1,3 @@ +[patch.crates-io] +pathfinder_geometry = { git = "https://github.com/servo/pathfinder.git" } +pathfinder_simd = { git = "https://github.com/servo/pathfinder.git" } \ No newline at end of file diff --git a/module/move/optimization_tools/Cargo.toml b/module/move/optimization_tools/Cargo.toml new file mode 100644 index 0000000000..de8500b846 --- /dev/null +++ b/module/move/optimization_tools/Cargo.toml @@ -0,0 +1,70 @@ +[package] +name = "optimization_tools" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen " +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/optimization_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/optimization_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/optimization_tools" +description = """ +Playground for experimenting with optimization algorithms. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +# xxx : qqq : switch that on +# [lints] +# workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] + +[features] +default = [ + "enabled", +] +full = [ + "enabled", +] +enabled = [] +# rapidity_6 = [] # to enable slow tests +static_plot = [] +dynamic_plot = [ "static_plot", "dep:plotters-backend", "dep:piston_window" ] +lp_parse = [ "dep:exmex" ] + +[dependencies] +derive_tools = { workspace = true, features = [ "derive_more", "full", "strum" ] } +deterministic_rand = { workspace = true, features = [ "default" ] } +iter_tools = { workspace = true, features = [ "default" ] } +meta_tools = { workspace = true, features = [ "meta_constructors" ] } +error_tools = { workspace = true, features = ["default"] } +env_logger = "0.10.1" +log = "0.4.20" +rand = "0.8.5" +statrs = "0.16.0" +faer = { version = "0.16.0", features = [ "ndarray" ] } +ndarray = "0.15.6" +plotters = { version = "0.3.5", default-features = false, features = [ + "bitmap_encoder", + "ttf", + "area_series", + "point_series", + "line_series", + "full_palette", + "bitmap_backend", +] } +plotters-backend = { version = "0.3.5", optional = true } +piston_window = { version = "0.120.0", optional = true } +exmex = { version = "0.18.0", features = [ "partial" ], optional = true } +rayon = "1.8.0" +thiserror = "1.0.56" +rkyv = { version = "0.7.44", features = [ "validation" ] } +ordered-float = "4.2.0" +tabled = "0.15.0" + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/move/optimization_tools/License b/module/move/optimization_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/optimization_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/optimization_tools/Readme.md b/module/move/optimization_tools/Readme.md new file mode 100644 index 0000000000..34e372894d --- /dev/null +++ b/module/move/optimization_tools/Readme.md @@ -0,0 +1,268 @@ + + +# Module :: optimization_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_optimization_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_optimization_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/optimization_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/optimization_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Foptimization_tools%2Fexamples%2Foptimization_tools_trivial.rs,RUN_POSTFIX=--example%20optimization_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +# Hybrid optimization using Simulated Annealing and Genetic Algorithm + +## Simulated Annealing + +Simulated Annealing is a probabilistic optimization algorithm inspired by the annealing process in metallurgy. It is often used to find near-optimal solutions to combinatorial optimization problems. Simulated Annealing is known for its ability to escape local optima and explore a broader solution space, making it suitable for complex optimization problems, like solving of sudoku puzzle. + +Simulated Annealing starts with an initial solution and iteratively explores neighboring solutions. It accepts better solutions with certainty but occasionally accepts worse solutions with a decreasing probability over time. The algorithm maintains a temperature parameter that controls the likelihood of accepting worse solutions. As the algorithm progresses, the temperature decreases, and the acceptance of worse solutions becomes less probable. + +### Resources: + - [Video explanation](https://www.youtube.com/watch?v=21EDdFVMz8I) + - [Wikipedia page](https://en.wikipedia.org/wiki/Simulated_annealing) + +### Illustration of solving Traveling Salesman problem with Simulated Annealing + + + +## Genetic Algorithm + +A genetic algorithm (GA) is an optimization technique inspired by the principles of natural selection and genetics. It begins with a population of candidate solutions, randomly generated. Each candidate solution is evaluated using a fitness function that quantifies how well it solves the problem at hand. Solutions with higher fitness values are considered better. + +To produce new population genetic operators are used: selection, crossover, mutation and elitism. +- Mutation introduces random changes (mutations) to some individuals to maintain diversity in the population and prevent premature convergence. +- Some individuals are replaced by offspring. First parent individuals are selected from the population based on their fitness. Individuals with higher fitness have a higher chance of being selected. Than selected individuals create offspring using crossover operator, which performs recombination of their genetic material. This mimics the mating process in natural genetics. + + + +- Some most fit individuals(elites) are cloned to new population without changes. + +These operations are performed repeatedly for a certain number of generations or until a termination condition is met (e.g., reaching a satisfactory solution). + +The algorithm returns the best solution found in the final population, which represents an optimal or near-optimal solution to the problem. + +### Resources: + - [Video explanation](https://www.youtube.com/watch?v=S8LdYxA5-8U) + - [Wikipedia page](https://en.wikipedia.org/wiki/Genetic_algorithm) + +## Hybrid optimization + +Hybrid optimization method, that performs iterative optimization using a combination of genetic algorithm and simulated annealing techniques, aiming to find an optimal or satisfactory solution to the given problem. It uses mutation, selection and crossover operators similar to genetic algorithm and evaluates vitality of candidate solution based on temperature as in simulated annealing. +There's two main methods in HybridOptimizer struct: + - `optimize`: Creates the initial population of solutions, initializes variables needed for optimization loop. In the loop updates population until termination conditions are met, such as reaching the maximum number of dynasties, finding a satisfactory solution, or exceeding a reset limit. + + [Mermaid diagram of optimize method](diagram.md) + + - `evolve`: Updates an individual solution in an optimization process using either a crossover operator or a mutation operator. If candidate solution is vital, it is included in new population. + + [Mermaid diagram of evolve method](evolve_method_diagram.md) + +## Problems + +#### Sudoku Solving + +Sudoku is a classic number puzzle game that involves filling a 9x9 grid with digits. The puzzle begins with some cells already filled with numbers, and the goal is to complete the grid following specific rules - every row, column and 3x3 block must contain unique digits from 1 to 9. + +#### Traveling Salesman Problem + +The Traveling Salesman Problem (TSP) is a classic optimization problem where the goal is, with given set of cities and the distances between each pair of cities, find the shortest possible tour that visits each city exactly once and returns to the starting city, forming a closed loop. + +#### Example: Traveling Salesman Problem + +```rust + +// Create new graph with distances between edges. +let mut graph = TSPGraph::new(); +graph.add_edge( NodeIndex( 1 ), NodeIndex( 2 ), 10.0 ); +graph.add_edge( NodeIndex( 1 ), NodeIndex( 3 ), 15.0 ); +graph.add_edge( NodeIndex( 1 ), NodeIndex( 4 ), 20.0 ); +graph.add_edge( NodeIndex( 2 ), NodeIndex( 3 ), 35.0 ); +graph.add_edge( NodeIndex( 2 ), NodeIndex( 4 ), 25.0 ); +graph.add_edge( NodeIndex( 3 ), NodeIndex( 4 ), 30.0 ); + +// Create initial TS configuration, passing created graph and starting node. +let tsp_initial = TSProblem::new( graph, NodeIndex( 1 ) ); + +// Create hybrid optimization problem with TS configuration, crossover operator and mutation operator, +// specific for TS problem. +let tsp = Problem::new( tsp_initial, OrderedRouteCrossover{}, TSRouteMutation{} ); + +// Create new hybrid optimizer with default configuration, and TS hybrid optimization problem. +let optimizer = HybridOptimizer::new( Config::default(), tsp ) +// If desired, update certain configuration values for optimizer. +.set_population_size( 100 ) +.set_dynasties_limit( 100 ); + +// Perform optimization of given problem. Result includes best found solution and reason for termination +// of optimization process. +let ( reason, solution ) = optimizer.optimize(); +// Result +// reason : DynastiesLimit +// route : [ NodeIndex(1), NodeIndex(2), NodeIndex(4), NodeIndex(3), NodeIndex(1)] +// distance : 80.0 +``` + +#### Example of implementation of custom problem + +Given a set of items, each with a weight, determine the subset of items with the total weight which is closest to a given baseline. + +```rust +// Create struct that represents candidate solution and implement trait Individual for it. +pub struct SubsetPerson +{ + pub subset : Vec< bool >, + pub value_diff : usize, +} + +impl Individual for SubsetPerson +{ + fn fitness( &self ) -> usize + { + self.value_diff + } + fn is_optimal( &self ) -> bool + { + self.value_diff == 0 + } + fn update_fitness( &mut self, value : f64 ) + { + self.value_diff = value as usize; + } +} + +// Create struct that represents problem, and implement trait InitialProblem for it. +// Associated item is SubsetPerson created above. +pub struct SubsetProblem +{ + pub items_values : Vec< usize >, + pub baseline : usize, +} + +impl InitialProblem for SubsetProblem +{ + type Person = SubsetPerson; + + fn get_random_person( &self, hrng : Hrng ) -> SubsetPerson + { + let mut subset = vec![ false; self.items.len() ]; + + // Create subset with random number of random items. + ... + + // Create new person with subset. + let mut person = SubsetPerson::new( subset ); + let diff = self.evaluate( &person ); + person.update_fitness( diff ); + + person + } + + fn evaluate( &self, person : &SubsetPerson ) -> f64 + { + // Calculate difference between sum of subset elements and baseline. + ... + + ( self.baseline - sum ).abs() as f64 + } +} + +// Create crossover operator for custom problem, implement CrossoverOperator trait for it. +pub struct SubsetCrossover; +impl CrossoverOperator for SubsetCrossover +{ + type Person = SubsetPerson; + fn crossover( &self, hrng : Hrng, parent1 : &Self::Person, parent2 : &Self::Person ) -> Self::Person + { + ... + // Get random crossover point. + let point = ( 1..parent1.subset.len() - 2 ).choose( &mut *rng ).unwrap(); + let child = parent1.subset.iter().cloned().take( point ).chain( parent2.subset.iter().cloned().skip( point ) ).collect_vec(); + + SubsetPerson::new( child ) + } +} + +// Create mutation operator for custom problem, implement MutationOperator trait for it. +pub struct SubsetMutation; + +impl MutationOperator for SubsetMutation +{ + fn mutate( &self, hrng : Hrng, person : &mut Self::Person, _context : &Self::Problem ) + { + ... + // Remove random item. + loop + { + let position = ( 0..person.subset.len() ).choose( &mut *rng ).unwrap(); + if person.subset[ position ] == true + { + person.subset[ position ] = false; + break; + } + } + + // In the same way add random item to list. + ... + } +} +``` + +### Results + +- [Sudoku Solving](sudoku_results.md) +- [Traveling Salesman](tsp_results.md) + +## Finding optimal parameters for Hybrid Optimizer using Nelder-Mead algorithm + +### About Nelder-Mead algorithm: + +The Nelder-Mead method, also known as the downhill simplex method, is an optimization algorithm used to find the minimum of a function in a multidimensional space. It is useful for optimizing functions that are not well-behaved or have unknown derivatives. It has several stages: + +- Simplex Initialization: +Calculate initial simplex, which is a geometric shape formed by n+1 points in an n-dimensional space. These points represent candidate solutions. + +- Reflection, Expansion, Contraction, and Shrinkage: +During each iteration, the method evaluates the function at each simplex point. Based on these evaluations, it performs operations like reflection, expansion, contraction, or shrinkage to adjust the simplex. + +- Updating Simplex: +Depending on the evaluation results, the simplex is updated to move towards the optimum. This process continues iteratively until a termination criterion is met. + +- Termination: +Termination criteria includes reaching a maximum number of iterations or achieving a desired level of accuracy. The algorithm outputs the best point found, which corresponds to the minimum of the function. + +### Illustration of usage for Himmelblau function + + + +### More: + - [Video explanation](https://www.youtube.com/watch?v=-GWze-wtu60) + - [Wikipedia page](https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method) + +### Functions + +- `optimize_by_time`: Wrapper around Nelder-Mead optimizer, which accepts config for Nelder-Mead algorithm, optimization problem starting values and objective function, and finds optimal values for minimal execution time of objective function. +- `find_hybrid_optimal_params`: Specific optimization of parameters of HybridOptimizer, uses function `optimize_by_time` for finding configuration of HybridOptimizer which provides minimal execution time. + +### Example of usage with hybrid optimizer and traveling salesman problem +```rust +// Create default config for params optimization +let config = OptimalParamsConfig::default(); + +// Create initial traveling salesman problem with default graph, and starting node. +let initial = TSProblem { graph : TSPGraph::default(), starting_node : NodeIndex( 1 ) }; + +// Create hybrid problem with initial traveling salesman problem, and concrete operators implementations for traveling salesman problem. +let hybrid_problem = Problem::new( initial, OrderedRouteCrossover{}, TSRouteMutation{} ); + +// Using starting configuration for hybrid mode of optimization and hybrid problem, find optimal parameters for that problem. +let res = hybrid_opt_params::find_hybrid_optimal_params( config, optimization::starting_params_for_hybrid()?, hybrid_problem ); +``` +### To add to your project +```bash +cargo add optimization_tools +``` + +### Try out from the repository +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd module/move/optimization_tools +cargo run --example traveling_salesman +cargo run --example custom_problem +``` diff --git a/module/move/optimization_tools/diagram.md b/module/move/optimization_tools/diagram.md new file mode 100644 index 0000000000..26e14f0767 --- /dev/null +++ b/module/move/optimization_tools/diagram.md @@ -0,0 +1,55 @@ +```mermaid +flowchart TB + id1([Begin]) + --> + id2["`Initialize values: + *ga_max_stale_iterations*, + *sa_mutations_per_dynasty_limit*, + *reset_limit*, + *crossover_rate*, + elite_selection_rate, + mutation_rate, + fitness_recalculation, + dynasties_limit, + population_size, + population_percent`"] + --> + id3["`Initialize operators: + *crossover_operator*, + *mutation_operator*, + *selection_operator*, + *temperature_scheduler*, + *population_seeder*;`"] + --> + id4["`Calculate initial values for main loop: + *population* = initial_population, + *dynasties_number* = 1, + *stale_generations* = 0, + *prev_best_fitness = initial_population best individual fitness*, + *temperature* = initial_temperature`"] + -- enter main loop --> + id5{{"`*dynasties_number* > *dynasties_limit* ?`"}} + id5 -->|No| id6{{ population has solution ? }} + id6 -->|No| id17{{"`*reset_number* > *reset_limit* ?`"}} + id17 -->|No| id8{{"`*stale_populations* > *stale_population_limit* ?`"}} + id17 -->|Yes| id9[ Reseed population, reset temperature ] + id8 -->|No| id18{{"`*population_best_fitness* == *prev_best_fitness* ?`"}} + id8 -->|Yes| id19[ Reset temperature ] + id19 --> id12[ Initialaize new_population ] + id18 -->|"No ( There's progress ) "| id10["`*prev_best_fitness* = *population_best_fitness*, *stale_populations* = 0;`"] + id18 -->|"Yes (Stale population) "| id11["`*stale_population* += 1`"] + id10 --> id12 + id11 --> id12 + id12 --> id13["`*new_population* = *population.evolve*`"] + id13 -->|check new_population length| id14{{"`*new_population_len* < *population_len*`"}} + id14 -->|Yes| id15[ Clone individuals from old population ] + id14 -->|No| id16["`Update temperature with *temperature_scheduler*, + *population* = *new_population*, + *dynasties_number* += 1;`"] + id15 --> id16 + id16 --> id5 + id9 --> id5 + id6 -->|Yes| id20([End optimization]) + id5 -->|Yes| id20 + +``` \ No newline at end of file diff --git a/module/move/optimization_tools/evolve_method_diagram.md b/module/move/optimization_tools/evolve_method_diagram.md new file mode 100644 index 0000000000..949d5fe2df --- /dev/null +++ b/module/move/optimization_tools/evolve_method_diagram.md @@ -0,0 +1,37 @@ +```mermaid +flowchart TB + id1([Begin]) + --> + id2["`Values initialized in optimizer: + *elite_selection_rate*, + *mutation_rate* = 1, + *crossover_rate* = 0`"] + --> + id4["`Values passed as parameters: + *person*, + *population*, + *tamperature*`"] + -- start --> + id6{{"`rand > *mutation_rate* ?`"}} + id6 -->|No| id7["`use *crossover_operator* `"] + id6 -->|Yes| id8["`use *mutation_operator* `"] + id7 -->id9["`select parents with *selection_operator*`"] + id9 -->id11["`perform crossover`"] + id8 -->id12["`Initialize values + *n_mutations* = 0; + *expected_number_of_mutations* = 4;`"] + id12 -- Enter loop --> id13{{"`*n_mutations* > *mutations_per_dynasty_limit* ?`"}} + id13 -->|Yes| id14["End loop"] + id13 -->|No| id15["`Create *expected_number_of_mutations* candidate persons`"] + id15 -->id17["`Mutate candidates with *mutation_operator*`"] + id17 -->id18{{"` Candidates contain vital candidate ?`"}} + id18 -->|Yes| id14["End loop"] + id18 -->|No| id19["`*n_mutations* += 1; + expected_number_of_mutations += 4;`"] + id19 --> id13 + id11 --> id16([End]) + id14 --> id16 + + + +``` \ No newline at end of file diff --git a/module/move/optimization_tools/examples/optimization_tools_trivial.rs b/module/move/optimization_tools/examples/optimization_tools_trivial.rs new file mode 100644 index 0000000000..2db8693979 --- /dev/null +++ b/module/move/optimization_tools/examples/optimization_tools_trivial.rs @@ -0,0 +1,186 @@ +//! Example of hybrid optimization for custom problem, with implementation of traits for hybrid optimization. +//! +//! Problem: Given a set of items, each with a weight, determine the subset of items with the total weight which is closest to a given baseline. +//! + + +use optimization_tools::hybrid_optimizer::*; + +use deterministic_rand::{ Hrng, Rng, seq::IteratorRandom }; +use iter_tools::Itertools; + +// Create struct that represents candidate solution and implement trait Individual for it. +#[ derive( Debug, PartialEq, Clone ) ] +pub struct SubsetPerson +{ + pub subset : Vec< bool >, + pub value_diff : usize, +} + +impl SubsetPerson +{ + pub fn new( subset : Vec< bool > ) -> Self + { + Self { subset, value_diff : 0 } + } +} + +impl Individual for SubsetPerson +{ + fn fitness( &self ) -> usize + { + self.value_diff + } + + fn is_optimal( &self ) -> bool + { + self.value_diff == 0 + } + + fn update_fitness( &mut self, value : f64 ) + { + self.value_diff = value as usize; + } +} + +// Create struct that represents problem, and implement trait InitialProblem for it. +// Associated item is SubsetPerson created above. +#[ derive( Debug, Clone ) ] +pub struct SubsetProblem +{ + pub items : Vec< usize >, + pub baseline : usize, +} + +impl InitialProblem for SubsetProblem +{ + type Person = SubsetPerson; + + fn get_random_person( &self, hrng : Hrng ) -> SubsetPerson + { + let mut subset = vec![ false; self.items.len() ]; + + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let number_of_elements = rng.gen_range( 1..subset.len() ); + let positions = ( 0..subset.len() ).choose_multiple( &mut *rng, number_of_elements ); + + for position in positions + { + subset[ position ] = true; + } + + let mut person = SubsetPerson::new( subset ); + let diff = self.evaluate( &person ); + person.update_fitness( diff ); + + person + } + + fn evaluate( &self, person : &SubsetPerson ) -> f64 + { + let mut sum = 0; + for i in 0..person.subset.len() + { + if person.subset[ i ] == true + { + sum += self.items[ i ]; + } + } + + self.baseline.abs_diff( sum ) as f64 + } +} + +// Create crossover operator for custom problem, implement CrossoverOperator trait for it. +#[ derive( Debug, Clone ) ] +pub struct SubsetCrossover; +impl CrossoverOperator for SubsetCrossover +{ + type Person = SubsetPerson; + fn crossover( &self, hrng : Hrng, parent1 : &Self::Person, parent2 : &Self::Person ) -> Self::Person + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let point = ( 1..parent1.subset.len() - 2 ).choose( &mut *rng ).unwrap(); + let child = parent1.subset.iter().cloned().take( point ).chain( parent2.subset.iter().cloned().skip( point ) ).collect_vec(); + + SubsetPerson::new( child ) + } +} + +// Create mutation operator for custom problem, implement MutationOperator trait for it. +#[ derive( Debug, Clone ) ] +pub struct SubsetMutation; +impl MutationOperator for SubsetMutation +{ + type Person = SubsetPerson; + type Problem = SubsetProblem; + + fn mutate( &self, hrng : Hrng, person : &mut Self::Person, _context : &Self::Problem ) + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + //remove random item + loop + { + let position = ( 0..person.subset.len() ).choose( &mut *rng ).unwrap(); + if person.subset[ position ] == true + { + person.subset[ position ] = false; + break; + } + } + + //add random item + loop + { + let position = ( 0..person.subset.len() ).choose( &mut *rng ).unwrap(); + if person.subset[ position ] == false + { + person.subset[ position ] = true; + break; + } + } + } +} + +fn main() +{ + // Initialize custom problem. + let items = vec![ 3, 5, 9, 12, 43, 32, 18 ]; + let init_problem = SubsetProblem { items : items.clone(), baseline : 41 }; + + // Initialize hybrid optimization problem, using custom problem and custom operators. + let problem = Problem::new( init_problem, SubsetCrossover, SubsetMutation ); + + // Create new hybrid optimizer with default configuration, and hybrid optimization problem. + let optimizer = HybridOptimizer::new( Config::default(), problem ) + // If desired, update certain configuration values for optimizer. + .set_population_size( 100 ) + .set_dynasties_limit( 100 ); + + // Perform optimization of given problem. Result includes best found solution and reason for termination + // of optimization process. + let ( reason, solution ) = optimizer.optimize(); + + // Print results. + println!( "reason : {:?}", reason ); + + if let Some( solution ) = solution + { + print!( "subset : " ); + for i in 0..solution.subset.len() + { + if solution.subset[ i ] == true + { + print!("{} ", items[ i ] ); + } + } + println!(); + println!( "difference : {:?}", solution.value_diff ); + } +} \ No newline at end of file diff --git a/module/move/optimization_tools/examples/traveling_salesman.rs b/module/move/optimization_tools/examples/traveling_salesman.rs new file mode 100644 index 0000000000..2db910ec15 --- /dev/null +++ b/module/move/optimization_tools/examples/traveling_salesman.rs @@ -0,0 +1,45 @@ +//! Example usage of hybrid optimizer for finding optimal route in traveling salesman problem. +//! + +use optimization_tools::*; +use problems::traveling_salesman::*; +use hybrid_optimizer::*; + +fn main() +{ + // Create new graph with distances between edges. + let mut graph = TSPGraph::new(); + graph.add_edge( NodeIndex( 1 ), NodeIndex( 2 ), 10.0 ); + graph.add_edge( NodeIndex( 1 ), NodeIndex( 3 ), 15.0 ); + graph.add_edge( NodeIndex( 1 ), NodeIndex( 4 ), 20.0 ); + graph.add_edge( NodeIndex( 2 ), NodeIndex( 3 ), 35.0 ); + graph.add_edge( NodeIndex( 2 ), NodeIndex( 4 ), 25.0 ); + graph.add_edge( NodeIndex( 3 ), NodeIndex( 4 ), 30.0 ); + + // Create initial TS configuration, passing created graph and starting node. + let tsp_initial = TSProblem::new( graph, NodeIndex( 1 ) ); + + // Create hybrid optimization problem with TS configuration, crossover operator and mutation operator, + // specific for TS problem. + let tsp = Problem::new( tsp_initial, OrderedRouteCrossover{}, TSRouteMutation{} ); + + // Create new hybrid optimizer with default configuration, and TS hybrid optimization problem. + let optimizer = HybridOptimizer::new( Config::default(), tsp ) + // If desired, update certain configuration values for optimizer. + .set_population_size( 100 ) + .set_dynasties_limit( 100 ); + + // Perform optimization of given problem. Result includes best found solution and reason for termination + // of optimization process. + let ( reason, solution ) = optimizer.optimize(); + + // Print results. + println!( "reason : {:?}", reason ); + + if let Some( solution ) = solution + { + println!( "route : {:?}", solution.route ); + println!( "distance : {:?}", solution.distance ); + } + +} \ No newline at end of file diff --git a/module/move/optimization_tools/img/Genetic_algorithm.png b/module/move/optimization_tools/img/Genetic_algorithm.png new file mode 100644 index 0000000000000000000000000000000000000000..1a107ae9e35ea39a81fc60dbc05c5c2f08a8644f GIT binary patch literal 36439 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 Z{~1jtTV7CP)U9Fw0#8>zmvv4FO#sD|IT8Q> literal 0 HcmV?d00001 diff --git a/module/move/optimization_tools/img/Nelder-Mead_Himmelblau.gif b/module/move/optimization_tools/img/Nelder-Mead_Himmelblau.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2f076ce9c5e42968aeb22d96698db93f07933f0 GIT binary patch literal 931058 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

    >vK1@G+ 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 z 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 z zhF6{ujuHCn{>n2J&-*ov#F~kNi63HI>@F0{|7u3)%P#@xt`s}RwmuI-9JpnlS}_<#bYHjf$AKanrHu)mJ^< z@4&gClLLQ}9CY{Un^CZ;*%Qj?9hGb8F?7S#LM&5G=l zdEOA-cgynydT=yYC}N@iQgCgdg}Q*{@e4U`Rl(wr3<+aFwpU(shqPX71c2xUDfx$= z8<9%@+d884;SM0&4e=rVG7yq_`>i4v}%`UKly1OpbV16($yo8e5nk~Dc%Yr9)hkN7bd}fBtfru$jpHfxMGJCytqd9 zK?>*e;W#E|opOFiIiKu+cu>f#mEr#*Rsi(i5<*F$fD=;JW|{dbB5*d5@3vSHeSwg3 zQu357q?HkjdD*Q6j_l;rpxIJmzWkQNeLv4CzoUwhJQWD{So1`;PlMoBWL;KQt0`YF zYZ_~sv}U$%=HaNdMN+aZKHLC*M>Lq!cCJBe)3pDwa^EnAT46CIAf|VY=jo#SCoO?x zX5@@UFLP>Y@(Q9G@(_yMsqq5_gCOVc^%sZj_`$eZ7I{05P4qtm2 z|4FH^>nSUwc!HC~g1)?Qmevhdob1EVy8>yu28cBt0NwW$br6qg@3uw~cKc2py{}`e zEZ6>V3P-QGxAYKncWU7Tn!p}hppTuCFv31(iHE6y=HnMiih(hEzBwf(2a!otVA%(O zOhy$hqY(?Qp;GwyxfD)nIHVNg(xir5ShY@l3&l|r9N-ym{PZ6{r5;ECk`5f{asUnu z+g4x=g$ep|qC?-X4i&LsN7;vOBCiy$B$l%LqjI?`qUo{K9=-c5H+0cd58;KLL@AIt zZ6}rh)9YpXMq-5;EA`YbyOT7bxP|LCbq7-f`lIJMPr*O|hQc4<)CG=1(%~YV1}w2}X8AZz4T<1s>tlLe&sNOnj=$z79)pUpGiF@hiuO$WA!V z(1#X{1&);u!nY*Fy%L}NsS-tuv6Rvzo))szqmiLyBE^`x^k_#v6kYM#4>~KX)(!~# zi5NzTE&{9*7|>-d$rKNmwKPasgM&K~aMeIjR5)a}WMm3g+`EAQ&>j?z@!ley*5IAM zNR3zndg~}66(nxcX-^Xv#r~WCBtpg_LI-3Rcd^`1Nu~1=E~#V3{2i4hYgbe^`GeEp zfrIQnl99nH2nr|QsllN|7wg=Df2m`S*yPaIQbt%z;y46&Re^f-tD?0vGaA^Br)T@$ z-17&?t2jnzsBDyBlJC}s02;iQIJ3(G(2`!UM^x3*Saj2qL_+C9u= zfS{E_V%_P{f9k+~&}d*%e&a$qgKsTdcfg*#Rnc%H-I~LTQ+=MeaE61s4^fT5_i!Vk zZQ-Oosg}`|T)!+q0BQ->k12vqnOuYhZmi=Do)PAVw{Szn&OuiS|~$l`4|Zo;wZm_qwTvfyD;3Ue<7uPgtLE?J=z;dYd}!75bbZONPCAr3`1|mjwqnm?bTDOPeXt`=aH7#T2a_Zj>G`;56>CEuB5+#K+Nd`dlGJhu!{N z7FRLJajKd7egIlr(*6-u*Qc4yL_!YRD>kF4vrZXB2O_y6?Y@$fKJ#7f^_02Ud#)OA z$s+rOXX!j_a!Vsw3ljNOe9;`k?1@fR9RvxsAKOTz0vR!Nrbnu?-8$##UE8Dxx9ei_T?amm+6jco~*Y5o%XAa2EkeWaE8m+ z3B0DPBd!Lhv)TevqP35AWGoj0t#0DCEByJtY~>VD&Sy~MQ*buQe~`TXTuCI8M>;O` zlk9T|29x{?_5hR{^L~z91%)Yf=jU*#x}rIcNuMyR`{VwIU()Q2X>5~mX43TlJU0tS z_cLHsPVma71gB7?w49Ki+;n^#kvh{c0LI<-kFGFg%45Ed`{y@rIE;XSy%d1iQ=!9^ z!xJ@q;?|`u^Z$&_?!)2*tRZZ=S+vsu#loa~kM7%In)YF3s8>yrEZx@JIt=7}UE~w( ziQIL#^`aSQWHyy*B6t_^sqo=z>Lt@@6p>__CWUBU8j=R(R};TX54(UhXC6C z`&aQ7ci;W~<|)gHWsRyVc}v7&E(aKY22K@Yf^&fFWD5B!hMW#)l#{Ni*ZQgCN*Gf+ zopPYEdx%@4z(+p(mRvj&KO??kwkEXVF1o~p;V_+nL5oe%H{Aq4^D#q|#6k=ykC1Yq zFklf--edJBrQFewjeQmTkxJHsQ$b%8xT|6>2vV-^Q^jEEmnJX?n&x|dr|x_}mv00M>X7k6P4!x!?S3JuAD*Zw+y2#|3Hc2k70) z+Z}t7LOAh_B9=wSbp(?k^Rdr`U?p!RT=_4V6D;AF0+wzQ+i~v1s4#W>ym8RuV{Hb< z_$%UnBm8r7l~mBl`zW2fn3`GH>^u_{UAd!}%mn??2nTe!_MjRd^+QlK5A+YarcZTTRVJ*mqT(o`}Vaf zkixv@vvZw8@u$qMqk(KT7c~tbG>7qZA-s;@g{!mrB5`L#^`0XtmN2qORY|i|-6T>m zH7tuJmP+*s7e-z%aQ2x-j0vJm|0LWaDP5AR;VT;V=-$Y#Wm~?Ga8_7A!wID?EcyEa zp6dKi;#}GJ!c3d{&f}iWI_(HkVaL`vl%b^2BPS&C$CG(dqsojoTH?7KXd>3R51;wXW?||#A+I4sDk=K2Zofi;^rMGySYoeANGYAcByqzqC z&&+aI=iZ#kKCH#zr2H+=9N_$aB&ErF48CFW%1P&Uyd`Ok9nIzW9dWNastK3Nfk#Po zHxo$zK2f)6LVzu-6he0FpLMyotuvP|)Z{OZ`}^xbckO4|_u%gPVAsGHgIrcx$W_-j zuNRvy9j}MX8;%g{i>Xpmlh(=d&)kGjPck3ka**~}H!Ph4R~sEyM0n<80jH3EnH}8F zg}%dzr+K6z57#%}&h7R!!+Moz*F&p7gh1k>ao9&ha00@5@!W;9@679Jdvb#UWVkG1$<2+DVu*$ zw+blQVSkNhvsq5RA;^jp6n7Od&LCU2ilSQC3OavoWz;P$7S^v^t*7$ zQ|`o@F4tX;-rJRt@6Uq9StL@PFV+_V)O{Y$G>SKSG|~ej=ir8bhWBPsv|My~(=VO7 zhrxj#D;*SkjIzUqtBZM$}h%;7yp^ukD6wgXPzZb zRq7+TmtHhWcU7Aj2%qvS)}T$Bz#iZS<8V68mx7gA-NIl@2!dA21m|exO366^4dHf) z=3ozIYU^7Ms1x~==uk5)sP7w`5*zPErw5r1)3`h7+gd^vGavz@x)uY z*Tw$MMK^4JKU>$?@H>3|8|LzlCo7hWFL$y`<1fMvpkq=e?7#ivr--9b4+lTQBRPzV z7W(&>N8(|W#>SdcH>G?+W$BaKwAW1`Ypz-zcSM&Mh&iR(Ecp2nJ|2d`qR3~iV-Y;ZA@1K|n65C)EoO+8l%&^_MKysEe60x_Z>?hzuXRx-3lR9p`8&%YUvYgpJO8L+ ze-AlZE(sWdH&Q5{Z`fQ+j0hiYSXBw*tO9jAC{&UE_Q1R(ECp?%HAk80_%ovn;z8Y#=JhqyigMqnE)SNOGrME78i;x#C zej!)nXb7Ojw)DIFUw!nFjCMnl1hA=*j$NLj5Rng)l*rl#z`=-9d8P1<|l9c^vyLfCwhDw<4}e2tdSy19uK zN))p8^1XT6!tE5F{N3aFep}h-s80&$f!H*(isd(HuqgWbBwIn^X6IvTHdbJ)H5|q% zp0>#f$VJ)`GlNqp)RSk*z-Zhk4vGp*j6^F?71IR(u(?ik%vfQ{De=P4s|vSehh!M) z#gV;zjVRzj3jrNKWSxeqGh#6b8YTc282Xb=L%jVg2pcV_Y&>^c>6`&Pd@Aw-<;m+t zPZddEGn1>Ux;PU=kgX9V6=~LJ1VYM{zP_CEHy+UEfu?bHdQ#gVP5pvT*vt9|`NPAA zMwaxKy&ACP;2*PFVb>z8N7tmF z;r0uWZjv&0lexq>=w4iN6Hs;_;J{l<&$Y}5GaG(j>s!L$s>|BZ0(aBS z6UI5UM>XCpi0D=gny}^Lm{OR0K?E8^M2`evVpd!_J^QG9lkVwP1Om@SMmgizB5!bj z3xc*$hLosZ7zWRqYKCtE`g|Sl8KIPa50@k+$}iSh5HSTLc7!GL))ju)=lsbjV+`yP zP<|SS8G|x}qjcwJp!QNj8tU?#46VVSG&;0y>dnB=8L+W-CKHbU!LZ$Zm?$e;a(p!5 zlf_Smp9yeYFfJ)_^`B^ZqL`flC9jCH(7HMgVw4@WkH0;?V}G!*>+;{tR-h}0#slPx zz++xLVVTOS$JsHpL?~!sye+e?G%*sN#=+aG6?YPJb5iT7r&=Z$I<6%r9K5j0Z|vm0 z7%1|+L(9YoL^fw&laNJLnm|x!nJMdyWqZvS0rd9?#85}8=IDLuH$}A#KH^|Bw+wN~ zc}yZZCTeEe4Lly!)4nEB%sMiu_8zEHf*tvftwcLAWG|Q>pof?w3kicvsxf6S_Rq-8 z7$q3E^7C4zLX-m#x0siN^$q`4BL@$C%5a0-Q^sZE>3}(x{YT3@wRg4W%zkryr{Cze zzA}H1Xp|9u;?F9m_18%4qAp4+QVH|-vc_JW&MK?9^snKWbPLg@*9NK2aU}=saA<)y(?=o;w^YtBMA$_8cZEBIlsM;;XXmT68K@TYL*{uSg~3C3 zP15=QMh_qQ)8t9fK&f!fm_gbGU;(eY%a7!vVH(b(*J-x}f{!%NlO&mz-dO{<76a1n zFzDUodwWPGv&GE^SuY75XGbNCw7Jdfy=6xn*bEbO^=SEScBIWTvR@ENk&;8ZJ@EvPsSsnPN^EJ4mzU(chRFXLypBl04V z5jDODw&YI_9knR_{dw}!_pYpdUlY%u6Jy**e6E#et=w5LW*NH7?}_X3n|G7sveYR- zX(N4)b5CrEM*G-C$&anPO_Eg>D~`57vU$Yi;Q=PogVVlX0#uR$+E$Z4tD$aE++w&Z zigRN2dxFLJ{Ubgp z8W%0}J@Cj9XJjgrl%Oro__nE)y6Bb8Df98E%`DHAnj{{=SYA=zLN&(0dT7O=6vj2T z<9(0HQ^AQJOCEJB%PYE|(RRpAF~z}H#<^%WcTTHAUdgpr5=k`HUV792PSz0`5hRFAs*4%48nbZ00M)%8jS`2g+8bWo3G>Nz3izidpO#D zGVB(n`a&)XGfYx@y}}(T+ohgl&;EYa%#iRFl8l1s54OO0@d~i46{LIl4{d8Effmi^K8#EQ|W47xgI9C_J?jD7Wq zvSBOcLWJZCUgDhY0&!LCzlX)pk-|$pz`*;nfxG6nu>}EQC}SgsqhX@?4eL6$)7xda zywWvmqK831neub`BfiweC_&$xvRElL{lZHpqosx4`+zvHe0&Ln2l9kDlh_x2y{N8Y zsrnQ-q^`&ysOJf0gEKN~C+*JJ)s5AZ<2ie04byiu&0l&KS&dtkyVM9R`uB3w4Bao` zh~YRV;oHJ!a`yqif+Q9CwawNbb>7@e7f|7>fPF(O)Uc>hx&2!xiYg$!zoJQ&@i^o3 z7X#g2olYjK;#|rIszO#Av|(P(Fzo{@Oh%Rjr^tgJ45BvIDz`wL)<+MqC42^NHuxm> z^usJce1G)5Jyvw_rh5w8O0Nq2dL9wA<(bpwN=PaaKyhQ1808 z>;$1P{XXWMHL5oijFU6E;6^EwGD@3Ro>3NC)F_euF$rs0S|7XR@G=yCul4PfZ95m; zo6M1U8V+#AXR-&ffL`jyD=p9?X~ogU@5XiBZoWPdF3m9$Ix}|nffs6i1!vUX@pfJ) z;i|}{)M2zabSm2}#^s=r;4(TT7q!5qGne-1De$9d;Ar*byC+|zNKgI#n-bW03o@qZ ziv$j_#O-GK`*v>p<5zG0J$f5}HV4rl#@N^YI&9L*J`AqNs-!+zF847$=@TxLjnyj` zJxQ>5tIBVE0H^=xNX+j5zq}#x7;6hsuLNEsbB+`$N*V&1q=Xn}&I$mGFO%a2;7jv| z#;>>>vi@n{dh6G{!~~Q=Z(C9MmMtoCs5zWf9EK-%HFa+*nsfear^wAMA$H7vEG3H3 zGMOz0B&5nq^^Ct@Nt_^TE=SIn!?|~>;5!q>+nZc4X0br3P4BcqPgiK3@iAQ4lvP4NL*h!$hWJECmU;G(V4XJZ10d%P>8(T+ zXXzktIY?SODORCx%YNSOKB<0GItbev{}0$y1N-r*rtsM0?c0Lv9gtjbV+eheW?1OK z3AK;Sp0H?`!Oadln&AT4eKp}r%K8s3g7!uZ>D#UYd|;dTcW5$>vxQzi?%odNrsC&&f{p!P;_7kQrGm{Jxf$t)8&n~e50380S~BJW2}6T2p+0_k-|$k~jW z#os*g{RYJ)=Rp@72xvbxZ)-@u;u+-^hI63&mnYk)`t^#T7i5={YlAq;a@Gv_i3PDn zY`WMx{6y&*Ict7$FzjWfAt|BFWrbFO#mqS9fqsXQ5{x%EF}?~8W8OJQ8l>7|+Q&O; zgU1e8cQlidXQc%EjC|EidgLy^=SBf%!J0`ky-2z|58T-L{k(y5Yik`y=-JQ< zdCS9{v5@NMp{p*eH!VSI7@#F`bS}N%7aM$gI92azO$e%8N zXeZ4>l@d9SP*PVmth+NpZ!SBHz=dJ|*r7xl`Hb&jjgvSwjEf5znDkUWe=t6?#s5^C zG^9xCF*F$x$K~jOZrG7lPcC|_CQge&7uv%1at4pb6(;LnYaS#&JTgR}%E8-8(|JJt z^#KU6>7dQnt0S?xY}{3Tz?Gh)8+goo2~L z7J2aJ#i5t2ehLH3=YY1-5kMHYmyTunJ7fHf7Ois5_-i&?mj*UIdL|6OE5qxq*Xjmb=}rW5 zwYUj@4NNN3z5zp9*4^C%pT-MQCf>fn;A^M!Mx4>#wR@O>x}D zU#J2f6}!XFT4_2z>q6LouD=*|ii5a^hVFHagIh4NCv7?^BvByptt-nObqrH$Xmp7` z`J9a&A-Zy1y=hp$@;ojfmsH_KAV?&e%aFq2(8^+})>-Gw?nEOZE;d(2{@B8?Wf8v* z;^6T;AiAeUeFFFOY}sJAXD+E+9He0|kbj1BC*+62b3?fmdRYF~9?oZK%0b%JR+!1i zBj6nXU%dz@(x?|ur;SGd2B;om+-z4B)^0AL-FrT8qtFC$@FYKVCE)B%qYg-!ECrby zc*mo{<=)M;swLR|L~*X?uu|(TJ6hR7$2#(N;$h_8=v5+$2q>f>xUqLvVwlmx$$n#+YD5HR|}Z_EByHn z=5J5IrQY|Zq|q;IWd<`Lq+U2JJs6L1!UX2mlv}WOoI7bi&pnc=XHuJUX@s&0k z%!>y2)tfJdI`zJfeR?SpqthI2F-UQ~;RyE&i8l;PT-lGi{)T)R{x9>K9!}>DqXEEJ zJz%29Q3dH^5JM_K>Ks*B)=) zJaKnWzocwLEby`tWANSCS*u7T4#8XkK8cq?o+VO0;Szg#1*$+Jja<=}?{5)j6f6J^ zsTiW8wD9|8JEFaYv#{xntb}hI!Q9I7P#$I9cm^u()nh^41TZS&oT$CG^)^N|4H9Gs z#*EK%xR8yytP&@nl~_qH7dpYh3e18{S2&G%e8Bx;ODWxC)M~zwd7=huGL4YT2{0v| z04Nh@|M!kfk461SV#6ehtCyG(56YGmRYXxx;b`FCv$8-lfQtOXdtRX~_PA)O`Yg6X zQg=hI1I)ggclNLh&Ojh$Qc8j=c0`ucSWU%p8rR>y>X~vX&vEtTdIx!h_^F2;(3azhmfDAC`(#W#ZrbW7yyqIAvA!2iS<3;C(C%o06z> zuP<7vsE@`fX$=iX18loBR(cg+B2luZ*H$<$-WOcFP)4nqG-8vZSx7dte}hMYH^3Ge z*t%+h14_l*UwO5|c;5jM1I zVdC`smIQDNN^-g2urLL@b3A~S}E8_I6dx|N2ADFxXql~%g z()}qRZeO6B>^aVPK3CE+;B!CVq6Gdb5`>fA%R_=cDTm3YgBqI60-`>!NTllEbpm=c zPD&D6<9(%elq9M_`_w)BY#}Yi}e!txsa>-s#iM=%Q&^xWuB)%Im^OKjWNqoUWZQis@1bK z8w~(z+dcj#t#yIK%R|(w8xkqMoX5p%hC%@3aZpJK%5^a^r3cCK|)DElud-W^;}=8~mhX=XuY|bg(~F)m*p4<9PnHXJGSl z9&MH55BtO&3Ip`HXC`>UYh77%UFRiB?aeN6#%#??_wb66ZwJ3?)VWC(Mm7Ih`}Oso z)3G7QoxzHAo+;vYZK`Y7P$Z+n5Muo-uzCA|)K6E)Cb~o-k7A9e4Z6d#-IXF&FBX>B zQfRm_W&qRNzt!hDVIU1=`T3wF-X!t$p6@DD`1^T4aN9~D(mO392F>zejYBwCwN2_e zT06ou>5v~Jkb=Arv(PK{xUlF^4)7sy1)lPxp^ibc+rlLKkGHK==g=~JZYVQ$cZL1e zA~STA!UT?bH;Eoj;mRQ0%tGB3b;peC70tU&=6jn#NAu*DZ7G$zB}CqyRAH(jpnLs% zk*AZv_$rc7ut$i`byM$5%XC4U!w{X9WD=6anv&Zt&Ql-@)ndCRm1YaqlO4A_Lkt#d z9rh#4np-?h9wbJhT@cNL+vQ}O%==cb{JV?oKlisU8KQhtraLD+EiGMC-I(awTSKA0 zH=z4L2=tJaK>-f0(LxhVUKn85K|m3-AQ`UT%P9sKRg^^hgL4$d@yl0(%jeWBn6$jl zd!~kC(%?8l$mGMA92EuiClJNJgp_YqM=ZJ&)9AL1M&<8xdj#NS+yX!13e|5nnM_PE z=JTFRry`=ysSku8H|&adAMj*-o38k7C!-u_b={L-L+9PLl!E(`ydsxS^n`4VEkwQ6 zOm>^vl_Fi6;o{8c0RlMEq9IX?@t-^(E3?J-m=4oyvIx+C7&S}5j+j^4D|8u2b`coc zhG^E1tA)!;Iq*qIH6$Tvt9z`yzqNhxk6F&nk->s5v!WSj&BNnne9;HA2g;@r109C& zE<8ueRWa2cpPeF}g6tCy9XlIU_w62fFAQAOq^G3nO@`N=x;vp%6~G)3{PB_UTZ5L$ z8SaBiOI_5IsDYc_WVi%1?RMgi!(L(AV!KC2OG#I^I;UOh%)NWxs>}`XR-`N1JjHYP z&*olWtt=^b%1qV^uj&tmKUdtSK|1X54IpfJW33Y}7C5)vLdRQ!`*gMxC8bMa{qd6H>PMV(k2?3m3WZemXNK^kH!1CfR=cwsE^ys&IQOIc zCwy)p!Q)=abu%Gq5X36qrOqUDgd5mRL>zF_O_RUg`ymiU;ZT3V zUKGX}^=roMCK_9k=fRyVsjOhXcr54-7DLj?K>q#{Gk2t1ooM+S_92}r?oJ;Yeot4Kf3zvdO&A8 zDP=EV$Fq@mN$~xyE$={!P2~QL4*dSh7nN~*l`JsY9%$r6o%)E`O&&iGCesitV+3Cb zw<{$?Aa;Mw%F2VccgKWB-*e6=fL>ok0EF#K`5Z#L{5 zju`&XZYCy*A?Gk1h*Srh!Jr@1b)aK+STcKi8YTQ|=40yk}v=xmw2Y(!&;##t$?I^4_Bt_O|q~%1-__i*D=|yEW2-cfS#> zJTKhmf6qDu&3p*cx|mofd3RXRYM(U{-V3jc(-STH5iWc0l_Je0q12zyHj3&yai_X2 zv>K`}zpdh7JWe_Lxa9)c-GhDjQPR^6{eL0C1_!nM-+!c?m*@Pu3+ghv#j*4zs%e## zy|>DM-@N3{8fW6pVn6-0QCphCv)}d*zfzTgjo!zR8Lf+)1Km7%=V`19WT$fSl8dh5 zNoUB3p7OZNw?PA(d0R-JJhUDApO79*J-wu{YiyB|_fHbt9(SgW0chzo{iv5T)$hOC zr_|kN9E8E)l@bryzdgoXa>ic%M3yL*HJBTitz*rj%1JpuNaT(t*-AQu&Ey@!Q*CZ- zx1{N^l!jhd-}wQBS72!<5#b9zn9A@bC~_s}8z9>?rXiw%DQA4(@kmVTx=27>j}odg z@OP03pc5hcbW`Z5t^<~Ld!P|L@OXoCb5nnrY+!)yGviLe1H{^Le$Y@-y{&*RwOa`@ zWO6yhgg_q-!K!L}HdY8UvT-L<&$3)SzpE$c-p*2Z$y9l7486*TpU!Zq!=hV^y^Uc;?q>UggEDT( z=$KSQxfv<>oNJ_M0l#i9R$8ut+>KG3=p9#zWLE0SD2`XrfS>h6)hln9qvy=@k{`3j zr1wiq=-_#;SCCy?v%O`B5lbnm-;z=XEpUM;u9EPTF!e;Po?B=h@CK^b86LwEH`9h(7KqT{e$nChJ6t#++o8J>}Pg|JjTG~xo z=HEAw)h%5{jeiRwbFK<8>r9y-$=%<`Ia@TgZOcE^7Rq(!#gayGXoC=BQ=qz)>c;t| zaqZ`k%*s<4E8=OZi_^?%$fn9#-AY+BHx>ZD~R5qp?0mJ7+hRQzX zFLoTG!!v}+#LB<*=jsQ(1)l$fG*cmtsi5mj(1sBJ+tB<}X6Vp4UpUf%H3dop4Z|NW z0Sb~fIz*1v3bN`1q|tV&9%`(xi$1OX>)}lTDiuC+oA0+{uBm4VV0h>!p)h`w%&^)8 zQ!0rP`P@FaSQlFn<8H1pr=v=qGND-bpVa=nKlX1rL&hOHpT+8uZ0`ya9@3mtZ!w)3 z$j)$EH=AHdE$@{P8$iSRU9hGBEq4(`ravwlJwDK1Mv?)n`6c))gnxq5+B_SuExtUf zV}93zHl5`)7vnS18*Sx#FlqYvxr9feh?H$2ap4seyB%rEci6E1YC*>w;q|>OrvW#} zWP$S5m*xjL`(PqTwVf z2&C~l_~mr(aR@AF-QESN+tA0nXO*k>JsB5<(igj6{DYo?uWT!7$q8$MOxm03VOY7B z!OW}zpYl0l-0mQ^mTbN|m^qSDt=NU*QEJxXwWS$$*2`#OntnS)br=Hof&OyGDUBrR z3ME@uKdb+?YzB3DOdI_kiHauLV`Lr7ykB@>HBzglb!e^f&5WwMb1HLMdUZNn-eM6m zLlxJ?8^@h~&`3^5K+GeFpV)sDV{@egoad6h$Swm4_&0VH2~-J5Q-&N zm7%=sb0soJeV#YPZ++sjOF>|+Us%oLR8l$XV742CS#_wa16FY4Dg)tS`N^%a^wmjxo)MnN z)gs0p2)GFVH?O%r&@C!jX1GmV)h1rF=&(?2d5*4gF!XrV%Gx*AL8DJPE>5kT{-?AM z0vL&;E2Sh3Jkec(n2`56C9?Okym{%T*;jdXXe@6sX?3UYV*0m^Eo<7|mS+>q?m|$u z`!%l9+!Gc_gyD(c6OJze?)1;gDGwmT9>3%af{iLrt3$C?<#$n8b>9AK=;+b-z4_S> zjf)XT1IO;jj(MFa0b4lvtEkxgID)Bsi4OG*}q|YsjJcLdOYpmkG=ypHE7Iu zvE9oSK0)Fj0Fb%2ZWaKN3_`MPqG|n`uNe3(+)Ilbp`4y*l$&aut6n7SX;QJkoqoY$ z#ignBq*4+;8N^Q{txIir0Xg?$Qimf68XMe7b1n}Is4*XJ%yF_?Jbs+x7*}mypLY>YwbWkrGsfSWm@}W(Vrsh z=&x%iPb;ePbvD&0*xWwDy=}a`g{Ii+fiJ1H5On#S0s`y3j(d5YtSTjM`f5HYR8O}S zP5zH{L%h-lec*|vniHDbdLScVroB9d!?V}lM|!@;^G+L&CV9udn7H@+RmGEYFCA;W zy#lbs32&b4s&0lvez>lwU2A?JF@DvAl7ZU+f2>$BRhD|=kvwPuBe?|Lv**1c%6dH~ zu>IPq7(G#5%c&H;2Dkob?060{j{hm*c~0_UxjpZO6spWA=w1?I`xV#@<{i2+?c#%W zj!st{x)PyW6bkiMa@_csXU|Le0{7+J%ed^=yz?sVb-)vcO%=+PHUq(Qbr+}3(D)GJ zy=h&r;qy@Q$xTv_>28U{Y+^kq&^2lcW9r#Tnl~BWyW*JId3?@$&FwMeQ;%p*`kS80 z<)l}^O*UA;0b$d!@?!6}pvTmyBJ@N5)Kj3vvSMiB& z0Fk4&pGAmwNH`f1atz*89^4O4z5QfLNs1Q(V`;k+?kj;=o)}viO&X(v32fK{-F159 zEJQ2ZA{zZwLaLau1Ha@Sp##aW66FxM!VwKX_}<6{i{g@$h0cY;jJ|#4lq$CSLIz|a z4Ik&2zjwN(j2qYizlTZ0)-2_wcAuES?mv!%Nbxep2>@+a%b&z2pb?`kV z85J8=;lPjY`@8?8ejN{w_GL+_yOMh2d^28>_kPN{^> z00%#aF);VPIi^HvC#!yMXVfm|C9-wx6`hwqOiMoMQWJmffOXj+Laa&e%NWGIrYs_V zn79IvNX}!pn*{MVWcB`#H^6X`w=B&IyF)&|9D5NGcXkCGIGglswJ+k3d(uUTjG(5sXsp-dCaS z;mAL{R)x}k3Mu>~G2&~pB2r!9*0DkCMCszNk&Lu+zrHpwxY14Ddp=KE9RDSSeET)~ zK>X%`?ruy7s*OJegY8{eNds>IlIXoWRS7ddFWGR~+~A91IQS_cmT|j&VpI3F!LG zEcCLN@Evu@&pMVJna@d^wht@-M)SWmRyC zYDQ6<7HHO&lHlx6P66H|_m@BXfo6KXwAc0DDRh)ZN{{AOt(+B5HEjpBTYP5s43gzrV?6YiDl*8roT!Lu9a7 zKKk|qBXQwO5`YAlnF)as2?n`QhvVOz!FN?|Y|Eku6;IB~mta0k4%=sSgsyElM}OSM z-v8RR{xtKPN;TDDSwLlnsQI+Wv26wenGU+y+tWBGYV6m z^%bmoYd=rR8aA8{S%qtA25WVGUTaU0b@;HD_voyM8Dx^xoTg{uxMx_FDyXr(o&omF z1Zgv|GnAKPGqq5e?B3chS;qDn`rjtN+iSX05~{e>^Zb&(tH4iIgCp1zr0~B?@MuP5Fi+el_j{>3F4Nd$4wQRUG9nwi=nLd>RBf8;+{AGJ$p~nX zL(ZLyhO19O%O(1+j_STWsXPOH(v zYY@ro$7RWAB6z8m{%AeC@nSZod;v2dOPwi%U%#UicKep^)cB3@CFA{0R_F!|&W=La zMS}=E2sW_h2oWsKfc;qO`rQbh@k)6bZKGgWo|XC}OF@?Zy2xH?YQU4IqWVm7i4|Lf z=I5FyUD^RnGnO_!jgY^q2}~^}+Admy1T3RxwTHO;)D@~($YX&WhX8_!s}V?a^kKdash*V?pbhFR5s^w#`_H9*M`=6S~}Z zKQ8eVCtWUXW{3693m4vwYPJk*As&+9H8A_F=vRAZ{Dxkesm+{Ign-!EKVkva)v>?3 z7JwGMV(D$J0skqy2GN^d(VWWjw3)S>yuz1XsB3&Od;Q4GnXR)^UkYvx+E1VPb>AnM znLc#u*QZLx6np_xP{KAV{<$D!NJ}&R3v05saa|THizOccVo7|UIe2oEH@c% znLlMvPLf-;fG)m3%KLSA-MSSoCZB~L_8xDE(v8Q0jRU)3zlmynEbyO1xarr{Y~iJlfs5LX-1ot*WUs=OzlWJ@1=-hAsMR8wT6PaJeklL49o-KUcyappq@aRd z3-zVL>uQ#&eEf#FC4S{nUR-&k)w83vkq(c1!(DF@J$=Tzhis);_$YHG@e)HKe$+Dd zOuWYEMfSYshU&wWA)lWMHPpkq2e%puI)WinXDPA8u^pef71h39g%9^v@nBh##QpyUjpYwL&3JI)c+v8Cj zUgE~?BYgqnR|#SFClH=-6M=hYX#E0w( zzfwQQ7@!z^9pk>78sWLU?P!Ju*{-3cIT! zyL|=SwOk@CgZ5@6k4YzXhVXX??KZ*ZV9T>N`%za`?h(A*uJ(;KABu_ASZqSE^Y(ZR zq5KLs)X?Fj_owCNO)-S}W4GyX&C&EVqC{{SN#)~6;^@O#hBa8{eVe53R29tJmGOi( z?y=r#U;a%TC{;@^uqDx!QTs-imrIC}L53+rZYrYXowvWGENNih;8hLBOMWeWwNI(t z39ehhGCk#{e6Ox7jc;fMgk8uMTYawW7;k#e%KLDJJ|T0~@FBz3Uo+Pj0^*(5KKjhY zsuni7T!NK;bR~Zg>YF8-=$Gxq_b*xgH}BPUSzx{RX_43wS~Vn4WI0L(1w>Eo*xHnT zaM!=oC(|&`a)^RSp-87Z;Y2Qq+y007IRK!;OK<5l=GLXpKSmv$LkMx~ywZ7hBeFm4 z(LH<07z?}A9Fa$g5pWd3eKg1|5s)x?P3+#6sL494>H=-2wkSs!-0Dv@OVZmb9e~g~ zu6ik9En8}5ZswC_4L`o&P$+BQb)s9{*qD8+A@k=~{2A7OmSr_nGPeM{g@_~*p{Wr7 znDVxe@0@{(wZ5q}dM9<-NSyoK-NCiD6L>ny3&PWyh&)Zr+u}$^;;mK=2rCZ8OyIP~ z8fl4h_i5g8A-SI1zY%}WzwsdG(K+a+A29PcII_fpAwJS)=*m1LussiAQe`7XB)m5T z4^&I?@eBD~LBxRIgo{iiwCk>sgpb@jZhQovvG^IT(*X5<90mSQ4R~0hEODU1gigYA zbMeWr^p6<|!I)-IT9=62EL4~RRsG-c4Tlw7To+rfgpk&OV6Ze8)eY6fGx#BsoylCi z#R%dKjHT8h#wcxd3|5c|w>5K+mGz(DG6Yo-TREhC2^t+gRrK$to!LwqnM>$B7e~Q! z`;r;(VjeK3U^433os#4W-{^h^bBR}NxtdlYf`|~d_`nh>krao}rm6;;rg_9C2Lf@i zNtvb&8R_G3=U?bnk0kq(xfaFJFUI>M&1H55B6P`!t1nEQe!?}{{4Z7B3I#5uRHk@5 zAm8|@E)GYAlld?kTtnz=0+QMKFlULMr8E^WNrnk^F+a*nvqz_f(*n~_*Ja|fES+?F zI@!fj`9S$B68>;06z8eU=l5>r<9LKtEv)({e3o))#VoS#&_3%R*t#Uc^C(WwHcQJ3 zEIzMT1VA{n^0-|R7B3>aWwL;|+&VlK)t#(s7?^>iK%FVZPP#>%>{hl>TJy|iE%8#a zoXp4qHM#s(bQ$gV64-_`3ziHclVQ7o-j-<@!54KWVeHLwx4;~^EXbk(6en1^XbhcC z!#m#EC~BQ!KGI}xma_~mg6plp`~8WYiP^f3N!ldgH>uISk;M^mEbRdZgD%*AKbdtH z6RSF5@8VMhB@1a|;zSpw`(s>j-PD{p$#dh>TYg$&6y|$WSSKUGRR9(=1{1glzkE6F z*~NS-?DhX5dCIi-e9^=fisX%`vWX4q$eije;4+Pthmw<5{SfO91-j*mkqbeA7h`my zsKs!EV~fg2IwGGDQMHiw+1Gib<#NDWG6YtfP9YgN-JYt-`=Xi!ZM{8zAP51nH(Z$L zTXHNvI$`|3m|4AU*rO^5sM1tgn%Bo0NHxkNimY{*F_3;oAsPsoxEs82x0Mpj1OqGt zU@~(6w>rRp1V63w2_Q&z$CPIhvJciOr&N>w%yD?}BhOn@jRK1MrB#hBRjXXLt9kQ- zX%KY0AQ%8!mqPKNYP&gdSY%}c@&>vg70H?PA5plKpY=iMy%tlL>-xR44Obfa?lt87 z0E)n5lpypnOuy>BVPt+N(hpmD8{zsOu(kXT3VY@-U-t={#bAxs`rQC#M3kI)iiJ8v z0({Em*F{01`0Fm=8Ga`-P|{)SdoaK<$4I~@?egsdqWu{T&L9Tlbq=~x;_sAXc@|!| zTGN)hb|{EA2y-5gGey?BUf_?*o1!%uG=F1B%{H* zp`n$Q;^7o`i3WLz%ClQUf+z(GV&RW|W(Q~8t37Ps>Za^DsfZ_t*@N5P zENc;`bq^}+HtdAryCNJbdxHAY1cxZ16*fUCAEB7&5?D*2d+C1=vGc zjqs0J=a8xvO^s1)3-fXwdpy&1(8_Jt#Rm9Sfu^2Ps6M@$O+)O_^g+fEA9BT&LyM)E zzft^ZEsWX#t%`h1zzTpiqODqL2?uQ#OY?~>m68H?EwPEySe^hO)?I8pMinByNpWSd zn`dUR{mrluC!yutVMXKXuZL>j+Kp%}K?j{LPbDt-rp)t2^Au*LmnB+unV3Au+PyA$ z#_mUi0=1n$SBm7UJcI6>oV@~6HAMACI*cg$pq{BqwE?QY%sxvj+1TQe>EdDq^;KoU zbXZtIYhmtd(3e1)J&p5`Je1=q7DUZk>g^~AxcHu&HPo6gjpx3RiD0z_Fqsu#aLup| z!{{Go({cu;bttqGcDK~6tqziMyYUEZ&Miv_=J>isz*Fv>esgAmaL#j>O3hT zM282*Xt3`xXnv*LEj@ohpmZye?PSwR#FaH#Nh~pvs-e zwZz{D$8+;pJ!{P@2qWf35Xc1KE~A!_dE&JLJU0~8s(mOp^l3C?uw&$a7IH9Vgp_xv z83wWCFsVL`X9Mj$FEi=i$5%BjcQHDNE=@zfMr zL!r>fRi)dWcw6<=nw5Xk_TEN7FtpUP6_RWxxCcq$>k05$YNZ2HRP%jlYyD>+L(b z7WY;f(PC}pdO#G@AX0Q~HcOSPuc&GB5sd@i~{EqLYU!g6Th(EwS+)O-Ddc&_sL!#XD4&^Kg)!b&kc5w zZ_lG^%Z8Rx53XnY8!+71kQM74p)ADQ5RGP?;mzD=t8D!-PqRW_k(`(NIP#<*Q+Pn& zp#w0@Z@om`ST|_u;TvTUQe-JrSeq-7sN|Qd#=S9Y*=lWB3z!=?6mG6Ux3yl6n+Ne^ z{K<9QX#90DTM_VbO=z2Ultu4_Yri6k189YBa1P5l)sA2h=x_CU0~M$p?s+P%AG7Qa z+K9BAZ_OV{seJA0*)u$Y0R4IEN7>r-dT*`#0aCW~^s}5j<()nXQKSbI0X;FI(fQO( zw)K&Fc0)sxT0OTCUdxTLB;7`I{&Lrz?5c~_RsS{qtC#tndtaOI_+2>cQLEIJjK*Xy z^wn+NdVT06w(X+cPWG{NlYa5{K{D2AZw^8eDa20!$OXx&Y?tfLJDCN|+=gA>PHH45}>)y zNa4Fu7UZcpxubA62F3ZwQnKR9!CwLSeXARu*I@BVUEDJh0mxNL!lG5>S3u!_!t#O3 z>%)X+zQ-Fi6=fDy(0Xv$OQFS=5yjwjq+ zdG0XbqczXO$UzU!1r%O&<-om#R{8A`@|ER5wNYie7m?eM^Ic=ubDqAMp4z0Ecc znAbCeQUH%u^kD2DAAdxv)w3PJGqBy;(8l=bOO!@Se9h>=8Jb}v<>kawOsnf z!~N~)`&e;X+RZfeO1lAO0~baBx47D~?;b}cYT zI86UhHv4-Y{qDQ$Q2otFa{x{rgaEYj`c;F%i`YU{zIkK;_YF1x@|9{Xb$5bUn(cLX z(n$EP3eT>$hYA1QF#5wzz-i`GLFm3W{eKjlc{Ei28^`aR8DlWa7~5csvG0t1tc`um z7Luf~Bt=3cl)iVyE@aD+ZR|@W6{2;lA%&6@YV49isZ^SNe*fNo?m73I&$-X%dEU?K z6(S%mi8+HP7L`&_)6mk^on`Ai6_wvI2NfSt@-uV3WL`^&9bq~aQ{SPBzdB2a7Y7^v z>4~Q&CZ|^I0s?7fB`$dhyuqb4->I#&H*ej(o8VS+4vgKH0Hy|Hc`E!rOBAMi*Wf_> zJKW@E1*jrbOpA|d{|EZ&hA2y3v4@pmr(sNL4}?kH+_d5iw7D!cGy%h&l7jG6)GQtr zIb97vZSEB@`=GC!z~>+U~Z)^vUgrycT5ViGsh zCpa=aLL2N(6_kz^KR@-N;=J)Cb#68xSKN8{{hW66=bYpt8GlXhZf;B-De%l_EG^b| z+Xvp@4bDrP8Yj0M=DXmgeE#%@P-}N#12G`<+@HbB8>YcGOid-EuF<}d9KH19iW?s% ziky=BsCMw5=zq^$uZC~B2`p@(spDJMqBGIZpM<|N$4djanX@mx+z8&?n!6MG6$(Se zmR;!Kuyh{>4P}=*h9QuO1k~tbz62PxHEef5t2lY2cPuZvQE0sH0U=CLbn^=-3muWh z0`HnW%pKttAIe}{*A3sJuFPi!AuRY@)$;`R&Gg#J4aB==@JMEvBJ7f?Z@iS9&m#v9Dn}HyYPc{V`#5QpTA>BB{TgwiyDifs~k9} zNWAVnZ98!7z$5#u)xyldJQ~K^C`qc?MaDx?bjF1JHYfM2&Y|;%sokuVYsH0d+qxHD z$`>94!Zq<2x6--q*~O?7*#oko>v`$w0T&tL2AU$5(-D$e%|aLWvvJvH(#Nkn^Op}) z3O4kn$1D{M(O|T|FGE&)6ukY_d&DKh>JVj9o8BOk@H#}WU3Q9iZ|z@eP5eKKS3G)t z@#?#^nC!G=cazL9Ltd|?*O=GF7p3M`l(NkdKWgJ!7T4qHkKXmQo4i$z*pDRGL};z2 zoZ5JDk7z4gG}|c({HDbhb%}4-kFVdTvj1Z<_?gs!%PRQ$!2G`cuj~bvKF*f=H>HPF zG21!)f?rOAZ#4>1frmf3BOa`=T#pRr=UmLZ_la4Q%hH8BoF zo;NL*_xcIt9}9@+1lA>+^07+Fsdvl@?$!70HaEQS-YnxOVRui!5dsr1VA4a)Hc zpG#5kMqfja4R;N@NPa!((s5MTuV_Ol-<(kat1#<6@|^jujSZs!;w~}XDo=5aME!1( z;J#k>fQD8+c^2=)Q^|TF&uoZxUOjjRs;BDF1TeH!F}eG84d3ZlZIQD{dySFw?`|2X zck(gcGJKSAw!P=iv`&Akz~-Ct1c-bLOKhfiw+UOq`6*rf0>4`2IGqVv>3#4Z@>Ed2 z)2f|^>9#HQnX+oWvpfFCGx*s-nr8X21_6^H+*EbsZA~38{dl8~T)5!?<<3BACR>Q? zfrP$nx_R**u5DbOLa)zS2>-lbX_q4gN8G2I2@i=2zn?&A&CBFx=TyjQov_srNTdWk z>vJLd^m&n03ZZxM+O2sScebL?6&Dz`Yzi{gS-aSm`3x=Y!~I^W$64AWNbAU%=Pssv z$DH00xlNMxyFZG?H&`P)b_{Sj%_rlcR|ktOl_Z_CJR>(sKcYb3c8YST%VnhT2y4wr zpSFQ>lkwef2^N4mwDi6%7PKihO&(a$N_czU0cc1P-5T>!OR=}ccZ+` z(zaU|ksbguo`;wNDD4xW!X!vAp*|8)CkI43?%DndCL6#=YN&>e`-tcXk#ecr;dQ2} za9(!t+nSz$V=H;halOqBX?;#rY-;O!PCjnp%*TkkJhLv1sx?ozsQZ(Z8D2ZWpiGX% z@i+k93409=CJ(ybzEIt*pLjbCKSX=PR`r=$pHm*szEYbA%gzLmW(BMhUuV5KR?p3gfW-S(Ri_kYIomz-x(6sXEh( zdDkgYRy&VFgH2H{C%Ou4n?KPgYPzzDqN1Ox;AGh0H+1e|O~51TPEgpNdbvsgWZ}2X z@;P%0;cp$8C`%yG@;)NY0f1i`qMkCLm7-t=E8E_j+MjfwN8Ydv;mvx65~mn}kSGEj zuL}8yS(o!{JkOAQfBF5qOdjE}yXyh<)*hYH)I-?}&N_M63O|EG{M=#LeNGc;Zx>8& zk9}B#gJ2$kNKV)nLuy;XnMwPtNz2t|CY;quJf6ie-qa>T&3A58({B#W%+( zzmI1~7bGv;5#Z0KySTKJoas$<_NQ*EsMZ?t zQB$ZK6KPI)pC1)d)g3VtW53SUmkZ_c^v9ZF_2zGbmw*`oraSVM7Fo#e1@~=9jg{JcNsB`yzy0e;D;L=GnJ!IAWrUwZ@}bTR=|JcG#-9Z` zKxN^`R$e&G{Q9NVv$!4g)LSntUSuk_=Tu3f*;l%+l%&bu|HgusA!y(Gu-va@=5ad> z(z16sms1=wT(3rcMu)I4Nak8Kz&(}twt~8^I{P&K7Jna?K4X1r$8|0(z(L1i-~G#& zXsXZEWvfQ}`l$^C*X2s2p%%TM{EnQdt3i>5~74=u%t4U@(( zertOy{>HoNR>4WvHD!6B$2Fs-ZgNQW=RA;mm-H53+?vEHM=t)3w|MWH%#*VJr9hTU zn(CAUvmv-=zR^~|O&vqHa;L(9|BoB?9hTSH0`Ut_YKgoX83_EiB_6)853uBHXpYN9 z1`5AkiQJ|NGs!&8tRY?}P=W?xY0rzPeQv5hLg#BYnRoDWx@59QZv9Vk?pJbmoCF=w z%Mz#yP(t&Ogh%l*figrazExIoiRDmiNec~Yfk9w_8_Ls0K9myg4dcb{k$JgPYruK_akTXmP25WL4KkSV*vmig0%OzRXOZ~Sg zoys8nWcDeKa5a6zP@;|&!nX71-s(D}$ZCQH{lgEc+)k8FFbNsLLZni?{A~otju?*y z+(S*2Q#3|Lo5x#FsAGKh;xHfFa^J~49&8eL!9!wOZqb<2Z7>!k5JFQ~(-I=!j>NcQ zpcU-o;)`o{Qph@(6t}i`N5vt4_(M)LvKpN~*VW@8*_ZQ8fNtg%jjk7vQ0ODAF!Q(B zPhoUFmX78pwo)pvNT$Q<`Y=7~vIFx9cdFEQgviL&;A@*AN7DYl=seSK*MjlK%DuSe zTqUJfx|LekhjT)oaQI)4E(X%91J!&zem$8J3LxrPpMq^f2TvS%nCQQWILm&|SlXigbV7JC2 z;N>>^KXnV8IE?w#SL6ido83&gpDf9ZFS743k}q2KnatIfoxyMS0s`CA!g&DNouZpTNafTHJgQY3r&iTCJTL0JAuYH)cp)u#juX6QJ#V^j6$M zi_JCa@6aUuEAE#4I47rk%MGWtU8?R7RpQ{b^!k9v&8kxwXYt6|a(h9m?@VgIQ)PWC zVfi6}?Bkd{?cf7hy=mS34mM7sDt78~CfjGYi>~OmGVCtQh3tCb*W4uvp4~0G0dBX6 zj5xdeQarkSHdtK-_IAv6;U(Fg z6c$k5IP1qHMa|#Z#CJ#k7WV$j@3}&~z;5x9Oy%|Vig6(!M413JQwPfgZE4O+OwU^Z zyJ;dq{>~Djfr$tU1QiW_(a~sSJojzT*?^v@2BfF7A5LZ~{dKiFwz@xI&F|L$VpZ?e zC0-C8?UtY~L3HvjarQ28loP(Hy7WcfSwu9m8|eJ@!(12ha!fFm?7#F~>6Dc{ysBV_ z8t{`kEUeSW%Leu$5cS_N+t@?9z+o;KSN;wmzd$Q(3uGa~aEXP;z6lT^q01UAL^kzb zK1RTm2GRoHb6!=P4W++w2fwokzaUCpbO4d&%gyo~Rm-5UrY@ZX$mdK}b@zM*A-WcE zv_eb_19)kmVauM%rhie0oGId8(tc2dO@E++p$-YaIhl%FeDQ?gb)XJ3GAddXwvgBfQ&R)EZKHLHH;G#u7-muoc4FmS|h>b_>YXi(O7 zYaXtIyzuvVlf=*g(i*ygK{kjyftXXapB#b$d}2mf^uw zillcdT=Po%C#vMp9x>Hx%?*z%Z_yWjjjMH{8;WKOv3WEsvmZo+*DYp=)i-cDIl>zEaFjC! zOU%dD0@5)hm#ze4_SQ8>#HkX$UD55L7~lZ=U-o42(P$QeNCJ8H=3TVCs276O#xGP< zClGsxCs^Q`u&$5zpZJrB=k8rf?MA5^U9G`;-Lfb^d#a`=pTNu&tI_4lDZG;2Eimed zgt==qo#&*$$M!7^yM?94s)amzF8+5lCfy>SwF@_Rpio2ErqW1g*D4EMrM|aY!+#HR z#IjgC0~7%I27bm&8EG^bxtNOZ#{^bu)HL8|%twHzRm_jVoV-7Wu)9`%byX!G?N5@W z#&>;otQ?bluZ&Jc*iz3$LoT!D|E|9{mtQio_;zio*T!V-?j)z^{o*}`%x|@&?s634 zxcK2K^lHGY2=np_4(F3y`ZDryezkVD0^kdXgn5LE=Nv=U4w2k{0w(D)LFLzQk%dQu z>JqeMxu+Jc8VVJ^jz^Ksu19yRd&1@>N1rLrVHUJpN!oEkS==-sJKHva8)0~YUW=N= zJ{UFk@5s;#ibO0c((j63_(I`zN~_HEYKKt+M^#?vG}YS>pLk6mZNW~cvA$*pL8Ko0 zZx|rbqCc@D$IcwTC4u*Ub4SWT*z^9cRXs58-Ct`9VL^xd((zhQvR&p1B@cf?qq{&# z=A+M$;}D5^mlhDk?sfc$igg!&;f@x?;UCU1vZm8HQ;8j}V-2iA=l&{})S_Aq`&s`^ z`K`##L(^^PP#3->NpUPLO*fft+^`!A4z($alv&;4(OQT{~|0j^ZUu49Mk>h`{Z3SBxSCrBfnb? zW1>a4%bbA}1C8<<-E~m@XHt!tj3Ozn_w^4CXOs(Y%*>R~zJ(CWG zeidFNA}c&AvUXOUL9l{Ccis0bKl4w!OPrZ63mVsnH@EoV=;_qV8Fp()sI~_V@XI`wx|vDL&d2t zhgF8Jy{q6V`yx)SyRs`2OGAWedtB=H8cafr+-S9?ZT=1VeCSf7lngiF!{T-G$C39w z9loekTO#1RA+XsgwqHBLJD@X=`QyJeAn>{7D7E(!)n%qM$Nht#3r$6ow)u^Olwf^o zqJfsQ_DGUJEOm|Jz$|+H57;sHg-Sl&%&w%%?A(49iGR|+RgQz00I+#+Ku)KrjGuqF zVRRztw`i}GV0sYx!Fx>}V+ox`J56ec|I?H#eNz_&^xdx}=C?k4`@`8sV=~`66ftIL z)woRf?3;tsMb^R_R^qilzriuf`Vw?Q!^|So_)+EL+6fny8=mk{WxN&-|gV3X)(9o395&Z9kTWJ6r1)aKB|hlQBV3jl0~od2SWNzz?ncnf|afO z5U1Y_VImh=Z8mN{f;Ir&?JVZmY93@I8lV5VZnWBW8!nJAFejMU2S@S>2rE+|Dv034 zL*%VHG)=BW(HDA#Im%P5mn`vn(`_U}6Jxu#^w68tgtT(mElVLER~sK9@Y7zR=~UN`zHQ_T9_p z^>;Ssmj>B}%H%SQn9TMieIT?h!$qEBc)mL_d$}h@fpx&W(5y0Ctv$zSY(d(*7?+oo`on90g zPo}EDg=@LXEn3(1R{V;Mj+qHA1;IdkkO`l)(xpMVe*Wq~l;0eY|pB*vv- zVNCjashGcZZ?S)dIu%Q~=33<$r$pNp6Xr=jE>p?FUB_Mb3A`LWUlKWllkOky7)U-Y zdpoD-sz`}7M#PV&8)+N6D2Dqh)jB{IdG9_`^Le&ksj2Skc@n_C9n!4)Pq=kW<>8}H z$?NUe3&%-fA*)05r=M@*9U{@bD}p^dG;W^3?Ue3X?8D6^d63ikiq}3wo#&H8XPk;a z1nJ#xjn1e(1OTf{RznHE!j+q=m)P-|5C41kC)I{41b52Ts`yV|-ecKZC%Wli;&B{7 z&jiGkD_VS(_|_uGytX)K74lHzKc^2s{-GJWW2xB-^EV_f&!qMypx+fM^(3DN){mO< zx``8#&Q zmvcw-HAgRwWj`azVutvcadW1Wzz#~BB;wcl9PG+dEcrN&`6SMB`J>SI55-Y8@T8yB z8A?q~-&gz4umMZKl_=)V4~w{yn@fqu8TYLyt(2GC#J|s()A8rpf5~CAQd{ardLB>q z^i_QoN;;!>QDzP)z{sg3olTT?mUS?3$`>!Ym&zGila#&f{8tArK?v>J=YPi68Ikia zN;5V#|_%5%)5C)xZSoY(IJTml;7vevbd$6|ROPbb<; zeY-8Qs*&u{m+5e}dtdAv66h=)*WkU=qttTZatNowAEg@8gg1$$9gR~xez1AlCEPf-mW5VI{!#zoB z_jQVxN}8>I3B~UHOV8XSOC_7zc(3JvJWLZ?Q2u;UF|{6^??D$R{?0^`tPk1eJVjk$ z*Wz2|q!$k)+q!v=oRg48eueC>SR)JEu-26J5h1;|O_qVMYOCs1FKN9yl>HVKN9dL# zmpnE*)NYe_67Pt;Yk8$$9x8vaiOH!m*LB1alh}BG0+A0LV+6_5GOB@Mm+YqTvBt9! zhendHq2t`=mJaX`-2>~t_;7VyjjqBB=ZR*|Y4r_mpu`pxM9R*NdWOp9t0kONjl`04 zigUd5dUG6X#%~pT6>3&Fse=2elrjIE&Q!kQy&z7ADeboPq~%V zelt@xEa^Y|PYiRdmlHe(Nj5Nect(>M0{%HL0aCY|cUy~Ll^Y@2al42UiHUwynnuXv zlT}uEU3#B2$RM0k8umIZCw189sN0HO^Flb`6%}n9cWm z=lqfWyFQ#Rk_QebXJY(QtTe4JB2lt3itxrY(fe*5@}9+4W39D_qKOB*JVPF*nV%zs zwC1T5&^k?X!Dhtfatvu8PsU0=^b4Qz0aP1?kEa0_9Tg;fcCt}IhK1_vO%x&|j%Xlg(G;saA0^vn7rzrqIZi`c@K*M$hA5EO6h9rJ9NRUu;hw5fZ`Au|hZ?r45s z^#@&BrxbBT`2MRSBo+)y1+M5UMw>Q{)IE1AasLn?v*Ks-yJh`Lx*DBZE+^|h%gEE^ zd)Pms6jXbTA(C(4rg+R*f`el*hmui@T;`@v{e*> z)B42%u{x-@_mJjL3H1ZT5e z)4jswek361b3|Hxm1Gs8BKi=w^wX$4`{_H*jDZZJz3=$`Gr5P*DMyMMC%@J<&W_i{JW-j76a z_&n5otAu^uwA(T^g*Zs%7H9p@NcpqXoo8C6vNJRA8iU!>iO2)5Cb&TY%X2Snm;|A) z73?e)I~hQkQsL@U80sk3i(WvU1uviqG#8;Ei0#P`DFnXp_XuRLV7oLkGL<9P{|-uC zImaA>juKnF@LWaGrV@l1tjM6K^~eXkwxZ@6-CpUmVzYG0pj6PzO92M3Y}ONI%0iU^ z2qbKyoQ0C_2QN;`p&?ijfVQUDZb3X0>Y{ca2c}0w6#!^;V#lUGdZz*|Pu-S*!;2xM zOTGI-*~p$M$xDgR_Oli9MwnF7${6m zwvqf&O;i?}N{5l>8JCCXBgGca&w;QcDw<5hWCn;|qEB>p%e*BKb`Fo6JEXt9a8DSN z>yrh^EY!sX$_SOmlxpxI5&m+%eN>ODd-7%Aif(k zg}f{9d!A69Bw*7f036%{oI$`y4QS5=r_A#N%Y?LAzLEEJhTt^wrd1GFCKxwo`gg+p|{n@1xrvbCLRnWfw9mQfagW_1NgLhovM4}E=V zowEt>oRzV%uDAPv5Xhv$oaX>N7SHza*gUwtY+XY4GMzz8Y@xqVu(bHm-Olc|^sJX1 z1oV_wCD_2evPzYt9EXTZv>u>HWTBWL@#>}Uf;zG~6l}11a*>e$Q;Z$n%OiL{JjSqN zDG?~I$V98bV+@BGmqSCnUjEZ_gV{W*N+1NC9~g|Nb`-Neo;kmI%=55spm-r{DXWEk zWM&yfJTBelLfo|iYGp_xEWYejp-tB9rqHUh^w~qs0?^)ch6QVEy17Z^QD+G&vQYTY zA{gw*G21ZFWZc^J5c%e6+sT>`%X7cL^@~mQyzt8T?uCz{y6@KLo@<6X)5gKidEA-UmABM*sgSjbP&$B95QFB!vD6;(|HK=Nq_4@N)aAy@Pivd%I>HS=^fVU^1+7sa# z4q4e~D|<;7-w&+#rGc_%vecO6e)?f4ERlt+*OMx zUtq2&qB7^fb=BgNN$ZE)?x)l@rLZuftgEn>0tR6U%()>|4(vGs8pR<77JL57gjfaqbYI%Lj)$x1(jhZ6)4nKmZxym zsbMO{xCdr1GJer*Amy%X=rV6&cAtV79va}WL>E6TL|S&0Yc#cL1UG+{ zrpt0&vH(pZKJ2kIDX^3uh;@?H>hQA<21CQRH#6cq`#i(Xr#A!dtWYD@ZHRD?{YAQ9 zdYZG2QKin}Gun?@uL0L$5pJ37TMk2&c{CbFoyd?8aNS@ElhFNbNMp%1zaHb*-V#*rJI2`S1Dvcn`6;~2GOD2E8R}|m z=W&|eE%&R_A$KzRZ*P>F9X+cFE!kd2pZsFsm&1us`Dd`gS4Wgi^NqD`xtI(8?d{Bi zU~bO)9=|pRjGg-GJ)V>+wpQ~^&CH4Ef}l{!|eyI`9iMmDj4<=OR>Urk#s{!L$G z6UrL)tvwTd)|ed~DNB3FcOq%-hqXw+8YM~1Dowj`1jrX>ZOp&>Gq7gP^5Tu~lGlg{(j2oHWf=_T<5_-1s z(v8vkEvr-*CGw0CIu~ZAN>-At{Y9peJ^A!`c;Ya0ocI}2Im4{Yi0$(b?2C?l@pVnM zHU|w0Y}`8tn@<$JNiX7c^lo1aJ!4iDR@DQ*Y4g12b(*)RU3=RfW9U=VZ!xL|lPh3> z1v`2IEe938y46}x>`j0{**-sU;0IdErFbGiAybh~3CNv03#qrEg# z_aG(TPPWeLs^&!XGQLS?KC6Gtdm~wIV!mNZ6c9@NfPR>dy__6*(axr!KDw?_W!p|; z-@0e+8KVN~Vo8({^@hS5j$^$;g|T5{|4ls<;r6L4VV(7FE@)o4*KIV_BB^VZ$0*-R zTdcv%4e3QHY7hy=o>d%VnY=!ci8`}ea_%uvN6w)AL6#GkcGmUXw4l#-S5>jg>9B}S zZE5v0%{Oinitnyis(BL=-%e%-A3S06@)nK_93syvklvwLLo$Qh>4M{WsV&hUUNtsV z1?3@z0#H~3Valc$3G&<*9zCIdy^p$hf*7n8jOx<@naA>$4lAS&zK%Bdpm-~KTv652 z)8)M9)fa&a^!alkl@D>&0w@8mYZ;yv^+$f*41T%+i8jX10nJ#zC$&G>GshoZ8=YRR zx|@hRv(>DPxWciP?Ro+1)d0JBe1W65SAMtB*6)Z3Q)S+Cgwht|V%HOH6`*1#&R({6 zF7}PvkbO9QTek1*$EqH5@hZfvgvzAOcLS-V08bhVt_*=Aiy-vH_N`0U^#K%l{{T$y z`aFcfYjvejEk^~=ES|x-!N5zli4W!yjzl^G9rB!}11}ftoGUL|bzA1~olG3aI;f%p z+ll|%WF!IjDjJ*UUv65BoGU8^Z&Ker8#^5<8W_s*YB0tqSf?XOLF|fMIdsCQaRWmW^Huq6I@RI zi+#oNha}Z*o4PUtToZP_!_fJ-8a;n8DrM3t>zhN6?)Zb_dr*>JUGSd&T;%0+0G^RQ zmx`cEvU-*3=_pl`$yu@W9Uny|_~7X?G|C0&+s-hkYxr=%;3*Zgy7Gj6ton-GCnMIq z{_9UJCm(gEcgvNp3=Ow_O+2hdM#UENesOrnm)LyxqCw@66A^3I&YW*5+gsnDre5V_ zm_FPbk}h8Xn^ecp7cw#@JI=M+5j&=LkExeB8fZGiJaonP!#kA`Z!&Ch4vbfpt%yt; z66|~L4x_`Te)s)KQGgyfnK62(sLq<#m#IycxwBRu9FjeKbM=LvwcGvan=5gB@eR(u zZN0Wt)KxO8nJvMom8WT-AS?v9FMhDyy_J4>Q|C&-GP&@t}8#%J5vTgzT`u75S-shVpmlapAr_mCuqmUF|V&kY5J_w@*t21pPh+aC6f zOw6cPk0kLNW?RpzpwtG%z0MgM;Z2}JSIvf_@M@Hj*RxBXzyD1hri;hy70vKPuimUgQC=tNj+5tX~7+k2C_r#6Uhtd`b4`n-42TmvW7? zVb*XiZiKd#eF}??;HT!K|Tl$b> z77E_;CbM}dI!dI+%KGhrgX4$a~HM%9ySzKp&0l_|8~h! zcyx+#4U*`$v#Dz82gU+6`ccbl$I~!DTSV(@Afj_A4UU*5qxJZfwPA<4ue#_VZDRM&1XKIH%MpO(MBr{927pM2`b#vp)gpTxP7+#8 z$jQ+qNOUR~?nRjHzL0alJ~w)`E}#8Og_?J_lt9E|AON2eausjw#vF^sYP@Q(aB5TX zFxTq$d`!rRavpU)x2uzn>#-*h+dFmj=-A-a?eq%ANPvzz6b+_nR7+f6Q$*QD-ubrW|SzU;WsYkrnh}Wm$>6Em%iz z!B)``yx0RJAaCfZjQ6Msy`5avXLPbjX*fWUt92~yWDohpBH3!6ZF(x<;%^=#J}@T$ z*;<+iQu|=9jU&36#D5gDJ0zZuD83WJSP9>LFP}2ayTc#Zi&;sc#}_=LobLNG_kc$W zZvQJv1#z5*WAe;!73ndK8! zPkf8%jF6-vjwUFXM`VClzVlBn|Ll)Zw5Ddp$$1-E$9}wZk1$I9a;`6Ky=L=LdWqkY z$De_XU*-v{fK~qQU(Ot?%-_5^W)2J-UFlBJQ_Fht-_5tD$2Z%+eg6UiFFAIO6sH}8 zHGs@>Fm)P2>m1{~Jiy2&F%egv@-^FY$IKbIf%cIW{Dp3g@8A%ZZWL80Mj^3;D)XOu z(RE94W~4@+Olx*SkH}+kYQa=#Y(1J>7RXjDt2x9B<$+Ud> z{6G!|dapfx`CK&)n6bORlyE!hNwLN0Jb0(j3=%*`mWVIy$P?wU7R|-g$Zy36;gc>W zNrXgz=+)!&G^?*RGZ4xIX0REVBa6w@6UNsD z-2%y*V`{s2NAKZO#3OO4*pi{6w|QPh6B<%^B~pRRa4))v2ssl=vVM#GitE^x)^Pwy z;O^IhI%&=jQr!7u^Kqn05Fj|}^ISnWU-&5xB)@N|QV(PSa*H9xCEpyibF}o^&~=7I zDoEF_JUYq71?sQ6Tt^pK*@(0n^~I9MbRwO*$(mR{=#Tz)C-*~zD ziMClRxCV?0ike~2c$MDbDVB^VEEBE^cS_-K9 z2K;KBUh}+?D`r|}6u1jmyX|2(CYmmk(5GRL=SggPthas-8lMj^b?mGo2tvk{#@-J$ z0ffSQvtjGngLY9mx2YPp*K0Z1q>QSnBMM>u`j(6>G_!&g8nzBQj1bCv3Mlfsa?wKWpN~scuUjC5PJbW?SYp!HyL=;4FH?N-v z1{nT@^zoWdg-iig9J;xenipAVb_99d8TN08}V^ZL|TFN;SnTMMLm zmk2SJ$xRv=XVgrgZurT=3Rp^h+Ya`yKqMJ1-e!p0&@X*^>FfI+FK9>#%R*pGZC0%q zXzNb=qMm%s<+DV0+FjYbC6Q*#CWGpogxceUKr{In&y|#vyWI%nRs{YAfWSldYzNS~ zgy#U--3p%l6)D7`BHiXr``Sh_LBD7@u1kdMteiwFMHQ4A`)C*&3FE%px%b;XWgSI= z3!#E(^r<&#b*4*#7@7=^4;)oIANbc;L?eS%xJ^+uX zsU3j@A>i(;?nd++NVo}bQ>ic<6JTg_An+dy&qDmrvJ!Fz8Rjeyy*Y>7h!eN7f}U8C zVGSd3>9UsJz)R0^btGFRe1Y!AI0HtqO3EM~1uKqhg#_I?bKk0hC_Dri$|V7zZcv8d z5m>{FA!|Q&Ixh$csM?;x&`D6*^>9Ev>@7kEbq5i|f~qxG4~2}{-}jUw@D%oQkP5+l z64tW@n1~r;s7>${fSdBo{x|p?Cg9fQbf6T(OnpU9J@5X1CshHP1{ci%;M?!saQi@T zYd1z(s2kGI#-rnxc0^Z{ACC^UJ1{E+K$uCK;&E`HaHr6tRC|y)zUKUudKlwI zy^${noHQhH5DKl6tOSF^#LH|DO^Yokv4EW6yYDPVr^17zAgWTK3zBZjP~sGfJ7FHqy!?eX zmxc+UcCR=a#CIh_@q;KB6a2u|Rc z^C&{jSrskBwjA`x_*bgnSdnG1J}&K1Ic;C@A=VEkhB$OJ_5c!I+_n6y_@xl)^PdN> zP-EZ*h5HvbE_AQ`M@A@XO@y*C9W1!F!O~C0b-GGOpL>MnyXS=@o_yLjc?Q@p0qJ+C z2~#jE8F`F)kK0~Hc;=Cjuf@kn zg1vC4`*2Q=5Y{@*!AjTH>P`>1^GP4Z)W0{aLTt47tA;1sFa;?R9AT3-5lK3QnRwSi z@=uS}?lAb>*XBL!l$59bdIo4~npI*GeBZTNw+ZwC@oaY4>0@L0eoxLZ}ZGjTex2A-61z3oK7 zfZ6svsolp~6L}HVqQS~`NL`RSXP=O1&&7$PU|ou@Ft2$m#2?nit>>7w6yj%5m7K#KU+ppA?@JZr-h43 z1-n^s=?BBt3LF)y5gK>$Zj~`MGakb_Z-(nRsqj8is7{g)tmz165b$(46}WZl zzWb&__jYAm?d34@PWLjvt-WqUER;uZ9+Vw+ew*UX1MjmOmQ|tZU;*FW!TuZd1APUN z*lIA=an{4JULES2aOTX9IPs+3k7ACDT;KiZ@bLg7h1l?f3VzgcSZfoy zMXg$&&=9BQ_nKO4);et6$Y((#h8Z_xIAK7pAizbX{;+oZS)1RJHmW_}?}!N<5l`{A z#XY!0)9+H7IwN1u!?vd;?4A#D20rDSzI}Vb!d0%0=iB82`}N&il5=ltsZ4$x>?(Q0 zHP|ax>fkx+sV-ICV_K|BgLVm|nX?Q6r1o~xvG{~lq^DU!+v{VW5q`5}&mECpx=FMI z#w%Q6;kd+7e6M91S&-rt((d6Ul1Va4rUd~!1(OlHPC{$}F6GIif=^Cq?8`&Ei8q5q z?Qgn61&YM)928MFnFVWC7Dlw*cTIooFZ9&6{osZEHxI{T0WMi*X4PRI)8zU42sh*4 zT^DJ5fmA|ycAZ7(j?;0oGCUb^x!Tc%a+PY_Vtk@UN%%HkKh;QndwzfAwdXQr&t=Hu zRE7DHYqwz)N4Su(iF-Fb`aUT!JiE~UGCA)duDoBSQD3G>Uxp0$eE-O=wI6o6?=|J2K7fl=j)T(LS<&$f=uDz%hq>^!B?WZ0+&`rdM9`mM%Qp z$}0>Wc{JAgb|c{MsWXQK6%MgVq~I*DULGjj|JEO>Pp}w)ofFc8+K=2|soDGWo6UUU znT5^MQ`#>R1s@zB>op811V1}WQ@)pAVc78evUtwJGy5OFax9;7&Gw&?>3x2Pebcw| zZ&iQ@)H8&!iiA}yA&=}w!kLA2-Ra>nV3{s7Q9~8noV8V+h5dfd;rYNxe&j0k9FQ;W8|Ijfa8bl>e&<#bwihF#ZT+r{;=HWEyqxX4y!X7hnt6!Nyi!V_ z{0qx#%D0s}=GDySU$W*kmghBp%xfVR$f64}lk?gJ3%a%odfq{rnhW|d3x+8R6z@P8 z(RmQC(T2(;D(=+mmbnYTQ0cRp7cC7It!x*qy%%jl7Hwk|?NS!)3l|;g7acnm z%??*{7PM7vfj~J!!EHCdttH4vammAA>45E$r}vUq$dY%=(!rD^pTZ>%XtvA2le{t+Y&rWnHIL=c!jNs0^L9B=dvoE$aaRR$`V@jCr4)i&=@QU%8@ZJAbz?yk#X}dF9fN zmH&{dkZ9;RMtu+&&RcMIC+=+-9InfDjC)MQ*+Zd+AJu3ui~6ms#DRSJYHwHP5t~qK zpK4i%R>E0Z_cWX|Xt zcb6yB`#6=U`K=RaVZf{iJnb)$K;tWqSu1TJCuGT?FIVmlBINxz*b8DI37C>bDq29a z<-NAa@3m>8BToj`+L!B7_2q$~q4BC>fc@r<+XQi z4$tRr=)?*s`hATo>BRLSm9^I$1f`S9a#-2MAC)uS(p@5qw*t4bh#m#kq|Sw&5NYw; zc21qH$bIF&Sej(&rbm2_^CN_QX{gR~2%0@>AiP49a#KbSCCU-MOXWCj;s3NxTT(YR zJ_>HO*yX?=RwBQX8D0poYnX-j+mf8!gciHt}^;G<&2H>viY zA+I({K?6VAc6W0Th#G+qRMIG;m(&DW#Q)G}GBc$Hb{qQhOg}E)vzvbK1c(4W*p4(9twg(WK`z+7IaYC0rk(Hz8yFTp~P0Wsv z(ULhU2LuxwNqsMf*CH{pqg5WR(r%;6?jM@&6o*Tbm(`zaSIm`JjIO_L9N%$2^*#5T zd}w$@b>4eT#_@qF0yfb~pODkKrgOTAu*x6uL@J~u>dIH0aF-~+er+nQ5%INnqAN@x z_nEU&#pwnfyCMk}m!qf7tDauoXmFPnq%<_raN6YaeMSPeMPYX$isEjacfZ1q`A3Z9 zJ|0Z|;e1x|Y>dR1r*w&rIwOW?|T zTJlz=M|GtvOowIuQ|jsmqrxW@mI_I4A@y8UXz!o_S2*QG+YCpOYXTa?e=Hwe3XrNw zV(!E1vX9)(B9*WF;(~tBJAPk(`uoP4-#1r&xBUEli~CQj*#9Uy&!8s4sNe4h=tabY-isnd0Ygy`5NRq{6MF9mC~D{kh=71d(a=GqNE2*?BBCNjM5Gxm?|tt( z@4a*9ez-fcv)^|1nf=W^d(Qcv|JiGl+iTL@dt$NI?7G+Dzt?(Y?`h&*TfyG5s=fB7 zdmV#&op1NLzU)2!yY~XIPvhV3mfP>q-S4&7?{nSn_un75vOk!(KUAHe$1 z{nu~zN51Tj{@ou#{2S;0_eSpDgzmpdi+@wD|EB%_&0P8SHu2x8M(w>bx$Pt_Wd~qC zvXD<;!5m^XN zRyTA2gpH()8w@ojl?`U%OoXJva5OSpKdw)Jk48&MyEmF#Z1tpaRt7?8YS>;$(Bc<3P`8h(E}K107#K>-PT9% zpN1~Iyl3;Y{$oef?{6PpJ$*d?f(&I9vu$fw=uP5Q@_OCYxHOn0Wpm$F6A4J{zyJ*Z z0F)0;U=_LwjX%7yva<5<@CXYFOG!y7DJf}bX&pIo#MIQ(#>U3k+1bOx!_UtzI5;>W zBI5e>>jwaEz{YmK#dRPod>|!tpsISHu6}Uz=z)#R!SUklqIwYAO7&7GZ{eHj@CiHQg4=?D4w2Sr7*FJ2tf)*duBA9Qr|_V&Jh{d#I@ z>izro2i@HVuU;KYPcJVoudS^eEG-@U__4XUd9bl@aB%nt|9!xjw0r+=Z0HS9wyJl> zR-6BCY!1kjnAo`Zg#Qzp{M!YEMR)EN-@E_df5WD>?os{YhQ_8R%`N|p4XwMUx37O- zaA^4DtJfo=W8?pY&D^{9A3lDXr!OonEq`A5@?Y36er^2T{Im6UduMlV{~z<j zNDcEputAGj|0gzzo-h9s8|!=4|A|fD$CoYtiH)dDYu((FfXN!qSN~twJZt*=s!%iN z)9YtXzKl^#QpN1ro4-z0pQ!a3X>a-dw!!z+eY=j~COMo5wUyuy2nJp7ykPsa`40K(EPLG@Iq<=c}=B<{{#xUEybSL1< zm&5_}xBy8_e488@i^Jgw092YmOpu#dWks$FI`)E$E(;o~4*cOO=sK?>A$wPl;RO)T zU!_&pY5YK}NgGZKfEhkKtBlRii{Vu5MD*PDYnmvzhQO7Ouc17MzC~BN4*l8JZ;<1V ziW=&R00c?%e{h{0w@QuU3tTNplC4=SP1E_dT9#$5__aLGCGcxS;klZxmBp98eXXJ< zD1NIhza1D@c5|z!=D|7(HVg6dMzm?l`f#*qX4^{5_xjGQZ{Hu&;7V%^eSAS{jYG1v zYfZ0pzOOwQH&^=6JmnJfqhnDp)^#f*AW$k+V?To?o4#vRu z>W+<>po^WGpK8^rj`kpb)~r0|cWhhFCc_>9vw?9@0$e2wLq453hd!pGVH(oa=X`^R zK3>_8A}+?+6K{*ee>%qJz((%dD_6EXX>^pHf>dC2)tB^xEE<;!VQfXURS`^3yZOue#tY<3O#$r zHtEW5ef?!DlucDx0D{CtjS~?ZdUOIbj{o@z1f$2GEs91lzk9e5eMN@;?FIh+;yEv(#E?phJ6VFMZRLlJ=Emk{Pzh8nYU@HaG;&zC=j zV@efVh?Z;^$|b`)$5^x-mlOiWDW;1{S(8Bnh}&ASnj&FRRUgbSrsKf$;Zy`vD1h|9 zTHDb^S<)kE+h|;`l^8uC_Jc%m9uO;KW|`||dDcA7Jyj@{*Rx%o=mVu%K+BLYxS}GQ*FwVm7stB9cZ0Z>~9k0zi!Zx^e1kFd*IWRSANl-eCOp zOE<<#wkA{V@e->Q0~sL9k_!M26`GcguY73i*ITZU8uo|D>~W4%ZpD>rB93+n@{y8q zDrRg3OuF^9Wgbk%&K$E*1bBsPJ`k&riLd`F26NUbiZ=CebZtED+v5+g2@q``ddKo7 z(V_1m7wwMhI_;)y7;jA(TT3-f+t1RWDkDya=dBr)DKsd?kqlJr0^9lWM_dA@!6)O> ziBr7X>r)SGjxtc*mrNo-- zUC83|E?aU;^l@mF@g)#ZSf~3+&k&nNO(|)lC^eot4p*D(%N?R1+MkiP;T1g&yyEMy z@3otv1h99Htj8HtByxT9s6=&4EQ`kSQ38h%EAr=wdi^7wquXxFjoyh@f}zk!mS&(~ zk|%`?t2*D!qH;mq?a=d`@l~@|3w}GDo2<8(jJs*L^{NQKYV4Fo-Mezm6yto2+8XeS zMG7DyiiEoscgPQXr zAWDBN-=UtYTQtAVf*L%l0)L!MtM_HZu>83Ys`9#FoysCL4`zacTeQ-JwE(KtkqL*w zEu-Z}aQ^K#fS>3{YsU@a7y7izG+A2PgOlsf;=NgZzrRhI8|wyYlutY4Ho=;%a&~18 ztvy)@q!B)V?>RnUSw}a6_uqnE=JLl=H>2)zw{H-VcDfCa|o%tKr0D&{|3_+%KHcj>lvfQe(q1?uF(VG?y zday}$T$X#H}{-!85ZCQ+#oGF9C5(K83|o37Apf4%r;9O94JQR!6{t1b9QXrIT1Yd}r-B^3S4 z&Lnu)p?x%*+76it-`t>e@iueMT)Glyskt?$nutNi0r6kO#Ks=P_{{%a zn}1UBP-2w^(MsKMOChfj*A-&`4m=YwoQRoX0ZNx{eIrn;$+yfP$6v=G#;F+3*$>-SBQd1;Uy6avTzbY2M^%@V%jASwGANm48~9s(0UTH0>qh) zs{}7zQ(uLv;~?zg;?KAM4Gr>m7SuKZ5R{BtCdD5i!~x^iERZPu1`8D7ITKP098`lQ;Ns1PM}0e0$YjchOSpS!Wrw=vA8kpMk?r40>8 zTcLpyeTb;M*SFP@b!i%8YjBvIIHEgaw6F|OAI}(HfZ*ox`MzZIu43DtM#}G?Sz)&dt{Al& z6LdC#Zs~#{5L#1_>pqP1j>fdPLZ!H(%SpNtbOJg_$tgiErIM%yK=CB~0$*ss320@s zu3DC^Y;&0Cl_NfR=Q@l{^!RMkzY3*9J1hJ}XP(Ej@msKw(Py?PMJOkVU!nL+h(E)> zDc5dEGq64pz~C)E7Z%o-0c!>54tGr1U_lZJr8W+F%t;l=*(~)T8n^>A_zI66FP30H zTC9Zdjs?i9i`t}0&eOPAWwzAD%R*d;_f=gv}sztKfD0(7zRF` zM{Vh2N~(@6e?e)}!G$8~rq;c55?O+3S6Hp2ZhVW)T11j=0W$JuiwZJ7m%0(+ZahQj zj7#=c0XTZeZIZ4O&Ei9q(vAf6t($P+ij=kjnp+W*YJnpRprjcOjv52(p^0@31TmU; zgZ};bzxQ*!q4$sg_A1&+2$T9YI5hU~Zs50B(BKYQbjU*Lo!V#4YaY7-YIJLeV`MqL zavZpv^Hq%JAySQcYH0!3jLucVmLl=REK?wRl(0C?1UX*Gg)XZ+`_P%D2^>dBV=aDW z1Cowacg88ARN$K+RSI8T=>)yX3xGSQ>$_}ROn+?%w&W%r;-LVr6CS=`#EXxcp68Ro z2t+G9)-?USYGVm!9g*0PjM9@6>M8!66RL?db%kgT?mgJlS-@)>TrmNz-eDJYiMqWW1Xi9R}IM+zrm0}}Q-BZ62ob#B{(DV{_Q3?w9D|*bpD~V9%i(iCEIhH@8H^Q0vfu=weHl^r~dy!K>C{jv1>29IBl zS_+%5hPDi0FKD_0siBWYWuGk(YQ{}l8+o23No2ytAH|ZN4Pq}Gt89%w+zmp@xwD~a z0HknENyfVA_BFnrGC)EtvTiRuHV6ijO65p6iW=`=@vd;I>A0f{sd>exPI7MeUf6Hr zH)jL$pNNdb`Ak)DUEJ;Lg4n!K=%SwHnYQ%L#&`D9&+5>{L0ac|0LtRysJ77gsHy`& zIQe;pFK_Q@CjI$d8?(!JJos)+nx7_crh^N&3k1efw<#yY^PlUgN0zN3VTNp8F1X1f zi0o=9g8GStUXNad`?_$?H5tB*LV(ZK6~52mp_6NH0;y@$tme^S&*B#J+2iZ9Q9t)F zrz5-<0&x1Bq#+wlkIG{#wFtAd9;byfuRpgr@|^9~%>P~)Y(<2qM)f&2bR(a2>4Zvn zy@q*s=$sYd@>{V~aSnJjaRiPh9zRbU(A1|27F^Qgmau&h1PpXL`i-mrFZCn^ZTV80 zi*Hp$yyXIJ8Uu%+L0B4qq~~=@87BAYIq&H4=Mjbahz|tsRJxx%pC;*N67M41%XIXs zIni=B&&`zy=?^a{KD!dMaM(y5+7p9PhDyt4iVWu|8>TGjrON6*(C=HJzYNfLX-6NV z;r*Ip8e<5ldbR@Z6Lhco<|#EFLS>8~0jM>YW-GlrweAXS=W?d%SyuRqjp_3#9b}fF8?YoG?ZpzCE zm(GJ(SqeQ+uI+^Bj&lh-*txFg#T0ltkS$w&h~I8>e~2pr{fvTubQ`T@n<7Y zkNbmW)AIHXvkVu8Pdp4syL~AaJR(WGF}G_SWLMF~2Gz>b4d97XvXXB?}Y`mNLEDmil`v={RMp@V~HSKpuF zGCOB#mj@nc>zH+V2S@-DGn>A!@pm5hIW@sH-G2z;@bg5vZP}iM>sydN(r_qZ@Cx)! zjsC0SSB~iXQR)$b)ENpq?Eu0~NwZTk>$9K(JWs<^-tXeisQ<3H8fvc{d`6ni1b$+i z{&hr~5BZ%jHEIxanr!|=QIEBmjnk|7P>dTvU7xo~J5H%J;2DK$3Id``_jY#b`TD%i_d3z0W~qy6ES`?C*(9#e-UAe2KKuUs)udBvQ8Nn5T}+Y zwl<}#46qm>`0p7IWC3twy}yIYbom6=&tQGm61h8wQ1_jW&Vu6br63hJD}c0-Zk131 z&&mQumKp%M~b$^0oDl;>-_2r zQ1~h^b*jkr_x!btdCtLBeY!Y=G!&{1|( z=JW-`^$^zCKbibBh^dOXC`V}d^LTOyvehOjCLRzaEM4!ml4{Qw9YN?Se-91)9#ynp zOAjR4r?Z659lFWeECQMLk+<7QmfipxKLpeW%UloFQnKd8o}ayw!7+%i6ls#*AJ`@#r-&OKQFkPRq0Q^%$W`{6Z z0^BnW=aSHJpbtk|1r}$&9YJffj{YgtZM?_+*O9#G{DQ?*TTJb}Ehb*+#F&7ZV*xA` zbx^n&InLnKZ*+O`{Ypb5D+j`@^60kISN~go!#KB9564{*cO>Z%3UQ~ds{FAXer1^nLm#W;P7IR%$QXp?NWQ`y*BN|5-Ccy)+* zOX*PumaE9k)8y?Y#_7KcidV4~AB^DN25DniCEk}-9@&p%r-yldHr3km^IgMwEB|#T;VS1AT)LPo@qCGV^7?BT0^7iWxKI+-k0dEf?`~7>k@|R`G z-RO+C%_~J4lA9i&ivO%9T|QzI?;IG3!-bHc*H{%?ngif{YHDAUFGE7fzB1SOtu6}- z_L~<#I|Cynvd(uO5s*1A8{JLIP-a5KZCOX#_9^ieSSVkqO-pgeV~?>P>EN2FF!S{Xzx)$N*z}mQX~;*u80+NVBK#-aA&d zz=MeXRUi8Cj6@*gQIo_XF=k>hiNAoCOn@M89>q*lFXc{&7*~7i&41SH@GET2XOL30 zf1f%u7F0p5C3}6L8s2V%&Cqs{nH^p!Lg0LEmpZkVZcIUwlc0w?=kXlt3uDTT7 zP9kYj-g!c4DCu1stofF-M$2XE7Hi;&qdki#?-Ob`mD%OivXle*(M39Dpq zK}$oOa@asWR?4Y=%|a5L-nY)O$2dNeaAyB>UyoE{>IU*X;7BUCJ=4&aP<&f@S@^IF zNCP5^;v;w z$!v^`d0-Sy&QJ&k+G&PIbwgR!L|%e$iV%?^3Q}bzjZc2G=s3b-c~a1+9m{KN?5gr} zT+$Gt%ul&568DHheNQUkho2ywa^_3w0+dDZN3ha^IG)7fsF1ELN%LbuF85%rDblXN z&(K$xh`Br#78AfLWw~0F07S64^95w&^BV|g++|;uPPX6k*s%RT{v)_h0BJL;@&xK0 z<#SOUOZ~;U@rS{BECtdXup{NHbV@9-Q39s^lYoOI{|*D?!q{k&3%84+i5Q5n$6)V8 z!OL?7;XeWd_z|FhM2>1l(o81*yX&-N8*}Af_u!*lL$yZFQn|m>L{Nz7;QjT==6Hm} z+rZQwyRTE8mu=pqMe$?%q)1yQW#Nf^L|V{!T`BhIhCc)42@}nq22DPMd^%De`VT_& z@n|;1ab0bXdY>+|t3`H+w#>RvedTUS$A~JAd=XiKw*-}gIv`EVFc zx7S3X{>+e4CCh4*GJk3B``Dtgx6T8CzDZ!hws+Kv1kI;kyXuw^jt_)CCfvMv={xsn zpn#-Y`lwWE`$>$&)k#E0@OL>?Y!MJ;!N;XVKLOwgh}%~TyQh#a@hHN7XhILAwE#5A zL$Y~E~7$lT|$;=Os6!jPedQc@gD73X6Y>?m|$h-u>TKqQ}# zS@1v}8>1Ye6Ws%01JZUl$%01-G1@NW@D4E9a4koVKzN+-3i^{_~)48VX3 z))+4=MC9aT&X7LY&)GCaU^c=CkEI}l$YkepWlXTIc9`|%8(L(a(&eZ7-bSCZYkQyN z@g9)k#l4oW&lIc6+#1`=mTBx@fD&hLgYfB>5^!3HEI6Y; z21N)U`!-pLbrDRLCL|v$@Id<7;Y_@axOQl_r7&R{52pdi{|Ff3olJo^D!Bd98dB|& z4O0jfZL$gy|Acn+SbnK`=D3-&tP4iJ&G&Ygr6QzIaR9_op^j%w+4^|MK0brBqSUn; z8Slw1<}Sz8^s1n;=ZBZw-fA!_Dw35%sP8h%GbMjPvJGJEGDQ<_TK9%dcE%0gS7lgZ zN&3$AS_mn}9s>pLM~&bhUvcyo9>X9Tfd>3eDFaZzW7bg^Qn-)M zq5EwOv=0=4c(g#zr!npu)5vUxbuhN)X6zq+4Mf6zcl~-~S??$H#+qD_9Wq2zo)t{A_AjgAh=k%=4&yWCV-64m>92Q6fx{;RS zD>{$eVG_s^gh6N_ml)7}+u1SU*+U;n7ahFEN`^dtn;!Q_MO4hVSv;`T*YEWvlJgbI z@eNC)h4L;2!tDOa>p^S&4Ua~t1KkiKUI0GzmP0x#!}zyf>|?kE?dt6oMGSR;=Niwe zm4#wGBpnotT^#a^sxPrn=eIm^s$ftRA_mQsFcx5a;m>f)?#0FesBTaxB*t}2E)`8 zxaZwkkho3`Jl&R-`00-%;fp&$ep8iA(jgM*w{{NO{uV@@k#+m}wU+t`x2CbCNpE32 z9Bjw7wnWa*CB_&KFNuVcpSd=Q{xTi9r`$Knu2xb;4NL5O$NgYQ{(~0(ie%hlI-N7Y zq2w9^=w~f&1umRepnQC2xcK6YENoktp9MqCbmttruSwact-A0=wEL1{wZD;R!nRt# z`gLe#M|#ltw~_pP7!J}H=A9)Gt_CioES8r66ZX9ClmK}K7rQab4hWizD|lg1 zi~TSu;=;R34q6Pf0_WDOhF<(?o#hWRprtw@a|eR;Z^EQ*N*tz}*mL9n0v7&z7=9ft z5W<1IK7bf0WyOzUMlYhzl&z*!u>7NO`Y2)C8eT@QB*ApDIjamcqxD_FS^xq}We{bW5Stsc8!s z)kkO^`wS`#>s$#^>*T_za7&V%5sSP1&lWx$^QFC~EGPdXb9oPAv|6{D^hJL3x5uLZ z+Y@y(d;COrHyKWG!u~@0_43~(s9je>1>#b&WOj5|qWZc)fwXz{G2zV^?vXdG8jI|! zZ-l}n#r)ImZ`FvPCRi%y5)VpP8?fl>mBMAX$2kd3!E6l0&)*n>EcJFkMy>i9AxB6%(o15 z)GCU~0US=L&|-*oZXiEB#>D<&*Vs@-Sxghy`FT`<26bPN`bV=G`1i->h6bWTKzS9X zSPhk*mAH({4c7n-9$d1S*LhfZujpNx>Tx`_EgZl;QE!yt;Arv}ixa#)ApMxEE}U!K z9H*=#;VH?D4Z(6>e8ahW9`!D0Va7zWChgR>&}%*$>~$L`za?2H5f>Ms{kDp+P8M>P zxVC#i@ST!w6;%hCYt0iPq6x0U7uY@$7M^pXHiO<KWal{@jRD$iHCxle% z_-bKrz5o?!iPTRthRv9qhDH8dC+yad-i3w}MoeHg7l44{CoY%qX%gjLj4S&)OXjP% zF}b-DA`cfVQ9*`Rk$vvqX4|+?a7`s4!aVTE4o#bH(?C~|mAIQZK1di-v?8kyy}7m6 z45j50CEP;C`6QfdUrpFuA$$!fp|+2442@$F0?_nE6io}&KKN`V0A?)>EIR4Hf%1I> z;5Nlp=co25@&*~7=t5LG_hf6003_59TXL)o{f?=08zZ_!1H!p%%`x-!Dp~Y@xL~v; zK@H73iQ2^qRM0pHTI_8(#u6tlPS9jtZ=z#ZRxcBEE^A3%x+Isc;(Sr!DcoDWm%ds_ zunEpb0_=xK%Y|znZqYj;RRU#HtxYaAJs!Y$((SkO?U&BH>^;X_OQ<>+`&ap#Wn`zB z7OtydSTRZayENVNEvzOIa`;}+SxudF>NqwM%@t=iPgeTK>(zTs=3=jFE#Q_<369Cv zxz+5QO|}*YdsK7KTKso4uN5^7I6-KEl=CghN6686|j%yxkumX<<*Cv2SmMxAL89V-d>N?6d z>Db+ofDxXQPQQkuHgm9*lP44QrHB4jPr5a50 zEm~5cT)5ZoFe+@g3Lidpx0*AW3%Hyq!^c}bcljjE227Khjq}n2!-!lgpzcS&s*2=) zhZ>bhlhSfVfAH2h?}XNQdsve43EI*X!p-^`{zfI+i)KldZfhzx{gz)SPh9n;%?A9HFL_;K)U!%u^*{OMvn= z!momQNkca2Mbvv5MGr{>KPhn4B%KnV2JX;A;W?gDxKvH^?fsd{{*mwQldW&QP3s_G z-znKvkuoaChDFrBHGNO%q^Mk+=ok7WsCUwzLX;Pi3fi8Hr3$d$l#4R|6_84BV%g?c zgT$O9#)!ISj#=mAUvQ3}$YB9|it+<%Jcb9Y>OXugezcyG{mW+!b!#VF(cTHui!S;*aX*uE z^fOg7pH%1sp+Fasp3Je74@`ORc@jvLNL(>Xw~6f}S6ciHb>f2Ym3!jP48-}WQ~sbr z3JaA~uo*jSIz@?(=45XdnH)|II!Me*)vt(k#O7${pnUKv)v|&_MhW&EGJG zlV`Mom$A?}dtUA}bc$TPpl?4WKp9xbVLIru&1|DCpE$?bj@;y7mwbCW;_Mk{Nzs$J zcby|C4(5Sa;5Mt9nuZ{j-8fK?s3UO7cTQh8`Gknx6IAswPBy(JeXgdPOfI9{$ft{D z(fnhC(5DPs&c8)X2w+XOQX|Mpo|2DvODFxhf8MTVT{)F{Qixx}nN43v^3N$E&E=Ma zYo&Whp3PO4$#X6`?I=?rr?z)&hLT2iozduT_ZP@bDzgDti6=^>)jAB&v-EblYI2iw z#(aynFBOcs3|hm$luYYQNP|_o?%!z2dJwwv6e_JEoTuec{EAa9sqq<4Cre44nJ(hp zfWz&*dIN$~hy|7%a_1jeX*!z8J8J%L+T|5bd3IArOVyo@op)LGW6~w{5>iv6=l8TdMf+NVK}JZj9YCnI~IfWE6Wl- zak^ouFacWsa~+rG%5ErqOR2lQklvKu+gv*-dh;}Q9Ql>MA?0E*Z?kabuYI=gVygCy zedD>?EXM~(vckn>U8T$u=(dg0_%_z!&hHz!kCzq={1=K}s2a}7@M%m3pYl8>cXXi3 z3o-o6cZnJ8b`Qy&cS)CXr~wGt*~6(}A(1FU*z_%I zQ?@`@pbnv_OW6Y#wB>=eU3elT;ih$p*YfViU%SdrCr6k5nOu#3%d&9zFX`}5AI-J= zv_-nB*3>}A;ar&p{Vf!JllU^3pyT2hrPStq1MYI^kyh&z$9UdqxhubhP`gA+l%LeY zFo(GmQ69JfmRT;uwsCZ^>mRaBLnerP9!-Us<9Kx{poOx4!D$o>zff|L7#gk{D7ybH zq4D>ZlaD(a|HLeO#(90aziP?+bSd97MHs#dn~*wc|M?#uRSe5^>*bpiG`n%>;?T~@ zSPGol)bz;VqSX28vW)59^#0~+YaUvDmqeDCsCP;cEX0L!UT&tslJG}P@oK;aslIPU zO8&QWLstmyoj5{IPuJ_ore{vt88bVia+D;nK>rc|xDg=0BR~{vJoG zC%+-&XD0RI1)I}pu`#2KUsZ1K^8MA4W3mmw|Lh#)BVR|+B(?8p!9>V?UPuii@)lLR zwHjb5Z|z|gt3UkVK!zg#a^n%n+?O&>zFs#joA|0xfP;HY{a`m2S#DeW9J?)8_Efsm z$q-0AJW2W!3_ z#RWR2q+g#))1hD$nqQ7i%*@z9uu1PmKTq`my;E!NPTiPpR>fXoNOoZ*v@U+e3Z@BK z`v+Z&u<&-^mA`yMKX@Yr8~s56+np4TRk56thKOLlOtWUCeeS$x&58gf+G5}wVw7J9 zKrYTUFexgFN;`I<^3XzZoF2=1JuMEaKvT@&2O#D;wTTl884hA4*L@WtWJhF}>Sb}g zeNAk@%~lU=SSW%Ysm@HorE-}7oDkUeWjbo`qX2xo{9%)8gp#WPGG-?74fTG1(>WE% zRYo3XS8Z7yNRoXdLN3*Oq!9_NQksAMF2s0P{|S_nv(tyx4s9M1xR0sqB;6ThM>VnJ zJn!Wyb7!X{{EK0~=hvuOq%P#FY(pc&u+;O*>p2pd+#wv*8Y#aV0;Kywy;@I+1RW}{ zzO?~-kFM{ube%97*(W6PYd^YN!!6+JD{)R<-3TN!+)hn>Tqy!1mS!b+di8VQGspg* z35imxWjAm>nmod)TjeeooF(@QNwW>*j!{x!$pkC(Q1wr zg$Gx^`jp)(4ly-&h2#~)8#jA&lI2ATwl;=+(*&4Eaeuc7(}Mg{=Z5RrmD5vTNpB@t zX-``jk*dziTffKdpID}^x*yzZ1fHI!@d6qB$jA@vtgo^k5|5)AE-LBh`Bw zt{|IBl~F$Ywu zz&Fkfz70Rgl0IR1DDXu|B;g?_wa7c>>}%MCNEJAQx;B@p6y^+Ene>h&_=WtgR6quI zvE1PBl5?kbbz5?u_-dW4u~emNvCF;5yz$)b(i_Hcla#3Ka~L6=eG?5=eVl%%iuQhl z_P6RIvlvU+oxYJ|E3vwd#}dYf1&n4SELv%$r9SR!Z^Tc#cePU5CoCuSvqi-o$lLe( z2u1M55i^;zqYF;asvM+rCE^mZ*B`FwrEZNeSZ z4;w~8o`Ynbe!T4Hn^FUoLM!Gk^cxeUo?pnySet`^U-jo`ij;7mNF-zMSmG35g{*!c zfaRy@)!5+Q(e4QbZfN6QQsf#sMvo!&S+Hk+onMM5`-VkXOfFQUy(f8U4oI6A@K~Ji zk?(hA=ZY~rO3OJtG|PJQS;LQyB|g6I(I~zqph7f0HC+#@Hm;S+dV4*+RjcHyqOA1= z+UKI^LQ%2e3gmYyc2?~va|}b1d|_Z+yu(AbS4SZ|hhC>7#i*DV@H=vZVd-(vx7U`= zrEyn2w|Fb4Qs2+G06SWGJ)358M}XzN=!_&nbZ8P{Esz{MV0C+U?dA8)r)kgq4rA|a zQ{q?0Ok1xi1x*RG98+$0_`2f4gII+$t*rBj{hd!Tx1Go)KM1wbUmN-Aq)V*co^(1d zpG}^w15pIVp$!-SlOTi38j70QT4uK!j92CH3fyh^%~eKPq7Jn4S&Je~yu8p=5rcDx zhcH~-2pTLFa-7U0uV$V)>vCy%nAPp`V}3~*H!b)x@YtGYVlEsTZJ>yluWKxv^iJlI z``Tqc%6q9YmX|b`o!>c8s^@Ii`_{QAfpdJtr>u~-n9Ff6Zs6pd?0g69re7Rc<{+GP zh?{nE<*+*B9anWJhEnOA=spW2^LF3q3+gipX?lGWjgN16g5{rT#h&2! zJZfP`nukWwS&VuZ2tG$8c-mV&ZER9hyhzQFQ=zo*Q1HU|lX&x!et@it@xb%;Ed$dl_E7D%pOz#tlQ+gvrVIw z*dw2ACJU-@6~lkCO;oa~7xMTtWGSnG{QF|D)=@;$B zp^whfphkp`|61&m?|kWbE3cODc>1od>2{|`p8Vybcg41&t>)DQ>=;PqpO%=M7RdV> zqE84;pcWOFiR0?eQZ`rDkPFh0e$V)i2wb8gG#u+Z#k9@O}+yp0PHxM=Mz*~qAT{L4V zbo0zm+J8YfSH^2WoF+R?MXXzf&r~WfR(*I(PT8j*i6&$uWngWRKW?lQ2I?EdDF}FR z)w!Z%DgB}kxVHz?jVU{Glw+ekS_XYS#q;dWl1AaZTaJ!)Yo40T)+z#iH@107ujiWC zTe@huNjvh*6^hl3FK}hKr_iBwao#sE?~0BJh)VmY6iTwTkhq-aXEe1s%C^Z+WmNh8)){^ zK~AX}Rh$WS5E+GarB6uBLcE4}tCtCHVC3wUvjNU*XPQzPg&s`;?#6ZwBA{z)kS@KIhozXcUn?MMvaeJ z`V&)5+^~*CEGM6DsfweaB_tnUMfsUVzgEoWO1a3Emr=0BA9N8Kn)C^5X@vE%_}`l7 z+sc}V7dxw}QlJtnV{4zpYC8%Ls^d4z96w4q)D>~bALk{>2{nl36?1Ce@#X3CB58b5 zUd7swPR8E}kVeaej>h4A%>0={#@O=kKJwGyR{_jw6YOZp&D*~{bI$fiO1}XeoJshz z>^^qT=gQ)$Gsfd!&in1<1fz$_!4C4%aaHHJ?qtjv3y^a!$6^c#_XWtZl?rwONrCY9 zsm7G(Cil0rVuId?^HFd&m=bMD=hE|2avt=_h}EW4ZPC8o*XY@DPP?xY8#gK=c-F*E z%j}s#CSrU5a1*M0X>l}^smO~owfp?$n2&;J+VDa2Lv9*cNTWM;1~i?3a1O&7cB^ab zv(&BzMq+dQPo2@E(T;hDnSJC@;;M~{ysfMiz(eQYZod2ACHk3!yyuihl7M|Tbhoaj4uxi`jMF=g{Y?Mn(q&)pply!2AFVGNBd3UoljU@-Yqeu zcZN?6SWE67K`+vI(RfOa6M`QRD9oXQH|15TIZOYpP`|0Gto`#z@CzwW> z8)L2m%(U*I2AW#@teX-Y@+v2Vd{yT41h}>`^H!tV|2TNHwZ7wrl)D)0%l(I;>|FYgM-WcQLJ$f8S} zGw&A3?0#$eYjw+yxF#=-cp?%!<}lr77Y_B5zleH46T<=EbyCiUm(b;s$&lZA9vkvg zA15{DZ++@kl>W}KN|B>2!;&$eWatdx2DmydG&*A4Ar7RqzMol!BI&=O7|2p4LD)vY-kZfusort4ld*coMgUyq#2;`X(*D5sVo%w z)5NEN2z=XV-?UlEIT>!&pYe(Esd+SujKI^t?KIT_mT@fr$>Sk%*6hls!<8>{0?J0A zUM49fBVG|)#gDkLk?s$*IE?X+6}USx)K&E_OY?lznF>Ai*J4+KcDnb^x%aVZP|YV( z|AV5lj%(^|!}wXU!A6V@aWqm6>2#x8qyz*UjYy185YgWl-6_(N0uqi8P*6vQw16PS zK%_)M5wYgW`~UgloXY z8tgTUQ$Sv`#2={pm3zzfGOGctg@b?)P<5M(_%mU!K?^;rX0SKGq)h`Ge0?E=XDSb> zi>}r7z1~Fub5fnj4!#)b9&39j7eZN}u~ts#h+tq%_-5szzKB{(r~VhY+@G{ljrwkAWEX)=%Hn21gBp!SKSRsTdSun;exI$hcy;g%UwEDBON-dXY!WyZ!MwEwJP#@Y-Vu(-3+ zO#a22?}x54HFj6L-7-{vIy&-UGD4Y0ovSg)n{_Uhq6Dh5Z{}nav~#X?2nqd>Q~#}w z|6TuI7vUqOWGZ5nXCTccux?XE4t^{pB=O7sO4$@$g-x~p~jk*Me{+p^ zanfK9%n7HYK)T&}t!6PDFJoRV_FamI-SYfP=hWrmlfTs7!x!28;tie&Fb7pXd`cr9 z-oP&fLmKV6h3JEw-&9sz3-G9a?;zwoWu5r5*SM-XB`Ak-R9;x)%s}jIneOA z?Tx;@Gjp>%Hwx1cS%arf&McA-xQ-JP&x#-2u2!Rb5oD8Lc=C1pG6KCF>%Do&-UHHW zr7q5sZtP`)00a185V5@4q3Ke9L-(f}&puoWFG8#65X0?f;%eR{uaD@|zW(yVeS*VJ zl{c^l|Fk4g7f2K$3^rswfON+{V3mt~P%DTuZ(_~D#&hXQVPP*SRn{1{$lfs*3abR3|&8WGu)d92f4fxyDA^Xok>pk8LcjKh4 zE0FxceWxbtJJ*hBEvB&@4`DT5lz_4T(W9f;GiiofbK)9&hlJ`zQ}Uvr0NSCC>0JJl ztIXMLnKAdnQ;Q+N5e+)Y=gFrP&kL0m{QfB}I`G{c&#NPhX}%h2%pR6;zU-2!YGL$R zXWnvLWK0z!MS7D@rt(-k)nT^IN`z3&IPqnHi^!CUALjMPk+Z~vBG>TW6<~tM6MQ0!bp=|;IU^+Q?XrTWLfWU=n35;qe7>j#|SSIs5P#(wv z=PP@dX(qBu0rDvZo;`-`ZwIGEx$M7P)D}W-NuLnB6pOu+D059htkD+ZmhZ6c^1yqI zM`zE^99zoC`j@X`CG<#5Y+&8voFqa+UDmW*TFiGA({4Yii01%G)z0f#R=A=iL395S zY2lXAQYM}h2t?IA7E9=2w7%P=?Y|{Gp0mrPC6O;DkMzRW1=LSy&9kRGS~ha{cvwbf z>rMcMc>#V;z-|53mnokS3mp0R-2)Y$uyTtPysOORU5QLB$sS7q9Q zCRBUA%{Z=v+bQ2@7G0}JrA7@&5?QOSK1{x8-B$II)srZ9%y%I6-){6KzHGv64Ppb5 z2ArSt(l#y1+upDN4>oZ_fwDM(au-|?>+zIitE8xMHQE_k72k3|z1aS3A$onhshq#5 zLM}%J7*=BvTV?2ispH{H^;?{3X+_uj;Wio$m4nEQq`@Om>Lg`Nnaj=Va{$jRXjp^e zYwg9UTTZe!6UQ#Q-qfsC^on_2zY$jjN^6!){NA_QSO2zw8dEj)YUFXs8FOCBlJWyv z@jOz?DF4kb_x4;~mo|T$6)oM7{Le4TUJa~g>L3fZGG0J?|sx_d<)W|gbXk)$287i^&DX+;LvEG0FTA2>nH*+y-rC zUF8#l*(*uh9o$n?Y6KatK8Sbl%FIBuS_|yfCdqhIX>$j>7Y*TT6r*_YCxj&FYTiK4C{#UYzm896g5VQbe+1_&&XmJFp1WH7h#r zi9`@q&76y@)D!mc_-{@pNuIs8oRTk|^5`9t$&&)!HR_#+XG>(Osn)LM5GB}3L&6^h z^gh#|4b`J%Ix%`yOysf<+L$f?EzheqygIm|$ywVozE#|^Da@O1dtL(i8PD_wTm==; zCZ#oHD#_Oi=Mw817H348wX4xkPO{0lc^1{hOQ6<`?B~(*YQp1sdV$UkR|&)QCM2J= zxig4tif3|3YNf*rr(6{UT8MSO%6H{W;*&*tm(LnxLR-s2&0{%#!zErw8+*50qjz8$ z{er;P8bl4x*>H32fCS2S!4Opg;fg`H{Z+sDxu30Vu1O$cE~2Afnk+!vp(vUqzy#&8 z>QYulg6e@9d7^lO3*JJj^D$duogMMIYg2%3cU}YeQ2e&a%9TvL<#qoR25e5c(usA> z6}LvVdmd=-f*N%&yNz;p&N|H}-HQ0=Diu~U-fS4h{4VYtr(79X{xLjCXnvuS<)~}W zhfCJ>#A06HJ#PzH8Y9LEEVI$aG@7LiJkq@ zpZjmNc$~B+m(pF2A91;q#Qt-^AYEqld|uEz4NbTOUR8fix$tB`ERIinzS@Tqid~>w zmw9Z|tp5tk?w%yn#pVojE8L4`Iqm-}#iT}hiRL5|Cg~V>QVSl5 zvN>Gcg)M6Xl#e~Inm_qc zf8FHlgH$@#1%0o@cHq+cu6ZU1v2d~L6Jn)xR{2`3yCmy2`5{01dj5#Tc}{r$Kdzar zglg2QSI^C;S?SziKXL``Sn-^MtAHHZx)IBPeH8@J_mb1UBZfJ;xI?po$3j3|r#{t+ zVpv&MbWgQP?ILjngnuM1o-z2T_%IGYMDD()WOcJgYSTG{WL!H|(MCTc{`{3W z_af!IPeYT9=lr(_;6am)2WmehItP7KNkTI@!G0DzH)G?oaOqLN^dA1*CHGdRJ5^s5 z2eDphXO8#UrjC1xuuz0$;m$~hSU^O!nBLDmFlZaT@cLIBD{ZO?Nq0c~) zbnjfZJQF7sQ+z7?+nujWR}hbVn@;;>-}c3xOOAcP2tec?X(FF#vDETu$stkBAPsOk zHbY${ldp8ZHg>2#;oU1r2V_h z%l|g!gZdM^Q$?PdDhq?G%cT-8ZCsxQ0b}ANe zbHB6c;VHjz4f!lB9I;R48s+{s*vgx3&7F90Ib0)x&^8it`^ob;;tSo8Uc)~WYXGRd zg^(ZXd+?;`N>Z0x`BP;-eJvA%q+F=sIK!aHTHm;bxj>2KR=Msj6;ynzerX`~fjb_f zWT15{h^U6yzXjKQ1Do_fW^ciZwEA7e1>KVj^ShKMvl36|r1L7r%S8{JGO5#EKFb=~ zjTMJem%-hTSf_RfJ}%)&s8LYBpseFirn+(GNR!GR;R_t(lbUpPpUG-G#evUApt!}0 zeLxPOnkU=W-LEN}#}c_VJoQRbJj*zfrrilh3LYZ50J)J^6L}J|Y)^`J!FgqRtJl7? zJayy%WMpVU3s}^NSQ{o*n52$8o5Ll57meKZTXm(SGf{C4G=p?{Qd$oMBbE@c4gU5@ zaK<){+n_Hdc{HNL)L|fHn{hm}x5V2xkRmY68GLL?SR7ct1+Ptd_R5LLgI!<2gmAXp zR5Q!WYL!}aXrINbD$hUe2G9jDU@$6W&qnExnu zFR_|hSRP=D0KSP2C9yn9W~qo=Epkzdm)SQurNGnPw2?8x>RkI^6Euq63Avn z-;Wd%$lSQ+635^x=$z@cRO2gglOC3*Y2mER3FX7Sc$uH$2EWFc_1>mse|&jGy8Gkw z)W7Q32mBVPj+x(-)hpNHqqf1wLWrB#(1QW^&*W)Cxfiz%5x`Cw1PR0(!ai%}X6#Jw zuOd*c8f%S^uPgD-R>2dH7eoAI562T4O3Y8|5R$biHD1YLgJ>qXyOlkVIn9jiG#f2E z>Pmak*7DGctpSZ`X@Sd1$|gqF+n@THDDgGv^IJ}(Lde3;QiKXH;E`9F(&ZI=7jb{V z`niUsRk5G2rdlJ^vyo;BNfYtmMb+kyGz|4$w7oLBsdU(-e_`KNVm5bIXzmIkUdl6h zyK6`TV4RLeL0?nhk=?9Hr}SyBDI-9;GW=7>J? z%$!}og;(Or#Fi9oYjXBP94$QEf zxJ9zm4ou?ibL5;`B#xy-%x4L)WB!%I^0B9>B5iW7JNf>V0-vfx$02bpg|DHp-x<|X z-rT*av?WAITl8Rx%mll19(Zqn!i(b!;9snoXUlWdOM{FxJ&rB--uu`xmg`i1XCFMP z&l!9Ygn)Zf03x6LlyO|3|DPd6h#jP}guJhPIe^yj2(onY7_h2XW?1FJ?=+@jNiY%)$vyy*4dv|E^l!Q*oZ8+(vldl@@j9Mv3)tD zWN_y%bH>$s8)fo;_#pcsI1n*xm)ob3t5Zm~F(tF(mVf^RFE%LY7R;WdCXUFD^7QoR z$2-e7LC2%v^o#U)7M_g(=1*_A1OX5n2mGqJ3*991(&(s;^3<;ru726Q67;8*koVq- z7Jn(cW%jB~^V9C`Q(-GLo^{o?3-}^qcu64M$alhw_z%?a_e~yJBYApnm(F6}D@0x( z5UtTYR?-gIxha<$)#(aGTJXd2X<3tZS@a8Ck!npjkVzVQTLulf}F@p|XBR z(VGOnD~(OIgp)P=qFA4Y@T40BZ5Eq53Nt8YKn`+A@zjaroL#WpAK&C=3VtYI6@2w} zKmW3~7m($fTc&z5@~W>RD=y#3?j4119jqqdA2#`odd2%E_H}6S}M|Se(rdxipzdn5JkzQ<7SI%<49luSQLl|QN>~gt?Zs)ojcCMN` z)>sA*q}f}D#FU6^_->}jm2Z}Xfr3K@*q(6Rk zb5k?x(-n5e5<|)K$yNg?=&etuH*MS3kK<_vOY0CNe2wC}zAF+qxnq@3v>iB|$JKI# z*iR3-4N;#h9OiM&-Ah;|S(O*;zPRtB%5XY$E({w?%j5cZlr(*k-2FS<#0vhO^_&L# z7X`oVdD7?LP?8$onlD0`@xa{FDKPUm7*yN3jVF~{_A&I!hWiLzLTrW}QPOY3dJH5$ zoOac7^FWNGXYcoUGv6d8#dBQx(xW+%7{s zNui?U-{g|kua5<51+4nkW$3CgB;3>cMC(`+M`GAbfRK~9#y)V8D&$f&G#7NJe(h_f zAIGhZt<(+*&&~5lUgGdjY_{tD$GUyW36;>1%m#p%95Wfy$qA7i$PV=5bKgYpL8;T> z&T6f!R}L344s9wVv^Lg$Fes~)Fl=UmN9T=CP5@+|^ZVkm2>B?WPMqcez~~$v`IbBR z=56G;!24fF#(PuEv0oPh$q|oE-CNS%s1Z(t>k}guM1Z~C!DI|LYB(V)Bv*tQbEe+U zuZO~|lN!PnDW(;fiRUt;#wVyzIK3w*AHa19Fpb27r`eIOD!!hI1ct|seW~#icK5#1 zeN8JC8foFVSL81q2bNMN8r(Xzz>Oh~3<#;bLKp;~Zpcx-qlB|D-kGy-0n6#ZmHMx!pPH$0{~ zI>A}FGX9F1w#G(-NyzA)ob->RZDN!f*3b3D7u%BGvP_I&?yp{0f!TY-e9~kGAc!vs z9N@_M=>5$lwx2SN{s;SqZ+LN~n^C^jHwg$9d7__0nMa`5KRo>_<^3;b0nl+^xxn;a zL-pt4jv0))jUO`V!83)7okx!dB4Ia9dVxh`;y~qrUpojuRx5RCtJhi$=NL?2nt*#p zpBv?i>8(!3PGI;($8U7z%Z=c{*%dDNrMcdxLam1cvq~rlVA4 zy{kSG?ZsJV%(3n?eWa|(~WU^Zqa%U;)#fmJ#mJE zR;V29`9)^|xtrNIZootQ)~`RvcKUGgf`{Bi>?lS`i2)ER+t@)ORX~=}Q{%kCf^0&e z1fN-0VmcT+{cQPgcBGwZZ160Sg*ON-R=h46VD_lt{j=!b=UTT8-{pXFigaON&C|8l z!=0Z|+KHx8jw-8tpGM}-Hh~m%%~Vz^0dW2laF%3~LOQL|=oEnqEx+71Vy?3MJYB0Z zD{(KuOu)xz?W*2$B$B?7WbS6R=-lbkuzV2+K5N1`T0vK8R|W|SUe%0Fx%@ITJvy(@ zT6A!8XSrLdYx;MaC9g<~W9UPRjKTPA4ERT}OuL=YdzL%cA7!FQzuZ9(p85ieMA>vQ3a29-LzYX^{!VV}$*ReAQgR zZ66MZLvuLYkOODpoR$Z&P&HsZT?t*|m8s{E!0rd z1})D}Uq|tlJa;xgS9S2UNXq&PHSa9eCc!xK`FW^}~caf2OH;CGF$`}`Wm+24f>PS!cG_L!#@bUj|YdM27HtK&+- z1;t1`M-_#LPx)G*{-eEa?x*hrP3N}>*5J=D5@)hWy`+^(7v2&c+G+3m1ZA4@S?O)q z-@du~^aY_=g{ITjCTKIHFsw-IbB_@3Ra5#sromM%fjRSe;SUGDu=3*Wo8Yrd>RqqT zr9VpJTOZQf9CDWu3H&IZq%?1ff`C{@w(tOY$N2BIAy=~Xuebl$XlJDji4$3u#NMyN z`QFL1-ghkKDdEyF;+wkttGEC?r269TDMQ_&n;))Mp1dzODNdY=VkO#zGA2-TgZ)^y z=)|WQq#cf0e`iJQu5-M~bdTaiQ^rDvY@GU5yo8+S4@pFN9iHMJtj^s|$Kf^SvbfEs zGq!~gokH4JkaV~UES}82${!bPB*zf@@rNnBj<6aPsLuXroT{w>$YPc}-}6o!a|-P~ zxU|)R5dK%E6-9{sFGJnx$s1a{LJ`4i_*Sei0S=@qe#|CYjEH^o%UZS%%?cxlf%?rNVPyRL-6EA!C zQGCzOoUDEBCKJ-*-2I;q??2wUnvNG0DiYOIYfokMiiQ$xBJ{oVUI}D+Nf3P0C&Ras zgT{%HVy)E;5<;`+Vw1Om34F+_ZWl{+ZdS_{&XklLgq5GdB!4d97&IC=7h?|i3Lf$^ z1*O;B9v%=S{HTYih>BP6e(_^a@(}1b4N5@>$)@v7mhu_lc!xyhT0PoDY18*?_e6}I)=T1IDPrbD#b9Ji;>EqL*!(0S&4Prbw zibYa{@v~Xx%|VTg7X=++b5}9N3 zoOwa&LmXU}KW0)LuxIV^YV;BXjisY-hM*DjP%})FH-AzMvd`3hXJr5!Lmuqova-2ps1$ znXmC-G;Sv#{*!e#B=?tj)4>;}vRsU#`Cgd4+vg=kE>onv+ZCD>g{;Em$$%<(tzlH^`5J2bzt8S_KREFsIIX7^W?n-Flg&p-F1zFnnfsr&PO^Ifx&- z0d6at!oKxR8hAp6kVm*cVwhM$56SwgsOH--p8JIeb)i;*$KwsWEhuKf@mmyOG0CQ+ z9YsHu;PYU-P5LO{G+j|gOhM+jn_YW~(7K&a!P&?W@Abg5B)30aOmAW(=-1#cu}5hU z?c4VKclqxtKuP=}*|K+67J@e)iRFoISVU_~3(JKDKM?$kZ)@XwEE(r5*s`ov;>;R( zW8kWNae#azsT*(_p|suh`F@TU2zY+Yp)0xsQ2&KwZnXQ7EcbPiX35erx3OTSwT;5AMFV)%bfq28jz<@guXNf3qMW`XBQu z2A*XqS^Q-lrX${pPmaAQQr8pTwM8p7A&Y$?0!>0+*Ae+IFMrbCFRyN@5KH(L-QntB z*HMgKLOy6KWBcj?{u7dLn~x0i+Jg=bbCr<|5fXSbBH z{k^RO8@b;RwC*3FIuMv&J>KtjwYwkmIn_j7F5%t&{K{{v(yleD8defeB7UY=EQO+14fg{;$S=}YUBrOcp^zn zBw7n8drMm|4EIFT;Nf=Di@lYZq^VmT`((;vVJDX9$2(yVtS`;>Vo&V}C;ef3!SKq* zl&(iqW8p}vpYH`;QM-KHh-XyTi6G%)Jc8>30G0kgRKD~4O1aDYb^~HBTRQ${?eq;s z5I!oN8t_3X+~-KQDwN%&JbXin!@nGmRfK7-i5YVQ9M$qZnn#r`I0y3}Srl&uVy}el zhnE|nZ{8pik90kMu%_n=s+MzoT?4VI!ra5;E>L1RR~*L4ym924R4Q`v9t_QM!CvGB zK)aj=MEW}D4CRZ-b@7T@;~>DTJun!S3n&-F5@td=f#`Ey#5^3j=o`#bjma9J0_BOe zzocXQgS9_QP!%s2bOdS{7IUG(^}6D9Kmn6@zfks&iUGA7U640SO!tNm(Z1x?OFB|s z>?l7$pGvq}*e#g8!L3Ek|LRcXY8HRgkY+PvJ3RN&cdvS$t3e5rv`B`EC!9@TlUI|& zbpN_5TbEx!68n`dlorBt;V#mm?Ml=Jd};x4hbM}3N#_nP+IxX_Q8C%sgeh_ai1SOG zn2w#mry0y&&np)bu7j2EGQBrOxYotdhvP0OQDC6N=!+2j7}TsZDt9yEl_N^%Safdz zF2cmpUXf@;Ob7w4rsAW0?ozB4w4Xb$Ne=PCS6QSUAVf(RBzxvpN0!4b)cFWFL>l=D zATHICd;z}<+_hZEXvK4pdhRKBMX;2jd?6jo#-EKTL^{MPX0HX*IIs|W6RnP6hOe^- zlA(|#uZi5N@AA`iMOd2mBat^S%=4nnY~pCJL%Oral+FDQPlqX~+$_i~9*gqXzSGe{dsY|4^2 z?qqjZ#)=X4lv*0)T6ah|U<>}+O1vj7>h;r-!;?+i(+Y*nm zDf@&-YH%G~L%_Rksfx;8or)|IU@j(3^H22(uz14tv#YhNb4YmajQz}yh&+qgvXFPIC~+Kyfzaa4(YT^s%| zCE#MI0TQrrVw0>mk+C!QUSsMC*&lS`vxC`d9dBTg^shLI)H{*+Rn0`+`oV3Sz1v#L zwSTA|ETKN#V~5%r^2s2%ogdZGC^k8~I9H~Bg zx)7R-C0<3FWjC#ZS$WMcDs-`XBaNx_#>cc2UvjOA8lQbG=e9>P%eo zZ~I!+BlU=Si=#!%t?36-I5dd!Q5Nn|J1zOgV#$L_I8;Ce)7$KX&3`suLC7hr!_-X7fm0phz4=5oOUBbqIKbA7HaBaL$nBo{EsKmpNl835kb?HMgXhOOO}*}_jNXWYCGHP*q;UCYQanO zhV+|zL2-GH0kzDJKOvRn%?K$FlozZKrKxu5=xY6aEWj}eE0%>ez4X`H@K1b@kX_vRXTL;H{lN^qc}}VyBj-2 zB*64Ry+$4_7nap6$Hy~RD%?a6jlm$Z4p6$P1jOVwq&(&NX zfi`yK?1u*Jn^?9y^~MXjF!wv{KM10ipD?ulnNuAbDZA6{=-*<30b@IgXfSRB@~5hO z|N6fhG}u$9cO%S>gJMMzGM3d5iiXEK=K{E~RBP&uZPrF)I2y{{LFKu|It?`k5X!V}h=@hh@Qai`0iq^J}6XX(RJKYM>d)H z_oB!X7SPlCXQyUL3uaC%3B$JgO+@mrts?b5wK)QkSwINQ+hqGSZx#vSONbsrpHQb$ ze5OiZ34U!UzkvUv{Bbg1yk}MAean^kL;D$TpdfylIriDhG7IC@h8D>qiyVj3$5sEx@i6rPS3Dtfa+5KA?B%V=E5zqc^sZFWyR`iY1Pk+{Wt3jA zK^3J`K$JyE_N}kQK)@4x6RhI{0w3~(1hIV=MzBb8PB+_o1+~^JJh8+Aw zm7~zbSs#SJVpj6cU-l$_y4nK(qu2Cu#;-M<*WvoL^ucKVVIZv`mHl>F;4;`qY7NC! z2}4U*zWyTedRV)K)eXhlaQgR`5pH=I^HVZaIVXXvRqxDTodJuaaYW0>mL5GBfbZ=f zKDm3_RTqUl;;Yy%l`1U0Csw^q)t@5+jaT1EX$`R z)DywZ)Mrx2FGE|;#yX}~gbQ0t_CwTl#&CKD4o&YBdgM87%Rc+f`|ZhSQ1{@%{-c2{ zYE$bc8wKd~j5ZT=CFhrqxj~z@SWKA~14>DTnwG6OS1p8*UmNPKf_PBz&$@p%RNee6 zv;JpI6xB&BAN4I?ibSOl@q$FXM(xm(_2Zo;BuBk$osrftNowe35!<$qw4uD;`V!oc z@pksw&eaKad*(s(pB@8xpcT!_mb&81zM6)An=<`QMUuG+!Imd;`|H{&a&^OIGPr~E zxf*siihn9Vr*J0s8H0J{V!#%0x-8ZDb4J##f+TbKU)1x%?QrcgrNVnUQ8MOoNPbJ$ z36W6B5n4l|69;_qDcQW#ITE}?$Be;l_w zgPD0`Oy9pFx@N08qqqOTn}Ik8Cw~%t)?T=aO1^w6Q$fK_@pa#X`B?e4u$^UF>-1>V zr;IN(&Kqxxj`6Q`*Tv5+D`)H*?Y@KTzn4#1FP!f0JEK5$KTzpDJaYSDOa7{b^LbJ7 z+&y5`2-k0g|K!6y7lvQ3xYB)o0=4=Kg#o?3ExPffXHqilJ0!R;APwrEFiBY5*2B~F zaJ%~COds5ru&jOmsuW$(qQ^vfpu%^qS6oV&k5|l)u>auatf1>_U#Wj8Q{A8ucP8Lr zA*APs|5A4Y9_TZbJDH(soS{4831NdN^kR$>IwL#3DEER#XiF6&{0w)(e1dM8q-KTo)fpsd&Z3gG4Y>J}i08g_h2OgU zU(DkqfR&<>Y?2ni>~^>Gi)M9MZGA&igo)+dU{L7BI57QO07(PN)&;V1t=pJEe6yIz z&4QoUQ%Nr2*B<@-SGxtmjyPu+fzzOE;BveknJsf|8p7;hn94gi0;XG>BJ-B2-$v4` zM`ZxSCcpp#ETcUnyCT3OE1_6TL*M313Y-W%@5UDc9~5IBP{GVn=J~cR*1agTEi$@m zhOX5o{shE}ZEaB+k_JAL$zVJoC*ya1fm{~6!9jyQAn}Vd=v!PLaUjXzmn-1FF+}4S zZx|x9#saxMbPgsVgo}vDN`K z!o@wr7B4EaU;Y=xE*%m4!Atw%9~EA}Ps4XGtuf6jKwDGbR0j4d*4+LaHmR;GmOD^% zOZL(~o(q<2PyP3-!7qDJ_?d(JfHV~O_wB!LN7CJy%3UXS8$Et4t(=S8CbJ|*lw9s( z&=jA0nr4)mnGe83g%DHES#Aq#3j90%<}LCKmsTydttWS&Fq{_x>(Mab6cd#2r!}$$ zi7$&7wYJjzQOhzVvFab$3DbI<$p!{&KOW8`DZ1vRG@2L&8ElT8kr!n(B?gFHWc}M* zO?mdn>tX--P79d?=G_s$4A#GzLSFbfIb_zD#>#Z;BVRbQS%*QM|wUaIMQe`&?q0ii1vb@0OK$=rqFG`yHM^P8zP8 zP|a?k+f7~6?BcGf638U(*{e|u^(Mt^IFFV!-gC%tIOuX)E?akYB^DLre>SX{+`au# z%LAfNkYQE2bUmX0@t|*3oab#$lI)d$_$1q0F;h8FjKx5M#ezztnd&6k=)C;(Y`;_4 z^Y~9r`R+Wi2y$#oZARfB)-JhYp+p^7T)&u?mieiUJ0~lXp|UQO4TqQPh98`LRr3OC z<@T^exQ5G@?`|yD?KYF|{(o@^RhPucZhec2MZ&QwCbP}eUmAytwLWFEOBta+<6!pOP>@4c;tG^`D7U6Wb35fZAAkZw@r1?!yJwRq0>tjZi-~fwV_)f~N8}eaSgm z|0S+}bXwOqe_tfiE^RQ+r02Q{<=gk8Q#SHCVm2G)T$p=2XWg!D|7U&&a~HA)tDUod zo#b-NVx?BFH_pVwts%{F=VG7Lz8bu*{!s*gU*c6YW~!7B^~lRQ{jWN-*QBT4w!E1C z(4zK!gS++RyT1p?58#O{)g&Zf2aduS$K4T;^?NR+58a@~-w_dw{w`V(sfbNAq*&`jEOrO4!+(7PAL{#^Ib~rw`vyekQ0|d58Top&Ms1o)q~utq{X)m~bF4JMfdagbIT8LT zJC?NY4i#p^8fa_R0yUCB#&Eq@2}IUM3GY&0W1_4<#cI`(LSBS!f`L{3+PJyeZ}!|X zR(mwfKJ+agd5{*t;5$T1E{Slv*o>armqf?c-+$^> z7$5Rip(gAYBksJ`pK1jwkF+)gq&V)Az!3OpYrI$jhg}7R48k7Q*eQQ~R#;?WGGuLj ziWE90zG)l|7D%`}U~SE(5`^q)7us7R>pz(`d|)1EX1TYo>`L^Gdz#b>fr{EanN$IZ zI93{3cst0E>`jP@zKGytw}V%ZnKy>W-qK;@5<49{K`w<9?i$mZ%lbc}rJ zd1DHhl%8a6G=grFso===R`CA1IBP&+oGG51_@Z*oJkc)14s)vaD#v+piaVAD!5v>? zbpb9_Xwtg4O}DQnd#QWlI#|U-8hM?+KNJA21EM+c_-{(>3GPq#De8c3VCe75`^$owRcA@VXBs@Y}0;_f2}A23%Zdp@xzM7`^6$q9X2G;3(kEnwk6#yhfJ8;7b1t0Q^+pmL1#ShNs*1tPR7;@MlBHCScX zx7NTa^Uz-leXChOeDdNc00dd=hyC;TG_c79;dQOQa2{A{brfz@J)>BzX4TjB<&*)s z3&dmnrUHKIreV_k80PcK{0zkl_HcE0Q^JeVITnRcZ-YNdmprifG`C1s0ag_z8%H&X z6Cqh zb^+`_(@(KGE|I}@;s+Kx`K-Bf)O2!`M@;+@3*>1i&mXBo8&T1f-OoqE+`=gC$MzhW z_HV_FsCj@mJBFcX5=Q%X5LnXrAVug&enC$`n~uR7v<4oQm0zACe(OzVD4u%SUm-c+ z>|eAelhtd9-UU;+I1ze&9NGm8RA2EFF_5}td+e81`q~|T+P>cXLYcjABIe8R=Fr3> z2U2bM&+ZuRH=h7u%j8&lzX;h5p8k?31dUo;h)jGg_#w|#Yo2<;L};Nc3sS;GUv)a3 zTzP^2sx038yfWj zszPe?(AMtcv3?V_dmZC+&;OoO>R54vPyYON>)^N9pe-iXtJ5b01I$5uw%LO2mF*xl@S_S-&yu^rk^adv#H1I3D_q}60BF%CZ zl`fK&vM2!5d9AKC4xud?S$TrlWj_C5;I6)>vT3hCegjg?)2wz=)B$V$fRBvx43WKa z2co1(u6G+7l=SL3BD7$f%5_4g1VFPp9_pz&`#7XmBC7%iN44p)!weh6nhr>PdykL8 zh(Mpvc}v};SU;a$`^ zE`w;*F;+(@%=XqP+jD8Ev#ie97%Bzy1uwB?C4DF+)wE(%#K1|H63!b;VggPg8L{wu z4~CqG=*%aNq}fNrtH07N%6!D~|GS1*W~&RZLA`fBUkR3)#PJoql=~ZlDx6_kjFo7^ zOMvkL93Ux`Q1n0YO8m(Pt>mtYV{`1#E`3||HsbCW&kOtE{ zX6JxE>m{2%c~pRYA&fk}I~V-bkYH-WzzAiTOWn1O;9@nyVO;vewNi8n?7lIS(W>DN z@n7w(6L6&j+0oYHykMa05cEn;HDb-$Gl}obo?188rR#RQJsV%v53#m(-%Mx_o^n7t z?HqeK2oG4kE4Qx)Wf$DVxb5)sREo&W^s^Js+k<51c2v~DSli_=C4NrB_7TkXN|G4N zojj}WZO2CVpUU!e>@*RH81~wgmR)X4_+6Yb*ybG;zPc;!GS6aw$D(N5fti}0iD+&D z)0gjVvD2z)?QB*^HsK@I@-&fND!>YWP}s{qPC7k9ww`&mKjH3YdL?x8Fht@RfqAqM zeu1yS{|TRe@m$m{1O4Wcav@Q|VEEO5*Lz@vtw?D5k?!r!T~XoEbK*`&Da zl??DgOb&Gzvg13vp|cwL$ezPrSy#&buMip|X-Uwj@EQi-UJanJa3&&l_ZJJt=CH%f zxpNmfH&HA6N3!}N6>vNrl%>XDzEdIpy<|DLTM)=0of48jI5Cs?m3{Fu`?CU+$Y9Pih*#DN= zm5+Ea3to#qtgH;!yR;xa)%gp}V{9IJ*KYMT*zs``VWO&dl{xec5t#b}C;!(RCHL^h zol6`Kthv6E|En(_Lbb$yC>LYcoPD&&=K@YC?z%w|b&yEbLDAABklX{2!^%b&@O((f z_a9}}7-eumm8lcV=L~|J^#Kri$iY^&z#n>)&Rua1eM$d2@cOHVRGvDk$&EYHA&ej4 z1uFkd`HP9Le<5?oIHFIgc=^5fKqV zkhf>ZIfw`n9D-z!q=0}983}?&QUS@5MMOctVfnuOcDHtaZ0&Y+RsZaC?o-db_uO;# zh&)A&KaxIQWX|VQ*}yYY-M{r6fF-z%dh!OkJ?69D6{~IfH)(M1tyF}Fo1L!)R?@Bt zM!FYt?nt%gzjBrmnWpU96Gco)KFxT%l}a}JE4#TL;`WRY%fzuUAnX^Lzjfo~w6g+qSJ5`GedQ|eUg{nI< zFR5L#=k)x`TwGG1WGzJ*Y zg6`@iOtYZI$$;wnEQNL=58KGF{Y{=mk?@@6!pSSfCcgM#b&Iw(KeSt_`DYyi zJEi`QWYfDXt)wPsZ|?H8*c6Rp_%FttFihLNdhdJ*mKGo3S~&-W{5Kc*)8WOF`TB=$ zs3zU8rm`;5sBfx;@V=;Zqo@(EJFP~l|f+*ae{+kVL0*ZTF>tv3-d2?8X ztzV2zRns5v;IsY8KGBUe)L9PUT}goK@Z~P>8|cM~fXez(NO#yyP^3kYkveQuTFugV zD2a5?^IsZVp6NbLLSB#Sg8=`rN^vP0 z87%aW%~x9EPW+N9zl9A+pH}YUknQtgB6qqE?VYBZZ8qUpDsViCw~#Zl@NkB~b!J`X zzgrMLg2Xq-GVy`y`O=Y)Xu)?^8xrYHVRwcG z25zx;&qrnctL%SJ8bAzC+Y}mv)fyPQbfhnp^Sj*Cy7S|b(EIF`yew?m2)L8V|N7NZ z)zmtXo_LC$Gk-8!esz9+iH15waA2l7aJ3;}hhpxzOjbSYGHf<3q3e=4UTFeL5vEHQ z+@w2CRxM*k-x7wK_+N8(6Zms<%y)j-I#v7ThhMKMcUE1`oi1+Nxs}oh~ z!|(t$ds)4yG8r%6GZ{!oE zZXd}i9TuY#6(nuOSzSi_sQtyXy|6XF^OkxS)LEChDBsrRa+=N9RhpZ$`lSvWm|@_i z!RglJD0fk`*DO*W$ecI=Fv6FKFV@VwsKKYi$p8pw2Xu?>XaG#9?otl4 zZUr@YdCmOfg19+yT!m8PR)ZD-$;>;cPL&CG6Pchx#kbkH=FN$?=g$+b6f6{Q#bi;Q=~b~*JQ@6Kd#H&s;tbnpd|~)eOz~?d0FrhWk^wz zZNnH&UWjC29lbRSbfDicVmc&%+t%-KV0uR~V}37gM}CBd1_rkrYCmi(Sj6c+f9Pt_ zOG&qaMIlJrd1);IRNP2DoMzB!e<)#{?YYp$3xEp0Q}4Y)J-x6BXc*HAnMm;p4*^an z-xm`t)~y;kd0p&mn8rCvqdIFAT9ZNdn=Tbp4RNH<^oayfZxc9MWbfC4`2mqBa3mH- zumZ?1l%Ub>;&pSqmUz8yCTVNGE3M!n-dm7}hjEI+trJb#buy9wdo&4#pSX&JGR|#_ z8Sl^rDJ7P^uP+5JDgkU46&ZDRKPopjGtH$c+GkX{E1EVnAh$Lze}vvCfn+rrK&ni!?mxAUH-h+O@|rXGKw z{dd>S72+c}=-AK#dZXf37De~LD#tUs?kHHLDHRjOj|P)9LQ`vIh!;zdG- zjyoXoWcFu|h~^3r!jtlM4P_%Pu*20jVn4LutY^}OxB^?EkZ$PiyAzOdtfqvHniPXb z=5MLhukw)6m1k#f^j%6xN?dWz6}Np57VY2WG?)0q*u!JV$Id?T(IMr% z#?1Q46($Du2jQtT#I{*BO~mdp$4PsD%wkD;8eVfTJ{all*3B`TKF1fb8VZ*R^cA`P z=Url4v9flJ$PqEW_}UZgD1eBZ=S8~poYLE7Yk|>}I91F6GU6OTUC2$!fUT~PPx@w` zDcQP3B~t;~!3~k|Dzw-2vt*(UH@dZMB$8m~OMFk_?@e~f@UCK$)qHKhl0``9#Ilh9 zGV+|qVwD!F*7=tr77BcxTJh*6{$8gPU8M>?@XTW>$0={<&!m7hn>PEv<&+c}S=+u28r>TCY>I`6j0f1OSD=gOpM@vL3!#_lygIEI2^eAqP{X@`?miY?d0L|p9% zxgywbnUC_}4_R6)m@VB2B^Dc!uzf+TG_jVz#_!}CYqMP0*2VeYEm2rj-h z!N*@fW+{MHQ$u5rvZWY}tAsZo-Nk;ACs}l)IzJ99;(s>V-GSM#lFlQ-4dPQc3KTiB z$3Qmgb(kyRNmptqoI#$B`@$rGtJv(_!YF8W;Y=kX<6E}4ByTKmEEu!lv)=)XS0;_w zuO!Voo^|(YvE$4m5NtFI6Kp=8;jyf(YBoG`$H*82+BDP+xqNwzhi!y&sA5>%IseXB zv~J*D&w0D>d$&EInJRI?)a?baY|g2_#+jug-E&SwG^SRpQg0#&ymNNn8)6F(s9z`i?5s0=DLjnZKF?a9{X$37~gxechz{OHq6fcO|R@}+0T zI_cwp!D{lHkDg+pChgcB=^MJ%SPA6#S=1Qq%X9kBC>)+t~DZf27^?egHFF$FOOT}p_XZl>4*X5@b-lyi7iV_3AAkR_? z_(YK;x07I{fRu?pi@t}5GYq1JA~^5co}e(Z!6%iEX=Lo68jN%~R3of9)V%t^NV&Mp za09M8Ly>bg%}mU5?h4az#D94t*meSzA>+e3%XXf*!HUVP`u%rKN)-zRwAo_5Ab|Yw zO4u`Y*SwdF{m~Qs6M|V1t?{Z|+F$smFE?F$^h#S_h}HYkbi(z=V8TUGv=-MkZxEZs zW%frOy`y>d@ft3cNtn>|hQh{$D=)9ScsiXrlkmn=J33mKTUV}E#Pz!*93#U|pW3z( zn*=yB)85&_$-F5-O>seQ{M~-cM#7_AUm26ZVg%t@FwmX6*tvUSB)IrOJqO$Mb&8U8 z3%t8~T?_%V1^SU-!sim+{vlj21Glezvnt3eSL6k?6TAe!%z|YPjo^LpX?#F;sa|f+ zDnPOcD!l)xXn$R6;Vj9pWx(sT@w(~8)XK?Y`YDD$(pMX46qs5Xwrga3zL%VG<4rqi z)~vPxuFH!%>?R2{{;n5H9tNRCV%NL9oF{U=g{F>evn__&9Or%HW)14J8X2QSHEjyPx)tOi40=={>sY>v6jRO@;S4M?eYmhi*@0mtKtg$re@i zibl7#n5gSgRLqSjXk$g7WmTf!J3Hj&63qvE*C#!=8I#f|(56`eGC3Z5B!&|Zgnil< zJsgZJp1`kE-8M8xC#&503)k-nz=)Nw*}i#RVZN&Vf#=6WiuP+ZRrt{37dRg&sT-q? zVR|wy)iE5G^y+K4Vn=S&Z0WpILo4Ci&;r#EoEE%T#RGt}d5AS0Km~oj$s}a8-L6VP zoRA#GSRSI9=rcm#s`tot_Wl=LqJL3f;s99l!#RW`VJ_)^Wj&k_l`kd zvQJmT>!CTTEhg&T{)3ZfYQ|O}h_|G@JSo!mE57uD(_|9(Lm@seCGws3MQg&$&X{=@ z7bQAV{}CzsP17jfEk;g{PA^UvlW{WWA$-mCtB4fC+e%8GNH%;4V)Q4$4w?SL(ZKKs zxHg0i0j8P+F)cZ0f7<`l3Ix{wJtHxZVA>ESn);xPgq~s+*eBpV=ZYrJqU8WAI|3g4 z%sMc^7C#Hx#qS_tuEujB;kHEJGWNm+Nn|JBD_j6wES?&$dML=f@^0@FEG?c}I>i-@ z5t7{QhC=|uim+&g5CcTJAV90T(+)^M=tdg-u?L`8GvfHb0dIJ1z=3`{KvD8`$A>%^Kdah6>A7E0Ve~H;FR$J zmm#_Zkoru4?zruUyGlPLN^gN5GuuCiQ>f=L-|We~O&~0g#yIQ5qL|0gP9Ad86M9H^ z0#SOLV6H85@H=`EzC=(Fz=(-zbwU_znj#iKe>h*8c_(h+vFXEPbef*DbYBT+hB_V zH)wR4dc{|M0UDh1DrF2}42RGqxh&kkNfzih6FbQV*ejBRQXyQrk;3Q|u2%)7RqZZ6 zJ~_m=i4ZRG6kh%H&jju}&o4$Qj%l;{=gx1}aY+WoWEEDy_MTCLWW8KaFA~A5m@gXO zju~)q$d3x4MR3_koY0|w?P5f2w5gA!!kZzq)Ulo<023e`|4iZ*S^B~Uky+x7yc}@McOm`VN($0sv5iK8GtGk#aJ4=ij*0= zpHj}s!-U0$rzhEni!*i7K$3E7`R5fPlMKh<%|PpNDa0%;MOFYqgJrKb6UFfMWuiEv z7NZId#mA3`XIZ4%?>4SmtT5oKSA}MaM1_DdT{3ev;#;QZEA?xE4*)DTExC`4VQY=e zNTger@(uwEyfS1M#o004MbI^`_7yO#)M5?ZN*cUw$fdMrL+|MxnIn@)Xp% z=mkQJ&R}?q!D?t8e|TkP-v+-F?NjV6%;=hyvDBjJj0qm-(uL_JuWbtHFI#WO+Ti6S=b}X#no8J^$Y2hE1V4KX(yQ1!!dqXWgnCP} zi0fU?^OxuKYw~*T>346@XAEBoF8`uHzq=LGmvVg+NOSL3Q4&>pFMF1-m49J9vdNxA z^UpzmPtf@nmQWm~;_Gks%kH{!K*r{#1Y6vj2!AQyuf&a<@y&*WFEmOLFwvpc)E3t# z>3!*h!4D_c%I(!A(#n=4x=`VcDaHpd!h|cPD6C!xDrV7Y8y>h_ZafTz_&|3|(Jrx! z7@pCUGS5VTw_aCNlB&@JLGs3XHESA}p->gyT!<>X| zqI9Q^CwrwV-DZ}2?eND#`WX8pub6+Fs7I#lBEa{+RGUWRAbnr+r?sbSJZy*Dmp6{E z*}Z-{)`9FikY7lwALu|X)quJB%3GVS4^_)Zk%s`znwxXClP{NNecmQq+a{LtUd1W< zWSIK`b$;}*|K7k{t&|D44bgL*81F}pb2V%mQJ|vIgNmR0ijX$P^gP`K^|AWXv_*Y; zmlFc1!ST&SWK&L~d!2TnI!Ft}i#Ac>Tiv-(2c zav{^_WTGR*7oj39Ku(y#97wy30}LEsOx};46k)vNr)>Fe3VzMA4CW8y0t`jRAcmLw z?sHaA83OP1@A&@c%C_b*sdSGOb{tws`h< z|Eu)JA%prss;ik861wvx&*WEr0__~D_j>fbq88vQo3qPVz2m#@vD0j~CRH2TPG?1q zNc>j3vf&c6EC+B7i`XVVm>-fS`m(q*ehy=v8a(G7dv0^d{`-dKf476*T)#gC6yr!X zCnB_{vF;5^E}BkKRo}%sX^uBL6Swo~yGa-g+Fq`?Q`pE*#qTw$8#r*s^95OvKEIi0 zzS|Z;(nsEpJ~WiDXfUN@;W;q-R=*FlrDn>mp&`S zV2BB7f7Ku|N=u5Q=uO>SYoui=PDM|O-(1-{Rdf+^6z=c{_jFmzxYqFdyZdxw91PgM zacmgXmmjGm^i;n9G#5`u;t6|a7mGJ|lNTsmG@&un-t$_8A!Bw1i#U#F`&o@43C;%{ zXPFfEa^~oqVL>m^7wMjR1t?EkC0guLL{0u#-SZ%TBVpOaCqk)XI zPF{~}O-JLqf%1Rl3%@;>zjd5*?-gn~#>IS-k56@Rd!RHU@6nm=630yAj_HrN{uWFs zc%Yq3jfiYFu#}jV^J@7amZ<>;pQ_b-WX+yHG7RZILIBalG0xwIUxn2_3Hwv8qKr9Q z5L7V}HS-iB(#L_$;5^>w^YO(aljc2^8yPJhtFKMFPZ`IMb3U`!h7Ke_vi6-sH3+A_^b}M_H8Qn2F_+qE^ zI^fG{%R`aH^Iwb6zv=OSfO2TGTf-N-YHIvkzVNim5Bhb#RU4rO4Y?zpQ(gAL4xjnjh0Nf!bEIDwXS z69MxleR5&EW~H+=Bru=yLt7gI4!?0ohGyvxgPziA&Ili6XXpOnC#ica0MX)%uVo$bhpg%VQ4>1ltLa}@cL$Oo1l6~64vbDM*4N(wgX|SOW0iHz zSX|)JaNQ>~t);y*^Yv?l+hq>kFsFHH>&l@EQ>h!&1qc23nu@Olj+pdKjVUGo^Lje(Y#Ifs{SZI8D81x9| z0h>qgjb2wUBV_xpa9z1xW2)a|?jTcA{88xyj&!Lye$B4RsWo(Zm&O27Ki!t=$BBwnNRv>r2BO$Z&*8&c*bJj#1>xBQg zlF0U?Cs8VU0aTL22|hE*x%{h0AQsT}ga`fdK3%)%@4GYiWJMBI6j1R&q>KYaMt=j& zmt{m{)#sd!qECfUmtDNi_9U83h<0WaG+8Cm8s7?tRO#~$>n*sl-2pZ1pE=P({yI0q zJvp=PJfx5BoxW^Z=S=su0%Rjv-svHb#=$T$TN%6`IgxEOOQS1vDjFcJZzmCjmr!j8K&|GrrE{4vb#h(F56T&@}l zZ4nb-m8dTwA2OBakxfV(%4YHn;bGyOvxLxElR+bJW}Pi z4YdKMwnwdO&Lt>B{p^i}pSNxG<4SyPYv>z}RBc^>P$XYHl9G3z2!hq9?Nrk^7eIDf6pI z?a2ZGZ`=(r9>+j15}z9RKH}%+Q+GWp8@A3~&?|A?xLie+d76-_C7|_)N4sD4R>N0% z1Q_D6d(pe`q)Zl*C_H)JM{_)M<>Xtm&)AuP1#fQVoJiKq^` zRIV34@7-H`N5871b$G7$h3HB>_8(DlD0U>5cg zr>Cgus~rI!d&)%RVF*xksSG9{UVhU%Wrbr(opge!*ul}BYrsFE8`HC^%|D&m!`WN% zc>D;wRAv^GUzq;!gpC35Y3x~`Bv;(8geD#!f+{34PZ=Lut12FAW_9Lg_|4Ma?0K9B zxFj~pbMgbJ?M5YJg`>g$qKwojy{L;H6L`Mh>)Ec&`zlUdVjc|_S|0e2r2jxq8b)g~ zSN#zhxvT#U=GzwEL?y*ZEeMNe=HZgB0S282;#l#!Vr{<^K7;p%$-TWM>9x9=B#~?5 zff&og7mppbFDn`Uk;6|Sb-YxsDxBa9%Tgjm2$vTq)NGsDzm@<34KD;y5yz{xRmM>E zIq_%ImPJlY8s|^hbac*ofxfF(q@J2R_7OqdF@a2; zJtD}w8Ol^Wv*zqK45E;a`E{HGZR;-8x-Z)5GWbb4YZFEb1Ad8$SiJ`t8Ip6JT9?UQ zNCdfG^Kpv<7va8;QR}G*YNP8h$M5nbv!HSLw2!3srETac?&p>t#;P4^OmRzPHvh#w zdg16x4&ILC!~2ucnmlP)EX|*&G(tJD_p&oT<6ut!na|1-+M~I{*%V2Rh*?`bO|36Z zD?R}GFQXgs#SRLK($T$BrYw%zQ2*}|c-^A6diu36KKgNrJ@in||Jm>Q6vMqHrD#27 zFIV`|$T*8Aegk-Ll5Iwzs>RVYugJA?tg49$&s0Vh>QXPKC|HPz;XqRXY89fs96;bn zHTYMF$AzA2DBma;ei%p(As|G3K_>6{X>STm2fiYD_Ptpn^WHez-}E?)J|_qy&$hx8 zj_ot}NBC&2h()Uj_D(fdzKO~1CeO1l{4B)MDb_x9#>>gk2>N@kup?A!$Hq|6KHH?M zRoI@^UQq+#sv8p2eDyGWdBFW?jW;L-637BU2r&}4?oOi&zI5^5oN&D1`~=n)0>SaK zZ^7R?{a6U{3jz?THOg!por~~r`grey9FNpiTo_9r)ywX$E-Q(7u}_CWnjTNHkR;2=t#?V57NqVnaZK0uY)tDwgO3?ppL#<*vfv}52Cdqq=q5^=)}s{t>O?vU z&Xci-VKjz7efc%G91Rr4wP|x>!V=#Y>p18Ie1@?^hBv8k!ASsoUJu3)EQ1yaYQu!T zRE9@?;Y9kLDU{UQ#A%bj$3|xW|7n0VntE{+h5h*X9~rGkm{GAiwuSQEaxMtD{J>}_PrSIJg=K~H?MVv|FcZ=Wf|NcU{tv0)p}TFkFf%7DE;_1L zW8*$|YS&)qMzGLZw&4awhA5mTa1eI_p;0v&{Wksv=}!mc2FIz4D-tN^6~4XJ%YnCs z@h#j6K;v}TNhkj~MC0*f7JP)Q=PR_m5-Q~F=?A3mwPdzH=<0)Lvq}Yek89UFECX5~ zl!k zbfR~GL}T1mjmc?6U1YTeVjEaoGfA^Hu{jSX?9fy4)57NRTVcJ&(_yB>W7D|vaMEm8 zsR#U6bCV~CQ)XDVQq?ruLsUC3A7t-W$WWg@g*<-q2=o4qvcA&{s55scFV{@CP2Ni3 z0P{y(jV;AZyBwjUJg~&%JH;eZ4r)M{V>kzN=c4S1&|6ix_xN|8Z2+9cK)1JXEusLb zCO_8zN;!*YwZ<(ps2z*X6td)vex#gbmbRsj0B>_eeuqpADp~p1AM$scWl{EfxfJGgbK=uJ zgBRK1lYcEMna+vSFt3Z1Wb#$b)7kr~9fxAP&j~iMtZM^(oT_Y-X1i47k(Qy%z9E4> zxODdL!CfkT8w&F%LT@+268hm?Y-|i-Av80^d8WY*P^+Pn3rM`FW5OLDwp zxQi(g>NiY|R;@mp84F#t9`hezis8aXV~cB_Er*|YQ>c72V7+~KUT!2ksunesDmean z;0*L$<++Wk@kb&olWn^fC&)MFZZ@a=?i81;Rz&+f{WCD7bf%8%W$nQ@D_uFkQP{LK zlQe&7Duo=L)$ahrnJLll#*gad*tQ3P^VaagpYQ3VaDJ-H0KqgjPyb4Y_S3`BOVbpq zX~wtu5pyPC!WI>h)%YqmdD+9(&*8S02dy1+;yAbvHdlayk7J6|95y@)(({6+lCGPD zZiMRitxcH6KP>p*S)8|w>TfX0=&nQeTW)qw9rmi?rc__Krr zk)(t?FGUnlhBqk_o-&R26GMUT11e{jKgHE12jd$TVaehmS(}9HO{$mF=ns(uA`+e} zKFHJfSjw0V6`T^sQ{T+DMvyu=jXV_BgNfmvGasXW`GWgGvxzvI(sEvXVc8i}^o;AW{)j2{lB?y7(YPnqYCCPL==EjCf0F;K$c{F3ZkddtO? z9_)ggcj_lkDyp0+IC!Dh|MjrTML)j`zD+qxdG@du`7jzea*v3kjobR-Q}13nN!5FD zoKl*(IP1*{y3YJ~=em;lYF{lEo=6jHgbj5Gus7ADYZD)hQE-jXO4TS3a)YZF!VBj3 zUd{1$&k2mr392iOYPkrZ<_X<%!Y!CFj(JfdcY*g2V%O#+0_G(n=cUr;rHkgoi{@p! z=jF!d<$c^`m*-EQ78JP`1as$jg#d#P*ocxF|IK$DN~&^=Nm_Z`nneqzUM*;KFKCZ1 z=qxYj{$4nJ{NuP6^&}Sc)fWwZD-*qPB2MuEfV7#iAwJPVMQFkF)uLJVBHes^(PDYg z^7rC7)RGnV()m}5#<~l5ZZV>lM{ct-08LzsT$2A316a+;xz1@NEIE!ZwUR`DEy~%o zJSXmDx9-HcikYVmDJLbCuU=d3CgtgkP^Nw*UMpJmVo6{)KiymxS@&|;=l8W+llfN` zmv2ja^P7nXQ`WiZ2wYYF77+05e&n~n^lw2$*MrN%t)&!g1h2b3Z%ZnVgmLsee4nvn z3^;sgPH%k{`%hn8?<)&#rFrh;{da08jj^isF`GcU73s3ial|n)d7cjlpywp0r%#x8 zDkw+9=ax=5+TFWjx5FFV>QH?xg0i$LkRB@h^6WR1g`>(^P@Z|;=dto%(Nlr7155e9fsl7#2) zTg})_H-0F2e}B#R;{t(C1{h!v0!tEq2CgI9y?08zm;EUzNOIL+1WwfZqI|@Vf&kyn zk^(6&@0Dd2ceeV%n zZ|22p&%m}aZ@;PdJ{EM_^F8c_1hk+ow5F!IlRL5!1Kz!}imLIh)MS0MOzD+)hWt+j zPGCj^Zg(m9dUVea{{sKIzWx*c!FD@KZvQLboK|1@l}!@hcOKCRn;KSVX5yn`h&y{w{C_IL^#WK zR!rPZRQChDM5*E$^-!2yC=51~s3xQ>mF#z;nK30aYwxlD;+v+_?(4 z+b)s`u6wt$&;KA}YdwDZ0<$;9N+tJ{@B^1_^0t{iipjn4Hd;?O%jlK!^|NKy6K`Mb z$z}B{%A%%7`tG*fVJ`26RTQQF(7RtaNV#_!`%7fcQz63XsH6Pda+cD-k2Wc!O4N-D zg4vcDyYaur^74e-?2x3uUpJUrdZ%vXo>_AWH~GdpcwSFDNx<3qwB{4RBv#F27a?_> zhylflFd1NUp@Z(6!_} hM3H5~M6|!l}gvdGw(B(u!j*_YUp^Ww?BMVDz`};@{`j z{}$cZUS2Y(w-K~wR;>xP5oo`aT&gVt{cZ}tw}q7P|2hi#IF?I#aA&K`DNJnXuD*nR)7 zC+e{G$>F==!@h>Y{+`2uiNnEfhwt|ehtU6qc^)P^mOT-MP{UZh8#@Tk?;q|ztUQmE zm8pT1lS5*opSiD3O#Ew?UQ164uj*otBmJ3{49zw9DnFbp^qMvG1brEuK}y94-N0Vp zg#zx=*N2|moumAua&FV;-;=lr{Y75e_fJ4%6rF(DzW84VgAl`a3SYdor2WyKC~l#Y zdvc2GevTggxpnUM0RWnl3A(C~+m zkE3LU+swz--pA?^28anHeZ!4>7>l-ly0IR9aic}K?k&2oMXiQaK&1VJy<7#SK z7^XNv1LsPD^Xoe&V_kvHx2O8qy{39=?iTbU5#T0Rd~M;oM^ZLrhZ=s*`=2OY>C0Y? z5g5$UxVtv>?x$&gE-4HvXj(7E;C|+jj8k9z4Fw$Pbt_1krJXFcuk)Jjds#m5!nGq- z(Ck&kr#jD%WlsICD!(-NF7)M?HB?PE2mV}}?r(VU^(|D61Obsh2tXMCjyw0q#|nG} z9&vnSWMt&z*(nChW~E|icWj_{{D+qqD2Kr}tf7|Nn`QvGIw?PoKX`P0xItots}+ z{67$~x%GYf$Ij2)U%&VE|NK2T{6{|m;Mo6#5Dpo~-s-%LD4eKiwsB2 zoKeWUv3jl}nnTukps{A5Ct1`i*Sx8AsXs&I=FC7--M1mCL7dPrL3#CKiA}ll;Om#` z6V+Gxb1j-*ZGLIIyFN46-0=M?EsRmvvZe9ILhmD4m-j7AKfetZm_4&>ef?{FvhL>B z_y0^|(I^B0?+Ue{@zWop!fF8MVDCGB$+Mx&E@%(Qt!nQ}0DwQcNY6ngL}L_$Ju^&z zVPNVS%P!r2)>#i~R^jhWuq(-uiES`Y?g!##;AGL4cDPKcmL3uN#ob;PLB z=gGmS7GEIbJ6p1T0%>gr3Py607GX^IZD-&#YE?|0g~kJf8AKDHV8p=wV)_e`hC9Z{ zeq{#jnEuW*YD*9@3pOE|E zT>3mwW~*^g_rY_3zEo7c^|}xSDKu|)mv1%gjF(F%Ej(x3%KeV4Zx1FCL?nP}i91`T zxz#_NYo{w}Ghz1Jc((=6Xj=jxECjaanAx@{0@$Am)x88Bm5$`^@{qH@UL_vahpAZ2 zg_#GM`}H2!N4uVuo|lWqYLyu;@v9&Fd=Xs1uH-v{YL4@L$87NMuCkD$=G_J#&dsE3 z8+Ny=Pc1xkSeR8Rs4y&J=qwp6;9cDYXVDm@P5H|LP$-Kwbq^)rU#*T2iH7u#eSfNV zPKkb#`*m#BxxG1j(@~Q~QYApbaFaJDfpI~t!9gaO=xq?qsz?Q3$QI+uG&s%`fMFGf zX>^oe2o8po5va15|GOQ^gt3EDp)Jqo=^-ZXz6Zd!oMt&@X4&Z3HaH`JM2jw$ls(q= z7o*YO0wDx_?7+zdE!}VY@UUqf%k0P>bSjMmf(Q}~X0Gy~R^>$WupWH;U<|+xw@xl4 z1PJW|7(f!%_I#F%tN)0$g4F*f$I{9H{TX!DW3Xw|-)XAGt_HU=Is3lC#rwbyOdzm|M{Y}+ z6v5%x#(X!W^MU^d{E2FTlz?lIf|iTAk2t!StY~DUV}%{4NaLbw;V4rnAc|E=81G3l z{BV!zZ*A-J0zv3Og|i}0OwP+XSA#n9@TAV0M(FfKvI_Ns=#$+pM$#}KJ{Aiw_(Eta zoQVa*f)rkX;AIy9_GK>sZ7d?_fGHL$p&7HCBI1?bu{qDrBZYmhRI&_1=hv*ct{RA= z1*ibr(EOslIV7S7^W)l4j?n|in+q-6GCNp}jdk38VnD6gA{DIkDq!I^ih~xj53$*?s_}zjy z*G*;Z`)U(UaIu(8cR)Fodetm#8)8<;EsUB#4hxx#4ecA)-slUT36`>#Z_Z+_SFN=g zmNW2J$MA)?mfgbY8Oy_7rz>&zW6f_N{gh`P_wf&+h1djIH}g!t^#c4AQ6tf8yF9#@e~l0}x!y5eSOP zpM7S{dN00p?07~Q!r0tJesvmP5;$2T;~z*kx!i%qHUo`D;+X{w;;~_8gg8$@0iy#> z5onc5z;J1c#k6taPl!?)i|4q7e z$sMadOJ>Gs-s`%ow801HvO?4WMSJDTRw&@DSH_^VQN5^cd@HPx^@O55IeopwR64ZD zenG?)b~$8`{(0IGd1CnXv9n?>THsXQw5_VBwW|$i%dVsvt%_YSKNUc9jolKnD{789 z`T3KNuOj#EdD|r+11+~cKu=xZ8bNYTmCzj*^9yTTO?dTgGYnIM8*1TdaWtbD_PcZ~@xI;um+XZ+Nq zm>&Ie51ae`tYLFmRv^<&r7$WNH7&dN>_*M-BC=O!_W~pozymlsFhCh)QR=x>_J0c4c~D>* z9DW2xiYlwIrLnU9Ju8B=<0nn@pGM=Uv;U!I{g3ITtTfW!^a&h{KN;|t5M}hWTp)RaBqNqy7Li7Th$0c~3vqa&6dYXBo!t|1)A&tRtR=IkO^LQWtPYOUL%T_tn8V= zAmbaMFAg}Ygtfc+g9Oc+kzW1)`Mzj$a5M%B6RKkumBKT9@)wDUM$5RWVR2Cj`xwPp z5KFMd41??%Oe(|YqZ@rnF=%HDfT2a_*gFu10gos^h^`pZTn!Vgjb-SGyG07ofW_6| z8NSX1GR!*n<6x12&iCz6=~3d(HR7|a;`iGDWlyFn#w;hLBw@3mBlcM7Sz!0f@#l!E zPfl1+q!^)riT#8!!fEh1Ksdv+BE=#S4f}rHZ)*jsvJL8e6kU>H`h{mqDZL38S#OC7cGfYhdL+G4G<`b_*fR$^NDOx0xYLtZy1aa#~hEnla3Wm3A_> zTR-wHk)U`120d!1el$h;PxV>|o>zx{uNxqX$;)zU&Hi*>-WQM}U6H8;HCGufH!=5J z_lG5?XAPfTc|!gKKf7HIuqv7b+z^l%zI3rEH4pdXGZb=STfCwgCJc})dqmF^2|w&6 zNmF4mRvM9Tc;ru5?hSQmNFBcjaz))PRym_CDJwDRUgwd~p_Fm*c~TXW@d*lX?*vM! zk4?+0-bkMPPt%Q@jtW5p^xNt@iIm+Q1^gEi`oJt5{m>Fp)}&&v(aF>T5?s1ED_#xC zH#Dt^LA9#sbeGD$`2$LCr@zdDd9TL)Fv5-mG1u(D>^`Ps18`wlWZe#h-^wap(R%&{ zppG`p_s@Mth8);?9?An#x=hPgg=g^V*g_FPcc6|>+O}wpjZtqG=eIxv0Rfz z{4%n4I)SpN+`JT+pg2JKmOD6!3vbBS0#g!_VJ0#F%W!TTlyj`IjKO8@)q$u$enFfz z#TbT9Tsp;yo>Z!4pU(!37~5gjMmX6`2(xgAV2x z2VT{*q-<*SAT6K~krPSt`Z@x>f55C$4`QiLH0F!`H;&FbEXnt6;}26nR8U0RxVPcR zl@_>H?v2vaGeJ9%;cYo0|SE35i@XEWQCAMJHULVfFiY(v!l!wyK-o~5Ax3q zSYAu#oc4e}?|;!qr*^dWdpoxShyY8^C%=X2cdi#86CvuoX9_yufxYMRZ%yT&B^?2>H~SmC zur=zAHy3MV$jr+(@}QW3RL;O;{@Fm>%`{F7gxW8x15x9E^7j&I`)=nX;a3~wFSH}- zlF%ye)uH)_!=*s)QH&F+@v&H<958t52G}5E@bJ-_i0HH7fl+Bu0S}vnBkYGJ)eb+H zy6LAAWMkMdt3h4OhU#%-L71TkCRohfOPhYxMWVbS1`vd~MpGaq;jIrpWm`1g_asN| zY9MywyKV$T+(`roR2I6*h?wcg2SjteQk-RY&$4zA2y{xgm z5ZD%C6L2HXYy~0Whn|EN>9`|ENPv$vpw1rjZS*-drqT7rjH7VSG)y#PBTM%MT+Q){ zs2}w6$n^`GBPwXot;deqNg8ifqhHs@T(UMIVMf*Dz{(k8CrG0sq!3b+oM1BC*HkZP zM&x5~plq;P;yaU}cg2X{1B{e%k^v;l5t|hb_~pR;HS?`Zp`-7B)O@glFguuSQ>$kZ zr((W&QZsFU_xb?v%`=GZ;xawM#P7u}9}JOwWb``uYI%80;#iWYVEI65=KKVk6jC$V zca9r1ed_FlyIh$4FF@ZLfX+`Q9XY-yJXPd3WutZ=@sZ(0ywO$h6Q6(wIys0oG}`!` zx|t-Rb70019}!k$5c%C;_a=Y>%=z+p6(D+W=)pkG$t3t$RUqgk6RZ$ekUl?iKR@U! zqa!&g%hGN7g3g($+hC@61wNJ{-eAx$1v*v#@T_|=KkMO3Df8Dk4=&2f%)14@R!9^u z6-b>)*^P9)q=_-c>uel=f3^UIe@lM<$@_cE35((v9cLI&O}VP`=ZY7aq88%6&+=-3 zA-w3cFrwinT|z#Z->u^D8^;u!gCr?Y_a8D#b+R_;(bUh0@Zq8Jm^8&C`8p*NuFLx9 zVBkPy@;&lE)3-SQ|xr!80M?M~0of=D^v94Fgf9Z)Ni(KIE59 zSGG;&liynjW(_WeRU!S3cP|ANUIoV<6HAy%iV6k<0r2(1$neEn`ux*7^8r|kXYRBs zUv*f?0EAlsSn+F_$6AeBiqC%>EEbT3&I7Wf#cP{602#RT&)eyrkfid9126gDALKFs z$1;8!m*$xJ=?7vX4a(Fij(VMJ9vLSNwR`xAcisVf9TWvgSGs^4QZl#qW$szg9NpGw zzNbsWsYI|~_iF$HY-=PIKY@|qRxOaR(NTKQ4TgnJDv|?Qu10q5-cMvbAM6gO!ST+K zA`o*e5^&Y>-jg9i>lOxp$alSbUg3+9W*u0#)g)8M*K;>a1MPwxo*nGb+q(@WQ zk$uqin@QwI30c0N9U02eLaD}2wyy~%6WwJtf1aCPUrhQQ zeNAYt@nhz3m>xzaR0wYSR@>8zpWC+`GDlGBuKAON92Niy?mOgO5}H#|esGb`I{w$` z`Cx4&wCm1?(}dsWZtR`fznw)?fs=P{?EhWqeRI@$E;dSM@hfcUlZ>b*`nv3TLkj_p zlI16F?&LUJ-uHFrxX|3#hWjZZPlGiudN1eAhaLtXe2E}ObwBBVgg|y)JiPyUf@|kO zY^mc5?E4x@yy&?9?;x>u!0P?rIW7SsX-ak>KhCgvgDv;aEM;XQjw z8-4lNK{})oI#fu`+7}?Zomt^Zwg)9Z)x65LK%hGSzxjO2E;iU!cOPaPE7vp0pRC4= zpzOKTP&AG}H6I{Y^UYjwL*xu&@B3JK)TC7R-$Y!*q|h#)znLLiInc}uR_>Q*YZD=y z%xDFX$vB7_*uyWaoI%%CgPY{*{lROK3K=L>s2!wE+4abqpKnL5W@fmL8reR@Os5nB z#{Vu>f$C%r!;YjrZu-aS-8_RdX zdf-w&m6njtG&!*MT~EZ8!-8bZg?bvfNM=K>4N2y+VjaW2oPvj)b_x(v=m&| zfh@asn)vZ!)+s#>- zh%hHDye19u_!dKg(*%o4&HzS5C*12{PQqeTMih(#tZ$ST2sjK2?6yQDRvVUxf8{{; zshLuP(>!*TL4JR$v&G+O<8;qF6=*U#+*?LscrV`B$NRLVp9*Njt2p#* zAJiLyzhQF~kRg?s<*Zw9AXi+?<+S3g)AruAx!Zy8rm7~os}=EmgV&?J>^>`%EQy9X zpAof_yT_LRPq(Y)ivR)(WE?z~1Y6*hXRJLYgK180r?TH!;lEba9l3QPtSsu)yP%S5 z*i7|ncQcPrRO2wJRS(~mHsQDC#S`WB^&m{#!mnFhKI!!&3dbGSfF_SkZ0q>jJ_hRH z!gTLJ?R%&gN7z5k*5h102>h|5Y(~`ME4NN8E9gPrO?pZnft6UeA$CB`A6&IZK}M=F z4Tqd+)*ubnj{ldn{-&j}LLnqzw=V~Dl@DeB!sSQz=<#(* z0rt`_EKVO~_a=p3+gzzlfb}g=Z&SF;WRv#4F)@jkBi*ej9AeEAva&!pUIbzk2O?)Q z%jfw>gg!Ir$>|YC9n#gPe!MA??I1l)1+n(IaPvT~L^4t5n_)teTT1#=&R(i0Sjg8Q zqwmH;aPi8Bii~hUs5}eA(})Q%f!xUHY|EbuS^#iEKt=HlDO5BAK-B9!)hooo$M~iX z&uQ+Xd4p#0Vxp-tj^V?KIn;ax23L>|&G(Ym(*xAF${-|S7K~>BLAtau6rxF(f8NqR zFRefdLs7H<=k5QCB{UaE$?M;qqRyPq8crY^NYz%HDF~oShv%T85&-t z@WPC;Bbv{$*G3WWK$r!zY|sQ9 z^>F$ez#YdKZ;;A{AQCz$*G=IdbqtH z%V6K9aK9T51SnYl3r!ioOU;FQO@{$bX%P4rFa9mGmX0!I0qEX(0BN+Tpp=FnbP!=g zMA2Cx;4v0U>z1UR&7p3BDyQEAGG!!ExQnp;^hlMT(({b>TPprvmaqloA>y=D#fSa@ zu-)(*1UHw78;Tqd(S;(AHtExB5#R?4QKP2&VvLaIR>_-fXFrDQbqpQ2Y>?`Lh8qUD}5s;P%u&ODhZL_bHv7PzP#=a zP~faP9Cm&n(}zt1LqiF(4$QA$v^dRN-yB+77*R!Kt^Ar9c)Z$l1wiKm@bJBs(RZ$! zD-=L5ryQSH3Z^~ONjbecILcBUzh)|qmY|hk5fvKZdHTS)CsdfGJvG0YX~Re80pk6j zXde%nangI3YRh2=uKVLe)=?dZDnN#Pq+^)OsbEJ6MCk@C`@gzIAfZ{`3+rq4*Y`E* zK|FRDgr^R4JxSO5!p^0hQ8TUJAIw$X_zm>y3NRs-m$(eRO)QNL$$>jNQ7r6EeH1VS zJ_o#J!Hrm;!!gh7ZSQ_p7BHH7_%KKmO8ccU^Co7i%lQ2gr)U&`&rx{lm*l3ZChkd<+KWa2?Y*=>@q1TDO|u8$|Rq*NTg*r9)4 zyhtqV#KpN(@s9c*iU`?P-w*@Yf0x=#pd9Yj4`#?34fry5asK+-;WOR?!%|+L65Dz% zanlowL54Q$oCt^{td1zN1)`Mx4Djx%b^ndicnCu=0uxq1{`u-MMC}_ST^=x?!e5g6 z8;FprY*X~xcLtmA>SmP3b^LDEN#RxfVF&au{dX1s+oa#+q+21V|B}07W4|E`?Tlk< zfk9`SJqc*S;9}td)#M-d^7l;VM;mBpNjVp{O^kdH{~e}Y#U|<_tr)KbHK65}PF`)= zIA}_Q3FdvoK~OtDDt<&@M?l#3G*@`ldN)cu>MiO4Q$QiQmotxO5+YOtbYj>=%d^OY z5Ktx2tN{RF)K&9x4hnO54&Qu)7tL4-5LL1b0~3YJuxavVF!`sEBXZEpfM_^X>>5*q zjz#Y(>P8j_k)yVTThZLP*&(Xv`U4cRkyWwrMvxhCj|xA%ehw1=w+~FLDi|^$!jq!V z_L%V&Io)@gsEPvVJ2dBX0YV*vu)~Cw3!qaD4b8zS|Y}EhJk~C|-G8{XSDs zeF4Qit*F?^5_D?kk7@+;`C+l_Em9%Eg}e#{_G*}*BpBA8C?ZVO>g+k;MLsP|)7YU} zBbcfog;h?%`*RxR!qN3^1c zNUJ^1Wd4xy~j(+!EOxPW}d%CghjA@~^h`$?e?pzx= zWpAnuja?;FbM$9PSjQN^XwhWsElg2}a5}X=ebxHaws>y$!MiM*q2c|;bnZ7E(CB0S zEYQtg5wKavgsQNUir=&bw&E)}u=RI(?puQ3Uij%X3S=oE;Y`riMXYzAggwdfzwacg zVyjM~%TITl(;2Mo4K%osTtpkIU>Ll zN$_#I2p5b@H^1*RrziFT8IVOa;e)LOn^&#B#wr6#&QGJ>n^@RU*sfx1{V%Sfs2x;c zE|MpFEhIkItp_ciSzfCLZqDn=ZJ``{?f009gR!oEtf8CST0klWotKKpq!W!@U5|?L z#|ie)Y8x5(LS8NCSyj`#E~M9fBy{6`iyCxY8Q>Op!&w8qSODXRo(b9?`#9n6rp87u z+GFHUePM^=50eO5i=S+7DEr-W!-e2R145vQz z$TtvT>$89Oeb*IP&%>LHe9fSHtCk?!^vD+)j`c>6L@4_wAFJ~HL=KrB&Sk!f62_xT zZH@$kJmpQj7nMXnk|5SmA-r{m8a{YGI#${5WNjnVjr>qFG?Qf$^)}R)Eh{F6nLdHW z{cz(8Li!6C+soTjGUI16?Qc`9KSv2Ux`%O-;zBmgYK8ygCwNKVn*&D3fuA1P6zAie zBC!K8X!#wK7hU=2wBS*DK)nE7*YBh3eyW2O@#k{=kk?7QMTdrt3@H{!0*Ds4`q@zs z=EbsjNrmaI0y4LdkzNuV-$Wo+BjZoIeUAwdS$#d5!U^0aHc-!S@JRb%-^3rvd9l{E z21wpQ@d3yBg=frr>J3v~zsdwsi!CQlf%+U_`adz;cS2URdM7*yQH_r6%*gM8aC6S{ z;lertB0D))lxTpJX*zIB$8g_Glx`_f;yYp}FfwSLV3w8oug8i)6st4wLZM`+0TI-J zUe`C5JH!cbpGLV;!kA~Rjem0YC*ldwla4Z?$KtfUdy?p&)i2XH1P+T_4=5(;YAF75Z+q7euAHRz#Be^GjM{JurUu8l| zZXxm%PnIwhYj#g*rKhrqH8om#f=tlq_Uv5hB$kptgwt!$_xsS63n*d&vhEuKm=)L_4(ci5pDz`%kIH;BkZcT$Y(L3q2jK7G zYy1il+~^}~+=SR>s<=sg(T9Dh*M2Cwc^bqE7F?psicktCh*#UGSrCf|UaZS|qAs-g z{Q&v=pdsFL52?LYjAVhdKZ^XcRUpvldsGWmLnLDV(aQlBEUwUOzT4&)1jcJi&?#Z~ zTIi8}{=C~ljkMtJ-vpi+GIC4I9kcnLC1U+1%S(tb39>JmbNM1Wxgk_aD5T$fRe#(_ zblRsX?5Wj(H!HzUQFXgwcwU7oM=w4_5fYIXcM#ykeRg8V$tS3A4{YkrHJfKNB-y`| z{XvlqkRAzp0J6y|Q`}M#ja2t&SD&?8DkRc))E2d5g~IHjOb1bc#mJ4Ph$s)CsJFIU zor>aqBdq?@B3Ix{hn8_f0Nj+ANbK@PPax#m~axoeJoy z1a%3l(Rnmyui%Op^X;BZVWOaq1ah0fPc+7=-)y|?E6mKRoLl|55qRY#$9j5O#P5Cb zNj<=^IOD;YNh1J1J5$$A4$HVzxRY3a`3U;rUU~KrB>p`m^Rd9LGg5n?^~-G`%V*^x zc}*hciBboS+ZZc&j#P_K!uqaa6W+F8mIzfSmY(^pE)-Kurz?3&0(pN>9lI#nK;;_% zITQK|A&KnXMV%MNz9>y~_QwgSEM6E)d}{Q3;xJKcGgsLsNc>r5gf$pn7#vMWOZmummBUkY}KiH77XtEIf*8Zz- zRU1$F=VU{g+F%$qcD(ivOP}74m*N}Se|2FzuryE#V9;4uwrSu~B(0PmeE_-r2jS9< z?mmO0f@=SoV57$3&WVayr42l!5ESI+s>$w^cLYA>5q_#XIPFz)8Kg< zJ5N&V!b#~{`)`HZ5xN``k{$7)<-Q*__zrq^5VhQn+?GE^jS3Aq6MU7U%zMh7^md?FR+$VoALT%44jAqsM zN2~kgyDJ>)8ZRM_XhK;M?a|$XXBaQzyIwCH85a$B!{xt=N*HqMJ%IG}=f8Je_zC$! zUc=+tM3>LfM3`jgk%rknYnl_o&+NqU9}l2S-mtM2`ro3f`1MX1C3p+d(^~14K3d6Tu~i703{-DwNcld2UFs%3nP>S-T@7_m@qZy+aQB zJXMI_gw5FiG7mtSD)&M^S`YkZ4O?-BA)cuzaHU04_S%`yZ=#43!*VymP314E1DyP1 z^ZG?!#_b9`9}RT#(?7<@noiBc02sYijH2vF=O;Yu=n)6nyAGuj^hryM%uU z3jQ6Z1WuqW2x#onYmf7AL;aXN74QkLSi=*E4Sg5lW?x1+pYCG8C46ODp{j z6wHYuJW?K;d#=RKdTomnkg&)W;$y?Vv=VL|OY>UpzBk^Kt|GBNw$__Tx0Cv1c~(vo z!q}%_xpO&2=E5rXFvPtf-`6*lzfC1Quyi;=2Lw#`^+H{Zt~7x{`mnK zn2(8<1qmhd9Xati7hG#K?O4Y0a5=SM#Zc2d@}kgIRew>hEOY;?tUieX5J;?TIbjV| z#hMGpnamnF76l|BvS=piU35k_CEHCfjrJf}h(?kZCNZgtAyGW&V+GZ5_qcj^guWvg zgns5|<#ujMv8u>RsTJ#*mFiR1=kptOicMP;uyCK@$ci9y#9;z*$r9dId}iiXTJHJ0 z6KlNHGrWw~H&Qe&V=8hA2}|TDsWsvh{@3u-j~b-G>_!{8S^RCH_5t`@Be(Cc!mKK;_HZJfqH^i z^X%&&)BJC^Rnd~Hs_A0GleX7n&{oadv!5S~TO^yf*$AOiN^62*8wiB4oXao)>A&J@ zAe7NOh&Q>PXMsq*+w?mD9C_AMC(a~x!sd|9h{|ng93vf0+x)Joh8`Nr44Glhr?tdd z3U)qndV9RDAT+!0smxV@v1YgS$6utDPYY`~rx{SGXwl_1lf_F129_pO_2hFGPG!Mo0zpt4~4&LLu5~ z;^X{IqKbxTAox{ewb$3N)b_nKSZk{c^1x43#>_Z&CZeVlN;2A4oQ<5(NV$|SiK4cg zCVZsSVx69hXe_g`2AEVm&DtF2@CY2rn2JO7kLGs(1dve>S0jA06}lvpz5H?cS80J@ z?S4z>rSnn*j2=yOkU^c!mlBkgzqvJ~Q()U2XfiOFLrYx{LuD!uV$DbF(s7!ITzmT>YG5e5Ml=Zpt7g4-KMkZ^Q(4S zg#$|#S`vZ>YKhf^-hG}vP>eR-1&e2tF14A z9dhElhhJi}xaf^z$IJo#uXK_0q=n7j@*1qNtj(qD zhH%zfBSX@4SjM(0iv(DHnHCq-T@w4yqTo4gQG1Of*Bul-V|k;rvB0vqCGShE=r5DP z1VM;jeObO=cc=l>qg*3H2F8I2a!8M*j z_EwUNX1R^{7_);A3V;)*Q~_x#@<{o;$Dc&j3;i+}(mf#r9FBm0>S z8qB?mGd!_S;A^s;@+@uZn1&{FDLvSH-^0g0-E>lxx(V@~4zzUS7$Bv5up6!SgB-JQW4jMHnvI zEh3Va2K&oPw019Zsn{XU_&+k2+v>(-4SZYMeO`n0PvVu)D1IDU*qKt)_p{~+< znbrAsP6eVP2TCY^%+Kx!iZ;40ygFW6%M*jLqTl`nnHUm5n5#^t#5QBRES7WlL|6#` zMC!5w0j3ieJ=lx6eE7qyh-0hQU~jTdA1)`_7~Guv7h-kzuoWkm?8w9_KXy!#g9$}Z z^E~TmTp{!wQMCc|g``=<|1|xC`lP&0U@$xKLu49^y44)3l{Q{1jueg1(8!pIOX)Z> zd|SWmvB;NoiCF&8hbzk|%T=iV%KjNBKQ+=Dd>8*pmKt1LOOUT!^QB+2cKPD~u^h@+VG?1?-9d4u}G48DR6cf#Pw*!b|QS z=?qc3ryipZb#Wu-3qZ~x)lZF_yX1&jEz6pi$6`#Y*#ZiXhPWp{?@DEebuY`zvle%U zQ*(SMsa_v1yoSZ4i+-4XFPh3$8##Id9BAn+WPFV>#iXZBKu_a&XqcCz!`U#WD`|YT zRv=QtOYEf6l(ElsQ$Dl|6=O2>($kV(BK4CR1`9r8%Y#XqSyD_=g>e{nWE{IVfl7Slr$u(P#XS1`uv$VlQ`GpG$3~V|52O2r z`M+A(E?mmgF?og4P#sS>je*tmPCtPR0L&ps;aG5~d^0(~!ETl)!DatOlRsRr>s>HU zh?LdZ6~&*G&+@_QWEM^Ay(A^1oXQafiD@ALde72CJFm!_q~`1mFW&$=3o!39fn;2@@iUm*g1PE>N+K&z zS&#)zCVMxK5mBt`7~r^QR+(L%$U(|2TloYM#jr~fNVhcM6n%UeWZ_eQx_iuGL%~X} zN*(8-Z7`*aBuj)gc*RV}P+*mV?o>-q~60WV<$Y~xa9?mA>xVuingB=f`%=;jG; z1={!c8w=A*9Mc?r51;F2TYMmga zUw(z9nB)ZF2CDY~7G7Vea)tGtf|ng@#XWr#^$?ztYNHlTC`1d+Z}BZfb52vgL~JNT z7*kYh3*uu9`xwY-&gA72m9WHgDPM?)$8lWjTWd!|Xy7_kH^q@6?1`iP@p!6P1}XXR z0F8F^%6yktJh7E)o~~wRA_~#OgYHyM2jNmoghASv)!()i1XVvR*1GlRG1u|XW0O42 zjQQDgxs~~0dS@ej11q6Q_B3dwsLqGVgVxVcB9uWS=5Z9Kc*&M((WH!TvBBX%3y;Bv zvPQLML*h@QIbLY6T|cH5>!g*+C-ZWei$-5LzxqDWR`6#5d-fc~R+!#3S&iFN257jz zz zr2wP#MS=XeoeY%0hB1-tl}^#Y(UxLI2?sawp3w($>7)h5`KV@fea;2O2kS|X-#O5W z$6EHKzDkKLp)!_-I#z1%Haetr8P+SD>Jja`0R&a3?FIX*@%k0cJaejhXJj0^&0ln|{lM?x!~L*+^$`@prK_>6HS~M`H#EB!qsg8ED!;9dS z-(dxvusBxO_bBqvIa+O|P-yvE%g}!FE76r8%7vHapDQEI%?h zIV+grc)O#R+hJ!A*`nJ*KG9KdY@QW)u64h?R&>Tn^T#&a`~o&PTznpQCdzIm^K{KB z!UPTRzelx9PgpP`SOp(f3h9n-KiJabN=(AFG9)GRKT>AMS!^~qx#Kk+`Vt6K_c@8H zdL%WhCZ6DrC1&#ZTd$4Dig#1BJWg43L@t?kwF-7P<+M{`|*`4 z)N}M?u;9$iYApjxfx55I$~m6D+@ngB0;GJlX0}?A=1wE|TC#6_(dHLR?Xpx-|LfcD z7L0wNg=(_)LPrauKjO%umB+NSaA#P|DAAoxA-!fC`m61_mNh2ApaFQK2Jk(9z=z|P zF$DyIqA98?>QRwqPgSsvh*RnGb<&mZG89@)Ggju)`Q+@-)0R`i?HHeL5+Za*olhQB zO+KE{D4o-z=V&+Yk@@DI8SUoCi6O3cGL!=7_r&SWT=p7k~G>r_2e356St$ARyxvz_WagSD}J8jP6PG2Ts z*)~e-xAqkHRW`2ITuTz#1}5o9PW-y7?b)D3+2w=kS|s(`k7}`2GZ+7*vf!GuW-OYX zsFziId9;*%zC#Ht31a3lCg55R<=C6nbp7`+f14ORr=i+$F=p9xM>F}XpZoO48y+oW z$fna(JYc2?NUk8j1YpjE0op9H(91Mu2Fr>@zIG;!Bq zLLhYokeUUEa+zIR*1KhJmZGZv8oc8nvi)nz%QM;Q+r_P;;gS#{0IHIgLbGN}$!9aK zAKmx%Zyn>mRi{depvnyaOn)BJ|(IecZHV!=qUMABiwS4xRI~!}_8j17R)zN9yd(2BoeT%{AYRXD1W%YWCq#nFH zu+I>9>1ar=u7bcuEIz-=EpEK2 z#Ry;o2#!oOFB##1Xca^5PbmYqIB#2qq9_>uJaveDTd=yFKRQY>HG;ldD|ueb^25)j zb1b)ON9Sk=5;f54@D*2fsICe&rjNet&1od8anwj&1jE zN}q=EeV#AQ7vO5r?s|_cPB;Qo@S3BSIuR)?#x9}X!6e(8S<}ab*!;5Wi>284OLUD} z!yimi^SjpzgSKn;PI?w=QxYI64q5^;WZUU8jWJTs+SnB1| z=jn#5gHI&$uj~vuChuYtx3Rc?A{~bJOU`R-BvU+ozKc0{A&Bxa+cNR*R}w? z|HW$k<<_aBTOc&n4@xOTiB|!j4lIB}GJV}{2OCs7hkKahnq;9*cs*4;*rP{reTx=_ zXnfiBbkz5Jve87aSIFxA(Tm=E_wOXl;6A$}^*}R-hin|Tp0Js;otkPI9n;T~SDcjhWMfU zt|pw3>J|AbeJ@rg3~6c49Y-rBS&n6ES8wZJ^Z(XHswxfOhCAA1zP88Q_vT z?G?!Z53V{cS*<^P)LdBY+YOrk**i{`$9w@zhb?`W6BA0k@pQLXB*WX<#V5_~#HR+) z&|>R7&gUsqfYi3W<;c1uUR5>A$X2fpqL|#D4<`IM9qwAaH6W;*tR7z411w2+5|x>9 zSJRYwlLD-sfMbgSZdN&1^p+;-8t-@S7$e_QQBw$0vt!v!6}h}>dirQ$Ap)rJ+z+4s z`MRd$1N4%zzv*;$Rj()?eoVQErfL+H+=h$L1ZV|J)o-S{zcb~Pp^G%Sfb9UlY4~}K>L_{pFuS-a8&;UBY4iUI7fgv1XdDu zr+Vsm7@WMw^V-n{3iNy)b}y#U_mw|1huXW(bk({_?=?N%$FX|i&_T&S4N_$Q)!wQ??#2*02|Fk z`Np8NGIhG33k{T(wsUe#O6~V4a8LMuyWygT3jQ_MrdwI>hN$~_y$NoPO6sdlH%U8E zE9O=F;ZF7UO$-3mEz0ACDHw~asU$rA)sY^%&`2vRp&rTd22VnQZQQ!7LXQsMzdm6; zIOsH=8XcR}m-5A~)w&l_!PX6n%{zd?q8Q&;dhMZ>HfoItwM5XhU7DK@VuSNeqNiq9 zq4QC=pm4Wjxfro(<8IP-74_?E=Yd>v!@7=~cYnpWLaL%v-b?RO>#&^Li|z`{K(M|k zn=8<^BtpsT6u2M{uKluZvuIgWdrp4N#uUuN7eW}G-WtU-l^HRFX zX9(>-6ah(SXrrD=BI1mSfbHlI`QijRNp%C-HzS8b6%YICmO+KB(X@7#^p`7JU2>lD zwD5W`7Wi3o##D<~YFB~2vrK2iHb)&S9(D;{BM%2RAWX9?9b#3}=FvcAic9+KviW?G zWnM>JR;4Zj#aLnUGxpu_mp{EBBEj8(VnCB?gj&o&A1D*@F(#-mmD2wKtrUyV%=o|r z#NDkJh8O)9$Vb#ewvlH<)s}1=Lv?SO4D%k|4g2c}!?}@Gx&f=;3EckHR9t=_AghQL z7_~qOeThbqh_GM8)d4kXfvA;>l3Y|{R^hy}EFx!B<;yv5lIY>YOus z`_IzG0&08mhn=%T6ql-wVpUsJk{~Y-lhK_*2j}bR%_K-*Tip(LU z?P8%=GwFUjv7w;X%+}OeWCDBR^ztwYRY&{Kwh-sGZ0_*YCQXc7G#s%#U3TXU-yO2N z4)?Z_&_lrdwM10eoEiPQaOd`$-;0p@#aY`;k_F%Z)^$>;>y848^WjizM4zKex^eE+ zyQVJ|v1s2kg)5eJ4=a52o>X>wl4ktsU?$;uww}OG%}A{k8>Nb;J>(I)$1OYiQ5NmJ zd*L7W{FCZ^T8S}a-L{Bu$ohHaPrLkUb&vV#XiKS1w^niO<)x+rCub}BaW1fIkY*`- z^`qP&txni}5&1*?m>Xt=cUGmJJXiaq%{Zk1el|BgJofWhyLgROw3ey@@G{S~U*!hh z^|)|##3rDXd`tf8pwsb-9Ooxdomsa(Doky_Zy)G-@}^nyiFyO_#Y;EpGYIYWdlxS8 zaIQ){`of=^h@)S=4_9G5mv#fPFC0uzn7%8C{L;O~_WwPq@D*C%lLjwK&l2Bw*l~EZ z_jA{)Y*5!1N@XYr4FF65f- zoria4iHetpF4=8awyQ#Zw?O=KJw0$(8b|mDmWrN$#^3d(F1~B7Qf- zy|-obg&eI02QER|nzhTle>GhUbs5Bkvf`DJ7o09-jgGj=UARChd_T%}qM(-gE*>AS z^R?yNQ~z!fShM2K0xj)#F8G|2Pw0SW3^Z^BHRRd33qj;Zz=P|5|0h!N9_g_lp zbe&**D5FPVfpU4a{z|s*dDL!w>U;}3UX^?(A??3MjNk5QBrxK*Bt_ig)gt2Ijy2W0> zYgGvz&Qxf#usGx*3}A+8!ZW>+px6Slsvy-vJ{smx7H9P=Xc^sleIs!LGS43v0U0Ls z^96f)g`ylmNDJ9I86475#-?6-zM49sYdE=`^7=efNo~-jThwian``xA^la4Vn_d)F zF$bBt-*%7IngEbf#}4V5c5&pKc5(Oysr^Ip6pxDXqcHQ>%a@-YJRY3-DZ;FNQ-raG zdZ}jJrqL{!a%oQyqA>g%A(oemHgQ`2~R*fZ`QKAqx;`YLdZ{$x$}J;k#% zS2P5V{mt)OIuO7jr){b_tuW)M4VA-It#7hDsTN657M-RJsvFa6+n(WWA&{-DreDF2 zM-S|Hr?PlX(^@Lz$M|5C)uDM71$clxKODbOH>B^VW8V_NKYrs6deMmHua8Phfx(v? z8%6~@e<1%vb=V>Vp8QQ~$5r5xq5KYMEy~5!Jblp^Sj)IwWS2gF-Y;9fzJ8kvNTx-#I6P_7H6f9t*C7*S+ zX9---L7X(7)1(>3MaftvSlV!SKTcRn<$=CD1b=aCx3zjxHmkIdBbFiYjppK{ihSFP z68bQ*c0f6L9PwkFJZS`J+rsKQzuzPFxLp&E`=+aBefd;LqrOalkCr&Dw}n;DLC7O8fjfO->4`l9?*S zkeT|;hZ(UmxB%6;fSR8YeC0C_t;4}oCl0-xd8(UrslfUFC_3+ds^5o?zt3`x<2cT- z9qZUL9ed_;?9DMk<}tDrB_!kE;8qCyPCeq=L{Ks=#=b`WxxY@TTTms4%N*S<|cNSo6D5 z7WageQWQ@^uY&CF&rQ#zIXJp|<8yESh3^=6oK!Vd6x$;Op>0r|vrR9rlubNs8)sZ` zOPgDQSaiDPy*41c{BG_#T1i!xcXvYMT7-*)-G=t;4dlj8w>qX>{Remb{rW05(OwWW zeH(LHmE*}7_0LR5X}G6cp7K@}%)B_|%y1A(^rAP&1>i4cd5wXa3K|=3-^C-=q zx-LM&{b;RL7sD;5y(5ixH@4qsx!}G+*-hX?i){*F~JZ+B~ zowrlC_irw(d9(hI@rFcp+auGjLD+HnRaB6JL#NVZi2{9j6H6N*mNRcf}h}`7n z86FG`_mxT6u3XEjbFL<_eE($cQ3)kbEuKH=xOFCN^g)K6^14lZPo_|gVjCuH9tOjJ zR*jNb5aM5B5egS1kx^NP?OvA5ZbznveA9#(#^2)4%jgwRwE$z^!e>w&GecHTs~`X; zCYzlDagZoaB>?KU-&EFc<4ShfsbTx#W2))A!GyLC5$0f-wz*fHZqhYm3!&K0w5O$U zTXgtIoUkB*PAq)@CJTHdq{3Ew?7Y(46=9A1S*r=uKMy@37=6 z*m670I8|970D!9VahEPMt~Iaw1wi$kl*Gp^OoOIHE!R&wjh;6-3g+BvEl8Y^JG1Vwgsv-Og2}s%=9wi?56@huiil9%I_Qa zPfCwX<+vIS18teP$GpzYM?4K))eqbMYuZQ>NsXZS_*T?^&;ZEz$vaV}}eH4aka|ACX zF`B=03HL*un#y`9-3l7&8CU*GmG;(|od`8Y?aA?V{nE%fL%RG*@=z|%+Pp5%jCttT zw0)_pSmlfM?EFD>)4sZ$=3BzHH!bsH0JWg$wIXfT-6HJAE0>tQk7_~`eYo~4YsB5T zZw6m_i_Aka9voj(%C#U|r(WzI+R%sb#lT>Ip`cvuY0esasSfgU=PyP(Iu-=SWDtPQjwk+17tS(}x^WX~ln8aZ0)Ga?*!>Xtnh>n58KW-& z!+XQt#{SgdI~=dIx_bV+SbFbpheI@7W)BV<`C}+Cs?R7tE+KLYVe6Rcl>3|t zS-I4n(Q|Tv88vf1?NmPW$AapA^kz%`VDA0M*?CYvJfD#F!;O)9pnG+}eUI)P>N@@T z3b{D*zsl#w$tqF%6bPOIZ9kmYufRkjv!7n|d6t#zl14cC;uyqw-7e)gnmT_0Y9@Ml zzI`j&^7r%_s`ETp${v9`qCoctAWVSotB`jLa$zLS=haa)C8xLn992CPTYaYd=?tV~ z;_<(XaGyUt`6u533i>2{GoGa(#~~)c?@BQ^wO=tPO&t7wElA<7qKH>^-*-LAfoV^S zVVPR`vo}dWMbXg>FaqUtWJ$%`-z388@BRP`lg@Yso}Is3)#J91(Pd0ZsA}iXy75(V z2E6(1;b!8F69aGER_^BYWwg>)+E947$80M)&b30zI3YLD{HQ0qgCoxWzv$f(VbEpj-_*4 zz~_jD224T#;?d;J^iZDZ?8l#f`~SzmFRNwlD$B#dAeXsBbR$sj&*Ws*`2<`gb z6$16X))iC9kT~4Z>T`qr+J&^qBEs|bZ_1MN(QO`qXD|4f3VPNaVevVAT8_6`I|)VN zmO2|t%HIxtI_I&sKk2bw4I6vyQMH5jg+dG~p$-(VyWUq8Oq;Qz=9pp_io!%N z8%~c#s4nx^4Q!b2Y}{aE>#_B-8`ABXx zHs7Oh;^pAhD@AH5i+@QU$$yWF0&AH>_n~0+I6Cc(Zz8*HSD2LGy<4wjk&fWgSHAp+ zBuKvbl9lfE#g+y8eQzrcFBovizPF&#;ev^fj)2Jt`O9{43Iw zsO8~q>__|Jw|x8B(|7f2yHeEus+|7^HC_QsRuYedY2*~D@y`n4F%tk%Wc@)DI1iWe zct%K~Yxi?;!{L0C&ks5C45TnZliL>HFQd{ff?`dyi03ppGd14QHvVh4$t9efss>Hv z%hO&SQz$x^cS=nge?H|evCZ#tMsbFLHe{Dut+n~9*GvuiS-&X)KnyJcPRJG9^~5uB z0W_CQlX>UZcwlqvR&7(+wsKo!aD$>sb9VtCoTUjZF*k<$afTxD4C}7z{7&J_GeJ7J z%l^m=Zg`a`-KcF8>t|l!6*10Ei~lB#^t+gKI9PXGW2CXc41sr+wi>2V!l!AbI4(@` z%VC@}dnl)ixj(Gv&V8k4ir!~%!<*vZIOTKq5{zG&9mmxIaK`NhJ@dWxObtP95xMtq z!zkq6v>bKNRH?E1G7B3}ch~U5>ox{iTzGm6PGjwxMzJnn><_?WqJ_Ve*Brl$EbKm! zL+D<3%9`_G7z8gh;y1HudcP6XF>`C5v~rw%X%d{D;-mdKP65&EWnH!-a{A9a=62e6 z&Xg8U;Wg(*YdW5v{5?Js%5E6-XPx^1L{hU9y<>f4X^fB_r7GqbIPUCCV^I~}`@Xg% zZlSR_H@jI&AcDo{<#)%n)QpRDd*0Xnz>dy8tXoR_U-_w~NtL&yB83mP;dow!trF8Y-$TUpA9(S8b zWyWs&zBS^`M1=dJhSLbEFn~1-KZq3PW;AGTVCDo+?5sfd_-#Hdr?s|=vrmM66@|?# zGSKVa`BcvSZ)CA&(V(m*rO#(q*@vY%7y{Cp8-O65b6o(=X{zcK;wd0jX7zTLlMaqO zE#^%q9a2twkP>UGP*(`<78--U{#K(tEkW%s071gfg#)Fv$p{gGm^fluNWpxq9olZV zU?XPD?{2;!LK_kiUkd;mET^0>C5?@hIR37u{{E~6{q`$G$BB*jy=fQ#;faAPH3M)? z0tG-Y0pX@|i;DaeHAOZV{!zzxNZ|m#IMy)v16K;y1n;Q6qWoDSS03fEru*QP4ivjA zh0i-z~AES(a5+ttvGL?gMpbdhP$di2q?5;R;uS68E z$~*WPQ0DI&-B}2Em+h_Ea2A1^0by&VjQ;SdLe)79OD6blKMf#J%v3-u-z2h5e}w_P zHJgqtVcYMd{Vjcr10zx}#Xng`axCds>TAS=UeGwkbm2Wg=;di{HAZ$0c2UQyLANOEQyq6(a0Ap0t;17W zB$Xl~`u?2cxLhjNG%V{wa5KCFH_{jjO!*Quk&;_66MZgRUEc0 z`BVe@+?0-4mAhWE4-{Vp+C&0==ZcXd3QH<4TsG4%qw6)LZ-?Krzb}EIqYWS6rEEo_ z9>e#pI!Y#7xoB^;teH0c;we-l%hogC9kEA)!=3G>31u8EA*X`*oe+MNO%IV_7%f&X z(w@O1{=#3+yx?iXun1w`&1v%<4m&?tyyeSx9Mx*hjsla>=W{kv$vgr+xYKy27C6sR zA@bcbY2k$y*IM7`UhU;nqgl6C!)jM2A%b9@SKr%-D^-25HvSveL3U8JC^-4c~;{ahi{F<&}V&3MFOkSSXAMVAlNk3?Wtj!6_ z_|M+Et6s3Zu8n~E_9W5GRO&uZm)ot-{goF}Ji|k^MkXv*qeCJ5qX%MC-0R&L zi0)cBr{#}pOglu!8Ao=+0IRRzHK+t&z6W#T7<}_r`iO5ud$%ZdWS&>%2wrZ#L7aQR zfjOtT4v-JEx$k4%+>IS;WXu>S)DNBhqGeZ34JB?`W7?Dtxt;$y2Jxr7QANi*TGc)# zr#&CpQFn=H$yL7TChvYTiQjCfjuAGR`ND`<*mj$BW~TV`<`tWytNQua??g=HCQs)a zhV+MAblPxP>GYo@I{tu)c>S4IG*Wv3O}oqm=1O1@6a~BxHhh&|5b@xCzJjRHM!}K^ z;IF9jDOx(!23gi<)C*se*0=IXw++(n?AMEnbSdR8`DsLl`v@1Bf)3&cvG|1JLUoo2?hUABRZG^v5L$I5BnaW&PGmc?dvttViJ#~`T0VBfK z{8BN}a(u8SGH@{$gr9TFb3WU1CwuBLDGzzcBP4yT%bwYDT-HCKgQIZc9+y{L$!xLK zg6SA!Y3jp(Yr}a#lgrxagyhQ<|2T4LDlvFxBzZ2{dbKffY+G0@4=lP55}rF@kAtUv zQfsNy6UpxynOfVPayidg%2X_!=sxaDvAdK2A5b~Mg4qe^HHXs(CW!GP{pvyFI6z8_ zaA};ooX;W_A3;gVv#>Bv8sko4!4lqffL$rH+x!4q`_g^^COX%gM@*G zB#%+`(E5uN?-R$2k#dm+Q~6+aA5J7m%7*S>RmktMlVeg7JHm`fY-e!_L{KvlVSE`~ z)T9(*WbaC*op>q>*5Ez};??0PM80T4fQS;2Z;r0Vbr6aN%%ht8n*ae!43~2kyrDFy zZY?)SOG)G$+DcPUoTvw3f_}Y+sxd*sg}?>=eB?pWP91z;Guy5 z>n|?$7ZtJ?SapCPr+5Hi1`RcF>U%+!>M`rpE1e4W$KkxONL8k(-BoC38T=|A!d)wM zV8@C#jdSA&7bZbu)3(|(cXZ0+3=Bji^uYUE5nlNzBqm=xK00-uHVC+%-m%J$!N4Z? zd>l@1X~Gx$IMLFjh{(cmLcTy$;vnAm5*~V13w}=%k#w%)(TuE?Gd)E#NadZ14PTkn%F(DA}pFdTVI9aNgS;06;mJBX0D=In?nAo zqvn$@kbsiQ#ORgc^C=cZ$GaMqzCDHm~aAL{;OQ-!#J|o*X;G46T?b zb!dPaet@q|RC^zV)pf?O9$bsF7lq>slU+EFlnOR^R8b6Spc%eFs!at1mU^N7%{TwC z!U#PzkIH1Lu40xWb3xs=kdtunh+27hjA97NF#nWRT(S|V+775AvjE2OFv(y<>S|=2 zWI1d=E*7NpG6re-@`iZ`DnAw_=}KLdMREOB=UMf9qKycdtPBViEzjg!1bFQQ>KiDC zS3wPdyIEr-zM%k@^Sf-SyD-}_c-Il!J_zX+5?R5Wg`CGJm2j4HTvQ0*ye81pL1`Fe z7$ne(zp@_RetzkW9Wum4ibEHdM-Y!icBm`TIGLQKBXhjRUzI-(;d6Ii{D!Z}qlRKG>YBq&aM^6?0E_`bx?Ren7Dtiml7RA^ zTX7Xm7m@kqruL%ycVz1E4L^|A4l{!=&G28pV5*e7)14sY5a^ltBr8fu9RBVEE0A*z zQGkqI$WMbG;Fa7lNtPW!ft(uI9Xk^pDafX%_PF@qiXMU@2xzmy(;Wf2@o;|iv1v;- z@BqSRUVIDl$Cw*&>oRMHI(q)W%I^mw^!m$E!DJGL%`b2)9c+EG(}HnoZz=xJM>S$s z$6b)k(Y4Mr0+6TIfrZs`7T++cwM(E!5b&`W&=Pq#u9ez^EY7S<@JyJQ3@HLBwnx$Bfy z9u-lPNNlWGZJ%7LgRSv&v+;9X0-P;Tr`y%K?>xH3cr-*V^CmxZ+{eS{#;Ot8pJSoV zEnv5Q!)~8NC{6b2-GMsZ!VEgx8_&~7Ef??w?#^1l=M_-Vnbpm|FCR-|pPJI29Ol;& zkt`hV)&B0n6|4}kAFC$~`oTVu*KcELK{{sGo=JtLmc*z1m>b@}BWnUWPe7+W?}0kS z#%YcVU2(Qu5Fwz5M8rom*=NA9(lZK}tko`7vBzc(19O61!+5vLk1Oo~EOfuf<|H{* z26b%-=iY_Q$s)FqeRUaTNZ*Ni9sJ%;iLvE}Wuc*0>^_n%tNDKG0> zD4n>9(}fGR4qe*0^Nxn=`yosV#jqzoDZ?73%1=gikNPgN^Rfcct=FL_SnYgcUdJTC zr`sDpk`U1fWIo$j3pLatT`a4r#y^jLEjQ9sSuqA~P z3E!3X_i(|Ov4}gy)VJx&vuD@Vc>d=x)5RR=rzgLZ9Xh|y^87Ly90q023AWT@I4|jb zsF=+eGd5E2z3+jUx;7W53>jRXflbdB(Pp3W%vk|gK0#O;7MOCm@%`m(u5d)d-}{$e z*OX$bSe3=@Rx~s{6Qbb(qUW6VhxwuXmgr;YMu)ie%S;}7cgUO`3~LFm4|dDE@=QDv z%5e=N(f2F@7&ji^pNxNQ8L`k1G3`xR!iL|{OJ=jI=XTt$iL}hE76=fSjb-y2}AyliBy5re(2;jqhEryZ;Kx)M4c{ zRyZka#fEaPV=nbFrN#o!Wtwo?m{E`*46DfP{Ud;g5@@~|9{OB46Mk@p+onlnZJ`|` zVDI*_F&8;54EqtUo71&mN?dYiXMn;|sDz2$%CU#0!qH(Us@SzLJnm_{D1pv#`w5hG z3RzGkm^1AW4pqO2s$FaTCdTqwQ1I#fer+LPws7R@ zf6&QrsNh)X#1SBt7r(YMZH4J@*dNvLRUkcHdUF-}C=Aoc!~31Ia8FrmWNIWhJY&He z-rfU^dkH1raYMdw?78`vxe|=h0XEec*hpBZ>H4Uw! zt}S1>fav)IJM$NM=E*U%xC-F}g>Z2KK8w6Fx~q2k%f~OCC%5mWFb0KVIUTQ~$d!)u z_@%c#!cY?PPWFeZzn*8azYeQtwPNy2>Ot~boJ~`jzwJSN^<8nA^}2NwJ)pv?e{yz5s1|1D(4I&C-PzqY(S&wtrWChRp|U zlZCBqrLEp>9_oG`B0ud*p0}Z-o+l!=#>N%C;maRAuDtNUk+h$b_a5H*>g5x*ABr{Y zo@jhR=J`Q|ZBGbab(5VgyzUXxtChD+K)A08dM3H~1uN`_E$m0GRm}AJXKs+?{ErSt z8^d&Qiz@u)vGCqj>k5DC;U)T4a|}fduQ;!VR)cNuqPEpZ)2Ba8L_mS_f8o#j7fqNS z7Tpep+SMV1)IA+7bY#S);t&83bEepm5FM|tg5`@1oX)u&osM4MsmpTZQq zLLFv3ElWX!CocbwhAev8bd<}X>w3fP7x*G((Hv82O}spNcPWbUC3*kjr1MefGKUnZ zs_RtOtA{_{+J8@f(l$u^<3t{F-=6iNgtu0{n3>xZ%#63yJx;~{YVSWVoMHKS4lRBi z^*HIrF-Y`9V7TPaDde{|&=-|bOS#a?m0wSIVkiJOt16OPu?AlaQ%aZLDRSciJDmOW zqY0@Pt zGDP6f-`d4ovcZL@$sUOy@_0wU>6K{}^En}az@;4Ud|diPUqtC^4+9qy|HA8tW%}{l zk|gDxoLV|RW&;VdXyBdYLe3HC&vO4u-mOuEp4a3zinZiYmkUzmKLzRw(kZ?(PzP|v zLn-08Vh(4yQTbWa28hNUI8XHwlbgp8G+d8(ZYl*l$YeR3bT7W>?fWVH_0|s*ugZx~ z4=%i-9O*ZfO$NVTwB~kEPZx6b(Y-s7t{aAWqf=|K&Ta44?Qv>yThP%Emi|reYgzQ1 z3h7@Ym!`u?jta2<{DPWwFr7pACskOY_zMBAL4l9%orG&=w4~AKq*m{(7+qVTh za5KAB*!Ut^*HV+BpK*5Tj(&b%#J7W;cXFS4Bh_c^FSiKGO!{re-`tFBJ7zt9=@s~i z`k(}q_=Ndv))3hyX08k1f=rbF@ctJ=Ewb!|VXok71pX;x@b~~SlwcyJVZAm*JL#mZ z6Uuw?KC|>n3wG ziIDnrqtPy{Y4#PSCAISlt)gvGJ4q;I=t2-No5jCKj%=s1ik~qdvU|x^K|3 z!jbvY+1<}bB$Tw6*|NPM{!9ZYIjrv{3%WmN-)!z68g9(*JL&C3v9xy>%Hv!zG7bn6Z9g3BHr}5UBDs5SL>i(K`(lh&V4vBwh zEHZYUt1n9KcAVR}q!Dbo>6SkJ{a!*S<0zLkSE~?N->tRE{^$MoI;A}a>9|1oBzITA zbEarhfzo^Wwc2*%n`nwjEEHPNQvrG72mGVtXD}pqm+hY*_&*2ua0hFuKceHcZn^j z-1*i;#y0HLQZAuB^d;n7-eVv0?hB7kg|&&@pIAQLqebUabaEcOinx{M?Kt*t_}wG> zfS=yGoJ{hA|0DtOhoPB2HN`Jw%ffcM^hAK{SIozJKg#p;PEsHD{)*0tUgiC}(X|@Z#Ju(CrCc4MPC02!eeb07seQYEc|R%2^g1e| zqDB*+?%T{^TqOW$tOq%SllGQ8BLDs_>$v7h) z6FHbbnTu^R1^BoM$zYy7p4Dvj^_92SyM}ra(2v1JTI3wU3e+Us=SFDk4SCpFoq39i zNzq@Jjmi(&&U>3UmmcBM!AsQvWlOp{#bVGIj{epI}8vhS~_t%{~dr5{O$%rBfZ=CC(RDDzY=m`C(hKJ@8MX~3cc_QKs(m-pgCAW+!Y>)-+V-YBqO<1OM2PTdILahVu3b<(8|1=j zxMZyLAtIM)w&xWK1FwHK&Ij$CK3-w@p!E%5i{lR_PQw0F$mi+*_2kzu8gL*lax8O; z`IOhbFksANKF#;z{J3s7S1a2w)U#8&?K~|g9bRAN=M=5<5xO`~+#DLzhF=$0S^}GN zrZC}R0zTC@yE;r0gg>Wwv7r{!jvwR!v^^~40~OS;W<)Mm;(5!%l6*h8JazwdV0BCW z`tP-*zSzm|uj3ED;pBP-n7)GgoeVS21=dx+uowo7`X0B|CtZ16kbgniuJ@4sHQ|FN zUnI|c4PWI~u_x@|6M!^<0%8kdu;}AcI-S!x(IWHsGv62*#w=-$v^uVU?o*v8#aqDj zPa4?O^eL&7aI=b*%m*EB^}=XnS+N(p>uXZbvUu_6OZN*|832b?srY~DzbPKp(%@m_d^%}{J^sJW=$uYvy>hO^}iZdEw=!Z@1d3qis` zt?|sKf*m522dNUlie1OW0RLXD(l4z<6nWTG>wc2-S(ug)*P!Fd!Trsg6V#N^c;q-2 zO|6AC3+-6e&>rbD!V_*jI82Axw&MVEu5NtzE9eG@Ej7jnb8< z6y-)d8j@4SQp?!jnLOEAS`lECJ8P7}qinZ^yLP5h+Sv13IW3F(CRW&-)BXhb;IHY! zA{)zi{K?@%rt8hu6U}H9l~3tbGrGa1ONz$n1j?eDn^0@?;KhQ3XUbG{_AQ>_3uA9C z1{dMb^});H{rRevbBs5(N&r0F6NaNxKqL_MlKP>2uBe&7jc8-ZlJfK&|HrKBWfjPR zVbHUBhWGJ#={q-v`(T;({wspvj`^-dPMXu%dIX}wY)Ss2XX5iq2#77UYw~c zcO>Q!lk4~*UIgvkcb?=MrWSr5^hgQL%@hWuZJR#4@Q&ZqDCe7}&pxks%@g^01}N$J z1WSQudxhu#zc0`vc zYjfO;xRO+}_m(1E!JeS!%jQgnXaO*!4flP^S0o!$;(PW!8xCpA?(cg872{2ZiUgbi zY+nh4JIz7Di$n28JvD_rryw%xI`szR*UZc!6E@7u{3b=3h5WYP=T8H(c7@)x&IGgG zfK6P4@vISkgki3SLEqq^ba5c)G}amTBGNAS{05?NuobiQ>m`wwe3w;25|HFz52Bmu zqggeeADie5JoF@Fh^7)Y+DX{C)9hu#*l(?G_Kf$aAQoegmYShJZ3LQiu;Uhp^&L~t zEe9#@3piY0^EWuiBd-oK-#xOh;H>$wnTH9TMQ|C|39XHbM2_4gi{x+|t61jmbgda7 z^SIc+zw*}3=yf2C*HD#2O5QqmGo5_FniwXDvX*1XTt|%EKtG%18KR@d=&K?F`UM1Z z08t2?e2fDfk|J=n;k@}+f&1Aiaii?WZT5uQrbsfkjktLK9D)|UW%5IS9i-bH zU1X1veunLl`k!z6TG)YGtIxlNnm^l-;!Y%-#->2&9nmH+aTYSFnF*_)!iV-Oh8gW| ziOJkP`x=q>*)RNSj0mAMfrVV-dI{hzmjBMFwK4+#=X?ovLvA5X(F`Kc)PWqd=R3=s z4O1%TcX&s>gz85=O$Wr@5hXrZ3VI%zjJFuZmTxVD=_vF&AL*82Aafwd*Q&O=NYu_XdPm&mUlUxO;P4j%+!kf& zwI*o>@y10r##Q-+2`FT#uv7csGQ0l+toeqn z`U5rfbper1K^?F{X%x09`HgH1`6ZWZq#r+_^U;DmiebTFEMwf=$y!l}lnm42pXJaW ze$?cv+RrJ_)n=2rCLgq*{vXHb|0(lRxeY^QND~VCP_Yz3o?Q#mrjY>?SQ9v!W%pug z%Ab`G_hES`W+QwBTLn2Kx^^tk*~ytZDP(i`F;Nx#j+|bVRiyXT@eeEiT>yX$SO8I} z^&3D)0p8rmEO~(Q{6j2qbT8I`#ZCp)sv=G4G?qjEPCsB53dT5FT4Y=aqSVyz*C?U0 z1D6}m!Bxd+g?w&b+=OdPTUB4z@}QN9IZ)r(cYS@QxY3=89(S(W{Kw-^P6Px7Fe*;$ zLA9ohh60wweA^2iSHol>ou=d{vCMT(_IlGpZbi%$c8x5(bh?Xffw7OHcRsU+zeeH` zfn)SCM$?dGvDkHk(}!#ANzY`Uuc2Qfhddha7^ARgq`EATZ~5L}FZ!w;m#uW}M~YT7 zdzFOChv4%+?f?6AY$%|j&QG`$#8)F;|BbJH!+Rcp(NloYV)nZX>L@dB*gD%PYpX@2&v zJkX%yypp%(b;8$UkTY`V1zT(ir?;?rcw=*rlvVI55$0in4!}csDTc6IS;Z(Uf+VOh zonVm{TMpvmFu*u7IXY^6u1H#-@aI2Fn5(IvJ#&La2J!++kuRt!_U4Rusv5{2j! z^wyKfEf5MwG4O{tl(D^xzVOhOro2)$dS8Hh#ppX8+IkNV!JljX@^jvfS(E3{NzBQ|E>rF97@^slmt=onJ|OOJS`3( z?t~UHiyq_mO9PMy141IhoatspWC$-KkBgFSWtX+dJi|92o5mZS$``v5c8rlv$>}ER z{ft3sF}A>DkRb&pwKx$HjVX)7RT<^|Dnp{y(gi_*nljiRCS*!ArCJfR9D~yEztl@M z5?BlLJL`O=q0 z@Xuk$DPM^?#${~aGR$shVaBpwuwnKp*{G_-yba`GF|)-Flvm=Rf48pB)1A++h7a{_ zI9cPs8dY4%P%XM9A7w~{32~yw9Bf}%!ZW?DaJRm=aHgw{*FZ?pO|?XeJ%Gu=KlA443O05yRl`bxRyCsAaY@~yU%WihUpu6qQE&JU*PA#!1g{+Z{($(1U3%2Gj zIPfaT(}*!}Trmuvg4A z$-D13sc`g^S^s%|Z;R|W(OZ#Jcf>iQKd8p;d-QKA_U2cf`&=yA&#rbX(T&MxQLzWb zJU-{XNT7*v{7SB!sx_^JisBeb-2)#-Ou)ZQ58CLnerm4$S!i7&4^&ocB{} zY#$eTudce07<$E^cZ|*w?8a8hEATSE=N&%g7$PX(0LYWdjhk9-U&bfwJ#jD;4!Iy8o5E#~SCs)4xTxE!V|PxvL=m@cAdVf5+R(T)7R? zf|wWp7{(C)$wpBe3jfgj_FUbk$Xi?5;+*uMpBDGuFe3Px}Iyz;tf%N!oyl+G(PYkb&WESI*>Z4$8n1v z^APm@I9h_tuqY@G4{XKiea~j+J|5(=m=%lo6!MCF3B2M-uO8}XsJ6Qg7oF!w; zm+uU^O3YXhwH&P}Sc{b_ax1A7j65Uk#nAeNWO*+7{YA`N+dU!nBeA$j3LjTFi!l?F zxH5raf{f`=_m~yE%u{IwH~pTNyl#KCA$Z6MOkG~ZKse}6y6^J|1tZoGy9zDU_2$rj9;yD(tSzk^y zfZhrNMZY;nJk@coeEaZnDw~^J1mTkm{6YH6 z2rniCKg&Hv5$%gg6!PGA`?r2Bg z^X`Pm4rNZSmcvUQKRKnkCBJgBeE9Htc7p@3oBT4%GsTVe-0YiNLGLXi|CgNX&n>+- zH-Q?x*aU6MlAWytn zk9-{9a8p%I)fI%no@ZJZ(MwUDH0E?MS`fCGOaSb8SeRTU`0RXP3hu2Z*S`Ef*g+F(L*sp$n}w4p@b5S_le+t zOHgNJg;R$1r&VQ#pXm>+#Q1pj=5ABdYCH-mW&ZQjNV`^KELN0hrbt?JJKe+eBFZF| zo_^V`2O`cR*R)o4=3OpLEYBca(ohWfSBnRUj*oEwKnTWy1w@bHcRKBfOU`u{XW7y` z&y)4Ev&tItVzL#Phunaim(Oi$61T|=){qsb!H7nw0}vrvo*^8iDA$0|0ugJt&`myX zd2Rr64a%S8wx#OxUmDdLn>l@MfR?#=iaIGX8~?h zcdA$O=wg2lOAT|bp@WPV-`{o{b*f*)Mx1*A^+33Q+B!!zd3T>kmA{4}6?sSp6CHgK zJQFqXFYKP2dgYNS4shpv?y(B_RUw<@0nMUCmOb*}3PR7hvqRu>Ef_Ar=f>|Vt8XHcTQ}cT5s&emE zg3gcpen1cy54-^jy8>V2t!Pe6I_BzhQK^w#7*Qs~+ZEBMeQ7%le=y4C5r)`vhTagz zg>Tfy?R%_{p_7Q*IX803Mc+pe}ZZD#Ul-%>UTZbuAIkf`4zojvXlS^QBVVJvQvvoHWJen{5#eCkO~f zqldNh4%zXR;yFtTiF|yjk0Ap*Q47J!jtnVo?jy4ZQc9AYw2N5}=pFQd;cdj2K)g)W z6aKfVkDCorM;D?hX~*fZN@9lco2F4FWoy_(6``kM$>49#8Cadk+0WVrUZE9(o?cmO z3SxP+8lOxM^i7Iw)fXi?%Jl28!AvAxDC+oDXkw*u`8Iqx9WEf8d zeNzN%GM|hLG?P|t zV*x=-rqBS?DGm5v7Ny~TCJ$LLBPq3)EKnvUop($AQ9F1?7N@pQWlzegNvGmg&%Rk= zeU3CKk#tXcYP?1^iwLj8+e7)xneEDoh9Yo5;<*Q$W9YNIS* zUdW$S_VSoB)5>i=1bnfEz(c&v)YoiYbN?tXD9WXoJY-0WH0h!86@om)$va5!R=u)p zvH6DuO-|J^{(<|e_me^7>JiyVw*iYczroF&Hb+Xb%=Hm@S3cxL1(U$q(MfSvN?(EE zplwOR_(d(}Oeexw8xwnOB4^LAt2yW#G;gN-%E!Pz#Kri!&~>~3KWh=h1kv)|Miy}= z-00-!=k2Dv&r9x%_*ePR@}xw$KuT}34ekB2kiTYnCS6G;E@%unJdG*Oy0T|oh|0sc zYfJho83IXnSP`#4xpwBC{Nm0*u7<0zNZ)Qelew>ghTptxjtPyqN9f}ptCdwyQmsAC z-A|$Q7~cKi0FOmvAr-G*Wn^kh-^`>qk;vR^XY}*Sl=W_i^*}P!dKebjd4dyT5j8Af&PrGcWYBETA^Gkc6Lu69HXOkD7hM z#L9LjipkQvMeHyWMXQ&_fEFh$$JN_976IAN;ACmoZvFm(zu{JFenOM2p`zH`K9PP$Klk+LO9mC zOHpks;^&L&uE7qyz;OL4A&iF(^7RahSM`*XEA@(c9&sf;Ghy3}?E^gvGc7X* zh=`K}LYanpIE2ZNvw6BoB&dxXQ~5!jtadNIUx?qB3b>D&T;SciQS|d4mz-Jq0QL1@ z`n$C~QwsYv?h#rtUo8-|{$)WRko)KT&Ha(IC3nHyEeD~u%Wxxe^7=kxv^4eIhl;gs+}uOj89A{zNMh1#+L?&M3f--6OMZY7%ZU5lN*5$7w%FoJoIpMIPRs%>`l|dh4gp$D&NG0BUZBD2Hn-2CTxH+6(;_*mfu4YyX7?iAd zv1@rNU?^Zo%B*5a*%a}DWHnbSj(6OOmH(5$SpDZ;EU?80nCVFa_OyfA&I!pxa1VQBM}686>Ec++4rFgUSIaDx^KY@3eh3 zG8u~&!~f2vA@w|gFd|swIgy+GtJjAMnR6=g77%VjHyGI8e1oAQIB5(>{aIiyXAcEJ zZJGjoRR^wKJb$TAlT#|1YR=6w*qQ(&4LC-`GvKjAIK37g4R*N8bt;NX{{0E{w+4iBf%q!{5B2s!HTmSmVM&^g|)7rnuws=j2I{- zVwzz`@Zol49bH0NaaY>RGmumwT#Eq~0zgr)MnWop0Ul`);ZzE8vnI2R0qJAX)c^!k zLS~AHAW(DP#;f?#fbh(OF|lCcf5bEGnCO z_ziAJBaV>4{n+C=?zvS*5lbr*Bf=e`n*c>=&;%gjdp?;r)5Ng-^C&ulMUn`)WvnMc ze5A#IL=fTi>vC~`{3XVTrs6LN=pIYDNi!f6qU%fNJPbS#^4g(1Kqeu@(7;pV4DQ-!~|8aJv(NO;J z-@mSFR%09c&e(U^k|d3Nt;P~U8AA3{DoJ&XJ-aN~%Gh@iAzNe3779g5V+q-lLiOYC ze?PpR+~?eL&YXERb8YkfE}!@3^@iBHBq7*4^1Z!3d`zipSR2Mf({S`F)Jhl|L_;Xk zz#K^zIRIlHIlxeen9TQ+A|e8gz5`I$9%rf~;;03PCW3=15xZ5~b6i|yuboee>w~UA(z?Z8*NSlUPbCae4 zI1@C4zbbmfwfuMGMkElbDWj&@55#rwGSOhAuo7P)PQt?^HOE6^A!zu5yAcRRbkg>C zra&S)e}~vf-99b|3LxTWG^Vv>SB+v-x+tf@6Kfp`?toFH-q5F$omqn63=0ksbQI3f zg@b7bY^mvj+a1*}C(GTyz*2K114JM(`cqVz=NFM@rSe5GoU}+8w>%-YZcZ6J7Ko%5 zQU<8g&MEPTnRQ$egrh%E7T2Z!L<0!?5}-g6d>?@;Wig+bLtwo#+W=e$fGHKfe4`^p zyB}~X1*zr;dhr4F-!~`t(Zcuatb8xYHOEa#Xm)#|-7|__lB2ddF{MEd3jBKYPl*Uc zQYE^OpIC@okGe7=WB0%mt01kdO2dpwl-n9QGJRh^?xV8iXxSjgt-#GS#Q!Le$S4Lt zg2bb9^Roc;xS)Eij{DVDi3i=!R7Y{XG)6QG8O%k{h}cm%H9;WSOg<7$C@n4v+OE*Z zDd)&ws|fYr+B)~?tZsUtiwcc~c>GS_BNV4#y06>8$kc5RqvvQS`}v4|n)3}* zKQQPYg|V8%0vrvZmk+*=NSplRRKGUPpN$FCOE;QHUOb8OXjN?+mLX$X|SHPQRkTplrrCEGL^Io z?0)qVB6YU9-q+-_!lMe5bb~^;YsLYyGlj z;H9)*33lsBOTDtG<0V3)v`gdu%A93~%yKjQdcLl#W7}_3LwbIyKIdR!^*wluc0wxr z6E6BsIE^zVbZFSB%&LQ_@WRMB5Z|Ep{Qk8)|IN!C=w6SJAAekrFrN$0Sa3Dhu=9Ke-_?Q(cUY?|^^n z=7W=PDA5o5&kL)sJ8{&dv)0YPdYzfqks+$H{P%^6K@O@Goy(8=(8^cu+CWU45gP0W zW~WYD*Ab=w;zLdvhF1k~Ve29eaFeT*D%Iyri4=ULf{{|``cH{_0ex-8@Q)UV^Nm>) zUUHX_xuUhW=-tWqFMO((u~KHMA@2G^L88d{u^*w;s!T9~vx5Dv+`-LEBLi4j=wYf5 zW5-sIA~!5VZQj@oCKgn80KSwfI?MP6!^Aib6(=TUpF!ReWJpt0G73H~rwrlT}Q&_gU`oZncx<^O4qb79;rTOsDYXzEi!Bh{h z+BOPf4Aixrr0MjoLJQmD-jaHM5zM|;JGix-jcYQ#2YwQyuQv(-3kC68>gu0iTCquB zZxPJu`~tBPShqMdY1TuNA(DQsu9U0FS+G46e&U%IDFYEcIuXgJtctLV6>rF}~K%1Lf;Vx4YX55}DcW&-dwVIOB&VK*f z#tS{fQi9CY`dSn|@cb* zJj(gRYWuHi(pW*UI;6#+{%cMM+`Az$?#VNK1bioh^|v?LX2!uWPH z$~OeKdOOdBUs2@_y@e%1oCzv~GC;n-L18v<|h zLdD!}3tC)%Fxwfy_>*rlEcZD`J!b6u5lRZJfA%fb@0@9K6|l?85a}kwMs2p-$R2uh zBIBVRE?`8+p`rMTn>>M7Eplrqx%t7KnDU?C_W`gW2d!X+pW!lNwg6H@x+SA)v;Csa z2|+E7TZTY@bT*?z`{f$sZrE`y$oy;U*pysj*Cu21U)7{aY~d+|HX4ErE=UZ&R~qv| zZJ}Mr^;kxXsU79_Ewi;sSRrd3qX`>g*xH1Hl zIfqy{ZSpf;Qa%h!y?3#VHl{-Sf(c8r$sPXdGB8y+813>!t;(!-J57q#ymwzB=kI`j z?CgpC5Aw}e`DKaJZWlC~dVXZFOXBAEi7AQfi={Vk|VU~+K zSIM)r?OsE`8!mVvs-2^d#--LpPxO&dAsBnNJz*+fdU@(+@#pe4om-`Nww`CNb063Y z?d-^(QE3GlSBhE>7R5M@E~+}c(R|=M!E(OEWk6P3#VIuLDhpHJ^yD>0d?6DcMpLPf zOf&Zw+YdJ?vi6<`?(ul(=-+6he-dY?O8G&#JK@t1*n>^ttGM09A}0I{L8BdDm^cMF z7k<`Ri&_z!97NfJTvAj2;bqKBvd061FA}V&)0{$*ipMVn@7vc%h|6ilYNy@L-zR#y zM?aMmgs@Yq(_F$*Gphdz9?4JcAng?*FTaw+?ZN1ryU{nfUj05me=Ibe&G1JN?6*h^ zR|W5oi*Aql?c%OSXjOk*k{)jqKmh#`yp_Zq4#O*58drDlm-lH)mKc6k#mn8A`rTod zmyi;ZgacQCk%GJiQb7;yGI?wZ2_tWpezV9jKbUYKO7s-7CaO;OhC$ze3}P-;be>*f zS$x*mD}=m}1EN=Rq)dMR?#ZYx)q39|@ zVzEbPBK#5279&ijhOz1ZqTzT0k{S|E+@m2_Gy-4{g_j|kvoVmUVP7;tDE!jdTghf} zjNc&C$TM6i%=Fsfy*l_hv;$PNS5qHjK8pAW!*KWAFt;?8Ok)CBlr1Fm69ZwK!SRW$ z3yP2Tt5bO-Xq!iH3n4f?$%rq)Pq&|K z+DfF-T$$4@#EMIQaYH>q^VS#Rl_Y?0!PhZKgP5BC8fKWiGV%;LKkrZxEQ_D%6!^qm zBZBokr!Id0A(VpH ziTffSim>N=Ov%xYD*~@(g5jU~fxnmPNF>MPX-Dbypm0xY>BNMj#!TtQf{biG7vk1E zO7R`aECQt`K@OYEwCY$z*j#H5`MF=q2}2=w()NEk1`Ed!znqY?pV9Zs!SmbD343Bk zM6CUP+o9-Ra=x4TWGE_6rr1mL0ZzLIksDBmz=;clGXMw!T03#v7!2lz(I-u0{r-(0 z#KXzB3o=+|ZK>&0sCevIdqIF7pYU0cY@{UtgX}c`TAcfia-=66~T)JR@g}d@* z6J*<(#8|<(sPf7_3Nm{xqKv29XWvq=VxR&Hr5`XhTLweXbiH|V56w+%7+t%7v5#|U zn3mGM$TzavX=Wy`qxM!ru$A(Yk=67id;4Ni6| z>$#woC#Rt3!y zU5}{Pu*xo*^Ku{H&+1SANpu0)NjB9D6PINsdo8+f7aBcuD=(vnK>JnW>izRo*_A%z zSd^V%%}c*PuF5gIW0Xg?LMDOy#FpdK)T2ja0S4tYm*Zv^Z$0jG@iqNMZ?J+{f%LkP z3H)Uco+3t16joPJyw!LNC5QU}cYQzqx?2om{8wt5U-n;HP11qfK7hw0t72T#R&3S?R&b%_U`70Oe%z^`UR)eR()V@O_r%aD6h#6o4q=LS! z^7D@u<-L_X7BG^HoJijZQQM-~BDdhA;g2*63gzTVZ}fj!^&Q8t5X(9nM`T0G#^_R}isSMN|7sB0sf;se`?D5#AX`tzs{`uQ>Nfhg@pYzoQoUs5S z@keZgFDHNDF`s;b3Nb}H%nM8CyJ`)N9vIU_?WPpum$8UK`3r1I8vVzcl#WaJHoVzM%GjId9jRJ9M0U*IhjsKyvX`hUN<0qqV;MVjjDu<-jtvV4(pB_06yo=I%GOp z9)X@yM-u&`u&s5l;+ctFjBp@(Qw3~xh(!f>_CPyKURIk|(4VV%6;u_6F6cMeQKUZL zgh}Q`r<%tbmC)F^qna2Zf1>Q)EiCT~x@!j&;W11vz23IwV-jZG{lVgi<=<8QN=_MSjQTeHTCsFHxu`bN0(D}-=m9v^WgS`JbgTGPCM=d&`w_qFj#naOT(~Pw``L? zoFI%QHTb-E0^^x!U`_Fz&hsv!s_L}qMO(GkVGd73Ho1-oO*R0~q+`S#Cw8f^*dBAy z>!%*KqV-H;s^arQnfLZiF_Y5XxGOPoRq|RtNd4_~_8D?b-RWRKkpg0Q$)@7ykVRu@ zq%8(s3|MoDImhbFa7<+}eUvP&WcL;EY-o*-2B44GQ*hln=Yv0RpmuUfChclMd0GK9 z>t+zP5E5=;)LP1k2xd>p&fQ4M=3Shk;k{B}mVcjVTd5^jBK;UfoeaLc!3`oujT~cS z0Em|eG6lfM@G=lmv&NFBHO)S}G{=sB@9PgX_7^WPDAQ@8Y%n_9Q)0_c0Y9mO zRy>7stEFl{XyX+8a0RnwF3RW|&Rin_k^t6GiHkuX+a!!Cjjy-Dba5#BIhq7SCp(0u z8$c-|^Kh6KvBA1c4lbE72YXg|v}!rDMFE5Y*D+H7P1e~Xy-G0y(WC5yu-ujc1t#B6 z<$#V>Jpi*s69^3DGXe2LRy-RQ!V_jCb~I#xT=pF(P2lttyO`Ti1VcO5Xr~n{%|!(9 zByNm7j8ul@6w(&tlQ~Q&5}Z<8882;@h4l;=WpWf`L!gWNaT*4I_&+%OBClXv2`84q z;|1urbs4I~9h~t}Qu+sDNHDuiB0!SZB_{L0?G@1_r`BK$8PE}Iw-i0PLHc_cUE8LV z^s&6^BWkOKf^i(AoKfUx!@6+u^;iM zPdjv{oUd>78IWQNFl=WBF#)bO|h1EjVByam6lCA^dS zt~nX6sIu-54V6TbckL;5A=zq7l#4lqgt&BoXw0$)962;>c(r~JVV1r=zE6F$l>?K) zf(Xtn03FmXW(8bR(Epi7;r^kAF?k(QACHhRVWpa6@nL#-bwGRI)6du(5l~ zKof(|KJR_=lgJp67^y1Gx2g8Fn6aVXJ!}p2|EZ{uWO%7!CzL74~?|nGKp3 z8r}dF5fpS_i)+R?wjj1DZNR;i6GaEuqKE5D&b{|KfBYV$WTz|epa$pkSM=g|*NyQv zn|<2DKeZ{Dy6P8G>RL)(`m{9sY(}73YOFt)v}FMzSro}Jry$gATtHy zseMpz29+_&koJ1m8u&B++88>`x(B>72S?UMy94DP(HfN`k(|*u;Wjq@Z`M8CV-1h7 zCcNXO_F&wVF19aJgD=Xmrv)~fL`{0oc>+3WGM47|RSry#XY*ZGJNGTrS-sAf6ji`^ zAwj{WdJbVbT46I0YO_bkUx2&9CpNcjN>z}ta`2pu<{85t2tMiDHc>h-QK%BmhmHOr z_dyZ{S>Y2xD=Fo^wo6*Jg(o9-pepYwN+nI}XtP&h&Q_=8L%}=DicFE?+h@I=sJigD z>xwUL6lFd%5ixjaV|5`B!rBF0(zqLM1@XxQD!;R8d7qd1;eh_}+E2UmSC5|dBV3<8 z=b>qe4YV1bwGVKdOp|52X^GT*sjA#(B_yWp-8LyYXrE>p%Q=ZglbUX!MA5X|$G@6V zo@TryDW?CYaUgr4R@ox+v{sfo?-J22NAh^Q=K;XO1fYoKx&IxNisg{Hb{;QZ?8SXB zKPi^z{>d2OaPJ3O;5T*opVpQ701IKNvh8J6)e}A4j|kq$W;uz|Due!N(*}mq*K|1t zZ=h^0m2=5pegSrlPaQKWrd{u*agtG>vQ|g)`+}lmmhoxYx?Ra}+vZOhVxEot4&$)~ z1{qxreMOBOlIa1aHDaSL`d?_>DV*@x`K*h&WM7scCZF|!xx}#Q)1eE1hbJc_Uw)Y2 z%yy}3#Z9C%zfbauKuiJ?6PM0?`(kmIp9`Of402kR!-&O9H=Mm(>~uMx|GBk11bWuG z;k3dOXP&iP&V4(h|6TQ=_=)QfA_4#U?1AFf%F|zE9|?Y%eayrtd1KV+KN+)y_^;QW zIuq^+T@ufBab?n|oc#Qsb4S`|oo!ovYD`g&m`o1k)+rX6;;&qmfWP%@@t5FN7+*$Q2_3<)^ZHuxH-LoJDE4en^{@c_CBwvciEO{8MvkkaqU< zfT8n(?=s?>mr;_uRMqNo1h*d3CN^&!WD-Y(@0j+cSKbu^W+mioL78>}!Rmpv;YF;pr3ME!k zYz{P4yd#iFj&gj1ux}SCz(rp3Tj?kFA~U4%IcYnMZ^nBNYf`cfL3`O}!V+#{4>vv` z#h|p4M3)d}Uw`R*yW;Y&tlzM#OG5cmRhVb;A_O>H`w%WuClQeLb|{Dq? z!M|5F*jCSQ*!t9B`K#+^?C7r(CROB=uUcXe=5j-~{BdrSWW8ZKCnL{c+EPQONA-)P z6#nI$7i4gci<2DTj`zHuj=Gj+uC^i?OA@!{>{Ar&>na_Lkt&ZC_8@ahn@_sL%qcm0 zLgOGz_X~~Hh}csvR1`f(c5?l8rpA;N7+w_wK99x^S3yr^WJ=rRGK}1l+6$7dpMiL3 zmA7A4&3IR(muAR811_PT%ElQM=dal_iOz8NdaGM`o{elB7VC^xdp{?cv{IJtm7Kp) zy8T@yOJGh-zO`&Y5*rIpLpQkK9*?yiVfantT3`BFfAQKtgYV$8Rr=(+pBnr=Cah0?SpTxPJ|n!|i{213 zDWX+t*TpE~EJBMwfM)i7@%F}2LP#`oflm4=Pg-i@^n8|#Z38^1R;(bw)*%3Hlx z%K?G=pU`xF->(NAo4;>w?nZ9zrEl&RZ~kf6{M)D>Cdm?E^bXBtS>DuEhrjJ`gqqaF7&{LxgW}Y8x*J5_|Yb5DM zMBX1c3PuOnQp^ytHTO2?FOH!!LOf>)#wXj+jWZl zF5#av{~-ThDFbpXfClE{M{BjEH`dRyPU^;yn8lY>#?<0A!~9N8MpJimLrln z7ohbR+!{DAk#kcvD&@gvGQQl=`>G~s1dy#-k6f72UN^-8T=}xl#CvU0@&RMAzoay8 z0Vco5S>Pk=FDc$%r~kT+XGPX+i2E@BnpSfs?aG}`lwH2sP{aq@J;|>L+S1Wt&%Xp= z?yQhPf5*GtzPco5HmumH=SvD@c^UvYn0~B+cH_5yU%L{KZ&XU$Ue35r$eS4|> z?#zSiG&>Q#rN>W}6vPKB;?uDZK8WwrzH#X|uYlRGKie>Q{u*r@*Du!9C=^NVub zRH;P6M`4?1OSqcOykQhZ2JC*wMC)9ICbVShzP?T%-MfYPo1+B1uq$U-_OAK8@_P4g z&AHH9`g;<}tDK$QuccwyNADh<5Lp^#T|5e{vKx}L z?7=D!b6#|=LGsyyP-x)JsdAz0=eG;y%6IPGhsD;UsR;qB3KNOk^Gc!MvCwCSY;)Y5 z|H%I-x}mh4MH3%FAxm;MuO8TFZ4~f6kQd*SR^B}Rx}XsYheqXxMTI`;*t#MOZ5{AP zxg6URllfVcCBk|Q`X=>Y-V5#hT)Z{rwp2|>b@}0=;6pqH;v#ES@Fn&Y-stz$${j5Y zG^=uWJ}K?e=kg#jv@*y-DSO1VdyC@V@^x$37i*&EMG=)7-u!!L?G5aaMhd1*1ML?OAS$a-aycsQ5gCK2toor24t1@?D^?rlHY{CBp)j)AX7a zEng>UCL1W$F;J|0J{thv4vvM0>Vxv8YAB!anY`hT@4qfY$OrbAzR~~wZDZ4-d6Zxx z1GQ}J`wO8(3{B;%ZjBj}VhGUfI2vAp?%WY|ac|!`Uk?v6o`MW< zy`UC~TUnWSmB#p3IX9442J0eFF(EzUd#->Gl8JK&O7bmvC!rR_Ng5@1o&%mHn4NZI zmkdi&bUycm-wTbRBbRU(#@aVJ>l~z91Tp4_J zwxwZxy6NWX%-fd6&9AgDMv-%^O+V)QQskY7TVMTL8Z9u-J=fO!Yjv{D=j(7=%kCz< zD^}!ud+Yws<*^Fqk@mK~yIb>vx#wTE|Mz$A=jzvy*RKx`4gs_b9Y%6{(kWP}QhF$p z#xgw&ZzMAt&S~p88^P;QIvXi?dwDjB5GgYkEs^dy_eiF=bS_4rVR3o9r@8$VKB3gDK$$;ByA=yN#Y~itm#`lF3l9BAUR2y5bZ)x@(W#7`BZaYQfG}F4=OS1CeJOXejR<2*mP3h7Mga(# z1FW%9di^Lh*x(Y0ua*UtWQ__E~@Vt%eh*B#{__ z272V*SQ$Wq+FfOy^RudHt$`7Tb&|0p79S5<-DunUtr7-7^$uNjfXTgZEOU{gUprRX zDY6ty3T6eS1Z&S;Hl3{4>fyB(B_WK|1C~pT6$tDcD;~bv{TAazG$v(j5{*$5NrG`| z)Bpf#vJFul&@N!=1hbD5&f;*M9x&!Jf2;q9#feK1J?D%Sk8_aD`~4c1bgsHJe&O2s zul^prf4?Sqe$I0UAq9!YrhFUMe@_RzQQZ9;_|b3oOVCo)?o7z;`tH|Z6bOj!BLP(a z02GeiM*%#`h=`+4Mn*N{9OThZYuxmo6Q;xgGlW9NxSc78Vv88=IP%nv;`LSXfw5 zQBhxC-`d)GNTD32rXE&S9@f_%zIxTw)ipFUG(J8)Jw1ImICwZVwy?0UwzhV-uyDAx zwzIQyxV?RNc=S{M?-%-jmKk88!2f?sQswQz_2Ad^n*Sq7%k{x;|5uWlLe4#(-rQ?_ zFmfbGFeNlB{790bAH~GR#U~^t{jVgYr9a8Y%*xJr`Ye~4mtRm=R9sS8R$ftARsFoC z_C;O&%ZA3LSIsT0ZSAjV9i3g>J-u)G`UeJw-VTq9zI#75KJnq>&tGP~(r4%9 z7rrenEq`BGU0dJS-1@QobLZFZ-M#%kfB*e=^oK*>1WjtF9bs4wIj6pwysjv`xLJ-# zZGKNIubTJgzS@E}i3I%^LDLt7{V6imVV zZVZ?ocxv8Q{iP-7=gODC#^+yO!w5!Ui>8{{u4oSV%R^1I^KX*G&7WDkdhu;AL(OMq z=vCd)2vt8;_-u3i_pwszipy`CU#|XtNYa01I1CyM@RDH)hUd#z)XiD|{=2&=P?|e( z7Dd@T5?^uv0RZ-QP@ZR*c0rhkGwjB9VjvAoX2gafogO|(rOyB=q*Br2%m+=49gzg1 zc@aP^+*3?Vwn-Ys3lWrw078PM8!7!^*&MUMH`)nqwHX6A4RqNcVuOoBO#Z{Sbr~Sy zzDp>w(0G6_{TzZYfYdH?SHLG=L)oNTKX#LFnj6AGSf++^doSljOO-F@$7!rA7bF?UeJ@P4_5NOz;c+BMIk#87mrx_+ zR!R%gy}b(_{LU=T-9X_-(VO@08pLe$-!({VS}b3!ZvDNo`kZzoNj2TvK5MmoQWa}2 zhBQ{!>PC&^*Xze^j}&Rrqr!(sXuSim%e8*&WZy*bm*yUn6jy9CrzgDGXxZvrEp6HU z;B&2YXQtv<$>~n)X8B?}52@t>Pl1*hYjulGNkPw*01w71_8q4`4|P( z6ey9$YCrNV#Kr_y8rUxjPnc$C0|W9mp9bpabBs~?H)NHo1%w$5mQoGE1KhJLqVN1X zsnSi=!$~VF>tcj_sT4G;CY^`~=V@Prm^HU(bNs$E@T&-n?_`iE9fjVmhQ}u^cGV}* z?m?Pu=y9kA1|IyCy*oQ)p45JpNj98*lpxKjOa&lRYiU&~0#61Yobo7)77PM98Dz=T z%uBzO&%|N)H4ji0_ktShU@G9~Al{;7=?HT|=#x?z|gYW@IJxAI#6pSdf=DynS znDuLArOLaryk%hk9l z)L>aP&;_Ux`S+{`{rIqz>xEaO?@cji)WFcX9Dr69#}JdWRh#JGPed5^l_ij6TnU`L zD^}B&0;5|uk&2{wSqCb`U~WEX%m)~ye?ky*^p6Z6qxuP127yJH_zeC&eArJ z@qx5G9HGlpm>wDSSu`g#DOB9hB*osu-6-{9EO!t!u|PX46MvU8;z-9lPT;U?gi0WNoq>Xy!T?1E=U9HuX&Z|eI8C{FAS%@U{W-AL!jmf)Ck+1czLLVFJPKoY7H@|}S&_$i+xkNUQs}(y! zM6hcf)@1X^|}PdQ|4%+BcbEXo6iTXWC>R}OV3jAfoT6D7{@;?@0b zHQ{Yl+4L{XOJK_H=qK|qRDh$VMm^FkIgj`JRKx|k=B&RkYt!jINtk%!Q=fJdlHWD? z#89_kTtAIRXuT={*WKf)FTkOwUw#3KLp2*zl=xRL5qvX4%b#8Iq^h5Ke?H^4&O%ir z$KE@@P3Uby%YD7qCuz57QnaSr3mb@>zmq&}yD!wXH?)pXX7=GGzVbE+W(6npzfvw3 zO=VB+cIC(gjS~r6|IKP9E_`u#5cG_rd7Bu`dDiUQxi1ZUt0f*BaSZS*EsaZ8KDy= zS0+44gVba9?H|Bv3#5)T37hccmacy!qO!p&|NEK>wG^e$IZ%*J8H=4qiiaL&8y#Ue zI02&UQ~~(2tfQvfX|XR zBkBD7sPCf_NbYDB*&rn0D8FF~7Kp|ivFKQV&}K1!p$6pmz^ttXsMm!q0^tUuioSFA zRF=_lTOiA*$SZb0RTUn^BP?zLd}84XDfQW0JRm@Onm$afB)gK@J`0#m$XYi)B%B-jed&E!5CYfqq6coOg1Q38zcNq_K z9x;#XUTH94oG${IYR*r-KXu}R&TJqgH<~bd9U@GnaW5rwE#sRT17-GcjL3&i?&vh@ z5jA#z4v8my$xwMw%Ef-H%U$NCkB~U~-9qvSVLA~PEpHjA8B?q)lLX0eDJ@z zb@fHc*?BeZ>L`F&+2mVBM!6xd_5{~*k-6Z_lV}D887k;BC7vm5KHrV0;qX-D&NywA zBMd_?P5EU>Pq0bXij$s>gz+NREjn|pRWN&~6<}VhW^Y(}ZPirzyeGeHr$F}RgBnfWB~TfRLp z{QfHjrBSh-k|S$IUOM>%foA-V^RFLERI8tIo6m!>}3$$$~~w;}{b z4ZOI;nRx@NK!`5|DA!`BU14H>qyCD4L3Gp#ISS_Ea%7KKrzZJKdtmDT-(tN)>LZ51 zPfU2@a3rb94ThfK0LAaja@0~U?jsuiLrOVcubf(gH+Fu2X~*c^23vJBO?b-^09u$$ z_kh?x#_w$&E<5n-TPsDCS7zXxIQ}BX-GR$};G#YdoW&w!A0|2}_kJ8?yT>O?&>snA z_}k31<6-gfF7^&iOHGW`+@@SKTbzkl@>J!%@8jo`nim6vYvKsts+`jYbg|A~=Hou) zM|E!;y|mkbkMjxjSJqKhHq*9;#a}P%!S6^BNpn_o6X@L|Ki^-I#umT%uJ-iB+Nquf zbK)h#SnTdg2?g)dC|qT$m9T&^HL0WSFzG!xdC4tBaY~|nhFdrmRJeD=`G{a~M%B9G@yd?_*l@D^uk!@;L zGkVP3rp%F7-v@>fT*ph;ul;FlgUsK_wox59Crqv;E4TL0-IeGfAg$Fa2|~G&j?K1K zm9$`p7ryOtr~YkBq__WVI%v}y_02Aib5jGHTi6MI0PhIu9>rQDt^I^bV8JpLsm*lR zmN0e-lUyoJRI#4za_W+Ob^?8AO_F;%1K_r>L;quS(n!&=#;TdtA9HFshqCwi=Jb6+ zr-$Q=b9xrz`klz z3J|?KgmiM!a2I5ETQpI$@f>`A3azYb<)z!Jc9P2X(#HT#o~=^wbV6taBWwk_ z4oGh0)-P`)L3RgF&yBns_eGysTL2l*8Oor5kdR3f>`ztDj+xhtl{%SwvU`y};Hf%r zmi~sO>{cII8%m7TwBVhNJP~{)Rlfe{q0&1tF*GR1u;&cUaO$E@+*rA-eSL~qMp?}L zB6jE>qrQ=}tk1KTB}49cK80maX=av$jh=M<34uoN0YWoWUsIv*?essrFaO?#un+gM zyZg(Y>$Nx|4h@EH4Yw=1*>%2grJg}1RpzFR$R=e;)t@*(8&zkXVmX^nLEeja!?Y?W z`X^@Ky>08^q!fkjE!|{ouy2!x_O+?Zd|e1S9_16r^zob>`$s1)1-6|Nly~2Dc=6NF zTH7?~UjD&rJY@od<^96=E5aBgkLUw&dZutkl#A{q09Vr}_?BUNdHmk!L@UWz?Yr7T zLWKKGhUYy#lX0nkk9HaS`mM|SeqCPqap!C}2_q!)P@=KWVEptl@Xs5J%9XEo@dzR1e2@yb z^J2{<8bsv*91Rp%<7p6>Z?cNIuEcOvwcu{eH}dy}KPlgQ3CHi8i(?%<3)TQ{(y&5J z;ec7B=mw7*4HO6l#vL*(etx}|@RjXNg9=>)B9EN;{Y_Bws;AZW%bL+;8Se2HIcB_QDrgicY>$Bbu?^IZsTs-Q=l&^B5`5ch=44dARH~$XUUgwn|F0hxa#UxFQw7X{|uuk@< z&-$ayr5A4iklY_&a|R>a5Afe!RGQ-LdRdKTpGu{v-@cC-KgZa?g<$Z0W+%4pOFy|a z3;d^qP4?e<>3K0B4`QZ0M&vT=GbBA0+T6uEsqJUq8}-$^gb^a^+}HRjQUi3_My);I z(R`HM@D|0Uxoi}^9cNdoa&!JVY;0(KG+TX)An%lIMX*p^Y@Yo*xK*2`{hZ;d>wu=x z&M&;v&dm1RvzX0@dbxh9Tf+|Vx=)PVS5Dzn8-{=7pQwGxvP*(@Y+j@6jtd`~wqTBs zw;th@Aw5CHG8|^?1deWTovgL3TfI{g$jFMZFFw5|{{8C1-Ro?7N`^mTiPCR^_5yS7 zaZLOEw7{TL*PMa&4a#`W)&&7?pt6*gCC2U7#(eKWo9EB{A6t$O5601A7)7$hUMv&S z%RH>|b_56+z05y-9u2uoQXnHTT3*>8Gmn-vU-r^p&HvyU0Rg*k0*{gOeuiPEbX^TZ>6ai6fe z^D$by!ACT0*DS9>_ts7OyHl#K6w3z^&)h+31rZ%Md0+MwiZ;g z55eufvTr=7@rydnBIbi~=45+KKw7y+Q=;&#PK1qvCxPG(BknQE+SYp(cO5&nq;MMw zfUih~@R;5f;OjAbf@pOJ6ixE#XyKIflG5#^mgwEw0WOh=r@&wqM8y@^; z#)Q7ZWaFG6Rmtn$G2H>lo@s&M~ey^T;5?%#CspvUXB?#(dmRaXmW(YtfMI!!R(I2S79h(xnK2RLL>D3tx;|PH~!C z;InMTbD8PcDQ=F6X+sJ;lxKqBRjew1^&{5Z_~;bpC2I--CAaP?pBv5@l@sLO_FK&8 z48QGDq+N`Jo$o8$odfh#Dhj0!T#i{NRnh`(GF{~MOyJ^F=T#M8UXXZn?yu9f#b@{z zIQs-@GAy|SR92<2Q=W_O66|@dBRfraz=$kn4@CRW2Khp53HP@LTC%-MhZWkqKDi1Ds*1Oax9hK zG}Vm2Jmmt ztyoaoXQt#)_^jMPQRnwF>|k+(m{_Ce`!08%#snM{%~!~niEi9}#pz$g^?>o|l95S`UB`5~vP(Lpg~ z)>`Nm;-wM;3xS(@rG_3uJleO8!^Ch7CKskUn8PC}!i97GIyL|}YMMt#6I{7_KNLjo4rSwg$7{liAOyVAb&p9@SLw9 zqZK}sH99E^W$$twJzAjf2kG-H?1}=kHK0saebUvJmL43hHmLR0O`WNg!svZ;-J(3rseo8D%6#D@sYayE@GvB{! z_}h1(HN5|s(v}&Xd{RP?R}xqo)<--Qzj6gn&43E=Xa0wxvkYtMedG99Fvh6S0|7@j z3?xQxqmeFY>FyF0bsOD{2&e<31QZdFQb%`4NEoDuSd@sh-=F{c^X9qEbDi@%_kDjq z9}wzZ{M0_^6MFrnYdRjGK?RO7ssRSzJHs>-&Qp);QQP|hvIyb_yV^qnv-a<4QHe}~ z6bRD`1E#kJ!!gjK=LgNkk9m~uoZyCBe4VrP}o z)!;>{TnF7{B!XWoWhXVu2?!F}&IdJm`%E6g*(T_04vpbPvcH+Zw7ySV7Sy&Q*i{DU zT`E|I3xF*wu?pqo5RSIVk6}jCYbEW{%#;nz>zori8x>ginb0S3^9*A3sM1K0$5_+( z_J}-K5K<^aKrz1b-?z#iIAgRj^nql;$d_g$GQnonNO`yw2p1|i#a#dOG2E=!<|7W7Uyg1jd$b z$ZOAv&tK3}HNI@v3swJBWqHdg>@tD;A!FQ%!6x8zcZM+`%DoYKL;)Un|w^$-Fb9kM@D|}>ge}SJAMSWSm!x~^9(Yx zddx7d8slLKppA^p2i3rw1=p$!Ai2-ZLZJHv0_n|4xg!}ihoB<(jn!OMDj8CPc5G8X zY<@D$qlccUXszId!y)Q7p&~bh0AVYZ0toch9$pCtm)SU*m~(P0M|KcHbyf=qwQjur6&6t@`^ zt~Q>_Gn%s6YY78IYVo~-Q#V=u5dZEBfReLDXT{wy;t1mpI!qUV<*#Rx__U^3T5q2K zZI~@Tn^p=3nkmo!W}c(cs$er)e;o2(WmwFG^@$)9DOnrL^34cNiyR6SX;%xPG)Z_- z=m;L>I&@AJ-`ly-v~deJaWvY!-2xiq&L*6zPiHC$l2u}1 zPXb((m?&~A;)h~lmAhVjKqTlCibn?=M%XBEE}%tbOabgSrnBCk;Kg3TI?pWT^8z4r zeJ(L!OpF$XVTTIKI0-rC&7BXkmRWqXD}TTpUjUC8XWq*}#P2dtSOGsJ7Ug|`-b48N z$IOWbEJ}y63`UDM79LJ{pheM}|55X@66TG~%INUbFp#92b)u5o_gZvLT+4Mpi4&b} z;LZSjFd$G)mAAnlJEH*PQ^hA@tgNm6f=Rpy!=jIgisuSV+md8ugxrKVkYPxU@KH(u*qc$nq97jfO|kfrI6!DmYxf=4Gst1Q*+e6qOu4Jk(9AjWX@)J@21 zJr`)q_iwo0O&+TeQMjos$juEPz{WPNn)?D?;^nNYznyTgoFk2cBPHf+!9q1eSRK); z487dR!2r7;!-rb~n#~c^wN52O9Z`m(jrFY%futN$uXHX#nMq4jGF8YiVwPLT+H7LZ z+#mNTtdi0_!#X<4oDzUof5JdjX6PR2dJTt~iUOO~sxaWeUwXjtjJe~Z@IK}S5tHhG zSMYm!@&yN^JjAybm}>dx%JmWG`vd}_*v$-?*B;5`t^Y%ZAP6`G1kIk|HxgAtWy2}6 zbQTbV?8E1%Vw1-RGTm+*UNufxI5t+ISk5k7=o!pYa$tS87I!hE7!I(UZE1-pm9t;; zFaA1IHAVTDoe9ec*v&g0iI$Apak2EGoNURis0G}MzTyZ zXW5zbcnC4>9U&0bcYjz}isS&c2T^3#JLv0sQr@qU4Rz2-f>aRy8SgI6-^Jp+g~!e; z>5?wNuo&l7OgfrXx*YskVyj3dJrtn>iC7TX>E{ANMi~JPItme7BlA=qI_fUj(l|%ntaXw=Aw@D5cTx5P!5PMuP1Gw_b!=H=Ud_~4kfHgJ?fA+4cF1%Of=(OdCRh+L_VDz(>c2_k;V;7W`s59Bsx<5>8dxQ0Gl zP)>JoO!q&VyotH8)s_9ftde-z%lJ1`685ZN z_g;$qVVX0F67-8IaHiE*KxbYsJpKDR&Oc`L9?|sXQdW-#a#hBx&LgLWsC9?(^WosL zb&vQ$w7|#pScqrZk5UFJ8UWfntwRYcL72k@oZ# z^uh3gE4Q15hcO&oLD#2eHqV}wd_xhxLAY}Fe3!;~?)r=$3}L0EGIGeAUrefZQkz%A zOYZ2&sY(2oT9m0?lW2u3P$~CESLO~$EegR1I3EO%yhZibDq!QBuHo9>=v@w!2!SjR z>o?RbW>BQzjRKmbI@9Y@hB#Y4#%}mACyVe>Nwn`}NadZUE33Uz8J31YNT7t#Q9+3p z$wCO?#jB#6y;s!FrQ7mjpEA^Mqs6lyX0JT#BND5rH;UH<@~Hk~K7_M|L*Np_915v_ zlIcy9aT9Lls+#xd`(E;hamP8+o{vY#j!B(Q_=hu|>TpZwQms>E(Zy>H^L`Gh-3-+~dn&J0;KQJn3~$vf7C9#6VBd+92h4Afw&!I#u4%)DMTZH_2l=f%?R8~6=|eq@9`1EOdG_P*Oya+{)T4D?zzkLcAz6>EIJz9E zu9oq(g-PQ6e!bcE=-v9q_`Yjk*O*j|Qu_7l-mb$#TkUR|EszbZ84rtUs>tg_(;Uer zPd=u5MYnLb5f;Uv#tt!`TCI1_ajc31cGv$E^{_)X2mjRHzeB9@aUK3}>E~cOY(REB zDB&TymT+$Fu98lpT7v-9VR&^r_A}XY10kP?`dH^!*#U=n{*T z=q;JPN2Tkn*#m8j^8zInAjXYHcT8}&8#Ed8pL)|W)+ zZsNz&ajFh(@iLvBH((C2&B`4Mtg}VC4=(X2@pTKe$NPvhL|U$72yntQkhBMUOo!T= z&;P+YmBd_#fe0J~hvrf>fRu^@8ZHb_%toa>J|apjNZ{{k%9Epy_K$m?{2*_9K)dhV z+cl=Wk1f{E(4_kfofFZv`0$ULB8X(VHU26C!9u9o9R0O3lL4c&wl-Uaiv%W!?=K#$ z54BzY;;QTu%fC%ySe1#U!*4v`;-E=woqNZ2z8>&`EB-a`NdLEWLyZsSnL4$eosI1; zrs_dGf^|GtMod$)e4kSmD;V&L8?igr*KmWX$N#7TfB&#{xbbL#zvoikgYN+eG| z`6PFPi~Fat1dVAF_T!f}H!*>MDy(vM0m4rlbcZWpi6@lv9rXZB_T&%qX8qeAtZ*-S zfT*Y`TsSWF^iu+%dhU}_2^wa#@Kx4;f3S1&L*giJ^)sO=Yb}6j?oj=C*vmKe{3)JD zA`d1$$@=-wnH(6pzM_H*R8$Q`UVZyqE`t|&SHCL&%!xFdj%NqiWsnlOvQ%S{Qf=eY zbFW{UgOO>g(?f0bKwaCHRp%S+ZSu&#ec?)^kaGACk~fRj)IT^p+Q`$AOEOMVJ>>8v zGW4w!vL@{+QqH(b6wHtOxX754HPn08l#w2o>mG1+G|JchO~{M?lIR=Jj$jm;H`88F9xcroR~-{|IWfVK2PND zNb}jrUZmp4bdPu>u~xWNCopThlFfl-faqX^dxtas8I=Us>jb!)6MnTnx7C^2#-;P9 zG{-&UKy7&m`AJIafN(7(6X}m@`GM4`yfioWAy!Q8%nt-E6}?-1W8d=vCy&I*0|#^Z zPuWjk*Tc<+SHz%UwsR3Kq7wI$IE2|~o*c7dP*%Wy-%E&35119;(rOnnV2WYOr^Z_i z0^l@#eqy=xk0QrOU1sZ2Z?&22ezbxRvCbGQ*ff|dxN}E|3Ne_rb_JAHt!)CQ*6G0J zxA?)8(Hc>__fs!=jIwJCt8C2)XjPsus|xT8bZ{S#2Nfcq{fbPFkX<hhyGZC>s2{zvG<#?P6!Yv8Ha>>9h{c}1diL)4IDse#s-W6l1PdH1dWlHFkfG^RgK}r9FH*#v_DZDeo%TO zE49u;?2qD3zhsKqfqr z%)9}4@Yo#AWs=1>1cH2hfzHnOHI3epzVnYS4K~jvAN?*q@mIWOZ6y+a#hYrt-G7)1 zQl88+B}xSO5W-^Nzl-d^V~dRZv~lIvkFKt#?VjQI4cDh;|) z6WRgdm7Yxh0lYTx;(x;jkNl|8q$uDHf6j<*Y8zkzufLB%o@JgNUc{_Y@A3v6s$j-R z5-mN`x^Q(mr0+rCR&@0qlEG+xqbBQ(huei=Q9TV#BU>-YAv=~$l9o2Lz-4rqQM;?< z>$^%X?>DA!?pB~iAUQJ|i&U6ZE@UkEmffLT`AJ&bG?e<`&ec)@!HOFAXA>4il?6k_ z{R_m<;cw@AT*U`erLqgwn`F@YHFLv0nwtB@uHoJTX6x)q<&uRJC&9JqK7`xI>8gZ$ z>cuh?-93TV!Z5zkd9W!eJ!IIV+I_g zyFJF}_~9|nc`64r38Vrvt*JVx@1d*`aK zcIE?1c6VUN*&VOyQmzVitC6H(`?CCEOO@6G);vQYI>u2B>dl?A?vQ6vT`ZYYYnN)d z?!W@;7a|zmUR;a|ZO}z%miM4rSbvCh3@neDMm8eC1UdZL1$4DL>XDJHOH20y{8| z;gFs)#==}9lmL2}NQ5wnIy#W9d9DmJq9rPDkQycoK z9>pE)t|56a+;%$X5~}!GDhoSEQhK+<86x>iInkE&!?cmA#~LIApwsEc&~sbKz_OOO z<&bId$@~vBog=7GSWxKf(_}+?A3)rJF#O^T6gd>mgzgU)u-eUgtj(1s`J=VljNYLP zx;&yE5$&CZd;2+l-CD?r2r1yZ%sTlD#8LV611yG?$GzYU^nJJxuxor5SLiQ<*4MK; z93&dwFt2w(6?!k0Q=GHLy6AZ2^L|c#vbtlTcU8wYZ=NDF`Px%6qooC9wND&dJh=?A z0`mFEWY)P~ud6B zr`mJ#em!ip0}pPq#jvS~*tF0a+^+!`*NH{Gt<$wg&G$Fcc@@|zU`I@IwTz0ToOUgF zvI-!czk-RT@p%38*L|Je9Ztv0t~ix>D4sK8qYiSjhiVL>>4Z)J`n+*a%{}zS3S|@2 zVSe}scbiA|{W_26o=&JKi06;?(NkF`FPb~QwfOS6Uo+u>pG7J%#N+$0g1bkDa{E3N zx<#g_#%VDXf_8$J*OZ5t=8n}~>f6+1ZnOUZpnKs)7AYzy>ITz2^B)~M#%#=BGgJ2^(@&X3%$ z@kGB`!t1?gUwd`#>NSB4v4bdM=tQP4Molf%K_50s#YzS9UY~d^*atbZ!_o`zLVAzrzVyJn?4izbwu(j4|mHp1zBRjs?S#_T`a z@}y=Ln0AbRERcn$nF!N95wY?++WOycBz6!kmo4Yp!R*#D_}-ZQ_67$GArw$*(ev-V zUYmoe>$&}Z18?t4GT05C#8yV3t>p5~^Z3vq1VNn4RB$|S7CV85;PQ}wQ}fIfd$R-W zzEU)rYumk--%AzA68ppXTQ8*tWz;CMVgGY;(ttK7 zWBLBsf#YgCRK5xQ%#+sF?#RIdbAW*yD@F&`i{DGo+}5UWyR*0#7yV*PL<#`UAHLV7SpS9#Fr5D&Vph@*{z9w}afZ29t8$sv`END5wJ~3{6 zk)TAyu^9l(Q*fCvhJ?O=1qy^Em|Tztg)N^Tyx|N5vwsnq-U<@C}p4D_4PYkC z){pAaSNMfR@>Q&_%J4L5KHpEhL zF{v()y)0*ifFc&gB{FK^?xBd{wNmD&v>@121gY@UXY-7-t-}MhI@)WKG#UKm)oiAT_K-F~>Giz+$WthYMF1p+GAIq4A&>|7K9fuwuz#RqyJdo8~kl|xwN zjRO<&8dVbr*G}@ErN4d|g$oh|8r)?s&eFX&$p;-UmP(UG>0IW;@I6wZ?AzPXdHxd_ zfqw65@%z%(YeO!CSmrMdcEmxdq6V%xG2b-BGh%_3h~-&}G;K8rGJOVN)pBrrw*w5-0-7OFz>vZKs8c%mSKcuj0_4)kT` z^^#JbzYXYG$D^LFB2I$PkM|lPSoVpAB>gahrZ~M30sWUyV{i=aM>myTnOG%d@-i+0 z6DKJs`RWWyDE|dHrJOk-Op;Q^_nG21_QZdmnIlB>Qy$5%jqGzz+l-9spS=yYL2>_h zY9?`=3bNqbW`+k)!OKfL%EVvtiUB^!52j}~9**=0gXCL;Zi!j2o5^!vFr23t0ZB^E z>i~T3IxP2z*r^vN$}cBK&vQ;6K}l)l0>F|~Fb057Vc=tY=veyhN#vyjvP8*!jf#>_Sgh6y__!YxG{@lJLvxD6eAN&`|^Yl;oLuM=&2hF1( zZj#{))l@+=07~#EcsmZ+uAC1$!nz(xF1(vpTD$eWPgj5yyWFO56Va>ibaET6+lQMymTfg z_*-eQd)XalY5GfT`~o$9UPHU%9x1(y(H(sIKIH%8Ot2^pjK*2XD2b?*(Gvk%b2}{~ zGS1jmS`oBS6ktyqZ@v(q^nNskohHi{@mOQ`>RbU@wFqHG2^uBF6i3&S& zI-F+7-=>>Y#?f=S^7|TGd4IO@Z8ktwC&FDXLvPAGn!Tc#0~zDgpv+3ZJeK0<$x)P7 zj}ztmpt=y@{L|>S5Y=Vihu@n-1;~Y`3p+-f(GTn@DA!+M+n&%6v_Aviv7_eJlK*6W=}Av-A8hZ&J$S7V6wN zY9ELO#uDile(-lv&)`x{Ohky4Qa#bwE}B#n@OAK-SmVh<^JiB$0v>VJ$BElobU%r~ z*W0nD#u{uDL<)WlzL==u7HTkZ<^us*O35H)oaQ_@g7J#{SwSp%%&XT+fV#pNkmkcp zPcyw|{#}uy=?bU*w^H6uvYlZU%v2p;K4Y=~CA=PVxB_tv3EAry1-D=&Pg^w=NPOR8}3@DNEdmLP>*!N?0KnrEpQotYTJ zFEvvler%E$V~EH7eX#g05Y1hs;VNfBwqy|8J(pB23{uhUD>zTO7yQF+h9I>>3oZEG z#r{%BK2XEl3_Bii2%I^OmoJ@pDM~FVum>ps7N{Db-)K|h;~e?v(5JhQb;33=Er?H6 z=%Wk6=U0LB!thH6oe_$QU6w zvxTw5o=lkg12G=zxcdwaQ^V>8{1R_u!721TG>X154|yhc)$7zWro??H(Ilo4%sVjpb}g^JQ8{Bwqm4+dtxcnrcSIk`5#|MCa>x2y1S&j&-&@Hdt+-Kk)bCOtL10RGRc4L2x4jZI8xAxSeo`@=cv z!$GC1y@(f(0O|A)T1`nE6Qqgd{!3R9KY9OK=g{Fq$z5veMaB2L>?Xp1i=YP&yB`pb zgK#V1kS4nx{`H|}M=G0cr8uVl-a&}pm9>)~V zZCwBNK*r-O%90e0IwE+j8C?@uesMsfD5ZEdhI3Mz`75s2gFpbX zoGaVN$EM3iT(dtX3P340UkY*P`4IQ~as*bhIZV4h+wq1y+%`C#04Fbfy^`>LIST$S zQ%xJ+Q%bK3&{y>t$g)&Idg+9iCl3t~zwr%;LwJ9h8mGk z(GNC>Q!*w1i&zZNzLxt#vklQ!WtrRXM%LAGwjfSW7ACx}|*#Gi~vl&1~{NcVR zQy+IyJW+K4*Dk8KuH6o1-OaynPzI;-AZF&>4yxD@SWsd%6v}B_{qVMH!a){hzUNAr z-JQO7&;Ck!AHF&dCU!}|^s_&)XT@mupxxUsbFRV63$tG+$x8%U3$em)^__j>C@&rT z7VL`%pDwh1+@Zy37T)-WReEif*SY!a)13t1V=CV5$5lda?TP??QsYm&-nQdhivxZN|A~TsEt2_hrR(5W|e<{ z^~f>qr~I%95sGU=@j^vI6i!Y(xKA8l*{wCxt^gB>qFp`K{Q2=d;F7sAtIBab7AdNU z=)<-ncm#MIY@#wcZ>krLG$3D872$%;30pMgiNrhh){0e$-jIQj&?57;Sb`&Cm$mj0 zqm?3&gE5nvVAI0D>VA|6u=I;^cFD*q$7Fi>F(=w!1V!snO6g*;E1tX`!t0CKed?cM z?|i6FT!Q6|IBU`D@`7EyLD^Yz9P_WH1eKV>;N4ytlFbMz ztuY~&YFcUfcd4A-CO?Vy5!;csNmFNFb%4`#8CG5LQt)aS>wN19Z*W#2W-e!-+BS?> z?^cEM`^d9H)R<88?T}6twV@ffuj1=puaX|eht)Vov<-U;`Mkf%!!vDbIA6Ue>Gv>m zN_fIpbNpTX<2)NKkzEmZb|tFKDTBtzNDLJhIl zMKR9YaN)^9+}U!pX<4#GO1k=!|{9s+X&+WJTBdk5%ej zM2jMuf35ub{?Flr0CJ@>V}8XD{<|*4IdmX`-YyZbdI8wDTO;<<8M1-7Es~#S&Quq8 zk8Ar`vQ&dmXl6?hVSPjwruy|(uk)C$IGFKgO-sB1`Q4t+auWCPMSySHOeVrBH6sSY z_;H1eKS;4vECHht?wojl0`VpzEo0_-gq{`^Kh6O@l9%Ag-4E-NQJp3R*?+vO%{m4a zX|n^Fal1>bzvdCpM>R z;o6d;7|RWNC;k8Xzv%0vy6;P}0mtea7pN4Ba_%cCES zz7|wIt8Buc?sd^UB@COoj3YqCAI0P-$S8M1WCN}yADJC8D&`qRwXQeHAJc4^02loh z_#sD#PMg6vIa!~_YdpP_DM}667mQrDDdw)>$~u~?IJS|H4=_t`_pqRGZ<~t2eMp`W z3uxNaY_?6N2KA}zR;ActEsMdD%$Pn8aD>T2av$A4X+Tn9ljkW7rrKoUuL99)7K0rk zmf9+`=t(x=SnG#T%)!@+78i2h zx=*cC%~Usv9(+iQvC77A^bVWmV98}(Wv;<=8@N2-!)ZQa*FnNSlvW=9$HZb z%odLFijdyyHfC$m;B?Phu^xy=JDY|;tbu3L7>hEJ-!5b6^$5(E&)gXc22(BbpdgAK2=H@wPqlxSR4ifl-O6xc5@#~ zI+8{jajD=aL26&zH?UUx?~;ZU$NL21N8EN+qNB=(>@>G}*Mka~6xNpnc;frywj#6L z>2)W#Rv4V~aX~kaOK{Mrr+ocXuo8r6ndfpxA}0I~$VEUHaM4PYPU!g<0Lx=j78!k^ z^EK$Z@-MiBkV<-SD0AemDVLiV-0gff&TLV68Qb|2K0mM!Gqnul=QlQWPt4hYTEJ!- z+@av=@G-dDz-e-L9C%FlTpPP?#FrP_n@c3;DR+x}e5ZUjZy=C1>KyHk`DVL8m+N%HF_Erk$-s!4IBodIgwlAiwTt!XLbOO}WBDVT4ilKtr$Vm4}RO za`}R=nFNf49(*axhU5{>wEJ@^7o8_uW^jd$wsg<%nhq0(cS(Bi{&(S&FImEG-tG!m zI}Bdx4}03?lMTzn6VK@MT7wkR&H>Y^11f)qX30l)AT_3I_7LB)!uL~Kb@kj_tfBYN zXUB$uGO=Q^p*Usy<_!2xLi2In13tzNjP!VC(<|Jx(7D9XeH9OBuVKr*%?mhr2fv%e zH+D;08fihhM?^Ds%Lk|r%mdKOM=+V{ z@ks2GRRRC{E;)2Z!0%!MKr>wO`Np~DT6Q?@?Y>4#-_tbG%?+K!G+kXxuMuaW6+o;j zM}Yg(hH2&_VM2$K;>|Cr-j6ZbSme$ z_O|P~eh~)mTV+z87HsG1mqD6E{~Ek{+9QU2o`WOw5b1@=vU!!0`HF@Mq!^nhsqjR| zj--*h)u238Q?b)P3q9yJ+vr#{%v5P8)?%3BG4kxRS$sQ7<_!a-dIYmfZ#9|WP>;j3 z=zHnI^jwX;_V-J;Bw=Dwn97YvNovj!hJ`4t9-O#TMOr6TcC2SqE&?Ifn^6+4paQ?( zgKm&tH^$5wX(yfW`qN*CjA>eNCsd?4IcIxG62ljg6^{~A`c3cw$lAQ0Q+l}u@pwO4JUnyI~P790f(a6nT<4pk|oefwuf0AX9j(-GVHTdq8!(^q3 zoSVnwyOSnHTBbJRrUefSB(?4=qDPMc(^!|!Av7lpkZGMqX*ruzmTl8NRVMQF7ljgs z@fh7;WK)2$nd17zrcsTV2!#AZ#*%RA^86%13E4!c)1pXXIB^&_Bet|W(91Bq^WmiO zl*0OCBS4rT(ouR5-)z{12d6wJWXj(LwT8Zi@K zfg|mhlc7Y=AiRbFkP)@eB(goJNK+hxG+IwIK=oyIF<3M~+seS7BJ+jQ_-h;Xx-ugd zmWy^8lEQ(O7*w(}v?Aq2%-ANCXyGbiT#XfGH5Jn)4Dw9;PV4?Y82LAuAz_zYz-V?^ zvS*3G3eud|U^1B!z)E*lE8D}gw7f?`s1E~w;e<2vZ@JG@Z1^Ku@9DnIA~FrY8DEA^ zLr`Pv=Em88bxHKJrty6@>SUJZY>f9%Pn4O@{+1_Lb6kd$OrdKHT&TKMG6@c$cLE@^B4@T zLTt(rRUhNQQaqSw27xplgWpW{oCL!XS8bi3S`T{>duF-X$4U55w2qLa{tsHR6{WSf zB`35AGHz?Ajb-Ls1S6PvKNqmaxZFc-E?6Af8QG_$nB{WEqm|4@>+WROm@i_8sXA?W zih~fiH}sb)UT%o2buP)o{AI(@q7l^LDRuZb0v$!P#Y);4dA;_;siag+YEqv_H`6Qb z&MM5RYu9UXcnO714OCnoZ5(y@5kPW40zz&OPU4GeSc}+paK2OeJW5=%KG~%ka$P{| z7AcW?0dn2|wz;yTQlWOsje+rNj`6BK-Wa58Lez6xerqyYOiU%pa>GMs)1VN*tOdmn zz1;@mIb4>3uJ8_IWNP2p>AWw>+K$vut*Y%2LPE}b1?y!&m0ge8yM<~jkk0t6W2S%_E2_r4BADp z-dQ_>`aH3O_udP>64`}`)kJF$CyvB{C9R5WdIC8QVp0YpJXF>><;qtSa6_2=cUqnH z!Ne*Vd7YARm!^6Lr8w<|<=lfj*kQ7L=R?S6P9bqFNbKLUYTj$^?)GXZCKF_(WzrBgcv(*M)R&4RmLOJ*cGD#MeN3DJexT}eND!1ic7ekjh1Xd@~ zx5dJCuv-{P>ZO`Cwhm`anw&?uAQb8+XTSa_-yz}6O9gUaWme$BCNP zip$fy&s~CD>F>KJi-~W8nzC$t;<*#+%MEK1k_K|l9tg@wYaLeA$Yg1;-jR4|Vd&?; zpTv?lK729!MC@dbhLML!x6h5MMGqQvD zl8JN(SYpQd=h5^a73z`(^=+DpTX2~YkD8?yXt{Vaf=@!3gpIiDk#oTw($Mnuk>XBS zt&IxygC;UGxE{X8AfaH9%^mRR!;8*;Dc?uKqI?*W>tj=HobDgaZ^^AkDJ(lFo}n2* z{!Z-aBA3sF93(>13R$oK*cixQY0sR0n{E}QO5c7m`q`iqyb-+mdKj$v9UQ^}+1$}; z5rln?p!qqNzLwSpf3`|P?GvH(J&Ld1g&gX}WUwP&zG5{F0xNqTJeRS=j@J2R60R95r! zj0NhapOnWJso42dp>z+Q_QP}eT>8&*GWSXJR&`n7Db8^7xIk8-cuD9`MylGc?+@u* zXoer$XAEX zk-x5oUXzIrHMX>`{Hqsz-du0j zl|YR}x_jgp_&ywbNxsK)n6tBM%99l34=a!OTgxk>(U~`>1*#88arGffUv)4g1@Juh zGjdr;>OTCl<24nOv-oM40`{8R{=a6SDEC=KR~r&IfNsK^B-H}jaoiJ@gxT69a7=$K z`tNw*N1Y`7hbE@enn1lBQT(zhoo2T(z#b!QV>8B;7S!$~KMB~e*K{Ard& zJ~hdiL*tK9T?n<&bak}E&e zV6&i3&+S)^F?Q)g{?C3R&b=w|I7V}MiROLa<-R6ep2FzC=o*rcRngSjWJiw~(W>@5 z-U#sEjE-Z@`$uoXxZJ%_YLq8C$=j?`+|Sl7pA5WDdQtx92Zmv0Vei?0XV6h9Dcu#N zNSWqUG;9MpTYU8CD4dDF-Mp=OV!jXAmCY{IYaSz}s1swmgyiG!1bw01n46=*5#$=+ z@9(q=b<=kN6^*Rg{xq;r0p{))J#p^*|84IGghznLRo&dkgV7^L@O=gUPD!*!MfXMN z+t|XfFuJ$RnBCy%Pay zRcetV0gg?VPfLO$b7~pc=_sz@((G^_sr2O$LNb$T^9)V?L zIQW91$oaGB@Iz+c;oZL5k)cUdlyeCJU2tDtuKC$0{i?`*06|3FjoFf$w}SlLw%K9t zO^7V!f&4i2y&LylUBAFfuG&|`TwcF4G3+k`Jc?c(%yng$^Mlwur+VBX8=q^XJ|Y`D z?*rtrRc;t--oNlegUyPSI&53fB3EgFdQYw-@->vUTOVGX}DqWF|}6SN`;uldQz5zA%Yj`XpdLJ8ZTwDOBW(MvXmKuQ9A8+V0Ul% zOpM+bUC{s9!3JSkuOo#ha=X|VZmGM@75@R7_TAr2Coh2iQ zN)XsfN%8NFEN;k5yPd@tuKJ}mQn6y6sv1Wf%|b}uR|O{K$=37cAYRj`X^jC6UuBsp z#KY(LIv|EG8;{5Uko?7b!r^=CFSC$hu+rsWegydBr0xUC!+_J<=q z1h%z=pkDE(e3i1FhG(+vtRvRE6`E*$^^RH;@z7MYQD*$6%D?z8t&cZCm3!oDp7NR3 zeoMi)v~I+SbcsCG7*pi5^5qa-a?s-7MA)rq3$ zNNGx~0t{kl`-B6Smq-5YngHrn6$@**x~MaF4O35gMRN+*^JeDqv?ZQ`A}#&X>4Za< zQpS!B9Wl5u=xh4auLs^q2-?7{U!N)T$yS9>J`wAz_!+*u0d>{*Z_G(v`t@0`EXIN_ zP-fz?SO~i=$b>?M14tWSte@B%&q-uL>)TXpK+1O;GL& zCml5_+krCu1LnTJMvtf(XOUnFBKYmmVPfxeevw)EkJ8E~2Az@2Mb?{qluZ+^umCn0 zPB#%52BdlpD>_2IMuw-P)3@jlDQYJ=_qHYddsknQ*q}Fm`|0?NQN?)hiYF%bj&w!k zrxL`V@wvPzZIz18te0J(mkB(29>N#+qAEVkLKQG02h3i<~1o0N!#R6oA$66%J|317tkJji8!pa3jQ!9O(YH!#|3}ez$3y-9 z0sM2*;c)iZXJvDQ?9R+~RwU_cSs~f#&fc@^aYhJPAsRY+Bq1bGXNDqa5#9Ia_y6bd z_+sfdQUxhi+hAr8^w z?3{($t?Ip7O4L+D&_|Akh9Q$eZoMhys`pycU&mdC#oh1k^R2D z;cI+|=owgR%hTpH@R$5%HtcUN-Z z$(dBii1U)EgxuE-!ExIY`z%_ST`bmn^AuDEgpe5YB{jIy?Pn62+rcj#R zm;$2yi8(?+L|Sv{(H#dSrJ)9#aB-jM1tPm=UB2h*Va&|QHTSA#KBHz38}ZHshQC7KTc zxRxWy@Dx095BX@ZotJAA@uymCr0&6Gk3TauA~KOomo~d%p@TI{vCY2=8@GEWiav@rbH&4Nl5a;j54~nt2o`@yXkv-HF6Z=HfyhwPm z?8^g9#i#q-=vVcDzpiAr@91rCO{iH8Hoqf$GUOP3eIFB0sUW#=8~bFw@SFtJjVWdH zTwJ#wx{GhS88Ho?pSshBx&5w&;C40Y`N*U1!h&@st5DpGEnbB$uM7dzv-{xoW&Y8s zFjD#P)yXl{k<|A@QQu^e!p?BqNJ~BJJ-oZtGX7_gg4*=$vB;0kVQxzM|HcpGszqVU z@sxSYp1#_LIb`7g>=iOQ3E8&p=4C2L>fgJ#T*vwWt&UdulGGFFw8k&dTWZ9;e0y$; zs_GqJl_|XVM#DbB=%Age_+s>nf^E9+Hs3#so=$Z;X|yVpO3(NumlDOnb@+nEdA`PbN#tQ;|$|4024Ym zJBv?~P&rrkKF>@801Z)mSGy^@A$8_4=I{cNk9BKVbKN_rFTAzJHfPifdDd^lDNYC2 zf5Gis%r4{+)n6g@?1|Q8e6M-}+DK}Xzj^U)U&5t$?Op4B2(2s1RSsv`R{#1=9%)K% z=Oe33Nh8-~nt3dB>amK%$#H}blXu&^l4J@852B686hwg}-2}inpYCyAxTs*EV`PEd zN}ALc;aIO6c>ie}Ph(slyr{dGtEyTqg0d&xZ6|@5bm0sHHd~y&x(LT})w@?nPDiz| z5j9>-2RB+TK)?Kg8;2uMh1XyaLGFXMXL5WxSHXr=mV89Q<`$^GT8tab=Xo0$3PKPZ z=nE+^PCcVXpTekL zCvq?r!DWh+|INqRz0=Zt!u(8>PyT?{cLap#fhyu*o~Q)J6!vEYNa7ZpvEC$9KY4K! zo}YxUzGNpU>Ghgj4^%~LXFcaZQ0e-kpi`SHw3<9T9r^4+cn+S!BL#*Rz6QVSn}Uh1 zC`_>WLGwJAj*GHpZ+>_4#x$5Y!l$r^ND4=46e;=|C0{!eB?IAM@##i(X{lr3W(!)? z!wFs~>~Dor9U|Q0r_;NAkXk9os0E|Te-J7iUf0QY{ekO=!T*`)3cs?+B!NJ-qr4Vk+nQyGudOzuRUU_*xXExg3UTTW6?)z#=oU_k+N!>bV?O zBHub7-6S%A>FfqP4%3sMrRS4|%7HrO7+lu6-_2rf9jrdXaH%aqT#}6em9Hd~w@j1J zh$w_p&oSas;3+BaZ67z&5aVj1peP222HxSs&4ptL=x|r zn0r)&c!j=pls&wsC~I2m!dTH=Pxa9phMFRHHyzT62YzD|&f|c%bu0X(L!LP<=D#4$ z5_N75EU_&|EH=1goLV$It#}u>MWN(kq@)!;hj~GP9;pJ<>P|e_?0tC{&O<_0{ znMa4Ln$7*{;W*rO%X>Nj0xw9-A?aT(e^r&cub2UCFP}N!g#ekOgNclbw#7hOsYlz*}dYbrnag@_VQ}3JYN(98^H@EgDi@n zcu=*?bV@)F`6enB+n9u6%lMDT-;QQ_P+Zey1b14hNv1kcu$9rMTJId5iC|vnEx1lq ztzJ-`KgttVT#j^l;L~1ug24%W&(nI!Y%);ix>V`SfDD#0PBc-541(lP5XBsDFuLJ7 z9`-i@mXiu+*@Xk9S^7Ng$+yZ6h_*tkY&T%27*?8G+~33mX+|!odZV_=GySv(NX-n8 zGD1DPg5y#Bi&;s5+e&*XduNoTa(VuBazUVIU_nO+v zOs>sa6euTuRyeTrPv+Afxy8jvmf>n1519>T9w~P)asOqN%Mo2ZZcfD3b+o13$f;NO z!)?J1`QS@3p=7(ZmHFb$(x}DPMjm3r)S`Ns!PU)~)8aRuBBu_@f0))I&+;Bc@V`Z{ zDlh<(7GPR!xk4!DR%u!Io1dv#9_HHuu_@fmF@W@Qmvpe(;{X=Fc71$n`!q_?q`4`$ zV|GUB+Aim01C+c0cW6X><7w_KhU(CIm{o*ZClAsNxl!+&Sk)OHp_@da>fuF=(5j%v z1RM{D8e-m7PdMmsD9$6ck;Ql_O>uFPI8JXqrfu9qwJNa4YK{}5%?tyh^*FLckWqNp|`_kO2%M&!DYA4X}j=m=^~`4lv<~mTvoWdY>b?uPLX)H|QnE`x1NuGDPZ0G^fL6IO&Tc6NnKHOOlBc#LdZ-vyHT~?Gchd$J zIqxvXmySjdVrL%kWoG08X ze4Cntr`;{(86m$LPN7;K01dy=xkYaEW}DL)pCSZG;2{Yd!KbiR-Kw_e&=Wqlt|Ual zGX$MqRwd9i({@F~93H93H-!Px%P1G0GB|#&N^64Z%#38a(OHP{&uhRC#qgvO|7N3! zcr8dvYA>wzmX7tXdQn%K7Hn3lp^hi`Mh2`S@3ze(G@9R4ax5v4(s++=#Hx{bfLbt2 z;ak$>71vQ&H{n20^UIVgbD{x(udo9}&zR_5 z^9!&7?=$)=o#{cD@a+lci{A0$YJQk0&zU00_TY^xYRpQp_C{>I9%^8wZAR&V<%St5 zW_2tZIg^cjbc39(pxrV>_F^G}g{VNe2%xYab&|?)J+>2{0Y6iuH|_Lm|2fw&9#`dm z(}Obcd37T8>+EaPd}dCn&-9G@bLg|zfWtcY1Le_@?pu9S{S``|Evh#ewQ@6jg5ec? zlz`Ga(-}Nnio03x5w`oqqsK2_BmS6%J00}s<2fX_A$G3aW+>^j(tet4&>{g>YRL6L z_0PF40cE<3jD>{PTpc1-dr#(&Nbz#mf6t!oK4KKmXsloe(`&ADY6rRf*9^rRds}QqYG?RqemZ|YPm3KeiME(ap)Or) z?&Tg~I-&a~$ZCX!b? zTzZFIBS9yhJag8zT{kV{KSN69UVN3Z%~?N>LEhJf3V@#KQ)t}Eh8yQmyEcP^6Y9Np zBUhwG7~{*4-N()v6HgjKw3Ls>j-N5qI6v>;AFD*bTieCgBvdAzL6^(99_m1^GjH5~ z*3B}yWY{ONc|*cN>EnTaTn_PzH)>X_D)UOrn{EbPV=36S*C&C9!1`xh@Cq+aX4eW# z+86A@>3YjdOHA~~4<&yY-U-6p<)HiX3nwFUD`vBw9}eedMMAS*k^;BIO;TP>OC1Ix zP?!dW?LjG|bwQPD&txxWBC34uatv3a{;e5XO0`qobceUdh-1Q|=&YM#`WFTyS z8-26g{N)y}5PZ8F+7vN)J*UYOwYEg7x_+>czObH5p^C)Tv+EcP^>wE1;Y6${cTNUI z4%WHC4^Ny|O^8!kdBZeq2zLdPpASC&5k8dRyW4j?DEVL{XCh#9TRooR{I@4M&l$|q z;c^wwj~j>543jAp(9o>;oL1X=cM);Xh-RT7k*X!9%EKn|km|P?bly#J=l*&b?5}&&b)&C`odgB{UhY&1>=qDb+H$yKKSbBcDcUY<9DM`_J3<+j>Kt?iG!@in(W5#Q#3#Sszu z3YR_Jg4D}3Y#{U!+rmKwNJ^l{GAg+1KakUTFUhMJ#^5s42QV2oKx9cAI?!iuGfd|m zp97-;1OSdITqZpQn<@h!4$d|)SU<#zV0;~5JUzmvrfKG=UJVBfUS3C&;G6Ev@!hET zlrHp+_4dp1DqAA7+#P;S;~MUm_@yy>#$+L+23W!Ssy zVfc48MXw*c3oPS9tdk!m31j`qtU@6?;fqrh;Tm^j>8SjyoaPfBQx!w@auTnl{nL7U z@NMDRJ-d*G(jpc7MNl(?$6DOt47T$sV>Dhe{N^Vg18WXdZoudE$yi3SmPfOe7Oy}Y z;SghLuPjj1&==1cAi5*t@E_OR*H-ua5Ae+C-;ubP?0^uq+rO4XN+4zrp zRT;$>A9P#)I!o~{I%fXL6D)ntku5ilN;KI#1Z)&$@+fRf`LmB94wt5p_6v^xrr{FW zDyh0Px`p>?5YRcnrpq6UMoMg77=Pa`$Qa8buv}J85U92kw&CMi)}+4A$qiMy5`Goe zPx)L@Q~)u0FtuO4{>%*`k7mJ_uKvm@LL`aUig10+OOEQzY5~2!wdA=FXd~L2WJ~15I!*sJ{-uw4V=c&qZ z*1F{o?Ys34iRV>eKXZmz_iy-rZ(zj%&nx-^pY2ktu1)0U#AH1ALN3guD6F3T984G; zDm7Ihc>{SW$=+M54j|Z zbj2Fq%ahE55Pu)?(ltGJMnFpXhN8{rD=9C<$n_!S+YTMXI-D|rnT4>;E&B9Q{Vx(q zkux;mEHIM#3!j$UkJY>oyXZb_wtdM)>!%Uwm85jOxi$LQD@f=VLB8Cxo>_C8ZLvD2U0w;4>fPWd z>VIKGtz#rPgUXJzffM%+@b*ksYa6~UBEPQaa{P(byOfg*hCU@}bByzFe4K+TtO@65 zyS*DNgX!yCwRDbWNO} z&MesSL2g_MJ%_@o&`rY{n8Y>(!b<_*vSbkN0S+-2QFv*e9q;A`*MjdFaMLRK#q&7^ zDwps@M=SDSUXeC@b?V7j>j6WJGI2x2**Ca`+Pj4**=PD+Fta3v&HP};D%KQ$hY|~I zX2veKN>>Yu>&rz_OsrGMm2c?B>H~%2arwj=)pNoX?rI(aKHDiBJLezj=1K_-tDMq z!f+OeV69?_DWgKZy4+*W7SFKybP>Cn6J7wM~LRu^~JGee#MYGIP!7AbCgbb!y7Fg?zeWc@2R%W7IaG3FqdAi?~y%I-N{V4-p&DG3&*EJ|F&)d6S zs9-wc5s(l)<|u2j@rjU&J)Rg$tNRNLt7w8HrQd^}(Sm;`tiE(KX;&X78@5RGu%kv1%H+bOa}{+ZHi$24t=fFw1|ued7$u&l`crlgaGOJfPGq1gn*tpw_vXf=JYGW+j#j z#Lop|Mk{bCKLMRCc}#ut=~S5WCO` zy-azP!l9-PB61DUM@bVMxedzczr9Wq`I!E3O*oIg&)UjXwrxP^ChkgB9PKN1LLa@% z2K{qHxwMzU+116G+7y2fGi&%!Z`&OP?!) z-j|I;{&)_FgXsP+U3A{Lg^A|7^N7CN#Z4IbzFXXx$_DUX<74EBdY@Q5>hblgkRc?3 zLqiG3zuq;9-$u06V6STt%UObS)IR11hgJ0lE{7R^rK*Vf!0cR5iYVo^b`VRnzKbMT z%-r=Cp{JP}Ede`P}@ycI8wFA*tE@*~KYhPk*2w zWl+MeAr#%b@EY4uy^zRbT6&Ucn$`WFJ)|9l1y0_rCc_rv-&f!+R%hKrw=xaERN}sV zKeAd)aWzrWz4$bp#Th3GCLYJF9yyQwj;s17kCk=?gH~>C9#a0s$iPNqHbX`MPylR& ze7cQskzPHO#lmK+&@>bF%On_gk~WlrNYr(@EQ|3M1xP4Nis&&>mw!2vd25u(ncRsa z?#s(H{8l(u@lCT~n#sTzg>GJ|Zev}r+LaVz@2h#Eg%^cW_wuS>r{aP6zN4?a=pjET7wZYUY3PFyQ9K{=>(5jLNOTVLXQE7mY~N$ZouzW z9{=@=fFA9e{ESGD8^`?Tpr1GnGL{}k8D}s9@e)8N!s{a35MKJX&syyPxdXj=9*gD7 zt^0$`J;e4$@{*u~6y^u65=cf2#~ZY;o3J1X-6q1fNiiwXBl!5WfQg`cc!ZrHvw)}S zA*PbI>VfPGZ;b`oK!JUT1mDAP9J~=Z!<*L#v#ov?hC@;INFITaL}{xRC?e}aBE%g3 zYm2;oh{@$83EVvpN{++)ArDDT!XEChs0Cjy0RPM*U6xhC1Xc6Pkv{##i5>+z+5j*+ z3N#sK?_$V|HD$4>XL~M>FbiQ(Ql!7k%HBP58Z*HN(Yxq-#)C}&MceTH6y4CE^{Y+? zGusiQb`{w9*{+3Ivk*U{7B;3zI+CzTEJ^szDARM}fZ%UY>7Z(4{%Y@l4c}1C4`z}! zJ_K3E%qu>G`Ap9LNgV}~oGD83U#Jqvzy_8Cc`(E>@Kt1FO}wK@hMpY@Z}TWQ;JlV{ z0w&RafLPs|>608}Ys{69czeE50rh;9{R6%}3kK5H2e^<<0iP!bfIrl?u?L-`L;&G0eXAFAfWEorVeDVp3Zxs~%gTq0bC zew+q2%x=g(1Y1Ujez_OG>`&@lSzV<_7M=TVvEJl&rx~JuD16`cMLx3dO|@OrT&*j+ zh5k7RF#p6AtO3L`4w{};xpBGWJ@krKhi{fTeZC&g99x*4?xU$7BP&U+YQYFGc(KA`)1a8iaS4!<8}Bc^mT;uQB^=% zC>mZ{Zp^Cxi;Qy}l~mE^5F2OC@@6^H4n7l6{&3#H#L(=G)Fs(f&7ZgE3bR$(;x0w6 zdY#&#cddEvy?R{M4Eov0IcaWreD3cJxYthgO5cdDq+L^!x~?Wt zCH`4m^4zwF-E}^OL${UR-eCZtL-4UGyn<#f#paibO+`8GOKihRFi?TB5{SBAEI(0KPJyd1VJoI?c4s$zMPXP$ z+=Wd5n)L_}B(kT=wVcTU|I24#wjzKCu8>vxD%v-Rf1(b*sQkx7wY(5lL4p$<#p#Vq znk8lNjxT_{t+{=kXYrQTdEH1t0ZUjMFsmx3L0!zkfzDw2mN=LlRb2N>B>@Do6WnU3 zyD>8l=i2FHuFsRUU zF#P{G8`y{rn*>8W2WCtMn@1>?<(*@sxf;)Y%5NNp)^DT@v6~k#PsG4Bre4O`+dcrP zs~2u_=<*)<$;ec}G;pBHVJ$$|EpMEtAQuz0i)}1b*;|$UB?R{kCm!;IiCTpk&vcGW z1I0LST^IE~$-Axe?tRt;q3MS_w68y+e&Jv^0wgdP#IXy~BKWcNt5)aF^)#><jQg$aX3UG_#8;55&%pSLCaH zE7e~;Z!OwzAx+hkh4$buZK_^U1>ZPPNwh~lWk}#gx(dmiXLUD(<}rr_7=1BucXbSV zLz$6uWw`K)<*X9*6bBeBGHDDXz(Aa-{o*C|DgSXv*mMOh4jRxwg34P|c;?w^%}5ux z(#EOua=N0Hi^Z01riF39VFdG#D{p4^aFVXq_#&I&+nc5DSbXIa!rY|4klhWxB>UYX z>EF+K7U=(ABa^$Xp4LO-kbAg=cbnUE^kv)&q}CoI?Wig?mM%)rpdpRh%BxrgeOTAWN_Zq;%%^=t(4 z3xG>M>~}#<-pLizslM}rs$vk~BtcK^mkKpPluUh6Mhb#x;BGq;Emy+-eVw|UU%b5W zes^)uP;>S1078%`(U|jCM$?+*QUN=gRb2h90dO?#~n{ZRL$s1Ku zX$Im=+~o`C_!8!n^-Jsxbv0^GL7eB^2|$n#@`b`TeapL*7wz({LqM0q?&_xXEHL?8Jz;X0B;h=I2cvWsv zBVbfidVq;e>`z?3+EQ5km?R9%a0PievUE?^w=6os3(k5%{vov9x#3`{6qdYbB$4Gl z3kdju6aPRkgc1iQ_Uc96L5gZ&TIA~&-Y}&=q-OxvB+?Dr_c~VmXeZ3eZ_!qZqCoc| z(>@3L^52&yIa(IsLt<8Ge8Nqs@LzfpEFoR6GIJnFRj$0b{{b<74^tx}d=3*iIRBf) zjh9`EI5DDu!cl;e7{{X$K?rwPChH`lS>oreVQ*Ysq(a9gu)7S%^sx{9N2P&WS|L%U z;nU`s~0wC!2Am*Uf_CuS9%zauTjRnbTyESmeU!P#5Pepfao0WI=IPu}fE$pQ@)o z7|y_3z{;CzD{r({=rJqrR${MF_@FoiaVvhXwmIh#6Jnl88EleT!@5UQ(?c;ypL`iw zv1Tt{>XpkpDcMlP36BT!yp~;-ca^0vyDR(^2=|kiif;KjQ~R@cWRTcpPTMFwak#9B ziaTU>7MZxY$Y{6rjPRDPae>kKgBP0)`svo{!<9zQfzRAVkUH8t&@#_ziFs)yve^~$ z=}ShWKo!jL&Tcus7j|!*B)xG}SZoHm*0WwE>{`39*p0FF zakFr_xjJ}A@AN)8D{0oCa;f7!RRru`m6|A7s(_X4^N=27p9;H?AwG&Wce)R42$0F< zHZ{V*Kli;WcY*}^Vf>#qnsoYto_x6)BT-w-Z2pb;poiN+G3~Nz51#z{?k?c=TK)}g z@C(jzxirW66RRFUii>dY1Ay^TzC0v=R0&;97*#jiE=`+U`1(KKNXLm-yz?llk|cc8 z{wfIla`<~W8<7kELtZ1IN)PRrm?l0W=Mtv42K8CryCI)_Y@u7?QEIp(kMVS=Ny=2w zvJ^)?KGf7{{q*C6c9B3PyBHV7tq`hbQz0ww9B>>u`61U}%X}!8D4E6QP8^nek zDc{|PW)wV{e@E&X@y08=Pv?k9%l#D)r33qSn2 za|@s1PRCEnV230o(;+$dCGkXn1V(URrvb26zca&_T?$@O!uT1)H0yp*xJ{PoGe&_f7zWd={jRa02z}5$!QVl1n zSH3u}!gTz|LnF|*v#^x^(2jNi!VdUz+N#D*hD=?2^XP(bV&y}M6_9PeoqvfbcYXOr zV1Qb+w6vN#1$czSQ^4Mvxh^8`Ibl7!4e+0`Ps>30>!M7;!oD5EdDZ(FK_?r)5(dvt!M zEqw&?#$VBS24_Lm9{lZMTHNqe!x0R%M`wV_1men_qoj`AotRpJ1dIbS)~e^hcQGZ^Q;$13=*xK>nFv>ioqy{)#g`DR&qZC4~vw7gwj?FhV}IL zg!AW6SIeMC6b?(Gk7d$z(zqZITsjxIoYW|-<}0hZ#y&zu8w92c#EWXBuXpNtNZe`O zj70VaoumDYET!{|(_xjld5C&Y`NGJY@MJ|)i&cZ|DX+G{v&~r-OZh~XzUVNFq-Fwy z?=F%&y4KnI#liK*{>`oM2;T|Wfl*m=e)vUJ=X;Afxw_D1{kDPaInn+Wp4xA&LUo@~ z41OH$-Cc+?`qO{XVGfSbVa~43fBXC-KAh-F&6@$ZD{X{{8 z%S=KGOyX_i=#S4R?2U;D@DgE(7@w=^%4=#|O1TnJ(|I79&kE^hgq6)6i;%zb20p#h z$RD)SITRv1S@jVU1Mhn-&y+Y-F$xaMnt+?RM-~csO}4mV2hQF)GbWCw@$XQVxgfpy z!;w{>EAd>x@;0cKsGjQH$B`3sT`av5-s#na;o3Jskuo*V|CFf=y(=$vs zy><4Lh`XRi1Y7y!cg4WVMZfEccG(UKB}-Yx4G|!tz?rwLSPI223KHXh^@Q0>2FH0- zyzNPpNWi7*NSYOy=B%>cv#U=PScP%5QDE{!5Yht!iDZ1O_*{j1L%=mQxt2DNO)O@} zyq8-cXkp0sQy>0Mm%)u8s$TM`_?t_2LJfZNuc37Ar@sDGRUCw%vhT0;_ZkN?MZ`(z zcfb`{)<8@g+KGnBOS2DV5xk%X!1RI#TXDCjuBk=E#bS-BLcyw=Y&!&@yt?y&TuE`4 za>}VWy6At11B8~-8t?w>rQj4l#N#<>7j0Gu)2StzFQqZctqld7F|dm9lh*Ae4s5~m zi2sbg3L)m{S_f8D1vs}^#nS0o+B4MZYr(-z@6puUb)kz_WqmnU<6L#2;;9pCA@K3+ zbPc7Zhp#Qq%C1bXc^NF(nS;FFc9c#4fJHheq1BBdDsv8m6G$AS{WadD=RT;ZfAXS5 z&<^XEa@u7sq-F%{JLM2ioc`Uz``#fR#H^w3Ji=ft3S`U~Vvq=WM3CpuJ9uUytgGly zuB)Nbl&mTx$Ej2$9mT$^oU60}n%&G|G%y8jn@aU*jX#R>E2TG$5-GXC2X@Y#t}}aT zf7O^=eLIsd0Jf9J{q!|otK!+{Cu=p#KzxZcni)d5RcqPjmH@tfWD zFJ9h#%R$rD3I$AZ3~zD}&FY1|u3`nzTEFfg<~gL*{j*W*pU7 z?u~rEfH4Bpe_ZL8kHB3|oFVdZKY-mz-HHDdj1=+fd0TX&*+N^FPT-gB#fKFn#qOVP z5`;ZGBCY^nM37}tvmE^1cn6Q9`>lKokRSb-*3l@PS>8Pyok zA2#2<-Cj$02AT%yt=e_$OWsjkZ^#Cpsv=_c`<;W2tV!9Z3~&< zq4E-cVOYkz21J0Dfk>yEIQ9f8MDPGdr$$5lWR9RhFoYxqXH@Xl5hBDX>O7s~oh)<& z<_=PE!!gN;19_DnmDy!n0wXEz6rrDfUM-NBM8$LPv%#{)a+WrQ1NG8X*{_GawQ(nd zQ9%?CqZ+YoM=s(lS}4s-1rRoEq0bwspoI}Lhz{z&dPQXdYsD*-8WY zMuEgo{yn(N;6s_W1HHZ!4&XMA$=@m@0Y=}vvXc>rJFd|>ddQfqoe|Jbg zX~@O3t)QlvWMaq{14>n+EW06WXg7%S+HrnbIJyMN4_MsCL>!&uFeqV36iEd8Q|NJ( zYW5WnEdjQ3IEX)mt_(N(BJE=p@JSs9))G|00tlbg3q=Kv{z8nqy6*R{pYtdaipc{7 zmt|*UK%6-S%Gp7oE*znt*VdqSRI-QxuWNucLl6KqAY(BUNCfWm;R1aq4uSzVqevh% z;>PzYv`uXsIA%=?N&%Wh>`=HgM5VS5z(5hcX8(@Ag&@$qgo!AV*cO(5?m+tbns@Rl zH--Wy6K98Uh%72Mj-MaT`meu#<;B%xdx#v(lobo+V*?UzwuJwE6 z-#7trhEJkrR<9t6Y}zIH?T?A8Zt{2Z-M^Ntjk4x(yrEXSK-N=qm~XO^3QEJkDEZ+s<_2)W#c51%*uxt+MxMgT?T&0 z9bsk$HGrO1^dV;=BN4}Kqo))B9Bz7q<&5UNuW_u{d@pMAG7KE+ki3jtoeotDB}=A=e)Aw zMQQHZYa4;*^xThKMULErmKg+Pp|;X`47m84%%T_XRY=agxiDeIpbT&dp3N-raODz6 zP%Ty#X9KVI-2mUcFCLWVjR~@E_Kdr9?;O8J9!OyDiD#S%4M`NX(Y;ocA1F;S*{pv~ zB>J%t;dWa|W8yWTx^7wZQBETdNVUBx4bnmPEsNuh{`FHg`Y%E$^hum2_TH{yyy1WO zM0_(DeTc0v3OKZ(dWb?Ni-VrS(fzDX_}g#wV##x%K`4lGr+DB8&Qr!%;=>#yVN3Tq zIJ=DJ18UI`dA;TEw5-$%n@RefEbabz`RBUpg%`(3zJe`cC7rH;8rV9)n}YF z;;E1d4&FVp5=d3w?!Psmiwp%0bnln#(k0Jw(z44wkJ?qt!-x>#_9#~GKk+(s`NqFv zgZcZ=Y{|x^kx`6ugVaxU3}NQj*@7dHvmufMM*A3o5X%qWw6n?-dPpBI5r2_#8t;$* zSzOaXqogcdVcN=D8(RF>wC zX_EN5AY{OeArtSxE4BTB#+LqY`@y9N0{1=H7k^8@&0o2!%PXqihK1}2-bes>$l&MV z-yO=a&3zSJxQ>SDl@jFYR3Q*FQKr!tBt}$1KjOzu;WGvwuJF_<3#=^3$@QKYc~>je zWLA0m^)P%sWKz+tWU-E~!rx7yIkCEjNsQPDz1jJP7M^t;yPvll*M+yhVscf|@Uc51 ze>(#+`&#^sm){@j7T=(o87bK6Ht3824(8=5?LGfvB2FAWqM!flh)M=awk8}lOjSQP z0`!olmT$QX)L#gGr)BLCg5|4;l(*u*_Le=Zd~eH#^1*bAnDIcS=w`f)q+_|B5^P`` z2&^A^1CneiQA#^HH$m?x@GPu6eQOUCM7-ZYh>qBj15*meWmh{s|L8DTQm-;X+^{N| zHdJdfeeMS9J?u|5h4DQ?YB#LKtq+A9)zKwVqKn;OwI)*nERCn_FIcp5+ZL8cl@Wq(cBgkhzYt zUbkP7-)Pc{CBGNK@NkP9B`?*2foeT0c3+yWNxEhL#`s0-n{eUqq3(3CGPmqU5noB zHH9HUCkX-qy6Tml?ym_0OCBOa#8OV;=3f${Kh7UTIq$8IB`W?zu~QWStGgApg1u%9vJ}%2j8^doVT^ zT3p^kVgdg^RF1FTU~g}d9whinOq&KCQ9T=C)*lgIu} z4#I)(UoSg>8WheT*)Xp5jp=6(cT$=3Da4gouT)nrU0JxUkw~Wo?68?xp3ICn`zAhb zKUtb%zyJyvA$CcP#?fUDKq87Tk%A? zv+gBHBB*&CWG<(!$b3iIR9tlM@r0_-bl68WM!IdKwK8Hs#D^rr18*Q)p0-tRJYit2 zxth);rg_I;Lp{uA$g173t)QqeIQ|c^hmwA$`fR9oN=+F39b7Yw!zaZ#UEI*Mk}nWZqJ#?;aI~?w$IPb}VuJOk)V-^I?dnrnc5SQlsWDI#UVNln z82Q&RqeocmcNJv7UrCfr>1l(^6kU&(d?|hQ5uxI)OCZnGT~9D?Pf%wAWgd!CqvO); zPRg&;*sP+!d$#Vmh-HO)3nrI5?0)Jf#>qJs_0AP7(loFV8~WLoqR!M*O#GYY)!Y6d zay-(N8v!JLuB#6E&W+#6&5qYfY3;hopEO=CjWd7w@6}+`Px8g`s=^abo~!dLr8Io~qocuC}7x0H0x+hiW|e6NgRJ!~7-! z@KLZATCd!SRwr-6Z|lBEKYPe$>@rzBjF8@wnD7b;T$X6vCkRe(T@#3;sSkqi)lc0$ z+L~EJ^}Z$~ff3h#7`s z0kB7eHiif<((06ix4w<-4Hn=jh7eK2&g(`9$8s?Bh2t_dmHkfj*Od)EK)P-X=zA*cnaN-Go2(EA`1hb`X8_o!IYYjS6mhRFR{i=;wA2sYQke+#r;RQ$So!Ys}N)9}r;$PKY$^~aH9@!>uFTn}suPY2oxjrS` z^ek4h=X2n2*5L>7`-JJqf?L12MM#c%5|gaFE+XdE$ZgIenF1I0-MJ~LDxt#HN8BT` zy9y_qC9&^Pu4S+=goQlZ3EQTxxyq3;!hiL*|Cl0FgHTiaJMgSP2L~hCeMo-9sO5WW zwLg>_%u6V>Q2Zh9`EmZybs;Gh9BBTgnH$~pp(lfCJ3ZpH^wrUll6+2#fjEJHbT~sm z(rD%Nmpv$f4;i0WlmOZ{!j4X`a|BKn0243?zo5D#2#h16rk^fe@1WCAqX&y)xd>%t z;pPzDe)&zWHUM`)XIg|b^K?gq2vs$%8dR}4rhuTzWkV!(|5K?XCS~N=k;>XY$wb^8 zks)}&&Mr?%@@c-98@V=)P|T#{=UR4? zJ-B0Y2m2R)e^b@Pv#z%YUGB*D1Ol2`gK&;$#PEM%J6t&NSxwpRV| z`sx1r2S48CnA#5}mV?LMmUDxd;)qPNlGz5^HC^!O1_yh(5ijC&9BNWyD?H7LE_l_sepMLIq-b&l%7 zAdq%Yy4U)K9GnW+*45WJrQ$(FUfT&xmY=u9)ee%sD3>k75gUe$H21{+zSYBDe14g4 z<&h9;%IBWUZ3is#w=K<%!Kt$_o$ot59yOn*IstvslggsSur&E zNdXc9kXWZtt^#4*TDRUpm{&WYrhldm-dgaS()-ow@yQN#{~-Q)7fx3Y09+0i3;P)T zVVU*QiJOx#jEUeA@maf%_lTN)SI}#hC7A5LG9SX*Kr+uku!b@M0K6&sW`LTJheTN z_vC&ozzsbB@=T`VO+rX7ed_xVcTlmfg037%FT_FVlVr~&2$$o@DS+}DAMp&~?~-Vw z7Yv95X@Y!uf{2V;(SXB$8q1@yRNC7n)Xq_GlFs&@$kt z{2yoU8P&uah5OE=C$!KzB!Cnt(wm5(_bSpv4Tyq*6h%b=O+xRzNip<}fPhH(8>HJn zItUVq2#OdHm7?)*KAf}8xnJ&Gch;IU-)7dV{jPau@BKW#Ei)(sGX>n#&tk9=0_*|r zk`ElnPX&Vhd(q=ychbqi4?=wbzef!|%Eq_1w9U7qf>~}y7I8l{H!a+I6;q@eM-k{Z zHgx7vQ}V@u*lG@wYw78Z3x?AhySb$hVdz5sV}! zQ(3ebLl%w`g*P0?&mq9u%Rv(%+a8o7YcAkF7^4o~EyRsJ8-3DGfC`oR%y`{34qb_I zn<2_vH2^S%|dJ&3wKf+C{s>QF({XiI6m-`_h*Y*59O^jup~xD`X$#+Cc**>NEqr=+EYk zw6U*1eFaoQ!r{4d13`}6NSsJ2LD40POsDE!;NDBb&GFQ)+t-;-#Q)hl>ctn*LF>g7 z#8{{^arhNn(cS<9ON6|be|4b_S5G`krSP@V;1Q?%#0f!Xs15T#5~cYD?DfjZJN+XK)z1CZ61pr}m;v4uGJ z^SF9W)xB1JCZF*WuP`NUk0uavj0zp^c0?JUdk@j3*R1;+URS;*Sd~QUT|<>SHL;jog*Rj{rdR|X;3G7Qu*}B zx`pj_07)P~xTqvE6`&*GhGLmVoh-*`OHfFk2D0ML&D-v^cbO1MHOI&o6lNp;eSHDe z&!;hM8-{G`$q3f7HS8YO1Qo}&AptYdpaKBnOl7txf?f+(btBIaEzjQo_>^aoHadNN1%W}HJk@#)lrx_JOelcd zunzXFp+bAMDWHh%5!<`|^Sw0HXKxz3ASfJgwN^P$OJu?2aOIQMX>xwk5wcN%2*vHG zBL=Jj%uoGc0XOy#dVq9r8x89D7Xr~HUP|=n@s6=;6sukY5%onfn6!>^H|Y~5fi&>b zg+PJO59A6nG)7c*lK96O#?4 zf{ikYklmMgljrL9Y9Bx_yU76rRr(m(pHW(2(twUN0NKaFQ2G(K?^FXYA#LtxP6p}Q zugzU)J^h_{Is~gnPt6QEOl?O+f4{QuhRMxN`Z+>9?3mEl5Dg-sthC^>z1-zrWDFS*Fkb>bbU`#{Plo#XN$2H4Q793FraqXHZXB$XGoV zIFA5-R4pG-@2n&sbEYFAfxPiV&wPZIHvs`>6_+4N%bx*`*=TGBf4E!y;57yQJ$Y%5 zdLCRo7De{{0=NY=a9gz{7i2>Sol&d$`X`@rP`PWtMc~(i11YX5FZMw(t{M@4J{r z8K+tKO|<*N;?T$-y=D35OdIdi=R$4AcS$a3(a4|%u5$ofyP12UiEXtB&QLbR8?JQn zN1*wvjrmNPWF1~7B7r7FZGcUgK-81DurMGlrRTkdWG8i2|7biFGWglSl*q}#Ut{Ws zW260m9I3!G7fiD{2QNBcjfKq22q0VNbCaN!E7oR)$IZ@+Kz7XwLwBLi&ycPdk=SPC z!xyUV{>jpf6W<2R^_uG1l)o*ShLXC?BQErWxvWscV_uL{7y$*>LNWu`duXNY%)D>LVs~NGt);l@7+6#>I8IPzao4CC^3FX5;5XvLGm}nKz)a`YHNHKDBGBUI_sD9 zS=0z$(4^y-L%qD6R0B*|@rj68MImXlJ|%w^<`4G9e1!Z-3z<* z8orn+X8{JHs+S#Jzv~==Ob={72ioeLUO3e<|%?n(;b@sR^JE1omG0oD&djrM6op4{x7GrxE zxE-EXn5UyomvriFx5#VD?8weUfoK5)kFn)lGo|PWDU#!pGȰ`3*)qZ`T6COLe! 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 z

    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

    =Thqpv#xKRr(7kw_45@LK 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

    KxBue1vW6Ry!n2S?LU{Rgf){VjtF@`j-9 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%0DobhIh-jx5_8RHAN?5~ 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 z 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%0AUKice5!Bt?Y^o<>d&%vf(!M5{E$J5Bkx13Um^W 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∓8W!LALX(%}Q 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 z z^x&H^FX;zUw znIu}%_WngX-}S+5uQZQvdX^~c4`AaJs#1nUzq(HAu8f8#qxcd3BU_9%=Id;|_2u=> zonR}bX~X8v3sap>Ra$coSqt@3LB_mx>w}H`AqJ%pf7h(p2EP2yO3>~IWXkOMKL$^K zQ<6ba%6cWJw3ww_BfzKo{ zrOeIn={-Q%QJuHmGN$4@DG?n6Kl>d80W{-TXqQ=(p9B`q;zm<=O37$LKd`e*S)MGK zDzQ6U|;n~DB+ZB5`;C+%EzZtrXtmg}A*4l&VOu-UF;p}%XI~?RUI~|7vE8Atf z9N}nPKM1w(o}1dd=mO?3nM+^_Vj9q4!he6WTR*Zx!b12hgU_UyOJLfoCtw@L@Gx`r z`>7+V>f_|L;66@#u060)vJm(3sds9Ph6)i3foyFcDWPSGzRgGusGw5|+#`Yc5KmZ9 z7B-owUyt3@AILZ>cbgrJLjfoOMHt_q-S6Ghb7YBx@ihm7H-ha1__+$4+7-+^D>3d| zylS#Cwg;2X1p8Q77Q(n0g1l?Zcnd-@%vHQuh}%!SE6D~|SxWFx^pGnU4Q9M6M!Hi` z!BhLRqA}6Y`<7ThgbR+}teZ$mfa8=ZT?1o!ecPXs8l?_b8oWUtG)$)K&&}-QDxi%N z?*hojQbcA74vvSc`5_jVgEw5k6C6X^vBI1-lr6X#3JSa$jE9;PUVtbqmO_Vw1*=_2 z>zDJ+BxH>__yRn5q8WJ~jq4oc!-6u@<)eEPCHG+PFbQLLoPqs@bR&V ziWb4~$%6->r&vc)Sqk(7Io+)Ui$6R*w=QfNtAr8>z zQYayyU}rIMP?*a(3XjHA)4)HOxGCNVl&nfq7}qO727?f$1nF<7a>*6tT;ue-!n+=< zS(<_-?NbhYiYg*25TvNX=fR^>hENC^Mp0CSKrc0evmo{^QKgMsjSs?#2rAQ@a%8PC zw_*(gh0RzXW{?d+@uu82jhdp=njbd+85#9 z-dLr{J3OvQ(`a17%JJ^po9q@|w4zD#6Hc8RU)EHt!DMhyi5x}ATA)ehw?sHVCV`*H z={h{c0ywsdu9TCt=I8 z<{n+UjHMCO*&7NC9P;T%@1vwb$DgMoeSJ`N`^%>;FtclQtW+#gz>em6*doH2iHO;b z^3FP^Wh75#%2vPugBff3{JrlI6_bAoQ}6vs=yiOhC%#|;B&Y6I=CdwEmmSEr>EI_{u#uCGgrc61kHZ%gm`}~OIM^jY zQ2ZKH5lADnc0Lb0`4co#%q-?&InPp7`dh#&MoYQz}JHagbc$Z zgnKCnMO~!98;m(YRTi_pmaFkTAG^H4)y%m)V#CU*oAIJ@T6w+$! zds0^h#8H&bM7F)oysmoCOGL>1elr=sr440O!i|u~MQltF@+Ek%1&ldNZp&TyCem$* z&EjT`#pf^Ro2Y5!yE_BK6AHIjaWhsbY1~`*X?biKcrXXN z4qkr`zwd$z!eK{^C44H4tSG*xcXgT^??pF1J^#Gw6b^}l>h&KD(M{;6m^3A z;M{Jc5vt1r%mKSmIOG}W6|Y=$!4(MNIe6Y5_kxwY1VLFOUDe9<7A1M*bFio&ba4}S zmz-U?RGW=dTyX&lK;gFLfh8$=^CKW+1k*YM-qV3hZ^EU5`AdX5=oYQdse_MC5C0wl z>ql-PjiQRACrm5l2aUD4dG0MMcMC+}<;XckA|jzVTq8Q}G$cu3TKQ>CuZf=59Zo5- zr4OA9oIQW%`vJ_iDDZ@}ihQ>SnT)#4LZ2a2$pPXc>u`z}i?BH5@$26AJ-w1VLD>`l z+TBF*6xPQo-X!e#%}A>20eWhb@|?jBR>WRcXmpWXkCdZ)mzIYtJoGNYA5I63;19P_@>$p>t{2B4qE=i9@$N`XpyjqcGK4G`i(F9QOjT ze7Yn6d`CtNffrHJ<0?U;sx9HNDJfQlc%tMjyXQHV1kNwX74-h{{h;eRjK@<2!`nL> z1Hg-1xI*+erbXes4z3&&zTP~DPQJeK_r;AaWx1Muhuf??t<)Ry4*QkLr?*M2}Gc>*)bX=u!hE$Yy82jtqr@ozF z-^f*jUB%-m9>(sGCPg`6;*B%o-ZO_UUT_uj-QcH=`pMyWsmevtN_ zkV z?46!#Be`kQi*!i_b!eAa1#Ic|cG^C;xcpPAplDC(y*E|ZinEvZ8WDasbG?{h!z z$Ooq-6Ik4B*mN(%Xu}jaBM>m41ITHr2v&{he#o35kyTf1?XC!V?OUMl(YlDYH)Rx= z1)iiI4}PhWt5=zk;XS(AE+Rd*(}CHo?9wu=`7sIt>PcIPY)3!Su2lNc^syncz{h&Q zKHP4{#;Fp?-qN+b)wiZ&Unph#hq{!mxhi+(AJ!57=8A*|-eBiq2U(Y9Z%{kk&d@b! z3ODolq&mK8L;vbsf>V3`+*)kHp3JZEXfXJDsBw$!?&Zv%7L+~1aJE~+nzs--qbP~` z&`2k@3TJ9!9Z(!Y@IL!>PGRp{7s>i3_)$f&uhotsTDCVWvf6`b0SsEHF$$&6l`EwV z2%;X_?QPYCwWjVsDWfQc-eod7mpr+n;l%132-e8JE5`CzplvX4+QcU(rpD3s8?icA zBeSe#&24@!ihCwR2{WGsp{`zf1mW~(*-X_C|t`u!Ni%G>w|wE-xEDkfP@s1M@3P*Ua{Gl z!ujuj>K;VQOdY*I#>PCQ&lHu*XF}su4ro+sxp;cw=PDq>Mc-%Sw(y&}&`2;_66@#& zob>1b-dFkrSZ&wlb?!*X$?GIqR%dKqQ5w+jr@u`Nzw~4(f>8KLub*A_;K~c3|_`2_oL)G&}rp-bUkg~i| zMei~T?t|>aO;*)}l;ccHU6{X6f&BHm=0MS^!LyX2(xSMUjWlE0_}HkDe(T#~8=G$C z`X|?#>M1;oDSPG7`O!4@n3I1Uu$oVskn|F?pDeo0G_j;T46+|wn-G= zIc18Ybuf$-)CVq9)l!NY;3Aj2SH($UA7uQj+A)Q-F5{#|-Zz8ku^;9Y!BG{}t zaf&{?NK7{KAtaKvG1`o%w&wAQQ&HJh|H^n{KxK=+Xb zqi017Lg~9Amx>3%uGlETjitUGaj^Yfwx4esvtAv|hDMccbv*v+y%_$8>b|drz4T{!g@|Ipbu>gC%nlWgU#Y?Kw zBH9U@%nuar-@5&5RI;y|Ly8ERSbt=Rpx`+L$wsBrpSH^A{%G3iA;JrCFtvziIt0vH*IqCzn%j16Nx3{;sCsi=>^9F(T}>C{>9xQU8&i~Oqh@ioNx)WI3|5ju#~11g zpD|Te%iPVI&-e@&v|8a@7?({BNNgDE?J!SM>aT@t>b*{C?G{O2%ez`#i7r&zvpMzp zVxNmX9Xg}4C+Qb8x4gaoBpi1OEHcSyo(=67wakmyYt)M$Q(KqP%cH}^#Kqp!6S?k~ zRW2vbr4xNSk~24?&*E!9z{!=8&mhdO^w+)%J)2n+!?|w6ZMLRGLUW7hF$Z@qDEU{) zo_@FQzU_FinPHV!#7Hyh)T^x|r?lkK&i`k8TACDgz^cfzf6N%21nluj@m#r=Q?I$< zUNhNtxL$96w@yztper3Lq8%{S;SfZ--RgWbQtR7+#f$X*pm7P^Bop@D=Ws}8Hv4-- z-?{JhzDvi7^fT(!yYXVef~3G`XSbG`hmPOK=rs{&vH`nD+viq?8W?=7bcT{mID~tv zf2@9_uA|zwtwpquBCLhopanE^6hT6^_h@GL95b6iN7&Z)>bATg2j~?$hIS2Q^#)X| zHU`da7vfSli@uY|Xg*zr=eg?pH6_2h6!pxQz09GpI>6|p5Ysb|6J#nc_k4uW_(z|s zes%dhK@M@)!j}xA$iLK#KP4t<1y}saIk^3%ZAORG2P}>rR5e?H=saVEJJDE0N%>TdpHglOnBS8+doh8ddD88mzw9(XiZQt zbZ5QJxVl*HGv|38z2m8IOZU1}omuM*>8ju60fTO;wERT9{*hg~djbz8i_%^X>Z}zS zd0xkr{F7mnU!}%CloR(m%pOC_;uxa8v&Dx@#@w=89-#T_a_ga|b!t-$yK&s&lv$M< zEB+?&2C83-yY+F=45$0L#ZjK?36JNR{Ht1SKKwAbA#z)Pkew=;m?+fD)e~#oOx}=B zcdgWRsAA&g`CLI~$t9j^sr#}yQ-HChWJiwJXD?^gZW1R) zV2fBNc&vSCJ0J4v0;;WfR85@Rd^(?t3Q8x-rMp2KaFYPPb4$FPbnP1>+j*`dvmgF~ zCiW&3N{E7A4#=5?98;1sJBIR#L&->A@h-q4!tvgAAy#XM=uo0)j3(9zz}SreRgb*S zIb@?t$z_C#Cn~8zaaYREo7J80a2c?Rq~^}o{>`Z@EXFtti}$p5iij>EK(wBiyJ_5Uz;rxE@ zGO>srLiWcvL^pdBK!n>^K0`4D+LZQoHhNkn?(f9L4U5lh24;-`2FJLtLZC8)lAc%G zx_o2b&7QN`UjJ5}iyasUuM%J*glDo0+tZ-TWL2>7Re1!r9+qDoS9GyRyqDCHI19XN zg`cU*2?8>c)V)rwLl@16o!K7QMBcjDng&_s;7#$vu6#e6Y|c$_6nIzA+*&-P%!k}5 zVIV3T&mQ?>fANHXI4q8pWS*jn*SnU<&wAGgVLgeO%kaKTc5lRA6E(>Dbz&zet+3rC zgNOp#6kWugA;$hSFwdmtVs9}jw*%M4g5VUQDd0Zw831LFNY-n{kU1A=t=YYFh&GVz~|%B=p<{Qz4l39j6d8V##ap zY2=_CyX&5Hv^zf+d*actrGOn7{?WaZ-QFS3RoFU|zneJHghvOLioclx-VAD?)Ojyw zq!EvPF>CxM)M-DSQs^oOA>Pg9W_qQ=%C1l|TpP_dxejo$cFgAl&v|E)(cCI*3Em$4 zF(?%gX{H$^SX{wD5> zlFRQ`F0_doK8n6f=Y);~1MX`SnD^>14#9In1vO58>A*G;(z-(U??XTa^8#DCI=f~d zmY$a=?L+UqW$+0|tnkR_7bslK@nd^yyWff8s#=9!HGN^ZnW&x1g{_-IB|yRWDWRYl z`8rN~<>RC72t>tZaq7qeU+Hi@Q(%I9biP8cW6R0ca0E^Qe<0y;BwAswSJSKoXK7+5 z7MipyT7YfHAlwKPU(HN^G`SG+R|Z4^VTmh_*4I5xF*|)cpH1bH1lIQy zEw~fyZd%TaV=qSp5Vm0kR|Khe>f9rt&I5aSfkG0Xe85q8>2g|`cqFQ?7Zf4OfZwxM ziX|;|S97vs$6gYVL~V})uxCFZHN~!in21n*yCAutAWFR6A}sK`7_y&m=Uz^Vly66Z!E;Z@fe6SP%o^Y>&rT}tL_Sl? z-XcYk^~G7-Ti548*KMB^Fhy5B<@+!xJ)|tL58y)Hlrh3A#9!OT?QLQ~-a=Z>t-YH_ zLeMLozSy#QsROt(vpxe9CIYBGzbrGFbN3Tnf2fN6K4F=Jd)qiUMi8~(Ox`!+8s!RxOg^f zEnr%o^;Cc^V$S_7LvFpS^c`?<6(T}`V0>E&cycy9bZ>iuoUb)hpWppSAwwsZw{5ndtc5xj0_Ga4B=6*@S$WK2k_T z=Otzty%fi@9W&S>->IDNhS>*2(POQd5v~fZ%|cdr)_O>x8}Zg2|4hmwL34Mdz_{jC z_4AkG{u#PRK1+yz2f+gb)tMImX}^8gIV*~o-J6O&Ny*~VOePwhUZ#uFl)GQ9xQe#C z%dXe;ixHmz-=N1E=ahFsym-s1j-9VwWKK^>=St@i3k!=w1 zwv$4w*Lzik=acD(jYmwk5h`G%SzG6NsQ>{}j&^4Sz{|E-4JF>3^v7Ge> zSb-4Hd2o*RIaaLmAy=#be9C10tzVt3vr!ND_{`~!uZm;;lt_AGWv|i)!T8%^($47J z^ZQ_^Vr2#2pQV2n5n7F+q1^b4WqK|Ht(P>4SzGm$$rjN2(*PeHN=Y zy?g6?CUwrWh?B{RfNyt02}{t_=K5zmHV25whDrg*6sK>gdkyY!A_ z0Ar}Q9UcS8Z$IP;H2`ihpKRcSUzfb6kBT^$f_V005fk~kJZo>wbpE*JL)+}nzPqeX zSz0^=!a$UFg<5yYke{pM=z%0jjZj{N_ladc8?5tO1yL7X7jy9ZkxaL@K$Q1R)wLgc zT~R)Cg>q@x8g>nP;Z0YO95uH*?|3JXuTh3lM&DI1k&Ox}-sM(&4MbNzH2(PHPIfX& zZyb@OUWW;Zf=5a=d%yqK$jPcjp^Hb}6gMNz4^9@iqNGp0|4_Br2YHch10zA=L|n8N zb7G?m>1rr;PtUqnj()#I{v+vE#E-@mX{K$NIAl&a!&T7HE53+8A|Hs?KtAlcnrzc4 zI9`VK!}sNpkPE+H?Ms)gkWGqu00J>Q;`o1!Y(Za=*k0V6z75z3aCqP+AInGlECPeb zhin&bi&KX01{yP9qz8x!CDdz8!AbG{y#(&If#t^KT_T1m6PPYw!&A!9De{ehb77_X z4Kx44AX&irIOPGSpE#+3utC{M{Od~@kRYY_7$v`epd&2AdkEPNUy36g5k6}GHsrg` z)6|fZj0ZLQ_#?CjuKeZ%VE-IEc=`Dn#UAFou+*Aex6Rh`;Lkk(m zC+dKLA3!5aC!H%?S^q_`@juKR3%~}zY=^LUk})JXT=o^QYe}WofsU5O-oI3A%k<5~ z!zJ01#qC=Y@fq18Y5Y?Mg9d*?ByjcuZ0$?;%oIL63+^<9b0!a7aTNe8<@04?cg`N4 zi51m}9Xv*H@dE(oDRzZ?$pntvKc({EzZ|gNGnox{PJe0P1+0<0;4yi+>D*de)_|5c z4I=h_s<*h5Jgsb=p{Qja7ttHoC04ZvZelOib%+m!CG53w}w7dq4% z>GxCzE9?`3<7i*a{Z6>GY8dXc{A{zY=$#g4JmN0-YiXz5u-o25_R6m@5~d?3f$`|t z@(t(S=k5DL9UiOBgjvGz07ztaZA-BwDC() zef|-(>~s2u?YEn3%EW&!9`SiO_w-@Frj!q8) zXrTf0wa#HnZ(*jXqjU|2J+a3Uy>%>Ko&eyiwxaXN zajd%_@9pzr=bqZ;1s!k*uOD8k?o+~W-lkXUubl3A_JU_lI^55oP+Va1llJ@|wWE3Pjdb^Q7xw%4T?X6(U#ZtI^|g|9 zi<||Pq3Ozj+RRwJrax3FeMmwJLcJlG9>^?>ea_gYb+rH)__F1L-=&Ve< zYL04D#8HG9FXe2uF;)CR(0%Ai!QP&p7HN#4pgFE33U(`T(C9xgBGhP>*wt>^9ZoTo z7+(~MH!&^;QM5bL;$H(@XqFtTEN{LQ78kA7F6QCxaLvq|>lOQ$<0CBjvgUcLNj(S+ zeAuEDHW#zEuyljSaa7&k;E{3ArhW@O25wE1ztKGV0o6EJ`R7_wOi+aY^@f717%+xx zFYUK;U917xRd#f-k#pAuaKt3Oxu~I+>i-7lJFXy)uIsWnA6A=&AmE^^cn6D^g0;5t zh3Q2LvPn!pMud@Z{DQB!sj(<_gsdnCW#GqBc)?;5Y?9cRcJc~iW=G{o@%C=HEv@Xw&r`}51kmrNcvEcQkpM8 zy5N>E4pm&s>NgM>7jAbn!C~F%LWj_+!7}cI_GUhX>Y-eAy z$RTf9DY6NsUe2Zil5w@#I=Y6IB+IP8{cgSTd7}%Iogrh1jUwVYgBK$R7j65j^~z9` zdMVm0RB9v|ms!RGw43Tnz=BbJR>!Q^Y#*h>PD<0f9lwnL&~!&#dsipQ6oXiu zxXf|5-V?$WXXaBZr-G*6DTTmXYfzcFWQBAx(h1S2dWj@bb8jDCmYP7eXD87=kkB8j z_^pz%v()gehi3sT$%^9pCQrR-49&4#W!b$KrFc~m+Xj`7X-TL*ez#=l@G$$y(<6+Z zq+L;q#@-F_^k+enuUGiZ!@If-<2mpTTc2W0B=EgwZi(=hWy(CJ(9D~sxM^VqKe`~g zr{1cZxLl{6*W9J|mVkEmj7JyZU_Nc5cOV^K%yVjN_q|rjOchaEf3{s#GMTx!8?3Rk zcI_1qTfoQ)s&Twn_(d~C97#lA_2y=&lZ%u1uGf+*9Ku+<_VRA*QIanU)mnAdgF z>gL`yMoSAQoy$BWRdH9^j$x6$sirYlGP4Mj+D+ zZzuL_r#x{u>)82R`rao3rhW;a+U7y?lf<$5WY4w$bHbNCa7wc|UZBHXmEy%P*0||h z;dkhhI;L$3ai zw$(q|ufJ}aSYhwzTM>rl-lvKZYS)RWhf3A$!o;{JsbpgfAM=sXji0aSPZIAi^7!=L zb@{wxk9hXN;-)OuvE6xFM~pQ@TZDv#5!8plXILAqK&E25#bqiQ%wxA(v8Qum0}ko= zU4Cd+xfi#^2C`&eH?2FlXt%Mw&SG?qze$6ds~jhI_awN;E=u`IP`Q59D{52kloQ=0 zK-SXTLvMm&258op6Mr5T$^9%1Jt}sYax}BBK1%kMNPlw}dwV5qgKIKk$9<59NAv$UXH-))FF#xG1vr|^$Q-wR=ZtaHK^q!A!Hu%)g)aJwH z#B#BQYU9}LG}>*;;#tuB@$E3fGYWXKGK-o`bg4`$g033@Eeq&2B1>^%KExIQ$l=>O zs5y(`(J#XX3ytxzpBi1U-4KUwQ=k7xRtSi(hS1|$7rU&t3XMj1x1$jxL?=EPPYZyZ zJlt&^1r1!)?Vfi6pMK)t+~k3Yr+6PaL^wqk3(O*9dJ!y|=VN<2p=}2b>3PER8{cWz z*e4IhA@N*ox=WGL<^h`PA0Cwq4M8f6dKKHaR{OA^+S~}ANgkwJpx{K;N=8^lLBo86 zuHTA}U5vGIR&%UBNpsxx}*A$4~weFsHQKRq)K4Eb@K7X zCknf(aboF>ux@km%7aIHE2wN)Y$!!r3Ul`q$)izBs={gXu8C14Yg>9kw!n}mbQ*@X zbig9Li|ZqVc)H-@w@?=+_?x+5>H;sqmu`~8i?&5LsQY^mAdXw3PdCSwN@)yRq4(P$ zABY-_1UDHFkX(Bdj8BJ{LKV+<1=tE*U5#jMaE+-UDw{v;L}%y2Jo9r%W3TKo1dic! zd<4}luO`BtA}6Lb?dYV25E|zU9qiN!eMA371tTdj*BI-(RSl(O)Vcb2yKZBULeJ|` zYlB%|Yb)JUJW}9@hPu^zQWNiqSyOW4;t!L22!@p1z-D{#9c0hA-OdX@{ z9cdd0e{)>BO0Xb<(kXELDoRxt!h%ujG*Fn|I=k6f%_=Sy>DCkLgK(pFX~<2t8n|(u zOkax8jH5y3JJ;IN6YAkE`c^(9sOcb_UBtsCJAwn+J6RI;0HJF1c^~>s8py(0k z_nyY4`&Jj9G+w;_L4TZg=@*6Y&C1AzZvuf9Y=X6=I8g?eKOWNimdq`?ZS*YD=!iO;ve@zJ!O;bpOck5dJ?BU3ZdfQu;zb;Ctc?bs0@` z#30?qR0G=eMo0t4U`dVDfX+3V zGlZ%qC%J`HX`_|8_)d#4m_xtG?y2WcBYvsLU>%K3k*xA@oRum# zF@J`VTN7We2CB2bTV1s?WTi^_KCP>CdqS^bzT8i}wX*G$_rrvyF5Ts-U19UTZ0g}t zP?@t(v0~84wZ=1#_eLHG2}aYZU^=yQHwpU6yf`fROF$mnVT^AfkD?l_%$uf|R!lmT zo^R$J_aF`$HIr}KBXlAtBuJ-zMxfgiSGQiKZA$&RwFbmXmx$e~>!mUN2zBynbCN}! z;%>!*qXfsM@lOl!PC`|^b9i;ASp}$95B=0@YLEukI77>>6c}*(-8x7&&*ynEIDTzi z?PV0~o-$Wq`KC4<8y1W(T$%Tmm!VDD>Hj6SqYK9-TkPAd84zqbbulCkdd#0risOm= zyY)hOC;aIvs(4~p|GiwPeIV)U{yJG<#Iw{`6ANq?c zH4TS6cj)0XL#Z0wQ|&!VC5P55y{#*@32$74W`s#5ak*7}vaBQUmN2=*cS`3>(^*fZ zeK@PN4bi#&&|SzL_MQ|H4Nq=<53^IYd28UmaO155bNaS>dO;c1nV)+B=5fH264QDeR(fc`^>ao)H7sRI z;^2DocDuqvK^cVu`E788jl?5YOcSPmc$~H@1#0y7eXBxvN;M=4a;Qw#zE!)%U1~8n z#OS-&-yVvw(Tdh{UH8|dMRCL32Qf=;5u2`1iq=&YJwX~1W$PAn?yR++Mn11x4hP{E zxLH_#rLcal<`)~7wVD<7v-UfMAtN5gHy5|WYVE)@y??`cX4G)S$*v+kLKl(hfL z-&QAzPK9x!qyaH0TnpB@$y%SpT{<^LXTw?){PL*ugsbycKrhNhuigJ zv)}Bc_FMcg$3tzvWbO}$laJK+j*cFZxew=Z7lK`-|HRoy>{V>5F18c?@1O{X;~?2@ z_w_GQ#Rhk2FxR*xU|jQs+0)Qlw_FcVvDYi3{1>!6!)$cH9nK5Z`r$j1tKkLq!5cSl zDTXEJ#!o$U>mvNyzYXL?0Um1tT?RY~bhKV=!jow`rl)aZ$oNLM+YhtRXlc!ohmU(W z=`d623IFZ`p@7)&%LV72z)+8UF<-$Mz~~8 zwJ)rI@~iF)DL*|IN-cm|TWCoOEUr`%yqfC=wv*CV7{@io9~?oaM1iyH9J(9ix8h3H z00pjDYjoViKs{1)G!!ojWuQWEr)(oWA(6WzA7$;5AZI^c zk=NbufbfvtoPL`w7wtSdZ0f5&yj5@E!QN6}_ zL==2vt1fdDG(;TrW*xg^{oIjgOJOt{18?*ASkA$Ql(`sB4ju&GOi4 z{oa6@lp_lR+A@-}lk-)YnfQeT0sl4Xg+B||R$6~L7BUhDgIrU*jT8BDo+A%>qsOW( zxRVBO|KeB+h5Y(tzx$=ss*qi~sBTsbeeV-y@0w2(WzZf@I!%+8E>hy4QE)wGMD8z7 zZIRwmaqml9GMZ*`scBXhz!xXW$C({ZagnKy1iK0LPku@HW$Bm79r)G`Gw}~z4lVkk z;xwk57qnTGL8DiwsJV)_MQ*)+tD=Bx*`>pdUicZJ+ zKc_TF_#DTQEs5_;c#Gacsp^D7&(d=&B@^)uog#9^P(zw1)DVlO71449)!t;)ZtVoxqdF)Dyk zJw|gPEDFEbR8q%EsCDw&hQ{ADrl-$3Ba7b3ir?^EFu~RgWm1>jQw<`y>teZ=q-tDO zA6uT{LfJf8xm`u(`S3#}hFtDR7oK%QuT-^^J1;LT`aCcim_SL_GQJJl*TAOD@TSQggmLgPtrq=8$d?`aqgcu$AWA=`%zYD;u}a3r6*i zX^Dj0^R{dcfHQg~pPgd2;lelW$)v!bxA-#sVP`q~rX|j!Oo>r7iMg(4RgqPZ!_8~o z@FWPZuaxK&r3qoq%sRSdSM&BSjaGSig$IR)ccOpbb6 zwW_i(tD29U?QRe^kf?5t(2UmDGQkVC_kDsOU(%Y?|_QbqAdxqL@>n6MRg^%?%?>PmxI|Eu4w z#;zE)3h*%K*g8Wa;H9u`80WPL`f{zLZyTFEXaDn(&sEgZb30x?FIv$^SwHkDP>BUvcYwup5r zZt>s|!}jKza8in>-15wKKN$D*|3!!3s0^Jym077|(`zl`%;y;>ZhwOMr05mled*iP*h z^^H}y*YT*8HQVU{lT=~MKiK8%Lc-*^k(G6t{+8|RdYG}Ov%96Dpr!+r7-$&+Un^hf z(u0E+uJ-&YLL(iV)k7iLluv0+KR zz-Mwsb90*XP@(~-8!QQ}mVVRS#1=)DvBcy|5u5G84lR{>IKsQc7SsBQbbUT894rf| zKe9~1cXYIWhW&Wu-v`o?#4g0YM?!28^>JlvG2R>gff*=c88^#|B}YS)g{ZQWSH4&y zdL~y6?itnM*IEys^GJvh%Q{W}^^0&GtniFU&&)Aeu}E_TdL90i%U%mu2!VmP=`@Ek zi@0Yt$g21tx@eJkMihdNM{XTyGd4T1&_8BDFVdWYtM|FE-h!KfW=D$K4`7|^{J>OR zC+%0m9ab;R#KIf?bASIbs6{4@@uigl6SZ=lK}N&{3?Q@j6nhCdQwEIKTg2=e3Fgn$ zP2CWCV_YSj5qGeHT%290UPpP);?2ruP4=@w9nBMv>)Zy(q!bASBfxkMim2AcqU?lv z-_i&H?qE$$R0O}OB5yZsTC)S_|4wo3F6{06qgmn#^(zg$M0>mQj(yH`d52Q0SWKy~ z{KRkeqA<>UV0N$%w#xmuz{+_rpDmW*N*hJ3X0C%bpRtbfHL-S#4pXL}&~0a53oczR zIS3U&g4AtvVajiuCP*3IX5cXPDVI2_@^R7a*^xFc^&R3!)A^!K%)i4Nye6xQnPF2# zKYQhcN781$(@j4)%&{)2J1RWF)AiLYk{7AJOUB=jD-B}6Qmt^PwYCV zK_1!r2%9PTLbW>srrijj_e^P%R+Tjdp4$3!C%!YpDgxwpbDUVgcjh#$fWO#)N5E0#HS zJ}ur_`gJHu9)#b`TQr1q>?JL&D;KtrZWfe<#2D#~N(YPcfm&9VaHHg-pz3>wXqg2W z|I)u5cdJhA9sh64GE?K!Q1&q7e}7?_^2_h;wuGC1S`d`^!9GIjb$e0ubvf2>qd<2@ z>$}YuCVyp;onjxNR_*-Bor}YslC3m)B#sVj`P}w<==ZVluPdv3RBf7SA!@^pY2le~^p@GUJZWB#0s+P%`kH@E|cAw-iRbc!B;b zgH09?a@y6yd8|Lx=~QQU!pFZa%!!S0Q=qiC<$F(95TxR_i<>k^Ot zV>^9o3x1ft@>V9!;gji*(9&*%Hp<^_$FZ)7z`ium+0CA1`Wg0bmaVL z+E>GKGPJ6WhUhAwZc)(Bw!GuB|HE=@@EXu^g7yYLkJN$F+Fx`UE07Oj1g6Xc^3d2D zDx1JBB6752RNY1^C>1~Nx+>NV=|&%8{XmO}QGW)Gem=A`r~(<=TuP zQ*X1q#VS(i$V54HpODb7bQlM1?FNVeVPuaadw}CR5yT3br_JbDHJ~Ov5MfrMo!Y`rv;c8 zUpnmpoxp^E{*3Cs@0X=wubDlM*U zX88LnYe#`;uaIiYaoZgZT%zIk^6Yj)NY+rZ;0)g`z#bE7xiCTddWq3sq#*;jxf!q_ zs1^;i<7n|C8uB!q%E%z{I1mG$d#H`;-bykUEN--rpnSs7q(B1a{2cIqSe>ba3CTG=a!#Ac*_sjAvVEsOdCwS;q0}y z|HR24CXe~1hX#nFLT?<@)NPV3Zb^I0KU@a`Yc5$$RWP?gD6=g5Qa1XHACSu?j?qlM zMwo_AP6*l9s3Wi645Q*a{?FzSC+nllS8sY30KeBkAB5n!B&R2UNt3Eae~yx{jrIjd z=e#2c6oHRtX34X*z445x^KYmei_P2cGJkJykiKBRt7ZsuDu2^9+ZTp)<^p0$G~)uB z=m)_Un|V(hp-rflA)nxeZIywRTnztGshG zpKhxd`rwoX&d{O;x0osEsPc%!#2MpcY&u5{(y?jOR!aUO`Y1#^uS)+tRyX}CbFKD+ zQw3pGW2M*B$zRz_u!y{iv~Ho3E!39F!Yy6?c`75qkJ=*vr6yaG~gOJ=FPk6yMz2%HQ8;`~^2(k~mM7<6= z2-ayPMKNHtJClCnG2^Q$x8$KUlVGd*m3dG^!7;4kVoT2<6&vrI66C%+)%r#WLVfg9qw2+X=Dx6wO3_G`xm=PFNl4tUETZ8ZuJ- zxmXJaFK?eVS{>cFTg3U>-ddw7-E+az5em8h>!*P0RuZ>K2!*G?v*<-QsLgj4-k7$9 z?`EXXeH>@uPx-|3@f=O}NJR05zq`%s6sLI{?aEj$WD80rvvi_*R!ghR$7rfrLs7AD-HU+%ggxgu=N+JC z8Wl=-B#GZh8>TaDm!Rg;8a&WKvFo8<(13$9&>@TQVg?)G+7*s6Huuz3L{*tW{PPu; zhFZnj*S6txwl3XBajg*q3yp%f)XqG*A++tMnJYDUZ@H8=PiPyDF>X92+LhAlSq*3T zNya{>#tCy71XmyAEfdKdTPdnIMmHOKFvEiI##&iG`_5t=-UE&b33lNmrw002TFICQ zlpShV#-Y54%b9hu8cwkt7TF-T75&%dL7DL-;2k~qbi;{y;mbZp6l(Fo=a{5VCZiJj^$A))lsTcU)>oP~FU+B<`9BU}y#(>F^ zFkyYL_GiMZDXx{WP)yDx#+c7yz8s@XKuAM0lc{60DK^$hf9k*+!kZ*`>s0&>k&j;^ ztpQ@E+-sivcHrpl4}QE#Mr@>52+I+CoWk1NO2B z%|*p(4M=)@&2rYvv6`|40`_*ZIq3BR&M#i zKVKyZLouk68bZ42%rZui)vPV~PuDqj;+Myp{gat5iWp(`*PYkUbuG=v){fT@@&p~K z5t(ilCAOYMd9+|U)7CeuuDG&)breK0pV4eYr@$-pxDxx2_ZxZ7=u{D|p_M>qJnM)@XE==c*th^@DTX_*h9WAz({=RL1=WBVgCZ@v=6KC=D+K44X|nX5 zkIe*Ey?4!`-!m0Z)U@c|A-=CVZ3A2IQ$pnal5A_ni9aqrzzmq`RD|8NVCx>b*G;z} zTW^}ydR714k{vWEWZWS`hY>)WS||$<$T^7J9K#&ckkx0p$a)*uS>p8QWm^IDi@~b% z0?nXW*PlTgi>AK`q5r_%SY~X0{mH(SZ!XO#E}0>Ws*LD)+uh^{#piUY&brvvJ8>n4DJ&DJ7GJ^wU4r&ai$-40 zkQR^cc}+LT+dwa;6SytcU(-oLQ23{Y?3P*EH#9=mQO09n(iCbO6l0CIz*`67`e(pV z7GboQwwv8T9Fkaa&YaIE`0o{Eh(?&GHEFy&5xMQnIfezF{hO)ShRYrJbmCeC4nIOCVs+G$&X*60SD3))vlD7L&l za+Lr4lBWC}+-yvRx1%d98N}v-Im=d~RlKT(1y0xmUHJ{acgFf8-$ox%i-dkQL3`cS zkU#FDquD4^!IEq90a~|+$j!tJYRS9#afpD~%Z}E8Nj7y?uDxcPjJ%*vi10!UA<%#W z1PWg`1iPxfg4x1}o~8sB2ad&@sGzuyY}>=#aA!k&SF#lLpmkVbcIdfx=xK|{vS_=L zXTuWA&r9LBw6sd!(;+EYFY;V000<`_xZ3J`#Fws#j`{C3sgdDx)*+8Iw0s-IhgK4!<#n!|4MQ;PQzb)N z{}c+sEgMHW`NfNJQyk6ghBn-3d$J^s1J+*}ZL{|bt-Cm8=Recyu2uaW<+PSko`MyP z6F5>H{WniMBVmN^QD>0Qgcet$VJvw@y)tI9$5(d@;+RDJV!)`$G~N1Zj4`+;nGNL&Z- z19ZC8TMgRXb%0CStI@AQSKRmsuDTy~Io^Tud@i2kxw~ByP9Jobe6Z|bP1};(PB6c^ zeg#AyGhu~3R#fJ3!IpHMQ#RQ@p^rMyCbQhq%W3g#Qumy(Q!DKwCosE2MvCi!OOYMn zuX-0}Cfqj0`-b5qiAj{Ofr^m8H4L{Bf0`6(DG<^-LI?XsO5)O`)jS#u28-CecV0lU z`51Df&U#yOTcU?s)~W;>BelMI+iYJg&od!i@~~p{d2zXAwKR0oiZlB7H`Xmlf6FOE z?EuoxOt`CNs^gF{@YU<o zpp(Db-|Gh%)xKbcNi|T#vw3~H;Wdx`HuIPPo8YFHGE#j@Pleq0Y@V5pravhVhU}ez zt^}Zw6zvSrJ%JFdZh>af$^vh&(Y+sOgb#@$rcpiUY8xGHdg}4kgq8|_&qBw{1!dSo zM&*bMYIiQE++ie1wZ7zx%gw+6i%DQ*X`r!Bst@R!(_V28Zm$S$Yrnp~z^cCYPx^kQ zjb}*pcdr-!u=93V%DT7t@9;@9ZXh^>-0Y54Ny{s>Q%;(Wf7v&s=>a=oC%#8UJ z(OQm?BQ;sM#=kXX+wYBE&ie2kQ!Xb3!8ooeaDt>}A3plP``A%UYz1DM(6Z=i!)$D#jB~YB>d% zUQ*gq_eF$SJr-gry%1KrTtew_ZYI?UwSeQ{yB;OpYwX4z)_)R9N%fKSnSSB)H-LmQ zy}*%r3|JM-vscu`W6eX@Cx}56d!zPLhp6ZTG5=k}SO#}%Njal>isMh3MXnSMcr-LZ zQbK0s%BC{RjNq=hLk1;ni91Vg8$ROLUaI7~KncduH-`AC)rKw+p0js2DBt1GGNi$} zu;%@&L*%29esB8V;k$Tp{VH;ZBfe;U;OAwG>Wvn$7OpWcySzeWegQq_6?fQ9Ck)B& znQ(C!ZV%nRv!U2VYr6?xfTyy^Vk9}dQ9JBCSLeb_otOC_ahLv|p7y(ru@XtUidVml&`8G(w{{M>X1=>x%~NidUa^?)=|i~v?du(omc-MHBheB5Rx&VDMn?y;HXPPMmGES5&MTKN>-}3R z>8oW_$v3gdi{pp4F%5&O-`)9PC$2hS8%9<(4lJvgt@%kc2zL(}asV*s_4s zF;2Xc1$%^!FCXsg&dKSxUVK<1wBTJGmS%A<|8UU`MZh*yO*!L3XT(Z@H>%5(v-EUN ze;9R2HC}q2OH7sFY0@fiV^*s3UYXdU)Y;g_aPeS&|n(V(=USV${bt%ebKy1$Z!bv9-_b5ib}g7$*!4# z#+dq4Z0>8(xVzr@U(p3YTQ8iEyy;%BfQGHl9RN4;B&Bv7q)$NrVd>P(zj}4vXrE`I zKd|+UFIOMV|Bx9;GR0q_R zyq$x80HJzgxr~31^qDsgWDuEj0`0*&hGZW?Liapo?yE4w`9EP(aeiOXdnll(jnun4z> zZo|&m;-g?ApU^IcK4RK0szOo=N+^Yh3~uC7cQLW6V0kVLGk7}i1uy58GkFaUi9?&* z1+cq$PFn#~1Bmb2Nt{Gceo|Am8(d$$2A>KM>H58kJfflina{+10`XGyzC#P8SO|V$ zuDJhbqU&D-mUj94m9lgflQrH*t0UMBHGF?N91%f+u$&zr=s#JwC>gRsp4Bmc-@ro$ zlZdyNP!~|JRgXH&Dm5WtYyj#w5Bs)rFIFqVD3CRL^l3SGm5<6RK=_mQsKB6@pRd=%TsL@gRnYaSCeFr|!fgej7KSDm_riRv*B z8(4c+I$%>+E3iGp0X3#*p`uuixdY~#^bqkHqHPy=ONH9Tf~cJ++gAv}dhq)$$M}4UPTU(3NtiUF)%D0-p*VSOifL5Pye>z*dxF z=%|-`%+5#1PGM3Gbxi{wImRdUs?gg2BSZ+>A5PZttKKePcrcV&v$_gJ@zocjms&#Z zJEhMi;?)fhXa2#>pO0f(u}8cUKTmFPn`-pCYL!=HL#bc2=nOSRTM>o7PzzB_AU02h zbOW$`T$258px%Hj(g2YlYC8>cgW0rNi{Qtj4ocP&c%V7Wjj9q1qfg3f>jW^4Y3d*rs7F9 zwT1UsK)lVzWRZmhdMakuO^vi#IEej>(1V_Jo=u6N30Sv{OzcSbjC11df3R9OhkHh#RtVj*L%PL6}VsGga zbD3!QD|9ly*1pi~P!Zu*zT_7f`l81FwaQkug?g8T&M81jRe7;PfY}T(2a9-m6ue;& zhHN2?2vM79=qobOb`~^>CfTe--R`5@1yNZVG_k3p=HJ6P8Asdpa_KwKd8)SH@5map zF%ffw;;qUDC|EU8Ag3JzsH^30+X7?*a43d(b}@&frn!&yR2=wLAqtdH#_=0~j_`5f zSv@jWjqFehu^Gu}3lNHeAX)(F`rH=5x&5zgiwOgD;dIe*uC5TM(vX zgc%9in0<7oaY+!5`-hHBX~M?w98y7CYXR%OCo~m1o0`rIl zTgO9z0QH<6OOeA0c-T#bW%t9%v7eE-dMtAvvP#H5mqj6B(8pVm5*mIK zoPP(de|lt-WkcpQ${{s^;zphXFgZfxUiF^MEjTpm*2Qqr3j@r=NDlzEHS$xtt3aI^ zy|WBi!a{CRr=M5BhUgt;kOP(5P}wZ>aommEZ7shlP^^8_bpSPl>AX>h$ly( z#uW*X`3p!}COX?dIKTsudN^kRd{KZcG9(sjuo?%G9)A3D4Q#1-!QD2M@=?q0@hv)&6guj z33n~3aGQA8YjR{ZGiFhaTCKv_2v_W2E+LNo01NfY3V4Vk7m=YgrqTQ^ik2v6A@lXd z`SynHx)tLD+s@1~ryZO%ICS!Nn|vlZYwB5Sc$KCvT7wivk+xTZ2L3kIDEdRUsosD{ zo&{fOFg$zI)qh-um}piynhU~-g*YEIbSEG6b{D>Z2HnL(ku^|UE_(h0Xj%)JsfG9V zQ&J3i`-iA(4GM>!(5}~hDa7HgQGDcOSd!T_Lq8R=4X;PE7-+Zk_dasSFZB<>M-vV` zxHOGit11SM4EIv8^^cKV!qhYsqG+7hEQe)+n0DHpEo#&^Dqtcf?g62^BVYz_4fC0} z8Z_2|BhD|46G`hS`9R~H1!UF&8clhktsV8+iI*@jbN@@D_@G%QOh2-qHC@zERxJ^N zRR^RV+mAFts=NOK-$#&SC&p^jQ`mTH3UBl^4SV7>^8CUWg>jlSN~LHSdjJ>>1bmov zSAXp1(~)Q)v5Z-@D140lObD?82>ODmUHE}6(@Lfe4Z*!sGIg;t11EgSKtRBQL4a!x z=fQRA?VUw9j^V0F3%=DrIGjuh2dJ(FBdQpCQGa&}h<%@RX-6nF4;ZY~do=Qp^{kPc z0`x9(`cy3vJTXozBq%^2cpix3{kCZ6K(HaU24oQn%GV>e8IXHf(4}J<%xNZ0!@~sv z)cb#LIHW)B5RV-?hsjbQpKX{i`!wT_L4@d^tOCRdyPP#Q$a%UMD#EaTKA(>w+s6F@ze4s|H(4f80A2nVd z89hiZU^hgcZhi>Vf|U#rYU6rR54eirjr)>K+84YH^BK2S)pZ!$VC<@wR3mp7&?)k2 z#tflN^(v>}QIl`W<1U)-2yl($L{1KGv%f4 zL3|MlS*}n2RIvOHJ(BKa@^Q(4B&;KC!BQR#Vt;Fi*dhFc8Am<$GPzQa*9js81^dKj zzUt1Scm9kDJM3e5`}2ccwUk)|7kj+x8B5RajRSw&1Rn808t)%gclQm zaxl5ALX_ATxln)Af#kq`WUdA|_a4;B(K|15Mv&m+?~SDc(J$E2w-ckK&c9jFrKHz| zvteNjT`}|@Ry=(SZd+NhCvCTodKFvM-%V2ei zZ67yV!b^^q=1ITSxcWw3tDmiJbpQ9v7OuyN=Suw5`PR#kIr?W$9Y0T3n>#Q(*SjfF zEeWw}=cls%;9pHxDx7G)_NvN;v**N!a%S?v+zOw)49+pvGK-G-jUJZ&7NMHBxe4EB zH{3{%ysnUbedj6}9tm@KKYd~I^Xb30os7zOiH z$Oy+shg-t&l`e&EXyG1gnWYbL;tjr1^V9{vrMN~Ox357D)E?d3`z0YJ^L|omCj9Aw zQK%e*o9C`o@a3!NObm@zKc$~jF) z=B6fTWvtZMruvK8zGm8J;HyJN@l*2(W%-M)`LY4(z5v;P*YUwj>T8j6`1ixB70Zcd z!#5o(|JQz9*u~1W_VZCyZ*bOog5Q9C(-97hnY7ZjIv=EHmJqQR{jNE3geg%rZ>6^# zN$L-S)o%tz1mior1gEVwMP*3q{Ik%Z(qHTaIaTrpTeGUrjCqj4IAKd&J~L|V`REJEd`14>r>j+v*NjcQatG(7ol&Lsbs?0V z_CqTsG%%{Sz0YdpUj{jXo;JnI1l?X|QP!#NgbgaHRz71B53)4jKuftltALOP4mxda zso~qUV;57Djw9NJyb!kC?qIYpvd}YHm1RS&uQ0u}?%c85HW6fM{bF88XtUpM{NRrd zT1)0ko$-QlNZ?CvG|7>Zbk?C|8t%_1!g@5%I%#QxHhKfxQ%@&uZG?;SCn^Cv9aw8| zH;$E2em~`vc~=3~)*+A`WDIDx%0kIwe8}>VESvn4a8wJ zKWMVl?{M}HM8)CuIdb9fz*A->+O}&TK?nS_LMe7w@-LlZm)K)Gzloh*((c$cszfAt z3vs^?kzBl3=i2}=J*&9u??CGK2_MRM#YcJudZSm2YEhvjI-AD;I%as*!l15PF$X|T zhB1m=Q@Os#48jhNvxr2pgYs&I9HSWy*;W)Nso0M&*C@#RC!ZWIU{ra+A<59%`wl)ZKM zd|DRKg&9ei1R2owV}15cdc*k252X)F1U`wuH)mEvsYsYFV@`jDu&s233ZqJgrOJh5 zya*Teoomw&$iZ}~WWn9+bL6ET5=VX^-Xd&JDrn)-p3&}Ic{WQR)6Ybn=&4(IqYY1- zO5^&mJ(~uz%vyx>xc{0G_b!>y|Fjqk(#TQqb8wuxz9MjJp*$2HK+UI#i8>AD-cz{U zG+6HDB&zTqh7g^)Sf=yL%H%H$t9J{PsmbF=zrhUZxk_Y#U2=krJOfjnD={7W$Nsnt z#ICGQ#IIc$d2*xMwSeyAmh|}YCOOR9*DutPOgBlpAtEHBL+!FikLnv?R#$;LM!VS~ zbhz52A-Bv&KaS^)W|$165LQ0ZBR4X#%=dJS?Gkf{%f{ij*D^8ng|Pf^c$R5YbLF8b z-q5S?ZzcCnERo6-N6*GQYqfb>QWZ0OxeM42L3js>+`(3YKrJTk6B?{v%4NJcs8!ny zS+GaOHQxSi&$ldCXs)0(LY8d;%-$pArq|~`W82wHPdNAQDv!*y&kx8D+ceNJJdS&+ z?9;fON-1j$Oh7E#2LSbbqtCWEkzLE13uF+jGp?~QdPZ`5=B4AQTw zh0=ZJ9;H`FX7lW=clXHxLf8l=R?sEK9+AJrvFw;Xi|-E|7%-I&6t!pZs2>L)CO zujxnHf!C1%$P8qF!#n@~6&~l+73zE)pdEhf&`VjfEfFyuKI<3ZC3f@2w2~Ig?)*dEedy(O=BvXm=fx z4^)d9fw}F!9==!Y@(&s}_>Xc>rUW`{Pthb6!5KcLg<>ptSNU-l6wd86cCIwux!X)T zRJfmx*H#bD?7E1ysS*9}s`D>VyVnF@5?dF1G2!>^eQHR}S`%Dsy!{nEFUIlUf4<`! z5B&n%eL?cR5hk->TnIwP^KUilt!e``i~CrK!7FbEm({glcIQHO%$J8UCH@7{W0xqL zZ{pAa%C8U6j;iu)^T?uwo5~bQ)wyzyF42^C$O)HnOQ{AGvh?$mUMs#=HhvwGR06Xe z7VQc|$608}Gca%Tx!4|UEmIief{0Fmvkj7N0nB5RU6 zjTv;^?1HGAFJEr)b7@L>2wxHu*pLdqc6@_kfgrLL<|AZEEg7qMWy}az$#F~(bKn6^ zgmn%1y&v=6%1}QeEbg!J2)T?tAr62c=Ava`g_@@YsGtbg-SrkLn)_rbgujbK^;sRR zM6c{B4{^Jesl~iKJQ&$aw|l1CvmlWbaB5Smj{!r#0%wX@VfWCxWUf@63PRauy8*6SYUbeVOavNV_VJY=#e3` zdq+fb<-V-i{CVi6L7(kYFh5ZGT~QgJ?x^kxFIC>%kXKtas@&rS`yM)&N~y}#i-*Ml zMNBwT59?B3sQt3qs0c+&qu=0}J>(TJ@kn>WfOuy`BnS)YVi{qi4O|()DzePu-f=g_ z-GSFA@xg0cZm(fV{DiBeJlH~&EJsRGoP1L`*lYCAf1s|-02 zf_!LGzHtGusSA;&Doc$(OnD%9jj_>P4>n{%IkMqW#s8~`x;#zSn z7&fk?Ern;c$6w4GZ_qK_#>Xpw4A(uzlu}Pf26HB2$zRB+vLCT0)skR+uX;P=ax zB39n!AhvyblNqLldYI|bif2l2Z*e734 zwEQ%!@JOrYrgc7uJia}x>%pD5`01|m(o4EA*t=o<)yq#V9$0_vr^YKM)?Yv0-hXrb%|E72KVN@4`()pL>$T6d8r$@N zvXLd-Pw995uDr1!{qCJ>w+^J=%N`y)k$&I*;qcA$2el!$o~Qrz-~EyQp55P`KJK~U zIBmnj*bSq9q(9pJ{D5uhliCf{C(@pt-_X{v;rAmOCLcVXc)sDqf9Ws(d;Wm1amMz! z-gD!1$BlDG(qC`bcz658x5?@AwHpUcY<6n|8HjxTnz7W2AD&O>FWn(c~$YoWXyhF*ku3WmT{J#?lAWi`ZP(ZyDFee4v zPJyr^+5G_t;|G4eL&2Tr$F>=8YcJrhQ1Fl9llz3EiA@Xllt`_Td`oG1MM*iSFpE=A z0~F?7O9~4og{2dz*ppO(7XGV-lfsi{J=V~O0=nI-f0q%PC2(*O*vAQ+@@Ek9F?ue-fZqOhX6Pr3-Kwmxub9lK8YN8vu%wh@lTjx~t7$@j z56LtmMG*mvKE?D*Z6K8tmMa99LjM3o>J(7Rgr;Q^T=}o9k5ojD&Bf+dr+5v?^b%rj zcJJ2O^pme8!mP-Hwd z+pZ`r`$X|43BgPt1&zwg4I^WmS-BN?Oo*ig$yozmmU}br#hd){+P$~l%5p^s3+0)C zqUn9L2lH=AO5Ws_6V_;8OwMUZ;M?MjIX&^fW+t#DjA}<^rwXm67DSrGRSNd)KsqmeWUoJSmMcRO>9-4olF9(FV%5b}tDm(aaZr$T# zGDc|9E8<*JrpGFFqlNhqS*DS5EDdbRUcrUmDq=$B_r80axm8-Q^+a4{IvRMlpK!cR z*4j|fw)9RFj_!W^Ufoj;+Vo`-DIWETSB3 zDncUh%${(xCLHZ-@$pLThw24jC~%upv+ZX1`~TXF3%%9)x ze)a|IgMA5kaB|9hUDx*sWQ%P5r~ZSVBD?i-3A?c$?S?E?*wd?*(gK-FD3?9T4 zLLlN%5jL1!k_$lo{=m|w%R1aNug13hszLvIZJU@Y1ZLUS?sWXz_Vv$-?azR(A`V|1 zKZjaTmo~RFB;a5}{&SlA6@n+WzeY0|@TBvc=;4|5rC`;OKZ3?|o z)-g!@yzRF6Z|^O3mw(>Yh>Fktxc-~*p>KrWum-hgaxL2W&ySG|2;LSi^okdI;bQ^F z20nTP|Gk0lcad$;x-VFrs47DOY-=HO85O@l^KAF5)Ob>W_eJOPgk%mnDe=4ap&et? zeD=B@A_c7Pdqf^(=8513yLN7y(~hTnbRKm+orpfNH1YfOdwcPWVf|R}xuxskjS=|$ z8SiH~|EHr3Sl*8Y_C|6uLkHM|^4 z;U$d$pt#Dbf)K2>KF9Ndd(7ph!{T0xko36MDe`8g;-tN5q^>^KYnw({j z)q)}TiT{D@$alh8sd1j2#8RUe)eUf6IcenFE3{YCSu z(5iO`Q(<&6@LO;%3fjMy14Q$gH@7SkaR|I@mc)%=15HV6SGj%G1f#8?Q zpq{%Sopb;dlRAaj5 zce?r~1Ei+EyarYyO;sBcA`m8Yh8sdFr0@AMZeK4CNqnp*(#G-}~Qxf++ z^fW>-NY8(|`yG9I*&DGjfS82IF6}*EMN8i^C&58y-3ltlM;<*L<Z4q@i{A?bOzX? z>+xysmQ8I$bk~+OVQYPK&Xq|{7+vpjE>@z>=RqRb2qjs1?9=y$28}rmXF9e#-^|P( z4r4=TbM3mrn9T+d!hcU9o@%^7z)kO&scKWGmihyX?N$M*`G)p!}P5$w}!R_@Ipv=$sh!c zbo)Y^fpRYXIlD6E`CzCNp){`Bm*6g6mbqCq#7eJ!9PM_z>U1_kdBoQLy$ZcynMV&` ze#EDj>J#^^=l?6#e(CPqCAl%(6P|z)!idmkpT7#8d`DRM;UQZv&3Had>SKn7#1Q9% zj~|D?@zWyD)H%_E#|pT9lkjEXoVa<}6l1NMyWvgkCP!zDJ8Vuz)RBtI(fr?7``>d# zi$TqB9RWv8Hmkxi1DXtKWonZ9w_-UvFUp*JBFXeTQLs%pHx@cK{Hk%#zTEC=ZfIP_sJkr z!@SsBMJ~+XtX)@jc|lc`pHXbXxI9>y|LBN)F534PUXU(l#m+T~{4|V;&I6CE1Cmxb z$GHzxs~?$Xj=)xJDK=PtQeA5Y-MC8Zt2t7}Tyat!diCD4ld#MEAfFHppZLLS4)8ca z?1Fp1q9acyKd!J35Cv$o_nY@GtDLGXB2KT3YHavkNz4zy_EyPunY}qtxQJ*Z<@iMH zGe-W__e)`laz`IBKq~6GCh5pWWf^9k6u@#7`{AG15HJIyFPV+9+Y%HJDuP`I>v zgZd>$h@Ev3&H?5cZrWTkB4L)JX)imP*nHZmd-K9XH(Dg$VKah(z*;uP$Y!gpL;qdx zC`*;Ev0&MB+LXGMnpHJ#QJ;UA1ZO6)<=ggm1K67!+rhk5=goGWS`n;Sjcyu%%zYz2 zqYNe8{{Xh8sV}~GeV$>#xZhrJy47fv#N^I530ZvfBDVWuv;nP;8BZN674Cu-JhbQ2A7RFbfW)aQQHOQxks?Eb5edfdu;lW7Q75v>CAcH$cBU+il>M@Y zz8;0AC#RC0L%5J>!OKr(>kf(Ljxk^H9E$F}HdGY=c)JmKkhaj`^Um!#cuta-(7V>o zP*z}?SAoOyl5p`z0XzWw5~l8X?4(S5nOh{JGF_L7@u;%v^4OV*+lDo0>BF0Mw++XU zvHI)}gNR#Ix=UUx5C-ET*%uS6s z8~~qfD=p(B*d3s z*DKX2pn)t#V?8>A(?-ys{zTc)|Z%=9Nc=siFmL=e)7RICR3>hsG}BgtZi_A zy93Ujxbkgt!KbrpQQVd!{S3<{OO6eO1738E zo4>g6ufOcf1@~O5O*0%|(g}swb7nuWt5ao#m_}tsjGaZ*i>5Kck-_jg^AE&lJYQC0 z7w`2RN*`pp*)39Q^7Pbrv$12|m#@4MWt}<+AMbgNZYtRTh`;Qt4g9+kEK3OKiR6>? z9M6Z>I2J;YUbf&bpC$eoOre5dMBL^O7p2L*q<29NfDPQ0jI>6)w;s)*j_2vt%B>gk0&mfWo+4O$02+_WAiOcn3ORU#{59GP{ zI@#sZf=PGgJP#K}2AA-4{#ekDVDJbJi5}7IQDGwH5U-|jH$y=Vdd(d=c*_=it_V$* z00ZcK6Hh{_mComR-r*F7A&Pz&AN<0Huca2EQV|yR`oB~3qpA6@cJwQE0hFJT5SssN zR+c>pD>j7e+gSYWF*X$fD~i)|pOeDcG4FV2cW@6n7x96p{}kMT$VG70mLR4Id*dpn zc2#yP{Lff7L(rF8b($KbHVoS11AYodYg5M)A3lQJI|>oafyr7NlmqH1 zq?rWdIVRZK{jF75RylB7eGb?e)J0|?ZPPK&hPU^zjvtKH8_b=h&3RE!_2!_Bi zt5E;-FO}%Uqd#=}`A3wLL$6~{#B-tRsM+-@j0t)t9FH5|>NQRR@Me=+pw5@41sk3a zJJuy6JjLa~>h$Y^E>Q%TQ@F2k>;N6%uR?E8qOys|Fa;`K3!I(P%ll@!w;gf}f@aMj z@*%nnwTElb@mtZ@y{g9QXF&(3>4bP=V=hnw(c38(!mH3|Qf07K0>kSnxL5^54+12;0j=9ZnoH-m03xJkUh(}L)? z6#X9V8FVgAVV0Ihm%aPz6lw%}9c+vWwpNj{*JTfqv`P~Esq+B3SjK;9-W z(U!6=AM7AjjU}Fcv+NwAF%^!~t5jb6AOo+{(G!Va>LfOnsP7pJCQ2Nw=n*1%!?(~& zuVZxkdEhEw4eXn)uV9O;06auTAKDCV=O?|^LKhssTW8<}N-&;VrEk92`uYAx|P3N|c-wXVa0h*mjwNTZcp@EY`oy53GwKj7@nDO@0_Bl#j zA-I=R(~xniV-l{@@<#ZD*nz0k4ftMu3W80PY+St2qPd*)?#t6Jeu-9A6?6CZs^3naWafeF{q?>U7)VRWk;_V3sw=T(>%x{sCdd04b=#v%mw+aF~*?MQ!V{BIu{|L_7A zO2B8l=(B<>cwur0gcnwf*51Hm|!0=K_PenU8T3W7o}9y*C>oSsQ!CT z-@Z;PK#l0N(39GZgEv*EY91n9tBT#({nol>UIC04$LKYNYb3f=%Ju;s;|kw=DdU9v z)>-sSm$Mt!TLhNO)x+G-XOH*xmIl_%-rcbyTG3^g}(I-U=}q55IFLH3K{^i&9@9?T^I{mHRUF+o|o+Um8p^hh|$q|IhJ zE^`E#4UKu84fap2WCerohrvx$)b%{~s`rZ8)@dP9FMEj?ybaBZ!c!8^|S4)4KhNk^T2 zYF}D+ddGrV`gI(1>4C`T?Oe;IIb9gOYM-_XHHC{Q1J`@q&?jLUv>5K+T=xCIGwXQ! zy@l9ETvjA*9E_%^(XK4A#dJTj zh{n}Uq1+xvrMCqx4+HNKpCCpCFjH7Ph0zQGb%NW{sDfvufF<|w`8@wqAGCWd1OL56 zMw0Yy5%E`*$W44~J&67=smmhkCo3@{7r=W|U2;3`uI~5+Y~as$Ucdyn8$=(_qMykx z_bl>GW)dBTB0(cPgX43&mvike4adi?Od$Vw1~j7f8o=~2vGoef=7`-h<#?;dE#^5B zg5!Z_OGd*E;HoU}Sya7yT1e6tz~IZFWq92vAw)}!nte>Z2q;oIrT?4XqJw#MpUe<{E%!eJC^J!LurWfqyM&`;I5!PA+p zMm-Y%2l%*GyG<@PvuudFAWZ9D_g)_|LoX&MF~w$MO-utI^uFJ=i3n!V;_yEKizj& z$1>MF^s583Y%KB_+Ay;d0eqHY?X=Zt9|8{wnrkD$^0_OR#>I00Rp&a-NfZ32<0sno zfx$UY1BW8_9b6gR?*wP)pdiQ9`@mb&Mp)yFUX>1=i#^Q6MNRBl=>l#F1eu2n%>AmC z8)h!%M8Dy|O0YNYv`>tes|-?6KX#%7$}3VLF{v$2E!V{?7(7uuYVy(kwPUk(@}e>d zw5eyI^aKC={2A_s*|Hp8%EMZoL0n9HD|&t(Hln-Yr9mc7c!xUpb6Ir`wR%M%4p4c# zlEVfm-M@>*&7D9`96n`I?;423b3x>TKSx>(zN*?v6d(WI@zTB!osi`KRjrN~3;e0U zH1aPQ6awSK(*k)Cf>}5QIdZ zmHX~NVy)P9+$F4CH}h&(XGIvR#OVLU+Fh2gc7s%k9u$Tl6@ks18kdwi8GAN1){C;d z4_4JaSY?u+Q(xXRw$V1CCeG0B1uORbnlq6s+|Iu}KP+MG`i~-J?~io5o5A-S33Uot zBiTxMK9X*9>Ka2guzQX9x-Sz_?)xY5UfoJSe%5tS8Xr4eraw+tF- zn7#IGOMrLiNju%V#oj@&--v5ta+ZT8>i+ZiqDJcnHip(7ZGIiv+xhjuq~tAbfZ;~! zd9B>BF#&m3vNQ+jELu>M`K%zghw25dPN77fj}4By=wp2BwPV=~@12E@uF!^H+8YaysJiljW86?*Q9({rz zwER*b;ZJ-c(LIpGBYw&aE+wm?f;i7$7W5C-yuk z5&fDyN?KFH;Kb}n{&9a)T0@DC5Z0Ud&eYChZ63_H!UoF;dS)9dW1Mx1@M6cBOq1XH zqiY*?zg_f9&>TK$=9g9Fx&Bd7>C^gNGZv04RKV-9`;mC^W{rzK_D_iIn84E@f6(`Dm7U%%S8)H;t zw$j>l;?;GG&^jw$NS>mImK!!zKyui|cM6U(pFcU_952>OOiwLV*0N7i@9jgrXZZ`K zttG=tpM7%&NVu`PUj#iS#-@hLj&}OHxxR^0PLo+(P~lTsHSWofh9IqFd_%~|pX!*V zebdm1f<=2%E=&$!(=+kZqU&*3hkmMSO!r zUz(g;GaI7jarJisA$Sez`X)4TC5Buf}1)(A~r`}VoG zHkFJ1IAS}TQ6KDO&}o0~_3k0g;I>Btcz=yGSlFa_(w{z1(lt#tyG>b{dS1Rj%5aN% zgn~sd5j4jclc&QP3ISaf=PlmWRV*b_dy2;IS6dVQmBqNs`|n9kUpL0)7)PWX-erft zO-*Xjgp}j|ad(o|L5{?3aEQ5juh-N&R%3lLS{|T+lY+*!KuQ>kRp$AKmEX%!Vs5?0 zNnLHqwt5*RJt?^>nH-3!9CL&@rok)dqM(OlE9ig+AY9XIv5S=xGDt{-Zi}(1V#%;D zp7@5hcxhEuW5utPjS`O1mvzgi28`z=^sCpqf;rTOsn%;-K~e>mg>`14I1WFE1B6u8 z@Q35;R7mS1vo`#g)A46NG}-Iok?oLM-XuW}85Eoi@!Tx;@NUMZe8z2aGe9Y~_>k`O zl^%FA@=B}@U3EYJ%W}AkgYywawc)FS&ll>zGFc}~RtXQr^}MX#HsU!w_L;G?ITk4H zA)l7bg?x&QPr%P&zG`It1rDj1MiRqI?CdK~$QJTU`9fI>eXJ<&|^~w3! zmyQ$&bhaeenByh^VyySnn)6I{^cd%DNknS-u_vBtdLKg;4NXN1k;@g+70)uOc)RRP z((Z5!xd9u8#W3*L0_wz`k0w$ja1Gf__nt|r@&$dZe?{_xE5a;J<=Cj7|NQI)D4@<0 zkcW3iTtkiAG5)N_#4~eD*YmrooHJ?@qFbgZDYtCx0JJguZ8*CxwK34 z>m2vMbJ%>=)!>R~iQdL$z{}9xZ6xRU-ai3)+5VeRZY<* zgYfz@{_8L3=wK`uVyZwdjxM9)?5Y?Cu#aZzcWt*rzCVhaar=;V(ZpK38R$N=zbTX^ zvJRbb={q+sg|Is045F=UaSxxuWIPf`~%ZK@cs!{zK0oyY1Xl6i63a$%`U7=_MdKIR2_dH}LfP zRgweh2Nnk&*jQq$qHTM1_1Ji<5?z0y6z!dDB(Ai&e5ckSE;^5tYMiW=fXK! zk+t%|G~=l2sOQy3UifM>Rturl2b5Fcsg(1jEtHZh$(t(%ZtbGy)3S9tbT<-${U+T5 zyReZq)$d_CTPcMX3dM6bWPd>ryKe!1J*G00GFywv=ouidbLCksa;slw#3x3$yA!X) z%$*ppXI51PAbK9jrXB(I7D4#;2p&+(D`1?aAvzs_IF5JlNbo$X^?I7@W{DJ15D>z( zdAFF?BbrrvcgPxikC@KLLT4qXLHOG0qO6Yo|8_X`&s#0&Ekb#3c~+Tg!mWav0736a zCZ$0Rz;SzZY&Ai9K(u+WCNSs1dnP=14jv;%2X~?>0Myz#Ns;^Ya)snm6R^=jzX8-q zFf0yh=n&Cv=iTTJ+TxidNBGHGi$2NX>u;7oP;1A4f=Nx4!LpsSr7zy?H8NC%2N27w z+502l+;hozxGahWoDh z4G6iggt@}Aq_B#3g&^WoUWZI$UG1%>vu4(-f+s%d2gq`auKw^pd+g4l9T(1&p%`=R zHS?0Z0#!+TQPz?S-`Q7cUA+bpRw)yG%kJqN(tRC1bjI0Q9wGA~ie0lX9W$~;rJ_tJ zJ~Saq;g}O*4Qu8Bd*y{PIc$B%xq>An9i5_K zm20IvbQo!05X2i=R1~%%334ifPZHT?=`S1I_0Q7 zU^UgZiaTOqgun6$$mdXY(}cdKfrzXpE}yx<S%`og1=M#VsR7ZXAqhhd!}L2HKuGjx^LQ{*VUpipT_10=GdV z5LuKxDosK;9A8_*MI2eok@d3;JZ7V6v|^V0p+t$Acrmix)-cseCoNFc;I88fqNplS z%7`thVr*R*5A{7wCsSiy5`R6Wu*mZ&uv!5swE!Yuf05y8lk-tGnwuRka4`mof?e^M$KKb8`b zG4h~XCA>3CFR4RBzKL7yb%dEk~|DoDGrGmC!I;(f8{zU{E*=-*MxJTiP5B5fwZ;>*imq7?R(VXpe&6RD;k3@eI~rq z*QW)wor+fZ1sTHhR+l4nPkhny5jYKkPh`fFedN>$p4hRDdT}n55RmYVG6zm-KVWwG z=dsOOfTygAJzmB76cJ4WTdhPIjU|W{M2oSqll3E63zN0nXtZ%vuX0fq6hAJd-V^b~ z55nU6ux7X{+3wkUi$~FUG*nNLa0^#pHQOcTqV@;NZ|9+3E$h(L*Cy&mkA>`ID6N7+%b&~1V~xZ6{Pt`R#>ar1v_POy6lH(`hi2HxO?we@X!F_X20ijmPIH$o_U&wlca7STT}T^LjJqzx$%hx?6-V@2S30kSB`-`^BmfU5%3^wHV;Q zjg(!&tRid9lnviMaQ3B8fttMXQp_I)w(ip7#K3hGVY#NO@#4%r&+7QC%dK`y@8yven0 z4R6EIGqP)*fB~eCBtumeV~>`goD0sah?h2CA-UWn#IX^wt*+75gbatFG{TlTB4Q`# zaB9ydd82rH+1rC&Knm}%SUUW^|8l8?j&!`*wpJ%{ zI{ak?AjN+`J+*u>OhEh?W4E7!U*^bu3n&%RP@VTs#uQm5U*h5@p{igoYT=;-sgeAK z@eS0nt*tH8MYQFPHL(oQD=}7>rSlG>7j<##9WCO>T+dxbsU-fDl!inYQmwN_7z$K- z`qCXy0HNJ-o7i`XXk&<_hJt|s~?7n$BEY-@rpZxK`ti`wq- zW=ogq{cl0zBT1T(^v*5iV@U5vAiwkXGqRZ-8Yc&WG^+EBmwb=k*b)`_^Uiqb@MGMA zD`v;8__jL~w~^5W9CWTy5<-*mG?I7@lB-07QV}avQ11e`fx?$YFEo(2?e6L1^7gv z)U@EAfXg>U+J|NBC8n9vFX~`}+krsHo73bN5d_!{MWM9huf!hl64oA@RlyTDzol6e zj)J86QZt`>>Al~qHPZLmsxm|Rt6O3#*5#b{^R}G84WLWJDSYDDT|01A{ke!!P9YY|FSh7T-e zl|6j<_7S`?8_{^YCoj(YSk>9Llhmb+)obH}(Um>BSW|U(>D+Ny+}eygSm-vefn%PxFcmtI(X)=#ve6QHH(r7+|vf9$hPF$L$Yg7~(y$HjrAzO5jc^GC*ZoycnyKwB0T~R(V(wda2 z0bOF)Epm(Uvb1$(k#_kQM|59z^zvEf-5KE_hxfc?bXWJNn7gw&N?o=^tPva4iR-yW z)eQq&2lWgy*t3tGk1&4gESA*WQp3nq7Mmq@5xY9lo)r+M+AEmj@$DN}(KAr&y7L)@ z=a_96>(vhZHYUgG{yb=g0%* zD$VQuDgpJM5%czI;$V+GSFfNreYVy8M2pm^z7E&Z=}2d6;Cy+2@fMp1ht|Xk_}1@H z?^dn2=U`*Q;&+h{?C+L{fyE?quVeDH+Y7`<)8P1gEnctfJMud5@5{5H?Gqcn2G7~J z;dlbxb-Z({C0k}Tw?DSrs^dmJ&|y+vI}+kqIhdPII|Qu4^LPUsw_@kf$zUMs6p}5y zw*$xKdd);F$GW^;WlpsaW53-`yZhn#feKJ82-pYqIxw|eu+_fLsLLW;TKKS4W`K%>WSCKgLyWRE zvxoZi4nz-GyLgU9jq5}{8gL4ozcq47FcdQ^ICqX2&O)G-^y(X3%~FR7L32Mj_#O)# zdN}@Z^6f0|6^s56LG+AZy-;d5>W{H!b0N!1cuZaATNbQHT3m!L%1ij8K-&(r*%v*A zWw^cF&iB30US3~33 zuM}~GiSD`)046CngzIl(%6up^%PE1n#v+_aqy508TOk-O8LKdjLb$Be-7KnZP51)u zN@-cDU(+wGPv~IPe->=qdl&W2Fg2o$~-JsfU6Q+G24XJ?e4Ro zRS!z29&2A~pBL$lthzes1~K4>9R!f7JT(JPecx}7a;%J7=sDhKxQW-4S}fk*h#KEA zi=0rPf(l@SmQ+@IE2EKXW3Z&wn}^D-RndMZaI&S&S;(=aH&W5!%3WQ6^_bU+ja^j{ zF=N2P{ry#cM5kHa=k~P|sPGl7jrt9mzImnr#?LUs+F_#U_a2=`6Ao-tVhidYfUF~C zvyA05rhbW5ik~f97Rq^R!Dt#05#Wez3rnPBYI#H*laxYxlW*1-Tfwzn_B{+~rL`$t zh1VQ5XK)R`y#fIOg6VwXbmmSZtq`2v2$sOHKjsX5jvgOt1Mc1?A0AKwy zLD1yrQu<95u&hZE+;z&L&m+W?8eR14A{6JMU^_Q;Yor!-=P$AWR5F8{YH5S_V#>18 zd&``R9w$oX#1~rl`1kmXqsyaNVYnt)zz;fp@hzt*q~n`jG$_QjdGW#Ixsr7HF495m z)V7s>CtbC$Hq_M-*r{{nmvc0x4K0;-KFEI;gFWV|Irj2VdWttC&1i@_;C~pY^UyT| z6i|B4xu%5&fYzkX6h-J211Gn!Wow>;Y*rVfYH-_(<-}#X7EL_076Qv^;fl=@|9S3B z5E?~6667~%saNN)BtRyv>%w2W+SYg1Tnwm}oliApbXc2iqa=Y#&9pKaHGF)Z!3 z;vjY!&S`z`a=-Rc<+Th`>|%&)yLG_Ei->hrZxsyEnnx#id~eb?SM8d`@JO88wt+~p zGpU)7Tg*B_4#xuXhL@3)nrTBhuK3`C{0i%`vBZ}VfX4$neP@W1&1DKa4Y`S3+x4B? z!`ApWrItp_PF+Q<@3mYK2eLZ+NzZ9dYh%e%DZMrXQG~{;i)y%wxEjxk(iFT>;(iUA zlG<6*!OlD83JFu>I?7HLQv=B`u^Cr}E3;idA5OkyV>aJ6PFDU^>}1tEY@QHm{KqMv za~?si%vgo}@`u6J1(>0bHkbX558wQH?-XXY4n*I;bILiyYM1y*z$30pwbJxOYlnAK z`C)lx-D~{qtVMttPzx5!t|f(0Y6F_&@8u`C8e&QC(lYj4pH4C<=q|^4VW&itm4-`% z^m-&2l>YL{Fkn9%!a-7YV%A&Qy$FywXLP#^EqskuubFDoXX>SBtdHqIi;S1SP*@KH zc}FCmzhce2xY>l-@e4@%{1|8~i8N`f6FTYNm2aU#RcJiYxtZ6`+0cx;o1;m1;vRYC zN8g7N=wg>+C%|y72wMj6xJ#@;7%rK$Isu$N-Y|xxi*}@D{y}ELlS`I1smQ^t&q8ER zY3k)QVzzVFiRgB#Ntp;LW6TVS=4}xcgh$Ny9t2SxEkO__4OscCZ!;2?4#0-cZL-*D zaKG`%p9j>pcdC6y8N*q<0fR{p3f-Jt9uP}lsiXeUNSG}nkGboaS{Po#a^b6XK@}nU zgP90X@ag`q2iU(ru&p@KwF8O-)z-)jOPKbDK@n}KSuzVdyU_ir9pSOSuun#~Me9;> z)H;7e>K23bof0u$%ae@Tb~ST%g+nFW)`Z0W%pb`xY9UfDRMA8m9Bqg2&tlX%v&pkdg-hY)t76N^9w%6B z%5cw;M8fJy-7?#Rx&ebZicuQ44pBXJV;Orvv73r;Yi)~A)TYraA9;u#PY5XQbg(pizRLO zWXN#$8%wc8EXKSH86aVM5@JFZkv|7nU%LBU*ppoyy?FMiF9^tp4r_`e_6mS{P}#&$ zOJ+_XaGUKv2PIBUGiHa@b}^0ft#21>V0x>UkrDm@bTjqC)RtcS9K(j%>zhpc<)uE= z+8b9QlJD;c+=ei$PI43%zHAWzqp&jNqS`I_cmE0Q`mPL8x71dB@&Q}qXN533Ay}-} zWvZcv2jLn^wU=kNp&i?YI38Z{n-`nsA8;&=$MCw0SOE*kg5exm?lB20$gmAlQFMQ> zSIWVS0f5XVX&ukT5hmtw7zcW;#<*jTYrdxQG?aEaI#Iq*Hk?sfCPsjVr2~7{m zn1+sQH-aEDm1+OE$55GUBk8qL*H;X(+%B_23IHPIez>w{`i45|ZScO5$V()#Jtnbl zPUzAsJdWw9UZ9%?g|p&&IY_vDye&m*Vxf)A~X*Xki}>}suQ>NG&5_8F~hLD$R>{# zO3tx9{DPXx@4X|jtra1u&rcLe5p-m+TSrBJ0G4o5Y)5Dgm}8Wj52kSej!oS9{e2}1 zSi|I*U^xrN77!MaS*Z{Un;r*4_~)PDp1+od&M|N1$lR3c!W)EJd(`{R2mh8gY)4}q zK5##5j$Sek894!UIl-(tJrS}+>`UktTvn52>KxdjI~l!z4LO`5OtE4cvE?bA?}B5E zedkX<5Q_|`wyfDgbXjdZUX4}0a#J#`yP!MU80JKw14cxfD71c%{LoFU>uqX0+rRdg z!{R#1$FBSaF@z!Fha1w7t`jPTq0m>mru101f3htrKxo&gHYTD+!N}!fFx}SG;WLa% zM#P58h;uj9D=-cNKbZU1Bdof%KnV2b3?5m`(0kKk!V#WuQ2SC?PM%D|2tiNBQ&P2% zDsNe|K)8n-^(px1d5x0wfKqP7R@$*Ge-xS}bjOSwhK|*nAbOh=BJ8V&DbtILxQ*JE zDsl>7uKL^DoB(qe>sfBWHV=fcGp2((MMnF#tfO9tQ?^}T_b?q0{>nuLX|B+9G|Vf$ z#)=~eaPIK}k60C?F$F@qi1T`baNXs6rnFSe(%JU~W*@SdSgCuy6?HK!-A6 z`F9Y01p832c|>wyi=XH0GW@$ZOa+u;*v-i;HOuTi#DTRe8tSc3w=gpV!&}*&&5Z%G%m69d zzNN%)nLzi;cy?7t8qFaM-qUfasHoIAx-!wAg?qb`R2 z5X*}S^{~vFO=pFs zxl8S&!mV3iatoB!PHd3zWy(&yNW3D}7b{49&`mw+FN3{qciH364dL2~PZNx$6vPS+ zl;@x>y$oY!^pe=$tvP%amDPb~BWRloT<_~Oe_?b9Vcu-JUyUhc?Pa@Kp9tSAAZ2FN zOtBIgfPi@XungN3N^bdRu(pl22N}kEL{Fyki(z2$M0h9bLw;{&f6>e~HB>5w3|1J{ zZDn?eOgJsfYUXDm!ped*84Y#YfiTA)P!WZ$3v^UNp>0N5$SBk*`ScG*gdc}7+oX6f z=^;b(JhoC(x;B{6V4BuKrxs!Kyb_Uba19}HaugRBZ&KP0l@wMM_jtl1&6st)(F==PiK z=}l#N^Gm&lp+=smrLnSSUhHSH(0A+AzCFD$2gDu;Y|xOxY;g=o>T^??60=F5XI%9I-^$DWDdgmf0t> z>~a|P4ZYSQ(VjUy$U2CXs^=9+hL?E}&ieFb_V%_g$LR2H2L{XvnACjeLB-!j_(_|C zdzt)iOail8$~MZdG^+a^-qOQygXed$J$9%q(u^m6HHT#NSUB~Vtrz=JpoZsSE+q9W z?_e7K0R1`{fV{-rlVKz;$t)8s8yjD-05wx|S4Ol;3;wy7X-?$Kh8+quZH4+H1TSWV z(qjxi44xVAp+ls0$(ox7BMU`$#dc~v$`7CL`v$&)yX*<3e~n%r^2 z!pHH!95l>{ZS^UJ1u#{5L%l8t%B-;E`+FmY9>YcE>O`S&Jj2tX6qr=~cM`vRKlI+q zz-H%Oe1y%nt?LI4?=zS<=61DrIlz)VW9Vu`RPD8ZIpJ-0^~vW~QiriSx3`+M>N{~5 zx3^2I8tyF%xDkS2ZjJswyuJ5d(tF(h&)(w=E*u%CxU$4mt_*N%8RkgM3|wiMp=oLp z+?pwBjxq}zX=R00wmaa~%+$)vQyow<+e)3*>2N+=*LC~;3*X=Q1$gnk@qE4>kNdrL zx98Q?hk-iRK9haG0?$OPuWEKi9yv7q-~%WVmTO+YW#u8!)&`F+Q+4z95Xyf70uygs z=9o@Ko!Sy7$y6ygUSd4YzuMw;C+k*KLSW8uh0&KOOTqa(>+K6qZdF?tSshfr~Kqz zHy=05Xb5`u^YNByquMv2>J0zg0oU@*TqB$9;{;Wg>fC{EiA#RCVlQ%d^|1%!H;Ips zhf!;$HR0dKu!C?GWw4R8DPpE`!gFI~*G9y1u@$;ians9XZt>cr>l?kCB`?oj@;gVp zJ&J)v_fucW)>^l9YT2CYH?v?^NSxkIZ3$dccdY(aT&exGnlST=fcrZCm|Kb0m`cHN zeUqAIcVMF(wCaPiDc?b-=jN~so_W9v*FczjNL>%9L<06H=L_8OUJXGd><+8qYGD+) zu%_|U_<0e3zSG<}cWepbW;OIYfmwHXB)Qy;@_V$39q`K>!wot$C#n^vo9nn=%y3de+zWK~}d#jm;yW`t>i->rC5;J=;@rlPk^_#|&To%3B8KP#!9Zz^F zg;s^;4lk_Ex!DjZk6RpyEw;_|wiK=5mwXx98XRRV*bH2VBdnbkRYgN-IXKB@oPqcC z-Q}V;CEA3hJjdL=Do2a3%&z>p(~C70MDk};^P0!1e@!^GWLg{DQT*%s%j(+2ZZS{1 z^y8dwbm=Um?nz0aUa)qhC(KDPF2+0kmYUUVsG^>4O>j<|qwWm=@?7eol|9=(X!EiN zLF;^mPJ*<({pQYXT7?u2mQGZk%A3jdG!9IvY|FR6mnzriwYauV)uzuUA1m4#P~ex_ z5<$l8-t53WV;1GQpj~^WJ;eC#c^}ILZ4wz;U7cIfGf~s+P;8W_PEvXSYoA1T9v}Ua z+E*QQ+NwyrYCgCPm)m~QB&D&+`PO}p9zma|b0Boi9@2J1?-WSa&gy&5oV7WQVf@d4 zcr^i&*Lcry$Q85`XKw+@&vqE9xwS3!fQ@;2R0s9`>&g}!dDFh4&z4cDpDmf?+&1dp z!gZFq$2a_pov9j)cwx4;EUll+zRwW4CZ*!jKw7p<;2Y^KY~!wRn11;=Emt!(iAV8r zolnF6D}N0{i@f(AscTDu2?+0~NEc&G|8QWlMI$BO-I4_=y<1Fem7Q@f=9R>D#A>A# z57@_m?&W4fOb}qwv-H_x5q;iULhCZ`l#|pHu)O&)$YUZ`H@i&l;-4E=-)0s+ z?qCG%RaBs~%?2KhN_14&{d>!~ez_e*)XkzIb6F)kAYvJK$|xqeBdqd)RQk~faPMB@WEjB&2zj(~>n*tGdvxGXn7{Hp` zFVcY1d|UM`0wBEdJORt-SyCPqm4Vxkq^t=tjAFf_2Iir(++H$#R@rnGJ+!+hD3kV* zt|>iqX8X;SrrFGGCImX=isM^Q@9}efz?PdA%tknQl!$Gj$D|f(>uA9CuC%T*`g-!+ zehbITro@Qs8mhEj$Wn`0Yj5jl3UDF4W|IPxCL)e2_`8Xl)xCJq zT?VGvSNT$G!bB;fG@RIS*sXiF`?@9AS;+ce7Fo*!XTGx~$7<4pu_^t;#337Rz5+R63ry9CSI$OdhLJtYee& zwe~xw>6`7|jc-?$yAR2C&sCjqzwAT0YJ2ru%7ZcIQ?K4tjS7iJr2F>6zYEq6RT}v8?rAHTo`4Zt!8d@ZvTZ_ad|sAyjX}IuZKCTbx~Bo;x53S_vtW!l5+{M z*hVVKtQ1tpP55`ywZZDOUZz+oEnn^|^wcCa`_~VdI`0<@-BeQ%iS7eP`a=zTv!-#Y z^GvwAx1U~@hyi)dgTYG+4>^2a%Vk>8!ALRzIPKjDuQ)762PdsMmxflh;8C zMLpjH_f27F9H%Kkd=ARh-7ja(C@KPahHwz5w&X8VJ~mZAeJ2B#gS6BYZ)d%*Wh~<% z9>(XgnYK`FnecsWb6PZ#R?EZp$#epm4DG#*#mYZ6#&+X!m#mw9Vv0~wbGk0yu}4ZZ z=6y{Xu^t<8RR#rRV^uu;K{o=1)|a+G~6P&RHRqoFTcroU42(9FFKqjF5gBkFA>;ih<&lS|An zC)F-d2fz?))4X*qY+a(ZjW}Dz$L*mLGSMbj0tLo}k|qhmS2f;Z!A-ae%;lgtimnVk)Mgk;TpjS) zktrl1kkdH_Eb>@d`-KgGqxC+pu{ zqt`o5+Z<9a;>1kVOc^g0w;=v=K)CV{cfVoDZV zDr}i&8P0wpV||UjDsXF2bQw9HJWc^tn^=%(Q$h=LF0^lx@e?udT8>9;0@xoYi?0cj zOs$NdJV4`8zDkc#7DATIOqS^onJTE67$tm>?~TNm$RnCu2WQbIB$#;b-&A{x7^Tfz zli_8MnmsSkajtM!m*@6cLS)-u`IWm)OahqQ8ezH{B*Vd7Xj>;S8X?nh!b|f)$vn;A z$ed&zZ1!5HJ7kUy7cQV;8&PbXnF_jd25U+=M}S~A&7z}0Zrxn{SK?3O;6r2*JvPJU zz61kfIR)ktxRra__u4!WY@L_rjmU7dV~%IeQ-ML`{iW@GG~6P!<=w|sACD7)U`|#& ztcT>wYg_*Nps>`DSEG8gqIaU^i?O?R`sNFx(bV_YSZJ(DOi7#X5!Z*n)C5Bo;7#6t{8 z5bRxQ^x8b56N2&FD^wpac3Sx?0U$MyNU-am-D<+cVi0%d4m-u9>7fH2clHEoNzdD}IWaCBA4O^+@&@UDK+S z0Z%qhbY;@VSco~ZNHm0~{z9!6nv0*%>scMM0+wkXu|sSX%-*_n7G1`T#j`15=1h7M zcI@ibaxr2WWWC&?9krHlTWDbah&d)F_6efqATfW2m8qNL9%y#Rs#yB8!}SGb2aeq= zdgDS8P$$L2a|1hG^Yn1#r$6azenB(9HW~d;ncd}*`qFH+NWxFaqtI+!sGzXNVa>P@ zStxBeq)TrXqMuY~UExBt!SR3PQ~WQRyjbgI&a)C;breiFkhAC!v||JaxlDl#kmHXI z5anR0pI|$lO?sD4KCPrg30GN!8sCLvyad8yd&uG9y6Nj*tW0m!imxvz;Tnt3!>ya`JIK18te~L{GU>M^W!NTzSEWuJETB8>@VXKzM`5={fWvW! zyvY@UP~&=~G(v4+^jn(zJHjrai4-I!gIFgyO{>#)WsxB1e<%!phy~kvU``d-a@kf= zF4l3Yg_^mCWU{4S;WeVDq7NIo_noi}w?(pW8yz-($i8vPXL=yl=qB=U_(tO+CMmC# z+M{Arxxy<&3Hgz?fg4eR%>{mUn+1SRH2COqm-U!fdKYtD2PlVRVgOnfoA>VK-%hj|Q5oK<%?H zWg^Oyd5>spG#hR`3mz5de&CV=xD8fK;02jxIr&HY-^HX@pD+13M{DTi4{cSgX0bfJ z`aJ7YW)GIDY8?J-Mg|j#!4XanY*)AiU+A^$0`zf7=Mo}Gl(WBVEfRUS8O2f4sDfcQ z8OFCcx3MZsY+^}u?vXnt^Pt9a@%G+8s4GY%(BsIfUkb3NKu``9Q7?uqD2PT9tx%d? zy~J?i{*rZx815$Hcc2x4nw=)N;Py$<3GBBKL3MU6<{O0;;bL%_YG}erB=u-jg;6{1vwm|%lAmSss<4cR)CR6mJxYDXga9yc+Fk?r=+2wL`kTCnJ zl;W;H9jfx2R~p5$a2THEvqNVvQ5{@7L_&N=C7jrUpQpm_#;XBKi8fzJxh8L%gKc~b zHfpEPE+|QTO%yIE&gO!NuFRp9x)<)VtHlf#dxtv7!))POjIhvazG?Mv2^nibo6JMe zJ^0XXX7?pLOO3GkfW_T)>o<9VTR?i3B<+XgI^D9ve})^o%Nc+Wmo4--1f_!}$ZUrd zWh`y8WB3;eJVv6EFHBKL3{QadTu%ZDLFPU)b%%!U|b1R5uPr}lBR zj*OFk+3?BP{&TY^gF9wlsckV}>^SdzI-F+1I=9J0XCt87r+JfCsh_xft7v2UpVU`E zQ!=JW7YM2b)U{jU=xD=u<3W?gLzt zdrIRV6VjTH5buAA|J@5#ftLG}zr@CtQ zX%H7tWvKNQf^QV@ZO6+ddI!Yl+;shoG%=bh#zIOrN-$l1o+JpRcBsiyMcpz61T+#H zm3pps=nAFbX}Mk$Pm3%kBsLOk#Ds4G(g~1mF3rFshL;4k)xcoUO@{YvLD6*25iJ@%$@`BPsY;UXlVPzo71W zBF0lCy3Y6L9ke^?v~CVW`PSXtl!(cRc_fN=-m_T4@g$woS<%WIr^!q~Nm1AlY zq7VP0AocDkAmRqSi%OYc0ewsoxsf_gHD14x#?H<^d*nZSeyCmx4%B4Ww6SM?`0AVw zM@rj?b3If)C~o2){_8kcJi#+ur|;%^H*vUmsFLu<$1ZK(<0DR`++fpWM#!2Rp3fRn ziz|d`kGHtX0k2I3kNiUv%XBI`QzabD@o7q`$-PPF3!0?}&L_ zb?rg>C4a~I70oV@+UGXAR8`+S9d~Tqm6&@Kg(lNj=Ow?jxmc)q3dQtRg6heN;JWOV z2I`v;%H4wg3R6-mAty9^M0_F&vAXy47oRKV>MEaCVY|XFYQ9E{baW!WGN1 zZFlzKhllD?KfgcbmGXy&dWfID_GZ;zo)>X7GrBE9k4HHC?62rlRg$2TwMz;|=HzUm zaAOt$ty1Gv=a&bq*ByfT`$n66Kkgop(o^Qiai@kFBA%PT2oZv+SDqqmFyiom=T)b5 zRS^&`p9x0^p4)jy$Ye1NSHr#agZvX}7$0{ga3gdVHl@dK^q+9HQ}Tz9mixVmSZ#j7 z68F1(J>f?87N3UI3L>i?z*ma-P+gv-9I8(<+gj%Sl3~*C$;rs`R-ZyF#~yRv*1|v< zWK1^|?+_fPJ%QAG%$0a%0$p1fJH=_m8h5X}sPXcB%}5}Pc^hLl94SSZtzM{$1`Q77 z`PlI=fA998{NkcbRW?IYMzf1L?>Z2dp!n4%zjh)FXSybQjEqmu9%nrnZ7L=YXOc%< zGC^9WSaVXwM&mi>&^Ct%b7TVktXL&s~tGT?K{O zInJ8+QdY)*+D&E_Se0|X&O&DXRcSxQYsu57uqQvm24ZAP@}|s>-zX~fM4vVq zrj2lW=@+&{ZMqh*>SG@va$0ia(BiCaRR|_=I1Z=eYnoTpMcR>2ECLO8+GUT*d7*)l zK94k7KZ}oT$t7h+$lxCTtr9_FnEz08nBD1_{ zR;IsT)Nh;xUX#6K*g?fu?0Os z6RsJWu-xnB6$k8PDygF=*y{bX^Z&`cd=dl$*2Z?o7XMa4Wm3Q0KpH;8`KxI?2NF|m zSBl}n41xtv9W@i1XJc+UC(B)Rfv;C_Hx?yrfa`9#<&Xn|;^Srgeln0nWkeo^_wsz? zN7zJUYgp9Bn{2yQqeo-?q@JQ&%sM}kV1 z$u-{#qf+f|620?Zwi{=9BNa4B8$^||>Rqa~CD9NILnud%Xk$@^Qd^&tx1vWjQyCqH zUcX%IHo~}i_1)UQ-G{^W@-ksMt&)g$nhjYHy~xw6g+N4Cxc5{VL6>5+P~zT?uf)Y6 zs5q%-z!s{Rf0ff2C(uH)W&uy4tnpv^4P?1X^o^fGM<(!JhT88i zPM`#yp}c+mwrQkR6xn|)xYwyHZyiyRhbX6_T`2Q-`+!bQ;0$T`)3=kEHwQeYD-lmg z(Z-h*a2?|&=TE2v;w{Am3#0UMTlXGn#1Eaad@`w9)}u#!+kf8yQfhO;e&Nu%(NXwS zgq}0Z0Ic}**Iyx+kVV=-h9q}$@Wh(D2vZc|Eygx!d9;$@_Qlv=n%c}l7um?EOMK|n zp?^eHirG2h&z_l6!9|W4yp1Y9U;Y&qQoC3PQ=hRY5#qNLiQ>KVgZb%yRqUwmg)U&n z*A}mZ0M3d>tZmj$r`J$vMKRenUsJ#kllQ>kwe7i%$~z6k%93 zL7kBHJzHtt0n#3!miy&7Y4Z>QF0@nz(-J{n#-;BwC%%!wqL*xqB4uPMB`jrBJZZZkGSojxg#0iE+1_&4E zME0vAos_{}Iu>5>Tcy{Vx*fK6x3lvH5G?yCsf>J#S%*(m6vSx&v}WrV%X{w24m7qU zmomY|@qn3+mT@prsSxg6LNo}FAQZCKk#LmC_`rd$>_jGvBNrG@=PA-FG3*KFa4!HK z03BO)F3SCqtU-7-Cmzd}0fgpKqG1W~Y8>`N26O2N)|V3wEA~;8=<__Z4uE*cAZ!C1 zRmIhLyaWyEGu9{1;A*HPDAQ-QpdgRrA%OfaAtp<4RzCwxdAQEM0oyu~%gqptyLGn` zbt)DZ7)Sk8NU9x&fBx#Sjf+T60$MoWLQ#~8gE&}38Z*~^H4$CeRm0|i4%Ad1Og@2c zJ#=7VC0kO*n811dtR~taE;2zoX~+c`=r^)XUx|!L1QIm(Q&CAG91||9{CVT3N`We$ zCMiTldeV4=#9C(&ewcdblt_~!x7+P|bd!Shb1UaiNkh@CfTJaPd1`a*ZDPH_r6OXb z0YQl6PvUGr_;v<*3Sgh47QdPz)mjk+OglmiCRAZYsD$q}CAN@)|0WamyqgC`69T1NT6gZU^f@NO5j)BhBZ;5wwM#kfFOOl`VXGCFi=W150fKBRd%Cn4Kl|>Mi*x7 zH@`6*Q@}h*NJlvNdjc*PliG%}Qahyk@9TqB14tU*x15PxU?4TU_i_#@H6xEglMrdx zfg;lFrBfezaa+eVb0{8I0>Ze-`bvVQEV~bIlt?3A_@A>ruiJXzlHnYu&6VB?kTn6N zaVp*14&}p#q;nzbrLdN9s0p}sR>h}uA~#?4cp`%P8&IYIlrO(=e411u19=3Tosnh| zg=pRn;3nwwpYNpGrqq`h&(LS7#P%P1+ClhyIU#{cFaqGV3RvgB*Kr@%%))VeG7!h4PEmt9g9n{oH$$1qOd5H^DGqa49=rN$Ybjyhq zJVZO65Ww8!b?1`LLCT?LsH8i%qVYYus0>0S>>e3ZNzc^mk}4I5T}z0|Bi>pINP{>+ z+!FG0B{qRhY!pRB@*DL@@V~bvJ|8C(n^ha^SChAhI^^E@7cXMNg&~3#0AFHkS|K0ONKQCqhh~ZM^xgkDNre5 z@-BtbUEt(F8gkEg$7czeFi8p$;~NyI&2N$U5Q1$;ySh5A;p z%Y=rm79XR~P<%1^#!pO_EavQ~^5IS>e^hovzao;Gnk{sGFKCtW3-n|0T^dy<1GaS> zu}_R{qfn2EhfL(yjY|iK6PPAGY8KQ)l)$U_UdE()4Mp1)bm5G9A$#M~gKEl(`nuTltaEGEO+~{=}e%?#KH%yG%`9|~8fggTB+6g!h^1(lP zM^%fXUw)LnX7K}VCT60;6@yge8l=4-woxh)A zck&TF0JXUj{rW7IE=NWt^g*tv;d<&sG8+rWD_J1p`)I%Z1NzXu> zwzPdw6#Xkq_&=|$^L?Kk=zK<3PN}Gmi&bbz9kjyCY6_0=5rqo9( zG{@wI&F2Yh*b+wfaqqp8Mr@~=MfD;e0Pb>9M!WAlKfQWzNbgT$(hK9X9P*?=4-;Ow z)o$Nyy;%c%0FaEJA%qr2UDLPhQq^B zh@I%A?3Xi_9{uq$>*RX!x5GOhIb9Hv@DYG;P!F}Znph#~C6Y!76L=@{zm|tyzOXKw z-SvbrF$D%~PFeOr=uu{t;LSFL9g5=055OJJR6D-`>mkHnZW*e3X_^LKkX164eUfon zN(KCuLB+&U_YKZNqQslX`osLl?APNBS2q?0p4WTBMAS7@zZ1b4p^u6GQ-PH;@4sZ< zuQR-J<8>qHBOkG^qu3n{33|;ansr^*>~~tPbR38AAb%crYB`1MP#}~` zvnm0hyj{9;jWC(e>2L}&+^$Lez$bnJ=^D6j$=N2Uy>|KDv~jILYR!>X&%(>AO&axp zHOF_!79D=!t5*{**rQ3QZN~cy2=Uk)}_9g^)KcxCqKK~;F6=rKjc!)gAsJBo@~ zu~&8b@8#tre1DnV1RuU9U1j%2h!yde-cgTe!BhJyUoLokiE~C3pK0CBnR46w)$hp{ ztwsDDck(=du-Wl-^B*4n+{O7)waJW`FKY@-|K1l5WN|+K9el;^I0!kYz#j)d+)GQ9 zN>olc>7x`e|IgoP|9O0vgX*3A_TGFhqW*jOqwmCi4{OHJh>AnI%Sc&@w}&f!=*>NY z&I(-Y4yS1T_TE50*<+Nze^65KGi;0S3-hYCM19BG5KzwWGDwUPq*r*YP9-6Da8-Uj-5x8nEPb9NwK{{Lj{4hfqyepCWI>d9hoi$4)U z9|?UM(jMFz)M~AL{_%y#>#472GEKwJa_^PXw@sylb-F)3lkn%%$3N?KXO0wXd-iGj zT{Zsg?2CqHpLfW1{xf4_G`+;@3&8e9pPpWh8*(tbbK2;+Dq)ne>gtQr&%f*(N4Q-y zS~2rAd8jq`g3rsD%$Op2@)b*#Q;;uXARkHiy)J$LE}O?$SE9Zb#|kR+nuT zs$1P$=FTI%?d_`Fhf}-ua#&cnYMhCG=wE}K@0@=moRTG%H&|XDo;=AY@PAzAoH_is zmYLumT5I+YeFoH&roBa&9+`)ah^xsAkJ^3x`jpeVo0(f<4knmx-I1sBZR_?Tr*Glh zim?4t@pYNC$6aF%?|+`u)~b2!@k?vB#XTEJFn1qwZYJe44S9+=5t-@R-)SrJh(Yr_ zX21a`rC|G^TY<`ZcWkr|H(|u8zjYNu3p);sN zz0=+|pk6zf3W5&pNv_4WIL;c?wD>(Q%C)}l99J1l04)f=E;19+eY*7D1gu)99-ChO&iMFyyrUl!a- z-wOe?G^T76vFH|zWfnTO`_r%Ym8w?_V%>n{g?cS>RP^5a*mQ$;mG1K9YEV1PZ%_A2 zLI5}sS3G0B@^q3vJmfVRq&@DP<*%*f#rmhE;^@ib_d-kX!B$HHz2dLJpbb`8`SoZ) zVx_>gc;BPo$#W`UtnEm-3Y?=AF^1es6`QA6>46zi3P}K z-fA%4KEggm{NcvuBP~C%BXmLLk!Rbfi~bb{Od`*`hQ)e({n=*#22FoW=_*xr#&7JQ z6lpf336GU2vnNOw&qF5T6E&$n)rn zOo7R~^0>A(>&We6P44Fw|H#9Ep;p5yNyqCwD?V_j+kZE?_ateJ_@Ac$Hn5d27Rb~F zLjM{dXPzd3{O`6Lfpp3#F{&ZI+woA&G<4+&>bfMU7fF58z!y{|C%b2Jse>qi3;+8c z{v*v*e4ApjCaLfGu3S{;)nek?4JuW_83H*DCS|SINCEA*Z3b`svOQ1? z-c&zCJINhqfd=@vTIpnsD#-`7wF?o3$*-BsrnAmHcYC7zoEwzH{4d=_6lcEgAN+2N$BHbma{Y3gJOyioyjr{0bQNS(-O!BlM~o z&Q~=2TK=;5n7HvsmHwak>5x(V>{X!3+z)zdQT+1e+aOIZ+Y59H_qE{w%Dg_}2z{6= zBco}6AYS#N7J3A1e{IK6!xdUg99&5P86i%!DM~EY_KP)kzq#3CjN3oPJi8fy%ntRm zjm@%z32K=~VKN_2Lxa#wWqt>$MF-u;+J6D`Bg`pWTT9aG8kXHcBoOpJcE8=h^`c07 zRJBM89I=I?S#-bgu843Bjc4(N{<>P2OPW&dYMdhrWc!s5j*R3cFG|)ucNw=ku%ujU z7R|^d>;Oh5RFGYkJj;9|jtobh9vVK&%4hDn(A;V{?+N1JPGBO{Cb(-@mP}Nj*K~7X zWU|zhL}IQ$Mv|FzaQ`Hvt14ojm4R3JNTqZ9|B3yUchq21yK3IlXO&IYc5faB|h_ciQ=c$yMc^py-y|oxxgks7COI?<6(1c~~cV-JK*cjS$C4 zGBfy3gJXj&1GwZ1Kyr}{TMk7 z;p-f8i4QPW2Hp7BU3=yy)xbvp(@brJH!H#F$W+paK#&FXS{CA1emXKT(ea-&pZ`<* z;YPr$LYO$;xS*Idg-FeMb*-^6-V2M`ji#MrvS3s+`=eK9?aCoIH^{eN79M^P*4fk; znUMYIpU*~4rlZfbogB)X>~kD&4(QISql~8@+kd}4*}C`Nzo&Oz`S;t4tk3^`R}|T* zf6UkIRsURUyQ2Q3d8(`bSsJwc@Aubdd;k0Q$D1qvsega}{NI1FgZ-@#;JDBxjtLeC zPJxD)A9EnYMild}`3aP>QLo`~lx&y5koKt_cPNc2WZMAD?8)tMrWbkmtob$-~?Z< zVbYdbmDwk%uS2RA;i8u*D1(D^8R~QnNu7^hC2tMLI7yD)f5|3_ina~5AFbAYY&K}) zZ%@jp3hwCFQf2o>#d-tV#%!HHGo!fb*iG!qQv8!2(0kn_CsGa43rebydP9+8jrCeb z-lFoEHYBJ0y0070s6TMcF_t2$=`UwK+3-Fi*x0SV_gVfp-NM9@ujC=<5)D6H z#V$WEcEZGIJstU03@|OLao?Ll%N%_mJsW%fr<6)-j0f8QA(M(qq6mVyngm% zLA2av`;fYr&P0`%2v`m0FU{@xPj7P(#}pPHyvrxllIVMa?t1I#rJzqE>o+Z3rNujY z*Vy+E)&ucj306Mo_?~F-TIqG1Rgs**E=~hrsKlQG`>~TRORlXus7UZ5#vdT*)b?O5 zW`iR6-LH0i>OT5Rq3<;&DlE&Gi@zXd?`_h@r+=-x_uuOsG_!A_tgk#Eux7|OptAsi z&nJxXm-3LRm`h!2O>RU0jz;mw39l!+z)ih3;Q70!=xcK z1vgu;$*68XwWMOte{ehRF@F)#$@Yxughz!AK7x@3sq+$$(IM~+;<;m)rkERNc68A`{PDvcHU$;-y24_yt8PZoF4PuL7DV`N z;q8H@`#W4gG}89KO?u&sMYck@TWHjaI~CD;!`~?NpFOj;2*Wdr1<*j>{UH-X`=SLZm^)h{jvfGdk;50EMB@xBBT}s#;<`Y;kxQjJ0KX8N1LO1 zv3@IdGDh8$j_{@XwAj}%8-+Ru<$LxwS)=go99kuXE#H5*%z3uAqg|(%=6GZ$mn$De zfD0{ko8B4KC->Xh9+)8g9U-)drros!KOwP~^Szp z&pxEGKxa}hR}c*)p_N~mL&0#LA?W+m9jX5w@vkL!fN{ypGw!#SeSQBrJQ}_@y#kZ| z^EBNH2g`v3HwwS?4c2ipd*QCc#|JJN;6FN_Lmc5&LY_Z$GXpIjoE{ zuF!}%nrPsw^>RWAGY^mZr|@3#bE??3ICNQi+rFZ|7U!}ugfQ$~j^=_5=ETuR&e40# zfgW+H3WUZd0VUKNh!7*E0{fQmJtAxB_oJXT!G4f@}>$3H1@@f78OdX_RbS_(?8yk1sI6I0T{Xg^=)x zPk|oLrc1HdCjPP4hgp(jj<&zZ>x30_A*NGRGK zFWEjc9pm&Bu4e*h=k3jud8Say=jXP%Nzrp$@CzlOrl8az5qQakmk*Q>?I2RU8Js1BZIL1xII!~qEGj-8Ng^0fftMTH)jN?LgMbv(N90FnCR^%b~nF1m)%!M7U+3L9Q*0mkPnS?0*xKbfPdnLAP(`NvN8};~`?1wlzMKf)HVC_S9DgSc3Q2=4 zSP_-{Fvv2oqix*iV3Hw;SFDkc9ji1A^zLv=8_l?WPY7gr}4z}9ljAw1X%7eLNk zJucBXCxt*WYvG-k8`)>Tt{dKqQFkK_!g-C}$=g+YunMq%Rl;_70_yx`6$hLP+BEBL zeR${Y#akYy`KYUqeNS@$1KA4oX%4cNzY5j~tDc2-4`WQY3BP|P!@vk%#Lh>N8}@+q zbclq{h7%!`;2Fj_xDvL|kGby)XfZKstN<)WmvX8-#z3G7flgZ#Bq!ZTCD^3T zzX%D2U+t|)EvYW)ZhPy1e&PaTw&5KthyuW3X&f}MbQvy0_w(WZn4AdhNBsWUfYdZ5 zZ(g3nY*??zQ!y}I==NODu64{wbunz0vNByB?JkQcxSu0;f9M+jB6MW`wjkzfxfPQ z?Oi&K3`TkGL`;AnEIzo3fh*wvv}3?F4&l%GC{OH$!JKO_$?j4Sz8SzL%8*%pz;p2y z#4-#l#mE8t;=8Ma<(hwLqT}9sOo1R8mmgH?*oaY!{X=tCrBJD-_FcxZy zAnGJnh?K(^(Q@=fk1;8F$5!A~6h_A1tCGQl(n7zjP^5e-fddHyx+=UeDA)3e-RB)~ z9+!H~;9004cG@5xbJ!Xh=Baz#706fMvlSqAw!Hmco%pG!dzsm%a=m7OS>TQvlIoQ=(@(r3Zu$k>-f-GjbD?G)p%W>Ed?a7 zVD~rzh;S1^v8U5I_j4Zd9UtX24Pe{$i0z0o~2%hDll>c1AUikvZbaunBYrs9VqZl+m9Lt5Q5p3rt@; z0BB4AKMoV@1kzp8G#Pk9h6{t)1!LiIMa{9Y-t9$?x=wk>Lvgr!z#TsFnjY#P0D8~? z6pOcefG~%+==FRxFbjI5`X50a&iVgQbT57_zwaNwcRtjP9oJg5tr(=_C~K*{Qb9>qHWtbwCm-A%v}#lB7sNSP3B{hfhv@fBpW2`~7&__x--^>v}!E z!sGdnI^M|5!Q}%ud;32)gSYvyWSE@_rxJE;#i9R4f}FJ+f`37a!cpmSB0=^2=~o#6 zKXGdMp20BPGdPg_Y24dkQh@?`fsg28n#1ZKh;)ohDSF%2;5pgQSBLTQtwF0#aiOq7 z!?3O*Tu+RS4jC(|fGTTuu64u`Y_T(R_(hn~aM$uovRB*OX;eDu7#VjhO-C{ZOA<6L z*}rcTx&f^^XND14-;4XubjRIu4!Ly5=DD z;*taS&&JhHTAQ^5&B)X7={RKj&&!BO)K?;8+aeQrn7^-(jd;@v%@ktJC~dy7abwI? z8N#gROlZn#{j|-b$X*O_5LX|h;{`z5rlDLDakDs=U;#SMwxX4<1gSBQ9vp-J1o{OH zJTc*2yj%mwJud8l$DsRlFZc>|M_IaOeTegPlI3olVGW4&`(HGk0gu5Xb!~f5w5*me z1P*PPON5>j0`37Zc+73y24LiSS#My~SefXE8J80IU*Sbe^n5s8M zXpsUQs;}MceH#1)8Tbq*p*>riS7FG@-yl<#*Vtg?^uZz5@$$KUg{{c;rB#Pv!-kQ? zCy=%qbk5r#b*G21_>i2G@lwRh5+z$P7j5s1l{n)z3O2_IkeiY+*Usr^Cow)6j9Vp$x`oPp9$)3MCxaro%ca^~RbW8!c?5h=Kmr5t&ZsEycXLW1CKQC}U z`#!AQ|Mcqjr_aHtZ4s!lJlwv1*lysVWYv!6f}=r#ZC98ccWklbEmJ60cxv-Ur(g98 zy0Z@(&ikFi&8T|F;JTzS*a-pp(4|zCxlS(=)2m>_@W<^wBrd$DzgDyU#m!}}hhMC} zfwLJ$B${F5Dpb8-5fiRjm42HNsf5RW0c0wkqDP_(Zw+MjLVHPAT%dzzF^V_nbcN?t&|@zw9#NDICT;5rDD=3#J}M zwWm$OM_`SfxEn&Vr+G3E1+oro_L_e&q&3L!+PlMk_{N<#oWIzEmsCMj^~+a?kioZ~ z6j!(k`B@h-<31R?6B(vZ8(!s^(!3pl!{GF86uHPa+N5&-5METP`Jp2640Z(Y9#D zbBTc^X3GviOv0vl<<_fDNIPM#2Si!^R{ln+367WJt{0l47aKd7xVxE-3ySqMqU?z~ zoL7!9^=UDBi*_~_^c~8N)d!+RORNbp-y4UZrV);}YvTOQXZz4kF=`T?-#qxtW@>HG zfrRDp=_y)5_ARb|$KFW_HoFH>rO5~l^*NSsSe;AS*#4xw0{%;MW`BdftmKwc& z=S1&M47g!IjXi+pGvr(9FI67lzW7(RAs*XB`7B@MO7Pj$wej@h%wOMoZBCcITs(Aq z)0+&4CDl|fDh`#IIAUGrJ@`{%mOUX1L{`iWf2a?uzLQ@H`T44~r|eq=hKpTkaKwl&4 zLV1xZ)bcr5hg!FcWFl`8)sWNBj)z?D6qO`Dp`YeNi`rNJu610>8>#xXcv~TNyq1Vh zB8S1sMPqm>#RVx^d%_Kb=xt2>HG`;*ycxx<^06(xxGKo*yB^iurChHb02iw(q|*vn zEyH{Ybids9^-T3TRe`iJczadI&`9#hJ-0$E_P?U8x_N+he9LPS$pul-s(=$TbKgEd zbV$aVj*|MHR*u2kd!EmJJ3flI!|BRTJnTVvK&|&kXpgV{0gJLCt$h=W04Gk{pD8Hq zXyZDro&R`wYi$}DE%+xt?mMN5HZbifAB%fan!FGYbi&2lw?0q4YT)$}rW_OB684A0 zh_8U0D2gw$E<9;e;8jd>mFuZrAK&&?>lv{0t1wB(9x~lgUpl%-(X>Pu_*_j?gp{Cm zG(5LwQ1&h;5eBhTd)5hSSkykUk)BzTesCnA>G1Xd5VTtHBTe@(>u|y`>dDFd*FRq9 zp!ibPRu;?@$iqY9(b{@ZpB~ubnGthiwJUpvA175nf;$)4_5cUhgC%Bb$JKyCnYjGuU~GaCl0KTo>InZ%EoPx8ot`!|5-0qcO<}0AL|<7qg7x62<*T zRFay1`*aY`LGMMQoRcH}$GO}m8{$H_v=pFPJCZNrv&_$rgKc0LARU{=J!W|LQ{H^f z75=LrUgIc!V|}32mIl1>2%ei0dQz4t0c<7px3bH~tl<_HpCUPpt|@c>MfZ4;WlC%9!rPe7Sv5)TdLM?~wY}PIH8kY zJIV2iVD^a+NJ4#mx9?m$kRRJv4gT3nD_KR_EzCa}Bz_}%ai)UJ=0;zaR{QU)%a064 z=gnt{{oer4Tm1(NooD3MKe%PvY9L1yK7Egt9?P?)QtQ2aphum{N!A!E(uy{*g?YWD zPi2FCy(PqV`in3l7D6gi^6aui8fnoH>SiTn;_GOeHqO|wkLIygyg6)?v*%lWul+VIUwaN@gj zU{ElAm(r`^Q!vkBK=n-8$cDM?N01!pn@Sty=;xb}?`C#G;JH^KwBKF0fv%_$`Zn@Z z;(7mT%n8qUOep@U8W-q>s5;Ckr;ULBDN&RFI5wSTKj-e`{CX&D3^Z3T<(dD{H#svz zR7iCVucnN)NNJbiKu_-L$)8P50IU0k`)vcnu_Y*ro;65(&zmBVa06G0bEhGR=R+e8 z(?M6hXN&*K>T+6?GU7K%;_P4#eD{*)@+)Vm{SU`r$l)#&-QgMDg!1XJNVch20Xy@` zA48Ya%=_5%mA@Hb{@G0pn92OGj~yc6n+aek5(oi>xFL$4PwQvC#u`R`+kX7plU=nb zNZDkRFGuu>GTO@h&^}!IrvE+V^Edz^C3u>xavb!cex7?OU;g8QZ5kRMHO)3p6$Iv4h%xNN z=y%wbEn3c)TC_#F$0{PnBRC_y&?>*q;l=IbBdleyD|+J4e0jfVQRul;1x4Qk09tPz z26q6&B~#0!g1=e%F&;jv68JC`_{5_X?s59&uKE^Ure&VVL2SQ@lm0_^v0x5(ixL{^ zthiUcO>S}mV)WBp{qZ?*E2L!}p*p3{mZ#L}ToBRI*;D-UIsZ&!wM6-`P&V4$IUi$( zxfTGuxjlXVwEmDv;z)Y{<#d2irw+@!TGQ&K!dDQt0q22@vWk=tP|yKp%s9*c+x@Y+ zTO>P4hMitPqLhXIRv~lY0m{5u*59(&(KBfw)z9E>TqPR6s`UZQUY=b%I;06#Z6=pP z1uc`)NY`BbOF;0&t3g(8#}}9a;E$?~2HRb3kYn5x3vFK+`jY8>Zvy|D2oPr&D34}C zVp3QE_wkW%Wc4nIKKsfJe3kj)>B5&W;?!@t<7?~v_v6a$4p-z>hIil;hY@`zg8U{Fa zit_fGn{(iMULmYo^Qt6>eFz~->5{DguQ!pjT+JiDT9mJ^m+!^d9aDMf*+DN%-O`o| z_djL*uSRmL0b!p8UlvJ|FI@W(jPNBKj^Tk8%He#KX=z$+)TVl5tzpDm*W~YW(enC5 zUHZpD1WSe6Tp*8Y1*OtY%9Oe5RrqWKm=3PCn?d~aI~ko1oxY}e34-7ik~a#VljSAA zMd?2ch|T>+_?`aQ3we!que&K>;Y)5>lbCUUrD%nih9K6cIwoqWqU1N1YVK`W5&*7r zZ>I<)l>1hLy#x~GMDzRsdHO=7uC`ay3A(9R;T{P+ew8cNYUKT(QksmTW$&spQ?G;U ztd(%|(aR8ks&aTDLg@8PHKzmnckw!+c3%2@Q}z1s+?Coskvun=DcvoEx@dcMBZ#Fq zsopH-Fz>cC5;mf9{iS^_+du|Tk{=}LyE$U_sE8#7l1v_oL6VOubm@#`*}|n+Tlp>O zslBs@;}lHwZ>KB-;8F!Vn5LniE@X_e3;2))V(w-}AR7VOHZF~8wfngzC0fIB$Cg;N(mPEr=X0xx!wi*nBZ@a5(&CsmFkxF<%+M4YC-1YRz-42!c z`GZ@+rEJ6v*AECs5^@IO++ZRT`eG=8fd93W;?2s^7nU)<9+jq*q}DS! z*A`bX`bx8;7{{9Hdg#E`d%-b}ZeD{<1|y6mi0%DHTnM>^7rEK}c^->#SN-}S7b%v6 z#_;ma)-shesk8QZdyzMtz5V;G+MUGgV!dpFGzL(-yHlCES{_D*`4J*YNb=qF5*;Vx zR{8pJTrPQ=>8Bc$PyZ)nK3;|N~90J(^i@ml;29YpK} zY^>c6sa_z5{T#tXeJ%Eaig$g?ycaaVE;TjZG@R!j?m#3M;2p>zC(9_n4 zTEgQJCGrpWW zqj#KeV7zSQgLi4eWq)7nd!NTuz|$C~WB88@g5+ylS7qZ^h^_(o0@%ZVUCW0mP4jol z*8v|O+IZkt#>UTo@7MmKj^rXztHlOYi?Y>qrrF9|q8Y*xAx-&Hmjj0S4I+O!? z_<3P7(inpWe>!QrNT9tCe5ndcUT@_3`_Ii*3cXjG!~cvM^yt&Ls}TtZkfDKv^AP@A@yId2#G3HN3lEWD zcH`VJ2jKr}o8ZMNSwh?;TLWoK7W~}Z6>&bnnOS1Xv?yL@7;n78kALF=Q+BG{HUiXD zOV)YuadYGkwcAdW`mLT z^3}I*RG>}O)}9iK3!yPH@}w`$^In-Oy!uQs`Kd^?I^yB#x48%xq~#TU)03Rj0ldRi zfEr@nJH5lT0ZEuA%3N1M>{qFr!NYZxujnv|C^kcEKO1s#4Pw`v->yBnY4j+CaQmGn zD=O!pm(C^?)Fl2>CRrrO!w?d0KA3qB5ug=)YA^KtB{pmYCyw)fRzO!Lmi%%j$Z=Nx zIqYoXy&Jhs3n9cTmdhd9@g(e*=O2L(j}SSLDe>W7W6&Y<(tCGMLM#E%mMgbw$|a_O zHb@Yxlg91`3UhDH77nmJw!csD+4bSwmX6hJ0mC3xBz!dkzi}AMVfHqpl#qt43YfV| zx?jLBxcKAslO_J=Jaq$U>#p5yE_FpB9Y1<}{BUSvNH)1MBT-CL7{$yq%5d-A@cQBq zD!CH0VMd&)kXXFW9ZovFd{5z1H>;MZW916fNyCw!pN!m^VV5goPS51|X+iemxiPB| z;x}t!>kw;&dCpDwo@D9RvS}F~<kXi*%>f1hj~uwu^|Wxn=n!JFZeJ$2*8}1;{%Q zgj~HScjJL?2(}iqiX#YloH%ge+(!{3Fk1m#S&JgAO=)S)rF}=F&Q;9ceDCq%#KInT z*D6^6V{05hfm&v%07A%Z(|afu?-+5DW}WB%1=@8G2Weo7yDn!D|$d}B3s8)ChO zc^Ix6yL{Z$rL+B1op}8m$d(3b^SDD#1Vr>mm#;<2)4&~jbrW#Vcax6qf%$B{U9@V$ z$_?@1C33b7YJp~VFRaC+!N8kfxi_iM(1xVrnxlWpw;rRWw<3jRGoawu33x_|GQ;!XFPK)H?F;9L$HF$dkJfi8eXO`%!0Ol!|+$jQYtA2mV zOukboP4F(v+FG#t)4AV`EKTSE)CCf*{J6ii)e8}^PWVg)04?GOV%D|Gr-foR8hm{P zA)wmkM*g2FTzH8B^6_s=s_MRM=H?^pQVs6em8PQnHYwZ*TatDskq`lrOH*2A08Joc ze!(AI7=M^Qr4%T}A>;2_(-o1A|IX`f|NYEl$tH$v1qe2@zAH@3`*Tp9+6r=}$(A32 zL{xOFn1i@RiY$&IR?`ed6w&fdg;QaZY-ZInI3gPa*Km z!WZi8BBEu~Xhup1+d=1^RdfSu^nyfDl+$mscHBO%x`5~UUxL;x!*rh>7u@!Ueu6F2 zbE=_lE*I^9op*gddZza@(G!Z`huV*|AWXe_7CWqB&TY_nM4n#9*#gKy-ua6k@31q< z%40i<^OQSD=X9SlTP_8=XjR-NX82Co8G&3;Abbb&{L-BX)Z6GpFmy{Ob}z~4ujj{i z^TseXVe9)UTWz#@V*JeRdsf>)Pn!HfFTKAq2-^bNNR6WdZw*C}^^}g=ycho_=G;V(PV-KbJ_8mY zZ+)Fx*b4-~?jstI(-wlX@LZu6;viUZ=#OF5=CtN$a;f!WG`CLJ{d(UqDJ-TA=UG88 z2(o=M6B?8{ucV;Zn<^hN*Kd`^K#Ujr`oH$??)f>5^H63o8p99r>mq#qTlMIkaUe6J z)yy8C6RTU0vN|<_~N=QpegesD_ya=^fo@w1kfoDUeR<6%LAi%RK*g z_-R=r%xt&l&=pTA&T6HwwI*%1b7ir0lCS-!Pk8@ssozMN_|fL|W_TJ(;NM=j2E3zU z#}>Ao_zh`KqH%yZD7U_DQ>o6|d%I2+bPk(9-?_>CUm&{cSrv&H3aBXJHJEj<%RSo8 z*V$l5*&bwCCI*tV_wd&`sq6Eutk$Y_+1OV;T(^2vpRlb#;C(J7g|6Ssx*K1Qvl+(4 z7d6i-PM>C-Hi%VFZo`z&MOI&>TeROHM&;10S>GbuxhvUTU{@~G5<%QCJy~$bRtgTp z?|pxplJHKsJHsl%>H1`kqRbJeeuX!};?_l%R{ zV0#m8la~FMjJi~yc#aG(ENKL>^pUN)d%yuKfjnLAf3UVqIs8wn`-IJ`Q+&!h%+}Dr ze$XTZXRyU6b8(G*s#26^)tzd9HaZax`?Yt%_(GZA7K`|MRNZ^|CHj!!{?F_g11~ zw5N%ctnOBY`AnbA)*KEzr9l>fvo!rA2`A#8QHW*ZM+0C!c9hmPW&P5~>aj zCP9ct^h&%QM68Upho`}PWcKxQOScVb+5F5)=Ad9m0}-QIDhH@5R<4m}_Cu?yR#V8hDc=5n@tOe+y+zY zAWgF#*fTLi4oa7858AI_Kser?_&xJQ^A9vdkN(+p?H*~AoNJp|e`H?J%*w%qh!`N_ zjs>CnO~pVV1pH4ZT1c2pQ*fA0?lQWJUHdD%&hev{nJ}7Fqr~kCuizJ@qs$lUO?S)d zVmNjm@Wy9xyMzvalfMG!^^^HN)hx6-0~&y(!aR4)9P~RQW)e45S*c=j6sR?B`VLP| z$J+yPwOo@yZT{L{>f;+2Yny35Xil+s8i@O_d4D^^BP=R!>?N{8o?Re@p zo=5p*KuU-No*@FA1oY@GksjC3H#UtWY(scYC=u>j=omx~xi&K<%x}kWW_1U|Ev;?4zvTn3EcBMiHU)zX~I5JH$|_Xs&KE}5;AFII?@`U4DpJXE+RK1=J{uu0^&^| zdhO%A4k;A5he{1!wII2ea1_5`c#6Couo9P;h6{wy-48Cr2WA&l^%eoIK#+aZK}B8! zqOmj0g9DihQ}CLCeVd!a7oDlwT0)3B_FExrn?q-w$x#pA4=9(K7>hF(l-M1-9{hRw z!$MUjIVTikTO`~bn(xl&Tcqc{|MsWy&>=WQC6}0Vlb5<_gUvTK1rnP>BSixCfv0!4 zMkq*G(2Crr*k>**8l}V6u?`VJvtsc_XqiRl&6c{nEcI6DlE){zQUJNToen_OletD+ zLKv@-U(y&PbIcyQ6iTXvE)VZBxJ(H2xXId@-6}@LFawN6M@k;v;p~Qd(WIViK+s$M zql_6js7$;ci#+OInGkrtU}1$^+UI>wvOp8!fX$E7>(Osdg6)Zw?NDneW}YTyp2BU) z))L(Qw`*sAVc77q)^^euKku^t7X(WKEZW{Gg8Krbr0AuXzDQqCG9H~O*kxpL1YB>Ep9kSv&fP|X=EK9f{ocl<{+9ew_Vy}u=)L5yPXtNqGGd4 zTC3qz-rF!?(yL{#pFQo4d|V7eY?6aVIAz8lU+O|eVP#^netYHw*$R^*OfgHQ;8N*Z zy>AM&to@s^Pe7)S>MUb!%@^qI*B~R%jyyJ!s{8cCH{#v#Tn8pFpVc4pUGQy+*eWt7 zgKR26PJ<`Bx&LxndQ28XAllPw9cHR0L97KCnYNBK3zQ+b#6Q3^l*VH8C^NBS*P@xG ziK%62*nbgH>I`mVRo@pANN@4hz&VkP_Bm%<{6ru=wV8OxZiqE1?k4p5j9a)&Z?(d8 zlNK!WF=U%2wjSw8a{Q4K>f@|$Mo@y(TdtnymjFBUdC`;NNbsN?#GL_l?-$#k*rp2> zMj8uR*UAy=+apU#RErs!%{7Ne;sdz0++ZJ)*e_&DQLYFkzss6sN3L3lXM?3e9^})B z6QU;(g6=)f4L%Z%`FDchwH%ff7;C86x{*as13E^EEn0@(pJAEvK=yywo{f>L8TbVh z#AyOZ;~h(p|I2dhW=u~8Op9DIf#&vHvJ%9q1yZu=&pL4z>3n5oNZE>jsfNzy4bn;0 z(k@}3@y+Rt9cPl0MPIMpW+iS!#CO}IvAhR~f&FR|1GP9fwHtxSK8r}7L9S&1A`#t3A=dWc!R%+6Z35yAPrQ9my&1#mNIy$ z5^N*P|eni1o*gt4EJxRf^tP z!4(VSvPjFlU#k6$xHjYCOcF47WO41ea3j;M4XjGR5O*U6=#tGa**Z0d zCEmtr1Uj`S*^QE|7>(Z_mYF$^8_s#(VQq+c?Bk)&j#RBiX!K|T!(kpE8Q}9r+}R|V zBybI~8d>2s+;62}$HA14AX;poeXSKs3vy7d3XT&oF1Ta=;{wm7S!q1s8}KBFkb2vT_2ah()RY- zvT+_oC;i6@ipBPUwLJ%x_TMd$Lg;H&D`+D`tcTzl(a!jjyZc9EW|}cqtzeNm0W5Zw z+9?xDqrz<&WdbF~38P_Dmc|7>V+*>S0T=?K$9D!uY)SxR*7)N<@ppPI8bKP8xxS;# zdna}V4xdd^!q@^p(0ewAq;?@fvQb>G%6A9$a-z3LjlP}Ybb>K^CEKscS^eEqP+mY= z&!tbV45KBSLDqUlrZE#lh(GO*sXgMknU{#{#muH2BNeA&rv}cF23#6vdK9v7l9FZ6byYNUlxVqg^`T55-V8#f zv(_`1)2>y)DN+x&ZE53Y8_|#baIvf$rcHE#^Ei_|vuN)YYUQL+@l{}bF4v3=rn=3t z!a2qXxz>q}EQUQ=ZDqaMLE0x4O>CU_Sy<=5CPYCokj0%EWR20i1ZSVklD|4!mmH|R0qzc@g_%hq5_rBe z`dTT-%@?xnOQAg^fK6g~Y|9N;ymVpjGFHr|w}ejM0XFw{QvghC zD3{T{>rBUT9U+aG+D{$%hfkF6)XiiPR>ZS#n4)a4p+1*XnHHF=zD4D(#6xazohD|R zLL)htTMrjpMcq@5gmJY+aIZu76H+SV)J-~|uiT0Bg(;U9^ZPJ{ntz^%S5JyB6Q%!Q zdTo*@)8g(``{|tUqoZLB=bc!B!yGfAdJuVgyc`Tkf;?aR%>T5mw7$pin;KVLxdah@ z@4$EzePY&vKkVc#+UjfOjJShyw>b#VjjHyj_ceMrnq3x)+}a?(VM0DFeM~o}4Xohg&>m5boThQ)+pU#zw(DsYF&azZrkf0@_3~UYO-ZYGh)0BZw}^}Z z+Y>a};N-i3R$_gJ3@3ekYg{_k1L)rWgrzyfM9lpd=<$Ozvpdy#NgCIpH7pdt+T$&g zzN?O^aiE>$(>V>x+D;tIwaF2AzqCB2!}V#M2ppXE_A4-k=V1>E@Bd(4)R7)K@s3%< z4jQ*%kJH!IvO`wvVIe?o$lt1M+WEAB72f5#QWlZ4Cyg)IU<&y~g;X%^7_P{)Ebd9s zS%m0x40v_`*i!5*BqYTZ=;fgCsdQZn5W9vX44^g4d+aqFu1EM`K4Q(rb$qLFVJ;Lg zS?kH27F#-Smt8SneAYMDnqWfaaF8E9n-$Eo?&clr*q#d2s)KL|JReBsxc=|SkeTjD^&I*g-T<)1yPC<)0SDO68PBSl zVl_mm#{*}LXJtBP+?Cz*nGcbioc|Ko#<7r#vS_R{U4(N-M%;fF2#^HNYPMMikkkRB z4zi8@$$p$=h{Vv=bG^#4(h)E z1K`1((yJbO?{={XqbwRxePACCrE`%@PhB6PK6F=PO;`AMu!x8qmv*eQRH71BZYK$1y=UJbf7*eXZBq8rqdF$X|_Y0bSI*>RI$(@?;%M= z>yg~Bph9hA_al3*F5xcB7~-Tl-s`kawxAN|XIu6%0Uk8NNCq1)%9O@f`p*V-u;V{N z-1)m$t=-m`O4Lft{yFI+DJxVcHpYR1(cGF~-OI1V{{}WuDp{tjqBd=t|0oc*eO%GR zjE?%X&VUW`IOUVPg>BH2T?+aqv1jBHm#DfN*x0>j>j<$W4SLhMgE$bPhfSd7N{Dgk zQewOb;)7r2wT^F~g*}{eCK|^^VAM6b^^6SM2sDFK_&EZl=fCf5VFMP9R|o4_b^UC< z+hfEduot==`x8&Wn4GVWyw4CyvJ=}8wC5l&U`}d5>j<0<*k!xgDoYL6T9tPJ`I>s( zyJ){D$%|F(jUli&?Mi}GcLePA_26DNh^p0CdQ^%0YlgAn9bq;~APkLD>kh^r-4efE z#$ZgK6u9qL6P@1!Mg|;Dk*@9R=%GspOY&hSc=%G0cHx+l5=ih6>sm<7Bd;!V2U!%c z29kQuw6dBZa(9U8^5=1M6(@b!Vq^)%hpl06IJ#PIR%Gy1Y9B%mrK?X_N{P{66S{Ap zvU^jUW{AM9^$Ve7sUKTPuUg-m&h0@jsh5deY^hMCD>dNOxGGsD^y|liSDt<0@$~mv zSGmZTw9zl;49Cij6E5IFQH*O&>|?=eVb0?(FP;pVxJK8UMAtn!Iu06JCw+dRlN+Z~v;G2Z!@Yu?;@*z8w7^sGu+g2t@ALla-$lde2MIpQ_qlD{mhF?V0%=7BKTAZP8JJ9jCy zZ>szIkcA%?8>Vo@J^|)Cz1}tDC-Ta+S7}egS{E_ev)}vt^{r8K*DCAS=DXX2$b?u@&T1d+}7c?gwk?59n zwV;u3^9SY+EOEbWqHNEaO`E*x4$}!L9F@(?O_{m?92yAuS~*e_WapTN@}lPG)Y6tO zK1#s3Pte^?FX!)cuOH9*0`%SXfc)yR&WbAe!xZdPH$hS$m!m)0xUtRmfFk=!CD(p- zBY5$qubeuDkAmvm&ELUlQrA6gXqI)A*#VrsNmk+<1Ah*f#{X>WMY)oH-nZXIJp6;= z-)|yCY^P=Rq8RmGjH2a$MS~Mo2Fuvq@=9EzrFG`BS4G}9Hq!>bZXNzyqH6cdX4h%t zDJ*SSb`wEzZr6|zeTF}JHYIj2bYsHt)puQs>!|Sv1H>?gx2l^UHItC-Kt(BDzCY_K zk&jO0ORD)R>jATe`*i};osun*!-rQPo^S&|(ZBU$LTyeAh1p?=woieHqKvEu>to1$3MAV{h}Sy@7<3D1v`Fm&qSTBKFWeX@YUw6grX^?AenBSq z+fi03rT!%`bo2OArhSo6>rZr;2Q3}7eNJMXSO<|D>{*wRwAlZ@Z*h6iBq?gNT5gTn zcRjDDJ_hEaG#-t|WjKN4G^lu?<{u5c&M6IwAf zY+bQa<0(_w0^79xaD%(*6?TJ&eHE1fIl6$bomz^ucPxXu7sXUIOh~M^q@(QFT+=FD zqS0&c-8UY<$n>nOz))(SbPj|^{OoaY`{Ix?AO3raWEQ= zElVXd7*_U!O{cXmMk^4rhp(~QUxxnD`=DUMY_oq6en>(S8`-g#z9_vyUP+HH;%Baz zBIr6dO+) zH9X@AT&mB3GRAF9*>nW2kxeN1JIY!odD=)N(EX@;8_290WP3PO>QV&Y%j-w!6T79cSf5eJG!D!gE7=%lQ zx^AndTn(Z#q?PKfT}c;GuUEmt`x~lUMG0JjVq79mzXCg|_MbdZA;@7}L%7PQgL5$B zy;ZBT+~Qu0e}f_e)CDdJoF7JnON4%VTwm-o}PX)v}BOx@Dt9MvcslMgiHAk$?Tz>A2+YZ3eAc>%^C)W=m=xTIX~|$ZXR*8Xa}{me=R#Iy~sCGpE9UKD&Up~ zC*dIF6_aZ`K~9ngq9W!axeQdf?vNG4j71Dtdf!x48>}-;WpYwG3{WeArimh@{n7RJ z1_pZP$VsQZ-|*`#c;pGu3j|20I#zhyYA-Wec^bQ>Op5Azq8G*JPsaB} zJ^cbn51Ar&u917sqN}4KRf1>%_jHcyh_qGQUcpT2@+;3Jnl>7Nce~&GX|*VCTotc> z?2z0kPm7Dp`a}MX7D~#FAKjP;)Yn4>n%-`ePsPU;3h&%D12|yA<8hSH>ddJ3U3b=e zq++pGVdMdTY{}BJjw!u!9;G*b?EdE9sqzr9c{kA3R!Wf4iUzmU)Asf+bHBI1CfiJ* zmuzLMcVuEzjw?_aevM+XDwv*_1{~j`V~pS;9EO;%psw1F&LfvDV7gJYm#>T^?l{Pe z2yCe2v6<+10T^O=aler}B?ZgGII`edkB-r&cs-^(3w*djiM9#RrJOH9##%y*Z*&yU z1jDdo%PBBo=HlU#X-F19z-z;742NmRocjO};JgZ(reLz2@0(+YM7MOS*4(oQbL)a%#K;Ojxh z6HZ<+2jRboUjq2WpOhf~3zYE>nPol!d>60yGz~^mN9-Y! zM$;5*x=aFav6)ASaZH0CG60vqRw~l9c}qETjw0rVvdnm zHbw%YL;z^-nw4&Ih7Ie5^cgJ9k>KF%Pg~8-@fMeuAKsk9j1o#B+srC)f%cSH z0e(Vjg6@{=A2C>btextRnoVg@s9k!M!xSw`zp}rPOszjucVtEgc_Jcau?!5<=r=-e z7Zd$piPm+sk+xH|JRoC4*H3g4|1e3p6bg@}7a8W&M8?Lu7;eP+mZ(9%9{6D`fh)o> zDTc%;BR8N?1eWq%I5$l(8x&xd=i<7UCb%gboE|leg}yD+8~?)9sEtD=VUdZjA9nwO zV)PU1O#Ekcp0XwuT&>&BQy6tu)7XZcNNY2y0r9Id^h`#U%ZnH3c3ZFpxcl_xxIe}my-!SxTnY16A@`H9G|KqRwbsdMbQC~eD@8s45KpAz zuQ5%^0XIlI>R3Cax$d03EnptNJkW0GsD4|UNuO1GELe264Noc_+vXeAfYcL_v@t15 zwc%^ACIceF&a=j`6oal%bGg>r0z_D>IHd<6q`ov79kI-1w0|yPpk)P3xhYjyeaG* za9nrX(uphwKDBqRWZAGe<{+(^MhT3aaz@2kJ!qq_)dul~)DpGM+|Z^{k?U{ahX2lB z%talHP^tkF{S9loT=Zl@t>>}Ure6tf6}F6DFtwMVyYFCxOM_vjQuWfPWHkVF3gAc8 z`=+ybSH!xL-)u^3ZMJ-*dxhCF$svnHF}evQp_!}9Ge-AEO%ZMjjfP`P5`g-P$_?u? zF@#A2A;q-+yF)z?Ph;sef3g{+_@KN069A~NAoF&S>ljl9A4}X8OC18@`&HquCn2%1 zKvkt`zDG z2@iy^@#Y3;#YZ+7eX}DP`i|7U3{tK9I!2x$bH#LGQm(mhH5k< zK-Cyfw$xocr6m!okOpKM-aW%P9an2{8d!y}sK<4-i0=`$LH60T14C|r;HcZja$>MT z5mKzWIHg4MzoBE52FXBT^`r|*9GXB;bb<6+wXxrOO!~))-YZe#mncmv)P6zIrbVF9 z_D7h0E!O_E{$f3UTX$5w$h9#HO|_#gC;*mJocX7sjV2UlMjE!kkPW2o4YfH;{udI1 znPuwomc&hr-y7}g2;jblQ}|Bu-eVlRd}Hs-0415FJ7XPchowH4#PmE`yrMrGS_F z&ha{z$H;7o?&V>w8}H3>1-kZ1=%BkzyAbCVb95bb31W3(7*cI^}e>T@dfY^EqY&Y13VzEjsL)W9*fd^j4=P;D*S7q~Jkb_#n3(=EPLee-zXS7atPDf!mMXF@7ET~M+ zO&5Jkv;U8```~I~U&95So=FH{LMIdxKsp+F6%%Sez<{7MH54I&B`7MOXc{3@LlHqN zp(s_Qsi>%-NkGJ41#AIPQPB|TE|E)c3JmjZhv z&XZ9F6&(FhGF;t9XNH3-vLws6I?1uEp}oo_H*Vaz5nU7unvm_^?gb5^R!=e|oBq<6 zCgCksYZ>lZwQ7lUu*~x*RQZd<#Uo7VyP6?!RN3AY_jZNzlcHa6z;Uw5^1HHlLm}Nu z`Ndx(d_mhgRUW_@GyC0V{i5J6f6IZkT*~gPnCXl&zScr^aF^kCAGEY9%wb(b$Gh9ns@uvxE&tD#q|%%&n|Ab0~Q z;Rs1P?|jJH`P*v|dbg$E!(LtAyL+(EN1LW`5i|rMR_!|kKf}SqC@{_v{5vYR(kZA- z(+#~Ck|j}k1<@+1Mxzj&YM$yN(T2l{aJzpBE?23-6r`}&ms=}6M`#b#9xzvmmBtmX zo=KH2-fu^v6fpPLviMsQU+8+D*sq4e>9!gh#lkbu>LYWv_sLGmG^(GJ%EKO}& zto9|EKOs&lu-b86f{`$>7H{>wLsU+^B8Ltdj5X>23gy!r8EzVL!*H84(ohO1K6JLu z?X42=%x#z=uKJ%>F7^)EQ|9E}r^o7b(piLl>c8o3Wc;=bO|dw{j9vp&dvlK}tXlc% zZDj=nng-F}_2}T57kMFu6#``*L~mZAyeK4eah?(&mkvK*evv9M40Y$E`a~{bo~mhk zuG+9yshc$)9ZC3-g>Nd|c;pp{^GcCjr*zcS(7qx=w>JbdTV8XPDUfm9ZsmC@szofQ zx_UMK>QVet34*0ikE_;hujany;zy)E)I325uds^}XBWYm-7JAAT(&9%FZ5q|!cRvOCwVe)NpPv-v-f>`(}= zNvN3sPkUcnr;*j9(-rzkHRI5Wwr@j^W9+v#n*9^oVKPT_i2Y4>9Z({=RNQD7X<`Kx z=r=o_3kwUsP|(bMEt~6!nvYW3y(pYWw^u7s)p$MZKC(L7vx=CCXp4lsFLifD3|Sjh zyd^#wtJ_fJQ5a?L@Ug>vq|8B{Q=HQr*%6jB(79VKH1NxTcd~{1WrD$+&09IBaG5N=S#TP(lq|Osb|`|C(Jn)d>Bvd zNv2v2eNxYNA7;1bsDUH~+I~07epEv+fr=HV28+~E)jh)Kkoa+shmbBq|5b7KWp`JV)lF}(f5$P~XypVfJPn?T=QBAvbSBGJZrHQrCtiJ67C&UMXb;=q!vae}s%l!|3C2F|L-A)0zVa{4 zK4@ShGk!{_GtDj^pVry5S7w*vzKyD;v}~Fqg?JK23&V2^&)ZK0I?XFEYNY(4eLi;1 zG%vJ{NMZ-rBM7C))haFzO<D(joV1!(mW>kP_jgB=;WN`_GT?BDxh z<2!XY`0IdSBk`zov5-Mb9o~KI0P5pssv=k$e%UVjQNfz?)b_!;l&*Q9%HeMcEah=) zpN`g+>}avet~zosBPviwZEbQv&yZKJtX4_$RQL?Mv#&jEpjmDavcWWOg%~7mku!zF zJz%@P^-jc6P7`OCPpuNIo7q4_P@{2o9A5`ccD?$Dt9Ftb5b{m3yKRgjlV9|R%&uC! zneyUy+vVHj;=M5raO?18!UK0tIBFHe`k{}LX0@lUj(KEQ9u(SMhU`qyNDH>_E(=8x zOE*KUm3qD54;aleJ*qlu+sGfO9ZR8jWca*Iph;SR!{$}z^`IBaowpZdWLGvHOtO(* zWfnMmm|NM|4`s_ywC!nEe|d3IbvI}-hrI!9=uNL7?cD%et>LQP8@kV3joRH1b$|lRE$UTm|10dS9GJW-n<(_QXBz@K3yDxY47C${b z{NU6#X!nSk<#(g+_sPh=Rl94`ELEc<13{xx5X}a%t_?IBhwaJpQB=e2u=%To)p03^ z+QYUOAo zsh*w}#^(bx2ee3fryC%@?t5(pz058)$!Fd#)^hb#FKWdG%t7({n0#FYC1=@j zyeISqfY6+l+^XoVRpvALwG9wzOm9Q;qXlR0&BO{%#gLUg(RuEnKkgm*&aTj!et-X! zjmR@Y#pHvuSM64vow2$*g@S%NfEce2=}QNqgDcYlq2m?inSi-kJ~3Wz^RQ} zY~Td{m1lP>n10!@Z`k&aIJDdf8l_{Ny&5(pOiAoe-jnXNviqU*aruwA$>)YXog#!< zqI?RMJzgC2$028E*hnu*0tCLGZ8@ue>T87DHJjl&sP`IUq$N2H$(cBU;=nbxdyTx1YXd!@gpnO}e3JR%Li#OLg{v_ByRn2v+?qH-}4IJkS28 z)K)bdWj=rK7WLcbpx5)+!#xS*a!<(4BW>BM+v?PJP`sQ|OU|}GL=Yp!5gX=P15S6w z<|1H~KciZX>I;mH0d9 zu?2=JR`u3&OIr5=`p%0G(|$Rx`RKHg#oT$)9P>@^H#>3o>3Y(EW|^&}=WECa2^aL` z>&}{8y3|AWOvRL5OdO`v?O$X4JtVlZ0j$s^J(dvq5<|H#Pq`pBR6-d8YZFhFvRhcB zo!~ZzI7UzbIvGVqTspV?zB;Ym_vvX^pxYc+Y7%zJbPRwiu&|dl38zdiwf0(X?7&)# zL>e4aGzCYYH|DFyKc25B3{)`JB+jcpeepEr9jnmvoGM~eqtR1()Kh6~dJgG4-HRB} zQx?LkK6%wVTfNK%H273Ue6^yrM0j%JyS$diD1=$6aN*M)OZSbWr%9yKmMVL}Uc>F$ z9l=&p*_&|!{o{1FUb(XR23Aj#+N8I}(p_X48)GWku9*c&4Em=l=q}eBU|dX zO*O9y`kOYR{8_dC=wwpvKdl@HsOY&@mztw1XZ&C*r@nU#@qnFOqq48tP<{I8kDzXX zFs8XS-{pNNo+=r_E|l4{~$fAG?F_`GP){ygCc}76~2SznKCcVu2a7 z+D1mSbwlRb*$uDXa%@rs{siSH#d@I@uqpys6HZ`K_?|$D?vh%BGx_xa)BaXuQhDY| z)0w7;hV24+cT%?3(*ET`1KI8{To`57qb*1Y1Dv3uZ^dJGin!j|^xbrF2MO6I7CvRd zeN9y)Y)2I+P9(`W+$D5mL zIe*}p>TVwE?)dJj6>5)Jx->1a0%E;nm;dPpc)^MLFg^PSKxd)JN7(3BW<^##1)pY< zo~EnKR}gQ=(;K0{hfT%g%1j*{HRGYoS~9xUq{Q-rsHQ9W+>%;51zFl( z;^0y^1JEgrYM&U$D@mp6GfMwuZF0?3%VCyKbIa8Cl`VWNajV7!gN6R)CjzgQMRr7= zm#MNq>ZYL+VMFHks4h?vbn9TCSfo}BL9rj6NSTOLo&eZv+$%W%73aVNTO#~H1qFFi zTAnqu&F=%eJ>p<`cD`*7y6fG^-0RVPjj$t$Cl9R#XfoB?B;8m z^nNL7mt^~|1kBGRe6*NS(Rk{19Z>CpUXL>TLaIvW!rgtMelr{EL3dEQe(Kh8<;L`# z#N8z@#1sxn!UX1S`37hOwH~|u;q>o*YdHw{S9tp3k4)qOO6|w#=Rf_Fb(Eo0^nU~# zYH2t|eM-I+-h+)$M85cN);ZgBFE!%E-xW?zlw+7Mu^hiyEc)xiInSMT?}pUAcO?9~ zQvw-Y3u{vQoGwwGj0TAGi?b57No%ZYh3jg*dQ?v z%Ih|KtjpJ_-Dq)sKC*68^7)^S>$WtVmq*q{e?0G0dVagbg$#}J@yQpK^&-wEHC@n% zx{&hmLIdH#UW@v}PcH0Fu8)kUKh#wJs{F#?kM-vX^~Wq4+zAc*f?jW)EePH8ti+@8Wfo84=-{?yKFYhP>GVb|Plm(sB&y2Git z!=$Ri?Nf(gG@AUoW4&&t*M?5dlup;^PXFeP6o@W~hfZRnUJ;OYG_eN1n>&qUIA+WWe|dr@Cdd_x?+MawX~j$6i25c#;!r9S$y^t*1wt?xT_q4+4t}ya{zr%T$kUOy45A&+tzSR8n3)){hwL zU3;Y0+#RI3_fN$s$2SZtySGlEfA6-zA)6&r*$Q+JD% zO8MM@0(W9jAlUq3_}|pz1EF_xLU2`)z!4IFU?Lvp5_|nm-_0P~2ZD}_P3obi2mQ&q z5aeMgIsk-ln4*?y;Dsw5N{J`%&<0d+5QKcrkRhk;JL-*Y?!FrULPP1qEmrp*@47#} zizstn2LB2K7u+ADhvK$DP)sHY!GyO~4nD#dnlq&6?lG)2c^_kpDS;Dfs_MB9&OX7B z^~fpA2XO9#(_Ie`Q)9ZghZo2riwcA?W8jwim`2u^&KV-kTE%i5XubPxI&bB*L-)1L z**7lN8@X7hLg~wjY-~klSf8C4GWr@oHm4xogLn!PrZ%ng=qLWA9Hs{$zvtis8Hf*x z$ndNuk%dII^|Q2fVA%Z8H~#pPd+M3%p8c9T5PV;K<&?)d3pYd6iVJ$0m}S@GMqb2N ze={dn-h^!^B$mH4sR$zPJWT!smivj15>&C8VuBa-Mnl`6oOj)>W8zX!1blT!3>ZVa z{L(~&HgUlQD{$DlIdrmK|JuOr7lVZ_hAzIi_i{fJ`v04>Ib)E2VWp9Dw_T6My>hv( z4J)KCPhZ!LGtrUMb8u!yd122QmbFeGU$e(dFfaeO?!Tl>lFqmxt1uthxm9MdZDgr- z!jNX@_mq3Z2;Ol3i^6aWHyI+J_Jpwikv1bMq>Y#De@GkpyZ?|j9seb5QY1AHTsMxl z-`V@k8(FEFeRO*e#2sp@(yt-ylBSLzkKSAJKig*c|KT=BHU$iC;iYyr}u@z`J)gRinDEf8X(j?mY`WT-;43{d7Xp(NFnDFof5(YWL#I zSInxRLbVz4-Ih3kCnS03s~=>~{aFd^iPg>vP8b_C4i-5?kb)Q+!lXFusrlph5}$Yd z)QY()TXq1kPTADe0j9^Dpt~5L3p9eV;@^;F2g)Oyy=!SXKQmVR8*A+q|Au572m!`- zer$BzNt99tXL|;lms{^9`xOFHAjeG*92o>LRPV&I;b-8ANPTwPhYBP?^;7%h@*1%U zRA9rfNc=ll?%ayxf4usl{E7wr{77YUwa6j>tS!PKPU+9e;_u_3k}>&tz1;Y6^!8bh zigzaV7o}IHSa1t${QLA7WG+3jClVu=c)?QuY4t%ZHW5 zHi+93`#xHEPhW8ZG0;xJ_vr#Z`-6Vjs@`V~EHZywbpNlBBSMMsPyTDt0#p=w!=MX%IaSu@&M!qtmb3 zvgJWn)0ra)K*ipHaE4pR?AyV8(27SPHmzq?Tho$RA9;Vz4<1u>A56<&*!4vil{)oN zjQ;%>f|EedbSaED&jA7@FfExB`60REXqxY(w znirS_R%5rwdXcwb+n|y>YI#UCgic*!Ju(Gd$IS^waEQzBod~_6sX|`_)4?^+5PD_7 zOR&V;7*JpcsRa7@4a}_2k($37(#7Ej=8h;_?Z>VN@eYK9irm?!H!i*Fcw?cET~NC+ z>q4uJEEJ`W80mg&81(p+di>y@TGD%&pJNO8NL@`I2^lH#acwU&X3Q9^(i!p(4J|3x zOIU5^Lif2KD1fK>LX1+>_-0ZRfqx0?)NyGx*zD9K`#NQXJ}F zW!lH%7*UC-i2jJ#P~zkRvpByRwUuPK3mvdwhMDU=*`eM85gj*KUDsb==ujiqEwv4+ z4H5L|$K`KXW|={%rZ4mylbvTEh~c0 z@`*qO>+eQ$PsvHT%gr+1`-&B5$(1DK)iRSz0%o7a3(}1Uq zR*w-8!%bj%vdD-n)iBP32&;9rRLHiHwGp(d&qM4PVT6-Jv9e+rK(O~1~yuizN0ZuTlb zmC(yLhoGW9o=(dvwNpkQtn#yGJE*$XjHdH)CFUe+i^cyg%RZJacV2PC(;7e`)Q{|C<(;Rh(!~zKD$M$0c;7aFs(@z$r~$nP1RrA+I;SeE^YLR~oRAzSR05M@{?viFogZ8N&#@r%m~`5Q$^+&LYh zNCG%7p90TkclI)lFn?Sk6m3-##yy7FV@ zIIrx0&RemkH>((VVtWdvN1yKGdGug;y^~<{Vl!3yQsI_^Q3m%Izi5-iNIhF`9iFM^ z>F?mZIKwa~Cr{Yc&MDuk{%Qyy*w1Q(V$)V7JV0J{M~$VzFDn_Vdhwq|mi7GXaE~#V zUg9acUIy2zcae(Nzb3|x9#Fl&Y=P^1G#a%fPgI>(K1iw4$5FCfnbc8Ws&`CzIqv(^ z@2oq<>NzULZMicl|6My=txn7Bu!lTa6baRu$l^twQ?RkxlfRmmv$o~1RX#8QV-v75 z5xhjgl(Tn6kO2o0fFz*YA;(Y)${SiiKgT2eTU75VfP>-{*aOF>U~1kRBN6xgu$ zN=M>3pVE}Vkx95tYWwstY(BNrJ}A49y2B5yPkR5XhE)#Ko2Iuc$T(N6Iek$UU4!J zQ^@K#un$BE*<=(K4XXjqos4xGXG$I)T_ICW_VJfjb$ay3v5OFNX%aXMBBcuKFMH&Z zaBzzphigN2zt1}7EoA@gu|^f5^6c0P)d+Vsm-r4XZ~${nK|X`CD983BfKf=y0XF`v zMA?q2)Xu=3k^{#`=vs%Uz3i-{;_YWes*-O=iXj-7w);SZlm0CWl{!DBW(wJq7U_BR~;_Nz*6(P@*=bg)leYN;LAjZIu?j;Jq}yIM3$5V zxTwm-=++Xnx343Qf+?!x8g}A7NnuYNII!Y;EE!|WSz)xwS4KA^M-X;`QSzbEF*XnW zHRt_ml}d5tB9$$DZ@QhTw8wXa&p>%dpkLeclL#5wtg6EwXjhUnlke_7#^1&2(mG$G z#998IRm0J!%0`9GBk$W+jrvy^be4XaLFWygh7-;}rErq?7-9vgnMbgoh_`Gct0#)v zkg3&q0!oEGb_9>JFyF$#V=^NP@oqE}&mzE9lT_BpVF>xbte@w0YI&9@pjf%`$dgo9 zNGf_EZ&8lAq>!Mv3|uR6v=yN#N52vy{UO_)e%Sp!<1EYwy^(}RX6nb7flX|oQgwK< zq$a-|H%P@SQjk0az5q18H*p%0M>`}z9i%8dG6%OYz{m?=`oTJkjoBCn(zC-iDHR@e zqnhlE5-LJ2n1aKM64-*$u@j)a>4m*q%N_HzcQ~4nOk{Fp=JGDAr!k1TAyG>5jfIUF zVpCIKJy^PhN;5_2`HairymB~*ouZ$dKoJ)2Qpid6yuG$53(V2yI@(ax=$I*NA!k2kK{;CrvL)!; zp9y!bv>W!DAPA@ya~13sa5@pRn!p|LYee1zb>p~a#-qG-J=Zp~E;)hE82NAlkm&*% zPPQS6F?{I`phu}u3c5{{7N5AXst$*601rffUna5;Q|O@SR1>&y$qg_wAB5ewa&YxE zgHAxzRK;{Y`#QJ_M#hAOgEf-eMX?gg-YeHPA8Uhob`TsPA9LET`hG&tvO2m_3UTNP@CRELoJ|E?3@iuC8t1p?cVt5jN;AB)+j5n4$&I zhM-;Mp{eslLIK)*9$0~6F0Q~aa@;e?s!ajl>(y1CsmR__m(|ixwaoSUE;udv%9Fd! z-XDLI)CrqX&JlxQLoR8nRW{{c2AgSW*FQYrtNZfSv8`q z&qt2(kG`{6k5&aL_eFz??Kj~z_3s~s@1xo_v6JD&*wQ|8MN5%m z?Tbv@r(qoOJJ1mo5e&k2Qvhe|u!`~89UDN76hBF6gcW0>EkL@t%4d0RrWN5fQ)%Cp zdwWmQ^6Z8eL0sa*0D_PaOX0z|N&S=_Rhp8yI8|jAZE$|C+)Aa>5%Vnxd~0!QYQt4n zTNhygY4K<1{t=px>G5`iz2zX-_y+%M*keT{S~F)NcnxY-F?c|&$NYC-(^{NoN2`)$_c0e7(C7mOF}%@SCEY;6-d5YUbJD9LRA)b> zi>JU}b9h%em?c^N#av|=yg~@Ue#Z6bs*kGMhn=0j9_$7dqm%_CuuCf1`KUuRR@tEN zDY5S97AsIlX#xn?^557Wo4J2o&v_;oFKry7eWtxq0I=9$fG`0k#InSX7de>jM&K>w z33`fESSVk6hIUq>DJjf`(^9&{>yS3LbBiYtH1y>^r}xB6YClfBegyn=x=|=?LH3~E zlE7Oe(##aM9oq=qHlbU@(}YJ{6g`#$Q!Xu%ni@A|JTp~{sd z2$W6Xu7pB-n9_2)5g0WI?x*5iFM(C_NX|U|F&_+P-a;-Yb;x%?hETAdsw*?i=r_vd zj2P??&3Y6=tpEo}6SqEtZ(GskjCb4CT~{I~rFWOC<)W*MK&P6CuP@0XK7ii!mCHUy zi3|*iQAy$_og|{N4Yu6!y?Gm|E!YuC68Z+yBGc0`1eE&46X^S(M51|7irg>36}Et7 z?Anpfs<%N%{``L?hj)L?sjA~Y+dpZa-@B%lMIhft#`@Xas^Goc^*|Hr^wlIU=d6Y? zwmWk4FG|-I12d+jN;q}wB?TQzx{0xoM{TRp>o3{z=NqQ@ zwMy*!Pt<$rsT5$u%~(5kU-_Wz^ujH1#voKZITgB3L+d z`M#eM?YBQS**?`Y!?TgU^FdZl1pYLybTsOG8E(+(ztA%6k2bSvww(M~8++pS8d&adf zd9Y=xTlUjjGIx(bRkmxxDAs44evr8?Q8`F^>~i6%V=c}d_UVOb#g(1(A{ty8%K`PZmb z(v2tfl`$JEWvVe&O?ztBjjF!KQv%H?Ue&0Cd@tokRYRmG--+P5jgsP|O6r;>m0HJf z*Tj}~kGd7}Qmfg451X!P0ZCSw1VAr}4@`Z&q zY1~c2PA6SE8C^5R=-caErV*&Zc9;7P9y7^se2V&co3R@Ax8JPN0Q1>q)hMgUf?J*ZZ`JDt8qvUz# z*^?2rAMc04ns<5?7`SPQ15O!L_3N60QNr>q&dVjwB*xZ@#-|DuOY@pG(rf*|-^tujnw-{$aZhE!MM!^1!oCx1@>o||@@g0{Rx77&8tMQ2qfF+$P)vAeN0uiCH+DCl@=%%1oN?0m=~ZraQ#9oVIU`TK^0R3BgQJNv{2vhs(0=K!}FpMeuleHi8(ZPW%>FEhd^=kmPm zRqqPxYQcN)(H2q$dL-z0zPj$T|1M}bJE)(SR&*{{%58+_NXT!dP(qEZmA;e(x1nfErYR}2m)oUa@7^yJbx8RV+ zG29E&@ioWRAd34hlV#tYLL3&5)CRBQ@iLAU5OME#1$_HEE5JyKTKSOcN!IImZ)n3C z?OTv5t*@J~+fRVxG1ZtGsUm`D4Z5K_S!G1qzkf};=%-$3$q3a;C-3W}B$y{+pZpZA zD9JSQU>(?NA);)i6+3kXk|rX0O#-I#PecmJ;JbHPc2RRqEapkPGQ1$k4~ujYIJWzl zaNXeX(EJ#FEE*$lGgZxT*Y?&ka>nSdS=5k(KGDws`iwl!iyB6&@$4}#$Zazf7D92f zv#!ZUmb)zGU=#2MDI!%>?zxiIV)B+NBCqpx0h@&%E6+0{se_0}L%~*Qbi6NEiMAT*oq$KY!OE zk8)0{T&QwJ-{WgER>%_Hjv-cp!sH~YIUhs}VaK1kUep3=ri(K5(WOg&y9A)<_VSnU ztS6)v?K--8Bp5JTXxQB_kgEbiU$mj#)oI`5Rf023>1AXpr=sD%1Y+B=el^M&ku?xb z*aCRT&}2XM320An$kMG6#*}wVL~%?E$qq;EptB;L1ll6hBbM7~lAe{Ok4VWs$U%{A z`@}xE1gS;nSNV;8_2=TnHQqZ3N4EKqGRA*+KWuw`oK<2`gI1x*@yb4*yE2H`A)@zyPXFiU3==~#DxUS$1FnR zOc&|+Jd&p!OV|+RWqeDN;dMJ?d*y>8hQ9LH{qAdyH~#CVPP+@t&9vzVtZ29F^)Z)C zdCVKmw+#K*E~9Fj{{D8_XjH35%gu9-Sm(vGAqsz`Q^)i30n;hIEW`~%ZXz7f&?DWc-II7xw&o zmtZul{Q(iEZ(lqSC3v9|d)MsSw(pOkjj@uwHpvkWPVY`hu)PN&?x$=oX6jXK)4(7& zgncJpMJHgttH#ae&~xZXGt{{Xm`^_qQdm)CB($cR+a3qgv}=B8UFS7#>d4GAi2wRY zO>|R7Rk=POWKg5=OfISN$4${%=e3KH?ketoTKeZKMLo|&@t~<4#6t)OwdFvH9CLhD z09Q8}WdVs5Bv|LIzrCoR-SqsJ`T_|2;4I)x$qA}Jo_*7mAK_9oi+T}Pp38AjbvGFz z+(v|zA$LiI>8Ec%J-O*f+$WKpTxg56%VU)kF7bzqmb+hC0+CGjRh@vd+3L5Tr*jDH z;!b^`r0Pba(IM%zB5l4kxgA1M1UApNU+@xnwR&z$0K8c(S9HA{{QDsl@DK`w z3<{WYut-vND(PlH#2H(NAVo&Jc>NAf!rMA4GM^S5V3HDytORtI*cQOAYhc*zu0y2o z@qU5DO1H0Ez-M`QnRy7)FU{JDn9CBl9fRk}sCgd+l_mousa-)=PvNZPW_ri^O@n!@ z2*JL=kUAZzn9ody+qJrJGgpj`0N^gOsL)w>MnezJ3?c{OAK46NlO8}GUSp>ShDy6rz z0Fm_D_>942ULr+J%|Fs#EpJeMh)+ofAjb}CJN zpQoMk0YI(f0xiTj))Hhb_w;gE&fg;MisM6->VYP2~l;k+sLk@p{YuSq;CBw&^bM{0Ut-s+nb|f^vRd{_@ zh(zyrLD&#P$ueVxb`SU&@bQ%KwI8@RT)FTM7X7Q| zasHCf#0YD#L$@nI6g6vZEo#0|d0AfpBX_~0SQ}RuCkkuL-gL-Cnz7D3em2gpNRC?d z#9JWC-F{z`+U1xs^_bDfSMw1?V+E5Oo)XC2$boN&;FyBh$;;`2)l>+vi%)Jn;XMnH z{X}hU7_xO9eAS=7(@Vrs8126$+E3Yh;J{dci;!{=2x6dalkEs{U2lMAnSMfR2yWj1 zg|nbo&S~US@L#r=uymjNmDsC}Ft}tqpOJHZ*U1Cn>XsJ)ELgHJ6yEh1ZXW^Hrl73; zK{-Mmt1+R9^bKXChxs6b-|(2%kX<}Hk;g*!bwu=Q3+iI7TqD4Bn?>wa&PcLwRWE-( z8!g$&vuofRag4bfgpnEFK!LDq;6RuhTZzEHS(N?_SP4OF+XV#42R4Z(FWnLyYQ3)P zj|-BY8tc}H1WgMf+PbN-jl-x`3M4ug{5NCS zH+}fK#De`0{*0HvdWoJf3**Y~uXRR;)A=D6tDGZ{mE8d0;x(b!7Jk?9DGkvID&-&1 z!=)7%Fa&|@Z9P_bHaG}c`Y@k$`T&z}n=JDO2Am?U&$yE#6ucF^=8#OudWpnsugA+s_zTM6R88gEZP6d6rX8kfKvx|XjDYG64KS><*&x=5|l%maLC~wA; zV=Iakfr!6hY;CrDc@G`#K!u~^L_0G$eq8#5+&5l{u&46vTM>IN3Qcc{*2y;T8;&Oj zj(u`RU*9D>~>a6-vi=5O}cIR49UZb0P&yp(WL9E%Gs> z;d1vsuo-Jn%DljV%D0OUEEc1Goe^za+Il9i9{Xl{4Q0rpVSwL&vgzWp8eWz#EgjjG zT_RqV67qevyX6?_hc(=+D_qD#cxA##vpcx6kRM+578OV%)(m8paU4L0arpLhxO&4- zetPpQ%je4_u^PU)%1?+I9LO(QQIwo_-|j_O*V{5l9QDaM!9DGDEPfLxXxRh9(AT5_|9+gL4B-anrf^PMEum~=kPp=Y zEA6VFto$@;j<^UR{1}j9f?Y*&~$nF*om72KK)} zQkUYKsYu8`{rc8ZX$Q~6JMTEbK|5E#og{&4Cg7C$&BH+jZUzia2#UZ2{3-QmU00mN zreT1qfFwXyBhMuO)Nu%0o=suoth2_@!B;#A%Ey_%ayM;M6wznh`P#^dBiqn#;P3|B z?LL@>sH%{1bnrOLX*Ryu7Z=ZoE!E6h8xg^07ZxMJYRqe9b)k!R;z61!hPqMeXyiEcYxeWx9U;671#kLLNt8B<8$0k@H}AwPtya zDcwyVX*q9@yQyL#7g)6~0_o0z+Rwv1uSaFp@YCjAHr)r-llUWR051hEG|pa<{v~<= zhPe#H%-`Tq6}IZY`c~9)D`XV?0}t{%SF+4=1CsXCO*-umRk6`gOK=T3-<6Y{CNbS4 zh5gJXe;5@}L3oM1D2)TRa~?a{z3B}?d($|we*o*+aG4nF*&y`VFNH-qd#B06gd(nI z7tb1iQr2Re_lkn%rE~J~?b?X7NBN<%9-qcg=4RXT**QkDf8|jS6j2&igfjgQz*i6; z3lp$NYTbF{oD6Z%nRfw+gDE@ zJ4Eqp#M;gLAd2hN*f~ctzrqGy(;C2M9=7KK(%S4^?)*h_>%ae{GSL!8w*kKG(sPKm z&0ajm57)3o-Y8_E)t6gg$=WxF@;AlvK|y_q+;p_l=Yl{we60`>c3M-%ASY-R*7*`} zUD6S<5NjGzGAaaCbl0PYzOa8BCweRh=lS$ILQCiDA-kbE@AVl}L9(XE3CCGUmmG4= z@$<%1ZJUk#=9nt}D}TkmWAW{s;a;2LgZbn7r<=k2g}G8LfitL)bFvUwk^*+n^_YX{01QCt3ktdzQahG>7Brc_{?8 z6!^xjdB}m!tA4CZ229tGG>*$qR}ZNb{(F1}6K- zyE+(ndOJdE%{NU&EW{d-Ma3!J==Fs}c-zd)E*SOLk^D-mu8RwY$}F}V^d4GVJyK!o zwrAf}dAa&ljn%3%J0I$6ZdrW#gsd&7_1_->TvFm-0ts}<%0sf8ZcyoL=XOeIxl{GN zp95lx#`EEQI>z=pA134_e*e7r5Yy~{x7I*yvwfm^R(wQDjS4T);%rA;2dEXxe#_n3 z^6>l{8G^jw(yokH?c+xvYVPH^tDCJ^uLzxXrqKb388c_Z1Fib2c&y3uee9If#1n;X zm&oHopLdizacuPG-yLgHoKX4vrC}wDMtSKfj7~rWS!PHqJPaF@d%TFPGY47;YZmq1 zt}<^vIdps7k%}}A-Z3CoQdXg7KlIz-Xl_8$k~q(Aht*8B`#yFLKIXWj{Gq{o`r|71 zB97WB|5s(xC?X420}8GFf%!NXxxff8Bg|qCA^tQ2u@z_C5$r@^k~W$y3%z~w*N|^( z#RaT~xg_|B-N!?mm=R3m)(bPRO{-=hY6Gmr);F7qedzUPz`N=8t7uh-j#2$!s|(=) zH|4fu8mG(4*#Cnx)GsGfzG!kH{^Q60?`(FmgTtKGHfM&- zA;)^{#O9EuBuX_xD&$nDR2$2gkfc&=QmIr(QpszZ<&=a}NWC^zsSxVb%d1x}udny} z^7(wf|H1bUc>c1>^K#ka@qFALw`;4wg2H+wOhvH1)-ZC7&(ZmVv@H?J0mqHigkoa3 zMzizc$^Ad=SZ7OBIlhA_3U08F1_4_@{-zf2Y}QId4xFBEPfnoBIel#KJ>0s)eb;Yn z2sMAq!kS6XRTix>?`uMMaek&Y1mv(Xik&WeAL=r6PY~*msz&h7%-^AvxyDZ4sd{F5 zn;N+eQ__bK>9e}mXJVI>y#pl65@wlYr63x;98`i0E;AW%6Pv7(JAVJjLD3*WUX}nm+hk$I?j5}W{3cT^aMO8V5lhhDiVM~6> zDWyJj)2bLjj&+9%Q3ah)7KWu-CX79PzpF}YXXg^a8%bG-S2=H+>NQEIY05w2`Z6>* zSU>s9H=atGVsI3@pNBQRzcjQIK9oTnGc@?~<>9}Cuh+Cy?!;Q@ihPG(;8GJct`>}U z6Z-NF#H<{LYC1u>h{aGcw8Z0O-8;y5;-RcbqjW(xLqED|du+F5pX~|W>ix|?rKQ<5 z5ho9zC^{{jM2wyaFw3PtpQxT$$mAf0h>zvTSrmJ7J3li)wER|nqQh7{)N-N`<{^|) zR>q~L zoTy0dWNU@#srF?a&DHF3@GDA@PyKt$-TE3{3kAA0q8viEms6I%^*l|`kLQMO1;SXE;GLv7K^ z=CCxL;o|1tQ(@(l$Gdk0Xh3Mg2{|%xUgaK6?V;K>qRk8ZvB~qeI|CB^z11MW<}~!$ z30BeF*c|G14gGXhw7wN(_r-aWmlYGh^%i4LxDeh1$ZE3q%FNmPP>!`WRA3mN`Sczs z+#)499Tn||^RAGTHcY|am*pA4aJRPgWLOtj_F8{1@vNWQZ#^VZ2I_*)K|~$&sWu|N zG!(ZL9ap%R?`OEjTlX~`Vt#`D)Z?lgqB*KPT~AhVlXe$u8&%Nmwq@_&)o!LH-M_cW z%aPwEg;lmX0{;7l@6jx8KWR%n|GYBCH%ov#R3p2J`lO0CW;1d#D8%Kf(@%(Smpt7L ziC&dez-m%ZS#9I1N6ub32wrW8pplhTFn__fn3a1$|Fdh^pz@p{J8#(0(&VBjh?JO8 z7@abS8TvEFk1<{z-mF53P{V*nU(_cAJFii+=dTp86$wZ*Vg@rvf zhs7rj#4hPRSov{ZwU+G@Z6+1TRfhQToBt~7%)A`~9@AN+u&<+*6>!dhb?nkDTn)%M zL5xuX$|Evz;n9Mm^{v(?xAhxYzn1zL?)p2|11o|8M8-)BBR(_0fPrYM&^lX+RGkVc%=3|JL#=Hvu! z8$73>dV7J(Mft?(vK+nWM#<_P5n}sy1zJFq=$@nKP%H0PXt5XZe2bHzYD3F8VORPt zuOKgBj1la#j;EW@_cT%2OVfas!)tejn4h;&#P^T}cAiTgksY=Qwc*T*Qr1K(OkO(F z`rZzu9g4WD8>XvU<*PuPESmxyk{UZ;4G285-InOnJP+%kJIDUBME%%Q;G>VrWziE* z-k*EuF;bux1ch{`;Ja63JpQI!Qrq+}0} zKcAN0x4dEdo;@^n@If z(MEU#z}xy(HFIK}GCo(%K|1yyE;YJTF~;-8gw*>}-~C&@X7rK8ODX$6128vO%Qk>~ z?lJ0bD@*Z}Rr;ylup0zf+45RQI~A_lvA8d{uJb-*x6(S}Kb(-MnY0e@BTkg@5A|gI zlReG8AG-ZfX=5$b7Le;QC>{&&_bdh!$RY!4vSXe>UMqOuxzlvVp*6iZMo}VPE}1VB z^7^xlXd|WxCQFATR>Di@<$mnY$^xebaIS4ja3yH6g!}lreD?Y!-?~o2n(BaQws8%R zPUqT1u?lD^uNI(5)EK+6(_m>dxL1z_@BAIoZ5Z~J-~Y}>2)vZ^1bl;M_;4d#`-W%v zl3mCAy~l)a%kGuECPsjWEu995BfQMcBaNK~ZT^VH0iOh8PF5#qN!gysmaVA{7zx78 zV9|Y@t7;~Av`&+JMJ8QE4+c{DUKusi@cP#Q`au`+kmS@`zv?9OYRc5;s zL+rAEQHjwhjZ{moi@e5B_NYSNmu=oN%5Qkh&+HWRf)Qn6-;phL18R01Xe@)dAIJ3& zuHpcc%khrIz8OI4CJ4PsH9(gTX=mqND*MT!W)jvVPoANg{8yY9e*j_zm4jN|u_LHz zNZzUz{mm0mytW(z$>`R$+PG;8^d<{_u-?Z2wyBC8e_CRbFvXMP(ED;6QqnCt`*#Tq3_0>zUx{+*3FNmx|FEtQ$GW;zw~#CV z$&{FrEmpN3g?Ir-8>gwR)qvnVuXZqiz$HU#>}$3<8-tbDs>L1&+Q5WmA`AxZT(apHVRpA`2h_2p5ICUzR#i%s=94*FNJO+N5Q>>G%kMPW-qz zgIeCw6t7L@TderdD5hjl0|v9V9+r4X39MqvcmON>km>HjTvLdAyjQ&EEtAUX)aQe8 zuS=RrxEqHqZSsz=j}XWI^e2u0`3#7KNby1%Wvl{@T)1H3UG6(U;lnE|v%tEe;)kr2 z|AXOQa>-{mF`U1O^9y)d({o4s;Yz`W4W$x_FWhnTwC@CvIHKi?qJxJ&tT02IFvUve zzebULeB}&v{sTK0IC45C0w?haW?{p&1adpQ4s+9&0m{6&O&-CDwAO55qXKvgVjl)f z`K2@@gMu1!@WD0*YR_0J*KyjEMk!sv!6m+7oe*DL4us=S54POi73SSl5rcMU97=Ff zwQCd( zm!?@*&Qi8dUc-Rg~P4FseWBet~{fsytV?^ED@TVp(Z@929Y4ZLamP z!)U&~0V@i~iOr4BQu&RXV>pQK^fP`$PIwl_P`Dc&KG`s+L}rS%w&X-ONfPlAtEkI? zGYYq3Dx{;z93>1pq%@T8a%~hZ6BDBXGI9*(^8yb5**7HAo`iq|r9&OW%{Fv!&3JgC z5?+n-juM+~@;`Mu=Bg89?^%vZF383a0y^=Tm%!mUNqp)*vCAR$S;KU$;!RyA2><>Y z1guxdJRH@DIt{w(Bq6J1HD~{ba8#K|*N262^uLq)##qEQ`+$~CO)-Y@d)xyc)`nKfqd$jat& zuDNG%Q%JXyt&EZ4PlK?iQDUcGpr?HtWF{Bu%bGc@+Ste0r~nE9&^q1gs?JBV3; ze-h+}a1dt+h*Dh7n|RAhP(HcEvXFlScy$^Kij8{|p%oB^2!(rawqg6t;2uRzhs0-D zYafuJ_|FZz0Xs;reeY2xa@zh`V@NGKDxt;R^uRXy4ze9%LCS2^kxFMy6zk0mu1Cvo zI!$hHK!q2MP@?L5)gYL<*HJD%lbPcfVb7nwz*|XcG$$h|0IOa9^ex!jr3KfI!Qbs0CeoFXE8Stme13Nt^akia)T(dtZP6| z!HXfFt_}&UZWX6Tv1&A1x50Koh$l6$Y_Sq})&*aY{N3ki4~c0&S@wqPX#-AJPNg{ej&cE z)6Oi%x_W_)b)^24q6(!2F98b>}iUOWm{B1e6n^21FoNm{N%cc3m6?D z-D&*E$S$!DcZ-NtXFrkuw7c&$jzy^2iilYTG z;NN!0sxZ&`gQtz>k)!s(9qY3=q&fvP1L)Pf^0?e!sU@`S2r*II zcUWc4Q5mghCp*7hqj82IB1l%kj{}9UNmh&Ja^fUT;yA5zsY^rHuqe(dBQ-U+jbmI5 z;7|B@i&!`7OfE)=S0zr+VnObeOpKY8A0A?_e~~xMZp~I{ZdElma3~USF^O${lWPNE z5-exKi#u_|4_gHaN{)n)AP=hC3`qRSgRG?e5dDK7X_{VBvza5t9hjJei)iQjTa3^8dKxo@x; z39%peT%?ydzh${omx8(|hIHn~v#GewuFzIrtSzDChlk`xVEY~8Z`q`sk zt%pjFrLigHZLY9iN`sL*&L(FS_}Qs(kPoC&}`) zT-J7Hl}~U@0rXbmt}E%+SYOXU%*o%_8Q*wv_eaw8td1N4k$ut(=o*o25}U9-O>t)r z=$s40z*Rz80q@+iaWEdEk!4(V-#2R8e;<-ymiJ@1;F_CxPNyXKPjmD~ANuui0JaLA zvElZcT%SR}+g`|>o82xDrl$+nydP*P-*mng@wO-D4m;eoT^Z@3qFQcTt-rC}kaHEzmED(*T5!`5V||76S*|$YoK!gS<1uL@r2C1F8bJxJvC=GvZOyn^p6X zG+J|9SdLi@>xnbhBMkWXjKt?V3sAkX3V348Pd*Z>eB~<1AaI|ZT!#2At*BG?e5*N2 z*Hz{<5C4q)WtQn(Zj zR#vu)?PH(y4}5EKiVL5(M`Rn6eVR!Bml*anP#-+*GIqcTVi&AHX66~s0~v$aU^=*^ z56qmX%?^2YIeHOmJ%dL@S4;G8d-8JydfXx-1~nsZ**2JRfXGUsRO6_3T>M(;77r@4 z4=l71U6qGYggwumUn;8IR*K%Xe&3$b!Bi74<3pdBB+V9pOuXg5T*K8V?{uNC+bgT#3lN-9(`fOWW#3K{` z8o#7e{=@S^KBO1T2=qLJ-EeQsrTHQcWLi-VTsV#re zA6KL;yLQUF^-;aKV+`UWVqh2#;dSIPeGk>zYsT%C`7fGDr&-1D*~x0V@3v3S zrtR<-wTaB07gTd%Ghc5lRw=l;b7Yywsj99%G+A9;wV>2H1n~lo=-&wl*>EK@QbqN3 z8lM`=W2eAM@?I^`{5aHm^>33*Pu%yjQE}=|g}j%ATug13Cp|3sEXXN{b6&IvD)t?l zr2TR3lf|9W1JP_!h?(>Xk`*=&u^>9#>j4UAwNn@gKhDn7O9}V8dQg>8c4brZdPj723*YqwOvW4Boq939uY}#~N{>!2XAjsIkE!VkH22 zFUVp$cZl01Nh|O(Eg)>ksobMgyx;HH#+IKysE^~6U5&%T3hNyA>?&on7Ih&uk?xgR z{>nSxDg*u7yx?Bkn5!!(<3+1eB`4)yaP)`#8AN_1YT4SrFcli9rR3(diSV=`BleH7 z92`UzY^X8upKiWo6%~ty^yhn~Sf2E$BkOtyVE)t6k^{o%bPAVG$Zp9^$y#T+MmwwVz<)Weawo)Pz;0dz57 z`bf2JL^)LOXBYZbM3JvLTxZuPu#n~(NFHy*Z%a@lu0&~iEcfSc`B1)+klx-j@Bv00 z6@rS1muGHEi}?CL)ZP3BMMp$18bSd^XTK#uANP;8;jAC2v?@tRVwmkrs}w zp=iy7!UB&QBCK@-M;EA8u4F4qzZL+C+ye9M^cAp}5fM5$MPb`67O68n`D`ddF8jNb zpV(v>i;W{+sJo%&Z|~xornnk%Ew2i0+X@au!7(7WwxO}>ZWdDcd%vvcz(ZveN;%dq zxWncoYZPQAfOLMvvU~HSfd{TKKXUdA=~iV}1b-mQeM;5fwGA6dw>>{Q&+mk#Re~^k z_+U_)CRCC!h4f1?3+fY};KZx+w)4%{o-*jiPuEQY+iZh&Dv|y*i`0Es9$h+}1NsRl zd_p(b{v|)6s9s}WSzbyj&Mq^%4KecdQPHr<4nW)U;E1*=UwrQR>%Ei;xQw%kQH!QF z$#iGoa>I8EC+_xLMsM_jSxx|Q0G7&fVM4Z5zGCy06(PvTIIm`TgN@#{U`pGYKtDI! z-hwSz`joB|tfiE1IUWZr{7-y)q{G4epl$SRqw=A@s>xf52lXjM35jg14*5_-wvjGt z>mLapA&tz~T-pPe(K}6^MPdwaM(l5RKvTM9MvTVSbLZ`R`GeK#gp?TcZe|W;u{P?I+exBPer~ z-5vl2blb05Lrpcr(Cug0fJpEqroMC6dmw_g^fNTF@%xh#i^#PCa-%fO&$O*{bNQFu zb6ue@11ZkTqCuDgqU3O!w1mw1& zNZwSN8Sb{0a#A3Y)ijww0#dt4`C2ye$ccRCI?;{*v4t+2cVziu(MtI>952Ya<2yXR z`$1mRl`1T^LpFW0C}k@tlK3zS{YlgZz(zPvXX3stp!Q>@Np?&ewX=GKhm@i`&|m$Of_7YY?mq!d!)YH zlHwW#z8!(q*O2>JOIi)K8DlZ2HkxFbO67Xz#GoHvD6Mk6hXq&n0G+Y5=v)@msn7JH zl-MjMOxN2~>QRPSC|dBI&*blzc}lKWZ&1DBG}wzLt)ikKBUs1EJR^TrhYOsPLBalPM6)#}PHdw4vmsQqc4n<50)~5o$4O{rp zf|&@(2V#iKMXG>KUPnq3psPSQmHdY#)I>c$`A~t^7wEj{8lBe73Eav=3R0`ph=wB?As1IBml;h4lHEN}L zZpbsskfBQZFh6Z!M=zW2QJ`J|FywxZ{%HzXGs6ezT?G;Cg*rzy@M4#Gt-{z%*wH4( zJXgcRP7+L*z{Pn=b~FM@*weuT^klvs(* zD6p4aYqmv(DU?E!8J=nKmHUay4%SSk!!nTH3;Sl4{t_L%Og8du@*H42B7u-gcg|ti zM*c9p6)@vKBB&ew2X<2L8~}VcV)ZP3`8>h5AI^Kr!P(HHl|C~bV}i7Td59W!*55?7es z!L<(%FEdG!&lF2pI~n%wXUe*fp}jj zcu)=zYN#|IIA2Z}VINqMg1oL7YK3+@nUB?bGc)y%u;CO0 zO?>tp733|)P}REhy_jir8pirqGX*?q}L;b@n z0w&E1pKiF_?R@>-BW$hVF`%Bu7o)z~Q zG&SJbOP6Gl;xM!R?2_DzSG7J_ES|TY}MZzk!nJ49+X{OCrwL$5D z%cHCXyt2Zj7JHay3X$n|bRkv)3iCxUfntZ2g%NBb6;r^FFO&`qx<{_xFSN8#5pM6> znjyoienqGVx+0QwC1k`#O0cVk>=R^$gICa96x#r*$taTYP}dYUnMumfs|6BP9Hl5V ztb3kPt?48wO=GUnv6JYL6{M&WAcdR9T!$aVEmJm#b+jzgX6E&N8Pc+Dmnhn(O{y2a zm)$3NwgF90v%L7T{wVKG=P#FDd(>qK7ffymLX=sMBE zEUFA<=+5IDriH&-YRbj|=F(_T1l2Gi46_zO zX=fSOiqM}INUK0*ZBl}?T5`OheL!x*U`x(K!?D6O4<-*D*ol}ssfS{wteVtsAoJ7m zjWg9y*oez9AhW2`XdaN{x~#}ezGL}7SwW~iliXrh_1aCT5Oe_djfhXQv%tTStt7)b zb48sti5`_uOo!0CRGMRdA2p#N%K0Ra7?7Yr z77LG`j=>W9Tt>S?WMa&n^Y4MApP{5a@ncj{h(@T_tVV)X(y{u$($~f}K-gj-@?9PF`*-%r z{RY%EQ)&IV(=mwZQTy8zy#BnN^6VvK?baikF-I*rw9$xH;qGfG2ni6M4BQudvkUff z?OUnde?r9a=yOAMIKlUTRo%`{KNf$~$}(^uLkz14Z=bVev?550X4(f|6q6 zt%#r5G1;0^u9K!+YJFTS5%hHJ8K%`vDiO4Zq5*x@jr&E9Bz6C7>sAE3A-d&gVNxl@ z5dlWHNsL-(#bqEl@WL#N_hYkv{Lx1)sgnV*h1KL-jSM7)H}eY zT@-+P+PXoZXT}05i?*KRL)L+m{+LPg2pM`nijH7~tn+Ro1YL35+4=yK zWuw*oE`myX^nVJW;be%kCw~EHjEg}RCtjxkll}r6IPpmS`w_bjm|HnHunl$S zVVQB+NVi%Rouw=DT!zer3 zjt6xCwdjAym>#j=fV?3-+q`G5RiQ?29*@sxm6!a=p4(#UWPoZGPGs#QO62gvLg2&w z=o@04U|))v7>1kFPl&V@$i$s8q^HU3&znRg86y!vquvmdV|pOrWN9?v6&cb)M%l~p zD(1eO*@q`ID5rb<&b7o0kcCi#9u%Slnu{mfhYE7q9G7z%GNVYjV&sPzdlx|AFSXy1 zkJi&#Q#OTBoe&|Cxt5-^=lj?Oj0#aPhx1XOg1S!)4F*Q zaW2Rh26Q&2sIUC1Nh&tE|K4m|i1zfgj*2!61Qb$*NcfWVL%XVnBUIrOJosbhP7vwg zQ7g81uYrTPT8=u*)9ZUTKwb{k_9HpuH%TFQeFSe+Woflfg=!uRl{s$Xb+jm+*gSjxO#?3P^H*?PG@uo zj~=o!QK>Pat)x2j-F(HL?9APbjm-;pfl zg=lPbdIAesXG}>sgsqO&%lMCC`PwXzjJs{sLEL0M4A80DXBDoA3e!Br)f!JLQ7g(= zapbqh$G=@S-yR5DMn;)ixQV~?0ZiJ(zs;z(cvJMp0YDQbrk%56$@5y}Q`ar0 zmp7c%JM1&{A!^;~%|dkS>IACeW}TBMe$rVrG52GiJjity*(<(vB6ef!2b8S+C4f<> zUw{ASpEGYBsb-E%HL*^yT_mfH$9TCX59|6?o@QQ|NgFg?6r~k2`&S0^2|5>Qxq5e@ z!k$$=nh!6WHvFm>qes<;Z}i-jNX^P{Bh;@`#TkdcxdO31=K=_GJn|+*rR}% zt(?&KU&%<6cA1dGNVjXHV*{e^xe?4D+F+@ zcPa<>*UP>#U7@Xo&SpLCLG1Om$5VMsV6~Tk(nKD7SvB?+q+@!i&0?cZVVG;_>MoPe=lR`|A6A>x$)04<~lLIqi5$05I_O#8V zx(bBj-KF88OGC`dC9B^zoZ^}O&}|vm4&El4WZoST4>O5dzU3PyWtDBRleKCGa4=9& z`oPTF&m=1#s;=*O=;uV9$D*yv8=QQC9prGGO!YTUaHIC3zq9GfbkkHRJ=+Kc5s6SK zG#u14Sv$lelSfzWU@`;cDz1+iksZ|K*m*H;y#;Y?7x|!$rsa?iZM91eIX{hW1(6%+hcv5m^ zUHaTZPFMPoy=`=?8?ezy@YT=d)C1oq{ni|(2j5-#8AHs}5QFLVQ@LkT5iJN;ML+eq zmzVyjB43kr+`xdFE#HG^rygI(tJQMQ~TPOtzNneoj(2(D{;`*d|=hMTj? zNYC8aIDZGJFOg9!j%AU-mE9<9beZ$LSYnE8C)v^lyH`kcotg((#JCjE_#m6XdQiG> z5}IZvL4Nk+GrTD$K|h77pAmb^^=+_mk}l-7ure!aJlYTwt83nH+1#c!Kk%6*i}!Qe zeC|Q4>8sDECOjWfM6XPd0x{MVIyVD%aRM#(8SL8vv+k+HT%I4Y`Y41PkJVyman>d) z!LA_NROtL$t=V>BUvQ-y8$pu9LbJG=u_>--bB=QDDkyQG}$ zBOHW-V9GQ;6YPBel8fOC^Hsz@#=8VC=d&2FY>n z9P{BttCHvpe#@p?ttr2sOUQ=F2G236p|C^3Xlm^Sh^LauJwHmPpiaC<_c!Y!=lA{O>PIZq_Y zd`=yM(9JHeNbaq0C5Kj}WR^x4yM*L6$2zs1dj=aXv-1>CjgaM#%*diYs1JVd|G5x+ z=mBW#>?k`v&K6?bt`U{UHN8- zJO5oZ+9-1v8hRoJ9&fAk9~EJIB9tcHy*DM%$`BWBZHbE)4+N%R)3Ty*P7EEQN$4q> z=NR^HvmT$(r;mO6XUJcDdn7s)CD^)pQ;%xJ$xUviPpu9Oo&9v@*vXdm+p%i&-;*5c zJ-CvSk0l11_)m;N=0VmiGM?zz<&a6H!1*=gBBQr!RUbWXu9X{vKcVa1AnYq>*I+z` za*;lbrD=(isCY70q{WqVp;egXsY3Ikp^!fa+_ASueC~Ea0c`?=`ym5cS4M|%MkV^p=3a(Y zkju>A5TfJ_>jHtW;7m>XZ$n@Q>t;-7qYP3wJ?C}xTgg~iyv2(Le7ydOr4!40?D_T4 z;U4o<@-M~2yOho!+64r9-k+SD0(J|LeLnkL`Nbm=OlZaG^u35R+Oa}XDRIW@02NrB1_1(MLzuyG+;OO=#vqyu zEf&Di<^?tSF#E9eKS9P8UHGxVED#GiE{7U2!AF?uS4t0C$$L!|P*{wvNA7X=e9NDC zJCcOD=0aS#RFId4A-BNmID}FdBC;`)5sHXo!X9*CQyT+*4jnql!UV|ix3E#5A&eS*9aLJU237QiN83p0~jc0uZQB8X^0j^TI9~ z1HLUK)?J3m5WtQ#;tQCt*bn%LGbiGK4yNTgdni~r*}B|DuVsGqK00`oe4M7BEtbJ1 zg$ST3_ZpnAZ|Pt_D-7OcaEvSfvG#W`C{c|3V{k%zF0Aec!9xxTD2rwQQ5)$SexpEN zHR3`={>K35kIYT+b%;j-9VfER4L96CV`ifpw7#drSyuRXp`>LIwu5dezLE&W?Y=7x zdiowe2!P%DLD1{oL~Vk_4Z{0g;;#vymD7X-^>2je6JQM)Xp5a|gv4BdPd6gdQ(%en z2)#6jKS1~6;4-XTig=q}PQaBuJQJHHgxm!}z^p9L&`vZKHXN5r10o~m{Yz8PFYn>r z(&2Gf9Tk>PCWlHt5_0GB!3*dM_e|a_87-!u-eh9u%11MnyjXSi2KPrMvZYErr7rlI4 z!MzR-(!j||Y?hI41l@J}Jn}5_bXdV@ue?~Or4FM^Fg}=4JB@!!KkOQM477kbNQUiS zB&Mfix+qZlg|IA9vEvZzV?IF%s01_M&AIT$Wk7i&ZnjaUyisS5==>f!e5G7SU$)lU z*my3lps=9Vr@>b5xy7cN3LR%zlB*a#Gl+KU&Ht?&Zlxs52z6scuotbkHPO=c21?NhekcmuKku)tJ1A3{E@Hqt%3Dp}K1QiQl6s*oFCio^6oqC!^)4-;g zIV%xJ+muU71vw1{@L8-aIP}=rK`9N0`9qg*u?(6`$mB{~k88mj@3}Jw7mckRtU_0rs zBXmSJGc}Hhj3JkYk`eYJJ6k%j`wwE@%f&him9;mn{`K){WqIs=6O^7E_Cq6l#{-;5 zdXx~2*~jtytUlv|bLj}P91J%!gahg%-Xv!1Z^&H= z#BJdgXbAd#Fm_w?aj*=P@^@Ibe-X^|c7w_C<(v1&U5#sn*&u34vJ()qDg||sY*=~2($^FcNxSI71@quv=c zI;P%QgC%T#gj3O>ZDqmDLf8(uuE!(XdT(5xTHi^7HfswO`qbbaZAp})bZzu#rT`ru zT>i~AnxeHs46SM0GFYaQDAL*T1z#mSq@y@^9NCsQde;;8@JkbHNG%E9dhgrHYvOZ$ z7dh~6C?Zw}duO!b_T`~c;oi%=>nnFZbbtFgBP&`o*An^R!1LS5)#?9hBMN}(GkL8kn(!X&rF--D^K(VtV1h?!%d zqK=6O^f4hUotaZBM+~;&ps~8%kK~i%^0<4j_v((bp(ui_o@V7Jpr*VQ3)>~~2?4E+ z<=KyHRn8w#lJ3DiVb4Cs-5o50U07&*`UcwJg>9B18{TvtGy2`HEg@NonKd%bHwCpn zJ-iKg8w`Z~q5oug$>WJ@XxAy({vW-{TRLsB!n-$oy4ntQF&N$DEZzQj?q^L``_puk zqAfL1*-;dGtr2<6+xRG|r?0cC0F}Idrlja9@@AQ|c!G2!xVPk2r}-1qIda39ep3ES z?;js}zBVNsJ#Qu}?%V0x=h)O257f&{Idh%%wEazA+{1+3^AGPfJoVZ7)TB3I?;!0F ztzYlW)1k`PBy4|YL;qiq{nn>rQ$(t#v}eX+{ov4No(!Gu-p}5cwPhE_?w3BBpbfZt zc0W~{tpH&zSb&iu^t1r%*9nfIzc;TYiLf5n3V zulnqn%XcA<6G}zrbRCBp?)BZo0)PjxHkItgr=5h^q25YfVk3_`iLrWi?s zME3qO4x#QdG z#J4Y!-nLFmyuS5z4Q}Gi?AwzQZ~t(7=Y8SrRMNX`7hHE8eV1ka=1bDM+1YoK=sy-_ z-+o*7$9U2oe=B&;Iy#cH%#@y3bJ!PM&}!tCb~c-MKf&0rkUKwO;ZYoRg+` zoyK5p{H8B_Xl9T&_s6|j-6+;OZpGz=(8;;f$=UMBnWo7vLzABuCLiOb&N8M-{2e}F z0R`${^AJmq7gPR|Q-9;M3k>aCsCG70J5#Rx(xlB?=deZ!-|98_H{;2sWXtg7gvfzc zTRPrvtVJvv$!mQ=n7qZabDC#X8)gP-dpUw?@ zI@|H-QpfZ~r_bdbuqV@`%rfs3L+CGkM9iF~X*=P6Y%lVI9j=sDR$m?+Bdpk7zms%- z>%7+8#r`bzH;|(cuJ7{_@kIjx@jAu%3>Bw}J5fxQ}I7U>HH#}`fkzquU$|6niARo`4M`6HgspVa&>>^0c(#e31}_+rcd!d|?u zE2qmOdomx0ZQuOc;0y&}O-7J^Gk&0?{LNTcNzxL3Cxz0#ZQ19t?LT7jb9{r%*D}^$ zD8`?gE*V>ld|wp)c(7BaL<|VO^e6fj2`Fe<6oNNBBcWzVvvl7o=8p>2--}py=3w;9 zLd^OwjJ2qss{F5k=A{znpWGcLK<3U+e~X&j0XU^7`LzkOoD~z_A|=hQGk9U)P@FN#u*= zLq8wvvu@gFeC+qz1A6}g$^R~d4i{bqKJZ_z8d|owFg#oSFK7Ys>HS2vF@<7r~%-LkhKrf!%&YPMb<+G?y&_`EpJU9jIPbk zD1PMp`@c>%=anekS`aYlgT+Vlp0%n$&zx6}`pwhId~$2LwO(`u6bi8eaL12y-l*dy zJja1R5x~cqV~`Dea|^qaw*94B`JdtY$B|F6>vGB6tHB~#8Q-E@zafZ>{I+P+)6;^W zkep4Q1g(b`ruEtHZ}}GD`)wqB{n~%Ne_PK48)OLBNcZmoE@4wfsK4p{@1cB)(-|8A z9qxS}ehLEp|80PscX6XS0&9IJsPbXZYy9O)r`d{h`O{rJ= zb0I<$>o84 zL676&*>>kC4fKAYyVyO0>plTw$Z79-rv9?F4r)*E5laBqD^%KIozYl8dF~e`#ORBo zuKjJym!Y@_HkSg){Sf=%`f`1q3-uN0PlQi(J*pqKO10d^iyn8? zGg6e3N^1X6{ZtOG`tR45hr9m!z5M3S|5U%e{qz58fZ6}G(cBJlR)55;GTTrimdCg6 zKVhewD1oq2@D-dv*ZxTnq=6_Tx1I1x5P>V6I25ZWh0ift^Ff2yl_DnYIjGyMS#R^H z-&bUoycOu`gcjV^E{h!Jbe-SO1;E>zVPvu$0R;CX}hCFJzDzddts;%9k zS({Q!j^L&F=aFHT8c5Z_#g{AK4or%kTP5E=)%;U~p2JEfNDUeIyuod>E=JGhi2tbd zn?3br71p)3(6nHBuwK-mZktoTL{_i3y@7b^!$htPGxa+*e!rmLCbLX8WK?g{Ud0h} z=xc_+XS}wLZ+;t)xsFiJJ(-|d%;Ssiiq2pIrHZ3Y@>3zww-r4x97C(g^bkdfUT(9Z z$(EX7zpndYPx+h8+py4N9#DJ{k2mjC8N*G}5jR^|(X~wLVJtdIlQhCT@LPLq?ZXnq zdhjJ)3<^O>Y^ zN|CZF#&%`JEBzEx>;?f>htTif82E!;8=>B`8-e=>LV{auC-q!T0)7A#6-X*NWBedE z!icQBA+^mcPinCt_-O5gm114SZlL7}@%MBR%Zb-G}1m>ARrb0csfxbu8`M;lFi=>$IZo(hc@n{nz!T zVDj99L!G_&P5JkO3dQxw;}7uzF1EO*+2SygmGxHUEpL_I-5)epeZU4NqukSRah`R~ zNzCTodVDv9S&1Juz8hqjgyt?1I!q0j9MA4#_=^@i`~zUnY*$5@^}Gq+=E}$mll|;` ziLrbuG(ffLM5G%JFU_jYuKS<+HWgd#p6Q@;OA@V}t`Ik3W|Pr+DdnPJ;KKui$o82L8}X#x1EX zqq56bH~}3+1iNQ8I_tWo3Uo^nnMX7}B>o&rVc~p&^oUL3xEa_zpOqfqLp-n;V{K5s zQ}mp5A$k29sV<^(#AwT$cpt~~UQH2G`qQXnD+^&7p1mgk)fE$O_h_2DNOiJJ7E$P_ z(|0T{@BR6xJmS|;!eagamyoN?B43+6eyFwmpIcyjY7#M>?0wb8oI0NAMf{lWam}Cx z6~#)u^=5i+07B*coMx^2R*aSz+^eu&j3CxiTrX(+1(vSUxsvhd6}5gci#Prl#94@} zR9nt(FSu)FXIT7b-`%Ad9?oPC9>=iW8C}K-&pD$M!PYw5)7dla^AwY{3;xXSRZj=p zys3^)8JY_r?(Wv|xdxbr9m*|>5NqG0ylII0i`&xyy&5!w^cW-Pu51%78kJlcjgEK@ zv{Eg%kVl&IZK?=ufqULa2Ub#A06(_mhEbC6`ZVSPJkzSCWX*`RM|M#%hbzb{vZTK5 z>?kYbzFWWR41(J7eBTOzX1cwAf=@zFb?I*rgzIlzx-qL0Rgdgki>wwUKA>*0-Uo;j zVb`d643lcOHFkhTnZs9pfm-}|!>v;sNax~+kmL@v#aN%&tKar&X<2|vP!Xy=I<}d# z&H%$m-j1_duQaa z?a);FssE(W!=r8ol)*^ph6fWGpEUX?9RP2qDuPbjn1|0Y-tgD&$=&U2ujp_f>ub>d*@|!}ne&t0vc&>vYQ6|CU=;TEAE3@m@ND$}VOXQTU4eS?cHJqi4e!8%`qerc;aj0b8HEjAkeYVpz&Nn^&F{%nYKWf#S3&5%`Ctxp86xkW+gDioycP+n@;8T)Z*ItCd_UTA*~u*7exy zma=r7+JVw+WCsUSeM1T)V5taFlZ_b=!viNYG$k1Cz4bzGN{%g9p9pmO_1h>vvSYL?@3kkyr%E!s3+kOM&lhJc+m8a1pV zPf6`#jWPNg+f{>_=WTTB!DcN2`d=nkf=_F&MiL!$2eM%d2~t(2bXfu_G^#N>DX47n zq0cu@`kUH$+k?B5Xlsp?iDZyEs|^q|;y5)+BzQ=&4qh7BEh)Y=gp`V_-yqNEq_$?; zd1y}-d8asUlxi(OwCde4aZ=!bt!~pqA*R}D*UZ`M$7|O*>RQZ#4`l%GN$1uWcm_n3 zE@1|YP}6vVP@D}yOKS4tJFimSsZH!iosb!@KNz%l2Xa`5tt9voMT zbZUOl>~Pfep)~14R-h-5#LM8*DNOHCq!$U?C?o4};q4Dg#O;4-y?~?9I$I`yjT3p8 zB*5cm$MDs)?cae1AYU`50Fk4$3cnr8Dp`{CsMCS+`_Mm1!AVlH!*n-Ffl2VYRAYoa z$k_{X?xm>B9HwXomPJO)3ZF0bFT zo8`@u{7=Y|g2(}x_Cv9m$%uAmUEm}iQrN0_7LpZsY^_o7IfXa&h3x23$FU68Bt)cE z;B0$oNwTST zjwYZz@Vc5|;L~eh;p}->SNHO{UX(!n&aZmFu`z6c21B%?{6K*i-6_%ZvIBYFz<6*^ zf--egxdJ(ldb&vy<&0J9=hCYyJ4vYluXA*hG=?WIaT3kvuB{|z3N-QZQeqd5i&8}> zw_lY4g%C_P#S}idU)Obe7pFJhc?dqQ#Uo!fOhV}4&ri;x-pWjN`GbeV5=1o$@fopS zDy;f-9sQ-aHy3-6f{dVWUrJ;Fr?ljuV9Yh}f%y261pVaYNK*M2vQ9@k5v+B_<|&cK zDCa)n3%h66uk{B9K#n#R85^K@4{iz49!KC%wT`-`d$73^rqi?M)fHz`&e|_&;Js^L zOLilpNh_l1c0?TIO15SJ3p~SV(TAd6JLslLkTWf4EyF#C$U%)y=i(FNawvJ5L*<{X z)a0TuBB|G)OFLO|a{a93yppX>eIY*qX{BH`3EwQUMG*>@&Z`R4!;4!|bO;SJeFBQ4 z@SbG!1Le-hZ|5#Q0iWRsbNG-q(rx-p!@mcK+s*H5ccF~&y0sM31~IV5M5o9Pe3*Db zWAa9b1ndS6twoQjYSHRCETc(CG+wKL1cq+jYj6crTY?9jyO5Kp?1d|s-)lZ3M&Vq* zXNeE6lNfU);`AswiG_KX81cRd3^3HrDh1;{T>orN!CceY84g~c4Cu+V1O7J^-tt=Z zM~-w`J0(Sfiym_u)S_ZAp%3ZD*FKsZI3zxR=t3J*8{#bX?85^A>a+kA(=>Sl)1|rR z%;PQB*WPuW)~9N2gPJcTYC+liKH7k9z{?t{YWMo=MqMuI(zmS$Z>`Nn5C$n6Hl?Mq z1&3U)!(u~!Ja~3o`>~U50b~fs(Kr2E6Km-l@E|bW5YY z0^1^KEwahpj(-=cua;9!E}zulvp^Z=<#ZA@ouze6+^`$+w^8miauSmzGbt5o6&%NI z1z%lP{XhN7;pefR0TVG#t}JC^u7+VVr0AY^H;|FD@ElC?1bn6+o3Hw?3ae>wvWR4Q zMm<=58wQSEebPb3st31gz$Z(I=*5-br+P4xg4#VhU|y}$=ooWi``W22aC;a~Z>hqz zX6w9N4H|3(o3n@Da_xx3olnKcRU_C&sdDGnPhak9?B2g0u@jp~(%7(4_n`PGLVg@A zM^Fyk$6vy3f;>0e^6=Qnj}wdQ&m~~hQ=+DK4QK);c0YImzYf)<9gpudnY$Hv0-6kbIuuZ zk?dyH@&DF5lk}sL2H;#E`#-QW8!;=5{Au|eAi$qJ15b*POFmdeVe}={KWofG!JCj} z%^>VMDOwFroP}$c{=^*e2k$bmO)R9|I5@%id1vc#w7YiuCa?r@vd$cvz|uJ`i+&q& zlW}6?)M{+i1aja92rr&7MhyI0Up59?`M|j zTTBYJ&!*vOqsUuy06=D2)40&ENQ zP0yq6%86UIF6}^HDD?TZD>!x4QRGn&|&+= z0vN$rj;_nD0kVKVX)@^wx|Bv(+!Ib3hW3;!8R#9?ZW*8U}xiVwUrlrSrJH zo-4E(;fSf*IR2u3)c8>6?vCnRU@6^QRPF@m78J&+It*R|QH&Z#%k2y;tK;1RVboiW z?iZ*RtzJdc=yhunQ=DBFwAop)_T_vDOL2R+vbyympZ95r6?xF{%lW9F)s7Rz7>|Yi z;wJJ!g{vc7blhM21<%|&^YbfBTb+A+)0pC~3o*2k>*vK;__N~=if~EQlFVt+%Z-9x z%yN8W?i{Z-{`|;Id~CJNK4MC>Z*PKlgd;ME)El@<*muZkq=sM_97G^#644bYWO;;v zBabj*F*Oy~(2`dXPfjYEW}}Hr50?ew7|XL=cqe+n5MUCv9%W;TEAn#n5i2=ZLUw7I ztZJ*Vq+o-j3d!1sDy z%s>TGuL(SQk{~Po`%-2>cLCipJkO+Hgxr4yULguy;qg^mzAE8?DAt8-BEDFPAmo6L z4j1r9Khie_vp+|s7R+Z`dA%5@)t)EuQTY-H>{plTvnF~W>} z<~^#9T@m9SQz#G^h%P9HS^{xFiy={$c7I7)x1{{Lr9VTwGrI*#f1<0`%O5J2Z6jW; zEiMOYkPacA48_cml5VO-LF_J2`Cbu)@x*kGo-~b{wK7{vrv!!wOir8>eULy)dCQVY zs4XG6LCk5qAB$&{&bH*$(J{a_xjvM8 z-qo?qFm~ja``o>d-DfTmwzdJbQ^U7;>WZ<9J|b;VylUV0V#Y2>!1Ix>75^!Snuy(R z;%6MHg{>jjk7aGNrgmh3#~@a-vB`hKr(2b;T9MDhXvcfO&Qbj@2<=jut6t{W^v)jq z#go9#`7TNU{bjlJHNCm{9Ab`=W%&<2pa8R>lO*mWG|6C931iawt2m5Dm*_()l*G#m z)f?`JqJ~6ip4YS1oZ{43Ebyh)OuF8thBr}v++(GmIgEd;Gz~o8;wBIik1X|}i1RI~ zwE{$P_`_q{sKz5y6n{Lr6&eR3}r1t?tC;PuP(DessqU2X|&2FN9@P!sd zj)e?y+h|H|KzOWOt4}pm@T!Zx?W|u5ceq^k$^R*U@Gx!>)15EqVxw>C&41EJn|V>^ z{C>dKaRBXZ{PoiIgtqv@8Q8{VJ6o$r(SaUE-5vR(+ONeyVFQ4>ZK?p1W&CXS=I;$G z2u=TwuT}9|sqN(>Q;u`88duy45xa4NWitom!X#AX;9ltBHZ^);wpZ`#qh5TMb}OZm z3eicNL(NqD6E(cOI%{ze|BzGH?zR^!HEc7>?*hcykUgTP1o^iv`3Z_U*EU=`czPHOEdITSbho>(^E8K+PjF%)x{7mhAxzXrb@7!gnb3{b(fj@ z3}{8(lxz6Y%A3?JRBgAZ1uWItnt9ADmh7*+HO2Z!cZmxE*wf zZI2uR)CZ-ie~~PGgW)^~I2eG^^G>h#IRP&+HGMODQ>Eyvgg3 zkJU+LHx-ncCHnt~kCMD#KP7nvItKj7h(s7?t;Uh3RM@}L_y0V8WE)z^o2LU%f#ph5 zBSBvfX_p9P;a16@(bw1)8S}G?mWnbLXbU^ugulB{TWR=*;2?fPh{xuZhnvsix|BmE z71S~Zk@7IvQ&SxUXE(=wV~w5OZ`G@z*A3+vA5@;F-bny=*IDb|r3$PXa%5@oPwnNQ ze>Ssp@}-w8scXmb+cRfYS3rsj+=1U5s|;ov59~CpL3^^`no*~d8m@PevXV+E|9J+_7@(%}@3#oMl3c0I{1_O$mB188&|TK*ZU zf8NKdTeyBfc)oiL zpNTZb13Lbqoq&Qj!_#SPjpooSVoq;ukX@Q6a*+&lgs7<mg#6|sG>uRA2d)_5ig1YSC6o$IShm1%>5NBG^Z&n%uDyGSOt1ZlNM* zcm}!dQ%Q_5;5~yVwh{%9&bG>Ue>wwHrZrmPnm4N$o)NUUXU!KzmTIOwe!pJeHmOJA^$yb}%nht%!Kb!$oMgjkm z5(RpQR_0%i=5)Qug%5XE1c30raiM%Es^&d7fx}0^O5MrGWXTwR!MIWuQUEE6vDXce z_q^)Srr6sSkOzwz_+5^zyHib9gKJKZ(Sb79W|B8Q8{J6|`ASN>$=7+}QchH{2Dvvk z_Qu~ca0iyHC^p~&#r{p8uPQdSNrCXL^k&h$a zHkI2^i`|re3Gq=i=8+9Pkq%K1q2#1*{18kCOBRokYlw&i6a^>_nvLRTo0*yOU03&J z&x8+i%yS_8by1>-Wu$81Zbwp-L)2A1hv;yX=XUcbQ*@6<@pmwVyDb#G_W+RFP{UXF zcLdVt*{ipt7TGf}i*Uecb@Wqalh@(aNIKwvH{T=TP3DQn>el4!2d2OIp+rcoID*;d zM8~58ndruDcQ^L+TkKI`N0Cd1A6}EDa*o>5I0X^&lNVsR=Zt&m(9DtPA|-0g0-V$$ z^aS|+9MmZ-j(tAg+Y?Y7GbfRYF{&q#1wA@jC98zXH><2g6tW^V?bJPP%l;R<5Nlw~ zjQ5U2*x%MCSH=49C>2&DuDb|6VlDDX4jt@ar=4n&51Dhqh zqt-zB>_+!j@gB5d&k4SXJCH2q=|o-g&E)EJ6}iL!>&V z{MbT=BTodD=Fh@rEryk-`ddIKz#Y6$am=RmtdG!%+{up>48{uu?@?=*67{fL8{oKz z_#-x=ELIe6LTEgrG5>VZes_7CWJ^UpT4UsPYu2-SbJ{`(${F0qQx-Wlv^ZuLlj_g~ zo;8~r;3Ru^w8;2BErH34CxBM&;!|+O# zP}5Cx@i6hS6OgjN#~Z`KmRoo-?!WDi=U#;e9Vjy^66K8Y-608YJU3sCyA(VXw}&O% zLP8)rPHIY;LZkfo_SKoO2zL^nu0;8Do-u^I6p95W=vr=vMCv6}vo!v}O{YC0%-miJ zea~`39Ut>KPa*7e1rk2qR!Wg_-DmjwUFQ4w^WEZEQ3rhO&of^6Qs&3mf$xc;8E)v+ zHY|C>r?hC3#2TNxiH{e!9D@0h;bhiqv@HmI9y)7UP1%koe4MDkY2zkdgiHRxKy%Lg-_*6?lLym2d5wP ziV*qqS<|Fv?3isT7txw26k1GltP#en_hLUeBOsyHDpSH1<}K0?cB@OZerS*+q2XV7 zwW(*~(#-MUj?^m5At5LL54rt~51r;%TX}T*At0l}FEkGAkWEXUBnjs7hJyQ)s*aDf9mR-BI1H!U}d#lkSj&L^! zvl`(VWk)Ws&a+24DibsIc?om#&ONd(>#Y~%fKf$Cq@(OgOSV_Ixb=$}!3`x0v;n-w zgj+gbqO(P1zG@7S3*dpIe4dZ=;Z32ydjWN7`}->I>O%bc-;vwMFI*+d-@zY zZbB?rBfRoFfI}CNQ&Y`;Pvg$)6@A|%=y|~h>OVer5%_m-*d4HSqN1_7;>vd6u|xk< zcAyx_6uR*{hGSSW33b#$Guj&6Ne9;V&HKLkXLtb`I3j=q^(unz&$x(IGhYe%;2-Mb za0fw@vZ%JLNKs!*0Aaf(R4`;}Q5p{ZvtSA`yU=Wmjv(>fC-|2R*`&l$nkNt<%~E!@ z?@S=)xCda-*XGbG8jTWa<&#ZyKXi+h0?j_~$mrWO0#&j>WFnL=a<|hc))YZPNDv1% zKB<9AmWc+3axUf<4_7X39J?^*SGp5`0}{dRKI^Ec;w^~?&sex;gL((FO=s($y@`Eq zIAj6n8TCF_FsWo00w&`r?-8x`u@dsk3sWp2q4Ol1r!J1?ZQWb;G=d+c`~Vv>RZhK? zh&Q_TS!=3|En`G{cG|~e-;7QmDFvRqyWD}&H06bWBx=J7jkB(U0vKlY%cmyB(3T0mp@`XHGir;;z> znQs8h?_aYEE>6BB1V8Y;)T7@vH0{jhtOvPlR?h0#xo7#s>m`O{ah9MQ06lduY6U@isVx!=p*W<#!lp_jO9a$YwbiQ z5i`6||CJ)0r|*vTm!PbwtX|bX{TUZA-@pA^^gG~@5c@B%7Xnb1PqtMZIsi zwA`jUO{4nS?h7TMf8B}nTN!-K5%o7%uJ`!G_Uc_J_os~)>*Oh?FzLJR?U(4DgqC6j z(KxENug4kOmt@v-vnzUV{1d8GqmBO;>jCEXPJ?6ayVCazpTFZXo#NUxv=p*^J&Pyz z*mGiYbL;P)-!}6;y?!uj`Hyuf-A8?C$ub-`=q~mi;C2=HAN}HH9FDk>(&*)9kgBn7 zZnj!%_~SaN+#Pt&pksxN9Y|BLf1wu5VInD9~YImmT8zMmPHtoreFJr23o zJgP^5%=JQ5EWqJ7;&OfFsSW`it?Xk9Zi6qN54R>nM-tiStaW5*4 z66BK=)FC8?<7KJwD#kA~OP%4FHbw+D-~MWxL0dyK-I&b?t`=F<7eWaqII}DD{8rU3QKQs#)K2Mv|I!lmldH7#}vi1Zx0N?O-UjX z^7F<>;TnVYDE~MIPc$P-TD5kRp55jmO|W6dc)u2$4EGq%&lRZ~8T7_%>+PdPR%~#d zWSD8sbPbt!OLP9YzP*sZg(ApMA-KKAb(KoLG`2g~{+xDo=&E6oeudY9GvNsmUOo7j zda$8(2m4jtK%?b}9PI|<$f(63)BV}^w2tE{s?({zF8NpE%W=3J)Qy%NftRdq@h{vB z_l&DEK!3tkHu~w~!Y6M$A!1D%{jc5hd&Q0p_wqHrsO56D4pwSYIZkNObQ!Y>PDUr0 zd!#F+de8EygT#0C1Hm-Vvxi9>Ha++!wb-UNA^Luf5K~|m7%B4yJxk2LggOC-;jgw+ z&ar*|CMHpXQc#arebhf?QDWbqDQ*O;rqg^~2V25Ge_E!#a=geFW+>V1CpkTot`-@mhT!c5N~D*V-&l#f4y z@@K~-*;n)xPpFpSs`q$aea>y~{WyizLA^b2hHjqB+NI@X9Q^xG>_m{6*A5xs^^dkfN!NMYE80NfTOhg+D=@jGr!7(sqOKUQ@9bM);7GC}&s0z&2=&5`b+Z6>whY zQs+#l>>NI?L&dPVGsE+@x6`E?(v90DULN${i*nB|^12`y(24FERCFr*dYgDfGw>X-{wt^G>mFm&2Gqx2@!!sa?OHSJS;)k?7zhWjG+L8_rP#qPJ^=)4qBAe+oW0fnV3aO78itUZ+8aeN>#GG@Ea@5L_syRFViY^F zlCyKZv$JN8##qk0zz=ceD1w@zrxpSXI)_JKb52^hi6F>NZ?bJ^n2f2!bh<}O)C2Xe zO+$-z{mhFXJ!(;u&AeF_Rv2j-k5w;m)WBVbwL)g`CC&jhfCscEh4P9gM9nGLi2b;pPQP=C`9?a^y+aCnR=Tf9r8jquY8_X-w_y(d zOc`kRZ}#6_SyGeZRwENI{OpOwKl@j_g%e3mRZh+F*b?yYZk^=Ps8}BMP3+LhX{)Ma z)@y@0vYAP_+gy?c8XkZrI5IYZlkvupua$@lUkB{2Sg5xt7VasqucESNR_0_^IO!x` zgCr6O$Cw*vn&+#7@t24x)<}cj(`v49AIacj7vnGGV2xY134D(31uq0mo2 zn-;tTil||8cW{kMR_U%~(E#1@Hg5Q6+U>5*h+UYXg$^~XU7->5VxwCDQa|KXG0p&{ zn3K^~^nuqN-u{VioZZE^iltTi51dAFJ>4#aSJ&cAuM8h9POHxr>_!bvFG&?AP{cA& z8!-`x<@wX8Wd>`Z5%uf=ops-ZB|3r(d7qwha;R9T>Az`MIp6{i3_?7Ft4e;`1w#9&t?*=?@E;#=8VT?fMVmGp6V6apCenQn9B(CeD}kO@u7g;WP~%S@Xy42~OP0%z^S?zZ zd={ahv*QNlT(o==yLZ@?LVYX{kl7Gq#|B6k#itNlmG_*yh_DPi8sN=oTFI2_T<7bR#_TRY*qnX#*<{GaoF*!Xw4}p-F$MSugw_+7 z*CEhj97^orz8vM-^{a&;I1S(vlIUb(nsNW2x%qv{g8bJgd=Y7tu)tkeB=F|Q@%enD z08UF7v}%BwHp#fM0fGXu04i3Vudo5e=;x_s7y*7k7vCqR8t?lItb-qThps=yC$-5?8|a%!Tz>&{#o_?PTE6A{px54#nw9|zyud0e zA&?CxPSG52G=+`=@r&iNY#Nsw=t1XZ+-osjwsGj=Fs!*2NxW=OPO%n zjGQ)@+DzrVpk{NYcIc+X%I*6epQG~iDT5o9?4l7g`cAq}oqWsXLEH=nBnpl@a||a+ zTw@^KJT7vkT>X+U>Z2afL3lJ&+=~%lnMeHu^0LwKAUgkL!%NYY4Am=5DiHhM*P)Hc z3a5UKf9jw$j%LhF!n66mM*~)jyt%{5(C=@fQ}kS9uydeb7ZbYM?F^&v-tsnuPlJ4q z4#GW;Yb0r>;x<9FPk5GdJ!3ZcjdS%I_&Fd2;w(2GAHR*U@Z@(uR<;G(BN zeR3dEp^E*>)c10epL*FvX}n?rW;P|~ucsTc?(2ui4~+6NmthDT!ihr*9G6o}=%2#X z&zQnUMw`be+&o@sG&!8!pjiD%pNX3&#vyEtX_gasT5JL&MrKB#SS-u6@@US^a9Hf1 zH&DFW8OFFe*gXdKe_}+VIIS4Rfu1+f5-ukv@z8s@H%b4O>MJcSvs!gLc3-3Oh zW_NK}f<-z=>*I-brI~nlgl*YLzlu?;8lR0Cfg2YNE|F>P#`qg4{6E$! z4u=gG&2;+5z(MlapuWM*2)au`r}FWIX@e)G4TDD()|sdx5Vm1**EX0-{7^fO>SZi{ zy#X;|Kwo7{qv97RPX?~R*OnHKi$GT5ZsKkCpd|1U7}|=>n2i`%l^R`;>W3l7wru{Ej}Z2aXI{)A?T> zaee4K^h%nK4YfOyZt7w579%)5JKCYh?z0r6zgxE|@r_%cDYK7nCZlRvP2Lv`uHH%4 zOK`Btqfyx-|1|SY9iNW<^69jpf{@SEW+A>I-ZJX8&{FxIrd^sdEu3OrQVMB?N9DCd z!HQ*h`tNb_7~faM_5LMU=~4A@>Ippzrs9kR5Ep1TeY%sFrOq%?W8nmAtS70H&KNLi z6EXS+&HChr4H15#&PO@V8DzP|UFu^4gg>d+W+cN$u<(aWNmc$2fZ~-uqt3`NyXfBK z@8}%?u=Uway-m$}0&_O)vpF9Tqi`crz0MD4jq!~ap;YY^K0k-6V9pFB>`ot)eelBy zT?CY5O{wU~R~ac%K~t zZ}CO{HqHe@A?%iF&|ajyD!YUl!!4H$V%eWR>uj0Zp)fx$zhsH9VVC$j%fq4(#*!TU zhTPyFzQf{c{4^Vj4Aud3x#sVBBoB}7P$M-AdLJ+NiU)PH-A2lEF{@&qScmKDg z!YP3pee&L*nGLmI1h)`#mC(Wu(b|n>nf}!Kx!eE zqC#x}p5-uRsHR^|2G~%?E<^W3DJ<#Ds1$);0+rP9MA|X*Mn@Pi z(M`<%tvuL;ymizwwbrq)(;q=gX^`#wjBsgIf8;4@QSZb~+69)vp-l;YW5o zgGJc)6oL@s2D98{HJ5Kp89%uZb*~Pkh@0Z)=QBAV{ zrP2dpc?fr4c+)z^K!vyQNt5jm*p*Y3E9&I(ZG8QS?V=@lyU&0{`D0gQR^S56BNX8v zrQ92Vg^$6>%r1X_*dNDbuZspJq6Q8GO_Qd50~fd^+4(d&tfCC|Ba^POojpvNATnm< zj{V-&`BbgMf^3LNmjwN7pdgm_6P4C4cW3c1C`0Ea2AX?da52yOEQ#VOVD@3+Hl=F~{0?7*?h zQ3qu`MhNp+b*La<*rcKQKd#?w;EMB~C_Q@_sR8I)gMKWk{&Jt6x!i1y7Hx_kJ`rmz z7?b@tKYwpyHrkwxqOTBBZ~wPjZ>rD(_lZ6+Ff#_X#;L9bo#*S~X@q=gn?AytzC}@9?=yT z=kaYM0TA36F5jCW9=z+uL#Hm&6RAh@X-_KCJrJ_jTcABE8%HPBPFsJ*FS&8k)<7Kp z>8-(Q1#}YRS6tKgpn2Y{(~DB3ePA084I8dQP|{Zj{8Q+}y8Jn( zL<7XCCZ6GP{t8JBAuqsz5`dF!w#u|n!i$^TBQN|du5 z%MD^WK8k3?x&%fYxw@6UFU4?up0U~hBUc~^7P$+Rqr<#AGq_*5<81?Z`~T{%*=Wb2 zyG@UT`F~bMLQbqLyX5iKI@zMwL1??<3~@ZNeO-%V#k_q~uju5}k-uTK_4G`>`TlD3 z=}p?aGt592rp>6{URvbS>LaI)4mKgK&yl`L!=^<+<7W)cdraJ^7YwlVe*``pEONQX zb+EVDbZ>pia+4aWO&(+KBk(o=Z*Q(c@Ci}w2-nD29y9XXW&=t0fM-`ukWevDbcKt3 zuvkDBBnJ!2&X1l9P#o`P=b`R?q6nMrrEi#zbT|!GrSo=P?cWV-H!v+(U-M?eR;hu( zOGX|Uz_7T?#2e4Rl5ut@^*P%fS(S|q>bvsjG)rV96hhX+%uhmYGM0+7%k zV2o(m{;t+eBOjM5mh62p@q)0D0%f#%oR5i=Za=j!X-#*;Wi~kD2WaL$L^W@khS$7P zXjR+hS{aD6qfwW6DpnA2w5RO_VPkouLg7<>ubY?w6C+yvbi&nC${|g>G2AQ`j$5rL zTWAO}uR)j=Ocih?)>Ewvf$if+KqslWbimZ>RkhW6-lBclDxv9jMrjFf<?WDH!ZH3zOQwP$HgNx>Do7KT!fsr?=Ee% z;n{M^4b!}DCJ#WY?(MRKokHaCx^7BEl6+=JLA)fedF9yy?~c3R6WnLGhbA@ zPJ_t62xrCY#DG09_NMD_$#wH=m?Xd=cjVK~%{33+Bb;~Ol)>f2e^IP1#I)w<#R7w$ox?!^VX9Vtn5bnBduMP3x*ElUme($_x=xW z_x+b-AN~)Yy~l|I7aHJRg{Gxt1~}79G%II;si|4HGHrqrH=3H66__itQnPJ_=1R@b zENz1;Tc)c?GnL!WX6K z-Eryil1pOlCu(E)DgEWTKKHk+r^N~G75y=3Z-sUsQni=UnstHZ(K>|A?a>)a^Goo|VjUH8b{)M4xqo8DvYl&Bkkl?v1_%k?{komZ`-jHuS8z-|hMem7Y`I z>uY#(TFj}JHsi(wL^v%+BSq4&_aT&cjCq>g^B^*}vHNBzn?Q4-nyqMc`%q>} zKt`ui=gbF8ixlv(gdzR=B|?XS>AP#bbsY}|loEgP(!CreG{;1c9`%i?E|k-8$=b-+ zPEgKj%}nAoi-DDDyq=uY3xJWg0c(HKb)r{K#*t=}%QFRFcZ=toDRg1|GAeecT%d(; zOI<(>*mFjO~U;o&rane1uN(bR|(~Wm^F$`mleVeG^ENQOikL9>_BPxI<*E zvB}U!I&n1}oTa(FM=glDLm6PAMJh$P;U4Bf=0}#ZoC{X34G8R?|Fa2Tm$3th?=R&2 zQ5~{oKdD-Zz33hYKAZCwqK=x(AkU8CH=6Yz9~gP6)6&n{@g;<6PlZPf3ySA1nsYL} z$YwkO%gpG!mlevo!%mhLuaIcc`fbH*g7vG*^r`_!;8RFJty>R@Er13VbL|gES-AV0 zQHwZU-gb?i)35}wl{~W{llK`tHa_hglsB2H`ez9|giLT&@n&9x_T|n7TO#;5o*! zb~VgpccoIEpRC$d+UdFdLfa<9glvjTP@Hk%3bsa>ENHI_x%gS*$mHVOz$v02hfpN- zOdk*5f_dNNVynRBBpc#L1L^jz%-YdSFf~BNei5Do+hNiRXJ}JdZS;KA?`gGROtHH` zYi@3;q5nS@geJE{lH8+HnAvUllvFog~`fLZS^nSzAyY!jd(4DR+wHmBmc|b?j3}fJoZTIt~BPLsZDfSfoWU5-T<@n zBM(wk8lFjwFryeBWw7#0iP9KX&FOqk8~SWUF$Ie0kqOPNaNl)R8lvYbQF>RDfut>E z={mbxGPQPQ+J8!Y&|mX>m4%X;jW&95$Zk=pJ*PfHjD1o3BAV^mxs=HRT%dC60UF&y z6j@nJjqx8)U6`M46+~0aLy+e_(k%H~&F1+mcy`wgldd0xE6s3-y)6#uUc1*>q2V?r zh%OX$W3E#QR^8Aexo8X+H37X=I4<%{_+_1S&|a$<5?W>*LJJ^Buc^O7JuzC-QLW^z z{1Ys4uDn9b$;3N#&jM^ppg~@s87ozg<*69ctrVhGc!CgvX^l98HJjEt18DR=X2z|k z#`W3RQ4hV0^n8w^bnBTJss66Suxg=sGk0Q=n(nC%?wz%pQeyE(K@F76y4o^H(OH#G z?yyp5J4M;J!qvj;$B(m5j{OvtuXoki!XRTTpn9vF{AujyRilp@3c;VZ!JTcSM_d!) z)A?+aYxMBdMQ%$iOtsYRV1&Jy6qT~4-{@Ux1v_9A6AU{-uf3Ii!>lyVV%%X(pzNA! z{OH%*aXLCy2(@aySXjDJB7oVrmUv4R&j(h91>HJz@#BV_=((EHTi^PHUnT`+)yh9F z%m1z?fU~Ps3)RIU&?p5`XgM#gT@KDPD_e$e0$qadlOor+Kg%yXF@rj;ycp;yNvU&F zG^+F5Gy{vzB>v5z%a|0mk%XL84mHI6)DHXn2E1~eYs=SVS+-sucMp9&<<;^SqWlZt zLyJ3Tb{75Ts^$%l6jh_ui8QxxrwM5o{v46O!_9D=F>GwR0=14sYZ>;KVj>6mJuL{0 zf)OJ=3$?RLzsZ;6;7Z=_cImGd*m9}{ML$0yQ2X=PV?=twY)Z3@xe%YB)n-kX3cgXg zHM+&bXI*;3V(fB%)iABfPC>RCw$Op}4;qZ}^iXPfC1?I;G z+8cR^KV5VGN7^^8eYylI7Uxjty28lI;RRHHhN+d3oukR$sOES0KwvjUiRh{{(t07H z8gL8;`Px%MUz>etFa^|D$tE{3Q3($Kx`h6MmPf78TfAD)(}k&LJ_z>0SI+1iXG8pb z3~;+dFMTD1Y~0Ej;KiJ5DH*pd_?6Il@0VV(eFFLb}heO*;s(e-a@aJ>wM%ZM3-^!9U2W@w~WH) zt)eGOFzNm5WLk+?cn^h5>Xa&|HBh6kb+5ocCwJ8_S8dLRCK6S(*}82}w`Vtc(&58& zI!FW3R|Lin$|DI&_;@ru5p1QbQ}3bT*D=3q(@)Lt22|}5jnr)eu0%7{XqBTnbuOtC zG+GI81^%?d5=`g*4TuH9ab{*Z4~N=BcV*rSZX!#i1Xo*N7_8>SS7Pa7I%fD*|0nDZ zt1Yy{%}x=_)@(*$Ai4%(KnnUz2{+x$HG7v2nyYaXv#<+%?6}|=U|H@wrT%G{^4Cb$ zq-$Fx(qN>RIwiF?O#iAer4FGc0{*n)T^Mc84b9wslNw-VNM9*mZC(SPdr~|`#CW^?WrjNtrg+{ zlXOK2-SUl`Y&5MqOIu}3Cl>VTO^Wa}QhnuP(}k7V&7gPBTqvbnsTo8gLO_w5hu6`?5+$UO>=-7 z?cYunQ$xF@B)ODe_LOpz^BonA3CxxlSZG5O6oQ{RfrjgoY)3C^N2J~j6xMo}W<}aoMi|tpg)h%q@@NAnIOwepF zb;qbiCr=KYa`$pV0Ry#IPz!aKs;lIZqd;nHeAq0D-1l^QFPC<+iMj=>@r=JIlLn1f zXgxHiYtmN*#YmSuq4e26YgZuAj_%1qHGeRyqROT`)H|5V^ze?b)ZV=Jk1bK#g8Up16R~PNBC;@O@M=WWjJJ^PiUbxDkG@1$z@zZih-I zC2Cs2wf1HYb7@n=q9Nlh5b(`NdpnOX(?y|beb;~(v~AK^N%c?U5?!UH8r;=b_Fxm4 z-{L zP$Kl%$(JhBuXxZgU@bHRw|RjKQ2%Pw5E-%H&M})C)X~j6V1TQEvt1jLZI#|o%BsflACNaDByn+5>_Xkr>p)K2At5ln@4qPjh(D{YoW>fj5* zSBI^j>!SEKP=|mH(DTHMW5`n(dT=%QKKeKf;EPS@;p#H3-8;5kG)*1WwfjU3+*3+4 zP!J*FQE0afGI&wq|!J)xVaB zf1{fINVH0)vGh6(Ay@s16mKQ{6eS1SG7)oJe6tSW50hlug{LdDD!X+11hJQHuuQ}E zZ_9yWrpO~=y-7R$R8SE*UH1leb_5)Oo}#4iskKb=lT&)20or62v4gw*j1k6^u2CtC z+zQiQmSY*K+%zf+F5mR4qUxi=wFa1YvPBquih`1a9!u|8hyadHiS}n;OsM1$fsV>g z`Y_Njpio_3CqklOD&*iF*8G6iKPfo?vROozbr+yRbFESyY0*Y}G^C{}VMj8SFf@yT)dw$Uz zT8+oL^lAj!)FpL#7qBd?I(Dbwi0+x|w>84M&U6J;`_MPh!yg`|0U|a825gY>n1`RUD|vXeLj`Lm zU5XTK$7+FYd4WD%saJi7+8w#A>yq9TF+4g8Gs4GksQTOs#9(kiU0M9@DjmM0{=f_3 zl(^j|0)JGuF{`Sv@P*z8D-K&j*g1eH0B^}uH5f$`UhQjBP$vwcLyXzD?KNjMFBsO# zCGK5V1UMhtO}-Uxdyv)fbXvVrdd|9b3smm1uly=JOs>$3pH2pjWzdXQcQskXDKu(LA*#y9hui zp6Ii+=?Nn9a13L+!5x&r088%{A9EN)U`mj-uS{i4K>hdrvl4n9Pt8hEe2uBuDMh_# zqsDgOUq$@1>(;X((_eL=Mg*?bndR;!VMlqur2O>n)mQJ`y}<9&n*-rc!G=ehnX|NO z`<4g`a@}C2Q6d=HEzvb9z-RJUMyTW!=_FT;3F9g3I6;4bucOwd*~453^3mWhkFB=R z9B8AO@Fr*wVmpmIzsi3&#Ndw@ESHKc)Afsf=BhqsNEe-9E`B^^gL0BbUgTf@L?wSS zQj&MyTf_U(*@dRgz(VDe5im9ooG>QUhtOtbS&_O* z+N%i#4MNaf)qs+kjz}?g*!Zex%q!Xhd#PR%v!YUwI}0Z1YSJBibvi+Q$J4XXY&EVp zxjcRDClLR_Ys1v;=MzxM7BFE9ga`3Hdl(*e+gT&9T9arA(&l1A!MJ&5S$X=ic4q5= zYATsU&{mk9;{yP4NG8@>Lo2>Q9W`aY9o>2PcA!B!)qi1Hzd8aS)Y?CdlI}7~rQv2kOXCl89eDVa=Sk83 z{`6^@KcC)xJREA^Yh7WbpWL7WVrLVbI1p_dbMrZ;@J5XqUX*vClee=*aEFkD?<=IN zKl~SETkDy10s)WRt>E&*$v=f#DpPy;HRze~r9M~KFB%1D|t85A+hL}+Tm=exWyHgz1(i?Z}C zOT+h)>7@7bHJ-Y^6eV73==Qr$I!)M3mAQE=s&?>~3j`%zDWO^*ilJaCYen9`wf@lP zghVgTU(ajo%JPmr`Dgm_g%G>hU{i!w&wXo&kC85Y|-!KGP&^33R zeo+LTVqp`#-8wqG2PR0-&e*;tP6WOZ^!#YIyY3#dQlNRE{`&j7lwQkK?k~&5r5sFd z65M?ZpW>$};(!V-eNWUVG)t7k=>xSeo4F#0k~;vY}; zgVs5XojpV%ICEbq1N4wuE)Vtg-y$JR24DRmkd|w+NeqdZ>!6Kbrgf0IWoY+45Q=d! zTkm>%Vy2^({sniv@#NYq#AVU7;h;C%k0eJgGuK>;4M!Z4J-ewj?v(h{#QD*4`DJ#a zk`;d|)+DpLknZ<3*NKw-v<&!f4c(q>s(&X>7oLih{%hN?X@;%tzCCc}x!(F)hS%JL zA+W~=j-n@StCuyVdQE9(<#R!wM1M*4+sur-KKmFi_nNGJ+wD=C)KdEK-NIV?!}pek z?w(~2i42LWAM6V7T0B5HiOC&dz=X8T z0*vl&l#Y``2`4OykF5~6oA+=j*C=2k={(gc)ufawRN&vt3mt=Pa_qzc;?30le~w32 z{J!TcTsZ9FAxp?S80tzgK8%&lkc#$3es+|B+$h>>a(N&>nvby8y`WCCXVGVwrQzqkvaDZx3Ds1sO z>ru~fOdAmByp&Wq^~f7agf`awEim0-F2aFNFU<`Yz_h29B)*cc$T7^J!=}XGcph=0 zMeM}&gZPk%hL6!sNpTu3S5K;cET&yM|pwt zSv#ZBHSTY@r<*9=@Sv#LtzB%C#^}|vK!fPGXBtV9-9Svsut6YrC@wsc>=d1K|9B8# zvV#iS0N4^P z#;XNZ3w!#m`{@4?gh`O8xBd+-4?l7rh^$0-Q4qPtPUQv1IZGh2u3>wOeJZ?D&$#>koFUcBibMK^;W#ea4s7kNWfjj?X0OxcS8-4cb z@LC2;wy+T9RBwZww`A_a(vtn2EC~5zj{Y#H@Kb~`q8h_P=sSfI{J|$Rv;(2Kb_p2A z9z}=Ef-QIUdln_oRS!HL`oH$+C&!Wswk3Mbi6F7H>AGiN^`>?<+5005H4jOPbv0V^ zHL^#C_URNlwT)h7RSS?98}e!=SyiD%`a{ep{KNxMCeG4z5chqvhmZ$y7+2S@;Rp>o zIT7qj!3KGrUnw6L3XJ7Ux6a&`f9`-07|xW%o zyRr!cp0?{I#;9&Fj*W1cTdTMKjnF=INI!vdpbqm8VX(4|V9L$Z5->A#6UA9Sw$ZeA z$3Nhnx*QwwAXaUp+#~6Jhg*=SU1@$eFhkR}3qhZh5^BYloeYqr@m7$xQ3?I%7feiW zfdUf#%Qfg8mTGvE^@JSM=aKHwww=x137+B*zwwPSP(n#67 zBz`;Yc%-h3sQmNFUw6rHN}NUQ2!K*2*(gk!tMzycNv{%ObcMNB=0e9Bz?krz4zRXz zQ4u%rzMzmE{;jNC30NC<5o2P;VZzyP*2WB3a-{l5%yUT-lgyzaB_8#*$2{4Y4u( zyFG(RD~eqwsLFkp`^-)FP_j52W-ev>xShZrl!I}1xfzw7tG?Cfy8tK6_K(e8cM>&9 z)c3b+*0UAF6^R3B3GrD@BV1&D1Y0lhldvsgCAxew6Iwbcq%tB(tfLjwpKk_i*LU+M zQUtFAjcmg#N3PYAAc7Uh)>Z@qc}!zRYPqc-o)$<}5ISY33}?cO?3Z9v~;+)^c!`cF_W9q_Vj^ z_68sMAv^`sdICwq-eO|gM3^Q3BNn48IPlaKlt~woD^|l$)s8Ltd}d zn+fs*RuyEeh>j1@lVEmEkP3{syN!wd@i?z;jX9tI(~8d69r{9sj*Lg_i?wRy9cK=xB&j!6n7DAx;>WUyoIeLzJJ z`DwFu8FcXsvWu4Gh_ZM@4YgRjm`j$FRF9>{FCt=?=)HkjiwxD1Ay_0p6e=`<^iB-2PTcrF6njMO{7k+n?PRfQMul?? z4ERY3eNK8WM(&9RQ@W7KnN)kk8SURL?T#zr#Mr>oXS8WZJuo_ifjDPQJOF~$AB?&% zi>++f(ZKZFoq%6RB6vI{g#&7J?@5;z;RC1PlC_8`W8zz8_*=)yngRa`4N`3Uxn%%R z5<_~Zj*VDEJO}(fClhKDQN2Cp_xQ*t24dgCR09(J`%lu~;x6+w$S^5Z^E{U^v zlq?{8m=nu?J5QOfXb_8U@XL2h;FE1jd1<5*vMmTd+;bJC9A#K_F~39TqgWJBY{K-r z%2WMO_cFb-5@3uuf>QnK1?C55w#5ob8tHmG!brY*bCs3vi?HQIRN(3rgF5E>W!0&( zXDMLpx>*(mY&}*3IETZ+sX=53A$l@6#w+#Jfd6Ym?9i0JN+H!&pSbQIY!r zCF+708}5dM942v?HPc>K$_D*SCNy%y#agYny<2hW9Q9nZ+Mqf4xNh68`X)URYPJP; zg@fAO0yaUQ8f3V*LnN(6vr zyCa=a`CSAJ!en4?GqFpDfR)^wcJBQjSVU9&{huGP3=Za6{Qc#IAC=>JyW~=E_hNGIWC!b3=~p730Rm_$iKIfjxSM zBrEJrrOT$9PVX-$wGM5KlWu#}O799xk)hJK$aFbYuPZPe!1q&e9dbx#3#5sQ&gY;` zaFGNoa-TTzffF*3I~@E>g`u77`GiQ3BQsLWaan)($taSJ0kV?3!XI2}hqTD3gw6r*#e3H|^= zyL2+cr#H*`@r$+k9wNlM#qlajBw`fg>Itu3!i4X8o_V(8OfR}Nlaz$jB5(%#FJ;M; z>)`cW*DmUx347$fAU~zAIRAL`VSQ++77sqnL^xc08D=t}78N>l1jnDD^zIwHkVc|1 zR4Q2Hqr%WLy=N#T=-7X>pKa(>40Bdoem(r?rBx&@q@Q&4H)U?$^YOE9Ufz3C{({sJ z_Vys_%|H6QSC`52ZiwHX-!9YM!U;SOK@IbU98ofYA}IC_$qj52F{1>5j zO{M(t=j}5C3PZvf0|R|v&FH;vkBmm9wnb0n=j`Z~O8>l`vM=gT=9ot07Y+no1#|zR+|zYrron2}kUZEmWeTV#9H|8!NYDCQnYHPAT?j%d`{npT z0JMNVX%m%MAv+OrWzKq=!kO_@m(2U`=hWUU?~;z$S%{nC3B3E#v+H-hJ7G|J?ivQ% zasiVN71K9n{gic_FkiTG)#X0KRfOdN^F8P;4$SW*v+B-h&a8hwe_rW)X1^hF)B>Z@ z;^Z}q{h=jdd?EV7RfBnC5>Nf7V*Vf@LyW;-KHgoq>XklT)x7nANtglcPC7@90_r=i zd|FOo9FT3Hi$9!sinkDhFW&exvERJ!&APB>ZzmT%Pye2_c6%=bmj;-y0emvkO4J#SyqCoWgsdqMMEHaxIwT)gb@b;r&;mOG~eYTkAG6X{5wv9hE*pFs}C5SyWj8y@@LuR&lA5tw!7^92aIE6i@vOEtTb;?9x!j) zW!`??_{LSkTPF(Ad9||E+v`!f@(<;mpPra~oGooHt(NM5*)s-j?^rnEdzE_rLE4 z{`-00KNTDI>+yg8e);bN4mdc8Gy2~K80iYBQKoPa;%HlH13BSt1;EGVhm$r6_hK40 zUBkRIVpH+n#D}||kIi~l+C+BuB+YF$O!HfA!D({me8sFRf^qQpykG66@|BS<#@}yk z^sC!a7ksdu?tIkY;ch_sal&tVZ;^4xvrj?oF;A~VURtBS?pDds&b=WM3t=6~wC@YE zFLyK=pFa*KnuJa+@_J$lmrido0o7a^DoQQqqAwdlz=09@PL9mT>vJ9T+s0Lcxaz1q z`xawoUIm&rAM5C8KK*rk5*&4N{E5WgvFY}q`^mVp50~_JUbtsim_Lpp(O?tw9cki^Wv1BNfhMPz9!nPKMdDP?OiR#y8kNM3^8c{ z;AgGb&9LNe3vLq>TyJx_bQW|6{Hb|0v};rP0=ZDiO^+ z+w>_SX3*kl_25HXkXMq=y=F9jrR79$??Branps&pxM9ZerYPkcFMv|`@u`#8uya!5ZSXpE^*LBEa(Iy4^} za~kAqWBIJ&T+2bL*vs4Yf!!i0-bJ8z-g|cHAR7sGn^`i+qJQ{A3aMznY+p}Ptw+lu z&wRJH;0DnrLepenAK6#)PPYTjFq%~8*8ImJtD+jsRBK<1c$jUYl(lJ3Ut7ZuCpwok z606!Yf(}%J3e2%YV(>Z>P*Tdw*4=3ioj;9@>G6Bs8ffkRr4U}k1R9iwgg=kGo3{kP zF@~wq>~#Tn@%%M^=F$jtD1Gij`wU+frw`Gdu563C5_B%g%y@5MWl&WRCVNTP1+#fw)yL|+ezeYv#*;LkMwpWJHNWvc+lVz2(HWUEU{{f6f$mpAw5TV~Nl z&`5;(@bc`3Lw8~X8LcC%oLu@?(B0*s)eT-LFZS)p#lYHgt0^%TrtbZ?9_C+dacCgs zAMM2B6*9ey-G z-v`nj$NX>WP4MiNw&zP@n$t}_bbQd^=E7?M268HF_*QHGHMexnie{HHeIWZujlq*s zaW@73FYyM|gmdMQK=nPE+MCMFnM}}%lWCdPwbx1K#~RS#C?G9St$*O8<)Kt^WF;sB zu?5Y^;pT!GR9$)7;@KcyyuK2~ok%$RT`+MCOX=*m_s>t*ne!1pQsjA{y>K;*%v4ef zI%YG@1ied6-gSKW)5P1uVCg$~M&ZLfrB+}o8-N7Xb`cqXok~Tf;P_D)AD);g$%ZD( z(=vb?^HW>Z43f9l**%LkEd1gWfrWx8t7R*}fQ@KXs6cGK2kUISbcX|~ zaCZpfsBI8HQ=aZS9Al0xKWxFe3#f#+3$7nNUbXJ^RLg$%@T*F7Yf-6gdjz|I^;22P zobwd@GtJClgxrc<2Lqrj@@((Y7I^uC;oI}|L&LV)Sw@PWMnc3U&^C>4MR0w#t2Im3 z`0>CROqaK;2r16J^peLPbI6P)u=(2X272+Sie$41Di=aXyMh@yIwbL z#Yda!j6%{w*o}^&{|&l9FAD0h__L8k9_=rS?lPN&r=C5(XnOUp`y-V4A(mWY>r>xR z-~T?@J_xw>_s6S4U;h0m&r#`bGp7zHf6q5uRsQ*O^Z$eX7W&4LsmYJVMd)}qZ$XtAe?EjyHuh5CfXIWnb)P3?W?EfDkKg@bdwW_SrjWF=FMEUZapCz8RP~6 zMLjThfzMIGgWN&RJkgqA0p4?SjoPV!9+P#gxyjTn^#;#gi#A%`_Td`xRkL2}!%Mk= z5f5~0;>j?XB7Y}NrN33Ws#TX1#w8n4rhoN09``Fs`8%bv71AScF#I3qO)uDXpj^Y> zIA`-i8i`+_nQK&HCYae|6r<)<(NlVAW;X^o*6v1yoiqZ^8V1n^MH+3|F-t77O%J_X zZj6-NXG$zV_KQ5Q66^_V~6eLa@-TWm{G{4ywhq?H9eTJuDGcz3tT_d%()GJJs z!!GM*1lfn_v*(1#ikE-h`(6MAlvvjy;Ij!i>AK0L$k!_<2><+0hcYwL*$8ZmS+P@S zvYF21D0IHSP5^wnz(mKGcvohpS8LQc`@OgDcF5jQ2d&>&^4>Ff-Nq1E4fR1_)}{f0 zef9RthI%WS4k6sJl)u$?+U|pk2&2~2{RM|iGxrqbk|VwB>D#}12ENR}MBe^Jef=w) zL@gl&)VP)J${GlCw4L~#P)02kHaTghkv)PlJ&qM#3Z=!e)>4ghtIdQVk0BHJo*=9n z_Y$|kYZ4Yam3G?_wd3*BwtPMq3;&*k=S9ApnzsY{VnZk6PJ9W@F^D$Ut zSpYT2b13EPdfh<6>T7v|2qHF{9IjKZ9>VdU~yroI7bXwrCE6f@e zDp#DYIm9VFU(F)?yRgG_UjOY1Sr>2_Gb2iC-0w0x`gmU32-p?vo}nMQQ%T_5!3AYKzO3h#D-P)ow3TYOlTR)|SPG+EnQg>5a zCi#yhdtAojL~-Mvsat^oM<hRGNwlm2de;M_y}Y|+XB**Ilbb$cvx9*TwYWBuDq{BG+fF$OFX6>vcZtG8yQeIWK1R>C%V25XI2 z>%I+G^MK|7mq47zWeB~Apb6FHS(atThaHabR4zj;9&4K$B^NlokoMd-|7c!GBhrK6 z#z*0ac{^}DgtgW}VJB5oT=-9)to{>-C&A`2!b2dpZ?ZaA$TZP(-8%!+if+IB^MliI zRU-#)|J<=Pm*Jw(wNprM?utqS(RV@x9^T4AtKvhc0dm5~O_zY8J3{Z7H+4PCvX*@! z`;H6x_;L>u%6!~WU#Al_(stLK7GAqhHFAg_tO9OZv|-=@(KxutQH}P&Z#r|9;eCl@ z#mmmS_38sc(66~p7(>#`e6!qmooT0!r+fV!QBLm#ag@N8P`yv^l5VD$O7!l*>&AW0 zvVgI%ou9)Q2TZU3N7mz0sS!GcTZC&&Xzw$O*z+?jE__rtTp$x&uQRi_tr)rgh`twY zuqe>cD9H<6JXix!y|i0CAfj9i?ARs)`jcx!A-J6eBgelQRyfU_fAZxbsxr;aos?r} zgs?s!gYJTFkv;kmYH-;ErCqADEM^W(125CF&&{$v_3YB;&u|`mMykO&hpEp>ygmhI4}sn(E${YcN9fj0ruU$zRSFG>N|1Q6#(`G@_1_Z+URFl36KcxUm* zviMM@*yMnT%I!O{%t;?9Pe%(fF&B`34*~n+$p{DNE^+iycNxdw3Z4od zIl@^r%H%K0qrnYApC1lWEt^!x7?>$smP6e^IlnXZqDBuMG$US>V$mho44VD2oDk*- zi~?x5-&S@qxupRURUXsQxQXJ5mIxg>gc}ph0Pk&Ug{c7EZP(F5K(iU~86UL_?DR4r zo-+du#}}H7dhC_1hm6|k)@RB~w>vQtku==Z7OayAktfWV;s$2(!w{o*D+fSao+5HHHl+o!YlrTS_>BQB2gO)CIVlVkf%8(EBX<~rECO?aN^l9 zSP8^ilr`ajJ-7X!_jA%QJM>HKyo$z+^?UMQ61<^0Xc#C!cj26wpaYfma2AGVPJGT! zHuSVu@jl6{#HKtdpIn}Qw=zLZbBlC4klqp+>59SK1^`eNqLtukPNblUJ~DtQX%S3- zx)*TNg!g|?y`Xs0Wl-*JF0^d2@ViUEG9T+|2E3+16(F?xB3w=_$3NULVG8UAA}>ld zAa3Tt{7~vHK+BGUJ_vjo-#m?Rx?hFr0WsyucN_09kjAB`1O^JO$VYaax%#yT1|}w| zMkHSYh}8AypLyRJQ~$ewKiZ4%m*UdgfHHnHk{80KMM3?LXD=Rfj@PQ62r7)>=iL(8 zbrqwgi}oaJMLs;YD91mO;d*7*b}^<#hMoXxr{3OCXhihM72GWe`kHq9Kj`T_HjsEG zbonO2GXj=NMOQH}mzda2E^b7OkH{o@P@#|FVfPJzV=}I(SB*er1Dc(e#T@;Xl%dKD zs9dq}I^ahd`I~!Ou(ZmoLVW8tyd*OI>0&j^rs5=A(w4ii<8)TId=nI0tpaHdbEsd< zfE+G5$O7=a4m$ijfFRzXjI{`iYpR4LBd&8%J3S-EO^6ld#M@G^%C~D~va8BByN!!; z?wkepV4K!pvt(6!CxPZ(B+LeVT@34U1T@F>AXZ&?!Yn{c# z>sBu}V!h76x-jtfO;A5ViS!t}3ww_aJdZD07BwJQhe+N>{WV*_SSxXSU9ttSDZbRy zjS#^^V@PmBE9|_WjpGHZ)CDR3Y%4g^3hTn{&jBuSMDL`H5I+J!g(|jOK8?U>oT*3B zGO*N}+W%}^b^RPtfGI6ktwG@1^MJ*cOHu4w_Bnt^4hd{2NZ57<6o3^fO@R_`paJmo zF$RK}c?drQECd*ls`}>uY%p*}#nFMPvhQ49N)mN1p2Q?zD&svBB7`6r=&1uvi}3G6 zu(O+h8BS=C+$xdN^aOi@M1CPD>i#nWzx4JPT{ItiJac&<3j9Xs-TyFq2 z=nc|N6|LCT{|8ER+~ZGTp}kFsqks^?D@U?WM{)rb53D1~wR8t0jE81*L%%c7hjK6m zxAq`LQ=qM=z*mQyDuKb7yvM_7p`nBCw5oXGjTtP<+AojFnS43JvQbRx>4v*U99U` z&%qqs4agb&=uu?xgUchKBM2Jm!3STG&&D2^aRuN)5VZ9#V$SXX-pdlOl94{?kuCcG zZkX@Z4I5{w@1c1&ArhQ%%Q$R_(60av0S`A;JjSx{7ciq{Va_ZRu~Spkb$A6X!9}kF zJox)zt!QP?GXxFkHnb&1f8%SpXVGFG28;@E0=(nzK_##kw}C{46yk?k%2t7N`~Cl& zn0|t+fAlOh73gX~T;>3Nj4HH(@Nv_KXdloo8=nbyzL>QCBXIHaQGg@GWxp;e9{}RG zvRq{&FqesNw|#X*-}!U=lN{;=AYt`;Am%!lH{`orf!)}PYKN2FwLCfh z&r6gbW%BitrRlumOdjAj^h|!IU5q}*S9K0{d@KZ{L%^8{7x;*CqqNFhkF=HY#5WT3 zPZKaDD#s08QuD)z!(0N_V)f$5?lSMfk95{N9)0#=SnvK!;Q*0zJAsno{04wSr&kF! z|6h}?{!7ySG{y@&&w^tNgl*`>kK$K(XB;a8-ZS0-62iv4EUQx(rNk56n&0?+8oNIK zo*D~2Cx4iA*ZR4LYFivR4dUl! z;2nSO3?H7rM@0SsCODygF4y@|NH#t*3^4wL|3tWDsqb-TR^uD24U%Y0jG7>LfrRQd zg9rhpccefS(pFGEAvDV37-j$C&;gtOw?mhe=ZvujmO6kO&Nz&Po4z^Oj3ryeWd57 z-mhv!{IgO80E6D>e;_38w=M#jsjnblCHlw!>?4Sfp-&oO^xVG=P!5xx#dnaus2Sfy zeUagM42vcYV-cXO7-t;mf#?p}FZ(icTH`I-rpTG)Q1L>nfS2I&0VFQ1lQ{Ym>z7>@ zU#BU-E$(L?IN{tGxPY)B+#Ja&ihsLD_MGK=AJz33ra-^LlVU(qngPFN)iG|p*hj~J z&n;QVQ4DACh)gCY3clg|vMa>T)f8{gJ-=tvGr{%1+j9T`xHaiPY8UljS-+v9sFV9h zcYz^);@hF5e=M#{Vw7D-_-#~W-7K+n8O1|YohNarui>u$OeJ9n9@raVz?=I5(SH|<`e(%&=&5Hp?y^iAhnPx~8t*+L&XXzYGOyQNlxcw;eJqR~=t zGjUV$HGe8u;#O$jHaHsLFY-R^oTYn^yV@7BZE3T^yUGX2fo(w9@={(OM`pCn=ix{} zz>R&c&mB8M+827~;40M$pu2(=N;=66ULz`UD6YB@72rzP@3*<@lXG@Q;{F*?nYG8t z)$u;;E%kI=WeGBhd((MEZfy1L1Y0k&Q(^aa;*QwIy>Rc>SJVE$=-Phr@8H%a`?+Ps zCx>GLF8rCl<#7G%{d0K7KS>{`=yG+3KJHZ}=|c6BXJKNKeuL}ruPAq;Yo?#R?mxSK zt@6kpatJ1KtL*t1VbGn2F45vu&i=K!-^yGDbN`SFVx8|$BK{wq?!+yr^p6`qyNG~@ zsHjK>+|XQb4UGyA70nDy3vI)#sI1h~v}qa+i{g@^nQ2+!QmI*4Svh5mAQdhZnUyux zpjla2V~#W9G>zY%&+}Z@?>{)#xo*z6xzGFaeldCAM*`!B1U+0-rW)<;JX(sNzd2cX zbBb{rcVysfp!tTHj$m|B%i1FrZ_VXEjxI+~IonE}B1f(C=bs>2@jWa5C+1)Ausf0- zPyLM0t=8n%s9LR(5Fh(afTZt|UfR>;r6q3nYj#EXC&k241y}5+RH~JiqfX_@hzk<+ zu9dTJN@Yy$)ZNPCJ0@eeHnUeR@XXF&Yd0f?R|CtO4j_q8vrzY6Do;%sPOehLv>)C_ zKqj6FJL3>Ea&t>{@yQj4RGw3@>}zx6YLvq#=M_U=1t*fU{Pv)ANN<~V@lSc5?(pYE zWK5+dY8|lkZT4Lo^|M(Oc|B{*fL*N0b)V>L&s$s1w4CZlU;ox@Mwra&#RH7`UDng) z4Fk*lJpIPZk40rwy9+GucAj*9)T^Js<<)qp(l50 zXzum}Ph!O|Z~>cq?vEz!&VoWWT^!iR%Z)OuE}Ul#H}BQ& z+d|LHDk~eD_UPNv_ILAuc&WtS&p=Eh#upJm-9NuZGWQc#hr3WJG-bgH>w{K(fK-B! zNxCB#mU^9OEp<>hl!clNsZ5vu=n`_@%&GeD=DTMsc?ZOsCvH^P$YNvu-f@bP3p(xw z00>l4!S+hQf;F&o;4vY(DbA*Z|He8$X$xlj4afEDBxW2^^r+&o8e}*}Cv}hGexX?s z&0BUXX+*)|hAoms>Gr4EECPv-^*6dYV=`mR?bDkAS0*(Vt~8`VDjpXVoYZD4X(LC+ ze!ZqZhb8BO@O+cN)6HktInUI{{v!9t>fQxZ8tAZlS~HN7X62kx^uKtRxp!2$-8E?p z(dnNH5f|f~OFNbQ-~TS#)!$~0`T#@fIQWbGZ)%;}5~DL0wp%67!ThzInx+3djm}7J zv2G>{s58ogZ1^q#{{Ff083wij z;}qjm{fEjmksd3nksYWqe;3+(HWnlz$YG9x(BQ-}f47u9h!ljMmlc|XnsvSdJYVTM zY@QqLW_yk?#kpiRtm1_2fTt*G{r_-MszCB3W|WV=XKmBWKA?t^k}ea(S9f1_VXsjI z-xR3-)i+waT`CCu2Ei=BA|in{WpH1iRRm+H{|p%ru9$dImUVRFJC=xh+_}s?_bQ+O zifMsCE=mG=?-V#{|(SLrn+YSlNYq$e=c2pGF7!JO`wx&MbN7`iS#uRmZqF z<3&T!3hd2aV|0ReWwTe>*&mx8Ts{7;f17~QBYV-z=ru1~Hr>vF852dZkYsCabHnBIIlf6|g28fkklY%!kq);b`%b2DT-6k*-& zBPD>8Jq&pk$>myEmweCLM%)5r)TPKA%6+ZzlN}LFoQ{Y>T&&Hn-&)I}`9=&lE_Mjeku$$zcN0xVTq+yb$K1VXjsVHc z^@k9zUgU&iZ;^G&`|IxR)Q>w4l&sqZrfN_U4XY^-J#=bnnqz(FZUvG)l|a%3HKSvb&uZcYL~Q zo2)EcA}0x%(WULD)39;z=Nz{(bsy(4>|zlbi}h%TTg3HP3IALotiPNdT~F9f-~eAd zuZQW2Nf`^P?qln&`>>~z`sP$re?!e=a9!x{7Y>{4QAr!<{m*9d&akahRd)z3nXn~- zeTH5iFd@zQi7a|~&hEMQy=kpiKHPHz##+u@dUmucPvsgPr%sxrQ!=S&)*QzoS=??5 zf2VT#_`POV4O4&2KD>7GALcuh7d8ew+CqBQu1+9t0eoM;dvN}?K`zgUYkm_9RHhn= zZY{hYug$&(b6R!w`raR^M4|$2K6qtN7E1dW;(=A6&s6q~H>^#$%Z%Q7GPmQD|MYyr zSC2g_f@@PgFa9?^j>{>JlZ2I{%m=-aO{taL@EyX-h%3e4DN+1t|Cog(&JRbv#a#8X ze79^d<-SM#ZnW__(nAqb3)%P}^UsB~P(?9)`QO4z_vdAe=ar`mda8Cdg)^L$tuDn9 z^NxMR$H-<6KCG$`nyr(UHkGNW%dlChfLkI&2SLRbx;&G!?|oIUqR{!K^NN|Ga20Cs z6Sa`BR1V?pOf5_O_s%y!@xH8V>u5bFyz_P+?yvKQH>ebkR4R_3*xUgv;Q)!~1?a8` zRnGi1>W~VaMp*wtS+-~yNLX=hqqfTmWfO;POLKCMLQ`JAd?~6dhOV6B*v9eSKhup2 zslVCjbskdhY~VXvCM|R0!0NKJ^TcnrK0-usH90&p>@7DT4ldE ztN!Kb28F!mQ>cV}XvS!WvQx3EuKW)vDysKpoTTWm!IP~=ze%m4r&+9Q4VSkTrN?to zL)2VGuZ-ncX0*6tr3#s^*@yvT68pnbMQit2xD29pZ?syn!$QPrQV5ZdjjOm_Uh%8={Onaf{vUgl!+|1 zjVK#fmAT#gFN3POBN)kOWEr|>1BbXdOWR_)tEP~uUHb2fJ(L7xLzl{bRGGw3Ju@ha zIOj`-(2`N+4Wm+YQ`Heu?MtX?5yQW(Q~3vmr6Qb0_o0*LUCPm@^+qp{g{bef>Tv$K zoO$*7jC*;V(!{I2x)igP)uJ+<1Pe+V{tQkI|`fG3-fG6uW=z=0fLF{YpW5>33>Cz)^QY+79?MJf*- zJ>7G!d=x=TugWuE8(9LSfu`$Vohy96rt7=jH_zAH04`3kE(m3EhAj$ zW(4z$Y&R>jgOmmHt=)IZI^*igVt?uvdgq`$S%KvRiY%5#D5E&7dtkk~+vTWAq={X; zxVseVu!7hMLa|?sDwq6oV}sDYtHi#h1mw1xr<1BZ(!=Hc<)a3D%009?+{Fi_XWOg#?sgrpS%5(jOXDE^ zF|PUZSk?p8vB9Q4gbInOR;Fs?c83)L&f>E2G?U>X>}W>oaG9ZK2_G+{Mc=5$ha?y~!9|PJjo` zz^VOMxicC|QUS(@*X8K92g{FsUe7HYQS`p3SRBdNxAxt><5Q5EWdu}$SROz?t`{P9 z5fE|_%ujV4l*%XRs|C#SH<=3Ukx}6X<=z@q5c6@l8d?8z-A@mWO)X+*QrRA@c zD0BsTkucE+^`oqT=$=rHB{^}p=JHFq=vYHS1p{&O!AqCPQHKYrh3{A8Tyc>r8satY zcTBJj?3DlB=M=t(Aqj3IuQ4B3gWd+L=`=rjc+H6y1!h4tsys0~8IXrcrCz#ZUtT;Y zkRQ=G{m_tjxOa1nQ2EeFl~?zy()9e$f6orrpTQ~k+6%A$ z4X=q28thk;NFe7Ha9hjj4{L)EyXxd@IwAvIzErYMP< zMWeN9dFKnmOz$A_XpYG;yUtWKGir1V4-8gqU~-Ge?QD~DFBU5~Q~m!ej$Fi$*Ne{wVD&1G~-Z%iQ*<}E;O6cpQZn~MaC6QQ!T zoD-PMp;<@F@CT{ODES?^^%fa1@#@Cmss!gQmCF?r>U^C9Edys{ zc}!`$*lcO5a$g-RnmKMe7~;P0Dc}s4GJr1Xd7L8bmy2fJRcSKJtGw5A({7wNzQ6aW ztnPt=g^0o;Tnpe2_9^GkitJYD1YcocqasP}?=c`eMXL)X@cmQkC{5*wrpG&}r1hO8 zD@Hd~wyrl6tYNlp?YUC+e`GVwwdB<&a%Z5U{B}YqI-j|c04T~ys#UF+0u@ATR0frz zaQ(3Q%ZglEbV#rK$j0K4(Kom=77fE_!ltTS^LN^v%+nGcDd|?gq(N7+6#oZwL=Jeys7Kz=`q;-;WAD|=KepL}rDVwAa@e6y2+@sTc zvjMyWg_Ftfz3Ll*^AOhpQcP$H=Cvv^q9$%BdYLG^vUjwp;JReF8Qd0~H-(H4${+p! zPkZ~O#^fowwHR#NRjBs&O#67yZ!6Abd$G`!RA$W51o*0uVQQDlHD+7UQcs4da9@op zL>{hbqTEC8Coktm$+!IIS;;EaZ81-Km4?aszr>luFHZtziBU_AK3--qa$P0!#wzE6 zclnnny<}Iw0*OpD1)5IIUBBr&0|qm8Fd&-?O)|(YjU@q9D;a5evtr**15A)rmTbsoZ$i4;Q`PyPqZty3oD5IBh6ZobPLNvsq(ASS zm(kVNlMOIOFU-Ygvs}}hK+Jq_XUo|FS?+XKCjDp+KlJlTk-Tr|>a zi=8B(vjkkRJ+#m?ksLWw){WY^(mHQy3-&WQ=fCWu^C%t%9?}W(Du6JacYDpeKPL&C zJM_688W8?Rkr(5k3_ztcz``_N$HXWi5D-kbms7wB&H^P8avMlA1r>b9Vv#Mv1!J{{~WWiY)VNyi~35ft*X|F1TGU_cyH1yz$n>0~IU4${DgNTtxUjxUX6k?S|$MU|z=Q#GhI> zi<}vqNQwdGM@A)e{tm7|Z;M>b2gY^Pr=t3!U%qmwvtzfQ$bP~js=wo?9*F(YID zsBSB++R$BXbvm=qgsj}SY!?TN@kHkcQA@`S;_SblBxRSsMHwkKBJ3Oj43=y?H!LS*uFcYAhvb?E{Lq8;VErTl!q5F2% zJHck@Nu}JgXcu+-=(Ws+5{u_iiT7_-d#{c+AKbTF;O|$MS>dqK#w>nzmNDM#I)m8u zad^N>T<8b4E=rnbrY`cmSTKW};vhR08cvh!e5^PHy<Qs$9J;!l*P)02$tUHgyKOk8wr5&@qV^I`2+`zMGCXF{ykG+yzBnH8qo`{AwW zlh@T=0ck<@}(Ji*vZ84p0Y+*+y&R5~ti^7;ZhS(mH=Gp&{zAAzSR^ z5jBh}@3}yaUVZ9My^{AOy;1F(scuw-nD1CD#<*FSZlLcpe%*M?=Uvor*$)SfDYv~r z7a83i;pUW_;t^SFF$~Hj1a3CKS6hV_G~J7os-XjPA9UBC$1I|`-p1p0Q_22aEiDH1 zA=~^li(&TW7pT3Rmr>MOJ@K$LI@|xA{YAr(hyG}26BPbh8mPpmy4&Ahb^6o(^PZPL z?-QHFC)Y>LTQbAA2L9i;B6pUv?g&ShwX}`>%gj`jeF>Xp$qF@uDLE@7?{-8NBc3?j zaKkNjbzR%`XY{jc?7SIFRo^@zYDpBEqlATHdFEajGYSaHG*rbapuU1BJdi&He!j{$ zQ9kM)W~;iyv0l$G_Q0Li!CYbeUmwOCK(`#eI@|E|F=>2Mx(FZja?03OT`3&&Qf1?G z9`sn({eg7vl*Q^3@lhNpj_hpoU)|zYq@yeE zsmJCQH==iBC5;{}BV^yj|D88dzRh+tB@%o541)lOYnr@2nSVX`{_9=%v!dXbv8IK3 zOP;k$iPd|<6QxH|lCFv~o$j&L`&w>`;?LU^ZjU_gD>zHID#K&5)ln^n;%5hT`46Vt zpUU2C<00}^2gPKY1@&klE9&)+h<{NFTi@Vzu!=oR=h*e83x}+yqhs9k)~hKBfQLTL zUMa@$HQRukUhB7{9K=OIs+YWzYWElCFd$L^$r9LVz1HXDcgtkE?<#)?x9*J^BvnnB z!^fa-4mJz7$EX(}hH>;s4j;awp55h#T0Vm%4E!@*aAg~p*`Ch4A(mQD$IBi2oADBR z0fFCp2gI%c^7tyNzjXKjG~dcWAS2|`2;|l^zzDkc{rY%p@7D#UYueE9(CEZkT$MHq zUKO|YjtP^hXtZ;>jCe|jFK13^g`3Ha_I=$~BG2Z8qkr!8_Y6>H<^rX&1xk3i7LkWl z5E3@t^(74Bow4abvyeykP)&Gyz{QLrF=xbAkqZPymyW;}nKy?mg1np7prHwC4?V|t z21v69=Ok8ECd$~{cw)T-uzoD^^P4zRI8dhU<@Ff5u|{2eh- z`ilX6g#C}2-3o?+i><1asr^oq33Yn_^`XBg2HTEv)%ztf>~?Wo_QZz&s7RN(UFMY}i_twxUNo7~ZRZN8Q#bcX;O+{$T7(0oz#aZT56o zA2lEFI%*bx-bue3?5%jpF?dgBM6R0AL({L=XIfn;-`69-JOGNe3DoG??l)rau|99` zJc5CW?$LMdHd#vT{F;$!kmyx!{LvT$BPiYLsO<%JinC$d@^6V;l-w_4Q~kWB>f50u-rmH za|r59puU!>C6hxG;XJ}avrN5Wo<)1sN#}`YaF5qAmX4x^kBF_28XtkH=+nn0RpduK;k=i1v= zTlOp5+)5XWL>6~&m;6frD$wv7oYzq5eF&RvCr>1`-?#IUx`OT1@* z!>Kak;a6cNoi;G!4iAOm?Pjy7DoG^U!zRUIhtR_5MtYsH{Rv#CBJSzEqN<38LxDx7BL%erZ5w>6m zdDdH0Wo?d)?tW> zM5iB2nYY|BW2#kh!V;S9*4u3S-1$jLb!OD3GiQ24L+eT5Q?c9n`xc9jeI?v%D?Y@Z zVB4be>`IR8;_mrTvCIIY@#`H7PzFmZo?MhRoK6dVn`=WXMaU-?S|T748Ch`hUDYX0 zftJ+e;5-N6j=<8mj3sCxC8TazJWtl zMDq+-nx1rC%4el>?~DtWLYO1sweuX0?pj1Y2xi$NBbBD;8W^vqluV~2G53PQC&J>zCLt}!-L5Gy@2qPIIM29cZevfI0^zINp71??f25zeupKx zDt-;wAmH?Q&OfVt!-O&E>;+rrfvSWY0BM}a%9P?3dE%chS!Fw}EeHSB}% zMLG<54|HcYFtVUWHb;8LK$EMKRtpJB&+?Iqr&O|(A}H4PhdGMYcotN1>flg4l!;gP zk11URDN&Q$!-WX1>DL?zujM~c^+`lfX5-;&=<7R9MDmG{cF<7+haGU@9)#Po*F>6| z+z--PgLFPdC+@U%IbGo|gof3J$Dr=5k;OTuL$wW{wVp?;2@4r>g1i7-2>dr_gpC;E z({cI-57(#4j57dnU4}GA$SJxCJJ=`fp_{X6Inm#gx&c zn%NwX#o{jKKpJ5AnI+j$>?5SnYTB2kJf|bE|{qUF4)V(kR7TMlfBdQLOZ+ zE_j?9>VH*Gw*s+XN*CuALC=En3lZ=+{=<=nZj)MvgC88appKGzhjJCoKRR)}cx2KR zo+uHbU&ou%+V_xlt0YOIJHC!!(bGyx75sar7ML-S`MOO<#T)r>$0S{`5!8U%fjmB~ z*Tc4U2bYuA!(1b zgFv~A+56!MMI6};O{6P=yCNYBZV*P{TmZH_^H@l&Uc4E+fNnVvi*xmoC%l4MJOmec zwZGAN(hSz(x;&UD-%CK)>bFKRQw4-R%YnY2^j*<X9~UXpBGKfJ=tm75859S9>eEUwMw-W3$CM3z!I zP<>WGf@DSxeaaDet>&cJ4^<^m98x%PJ9L~t1h+G`Mt+AqcjJ5T(|HQ{ww}!b5}fqi zqC)fOoeOul?XxS@9pr-x@Sn6?2T9+@Q7^6($_PX+F^6v-=<}nz@lq%9%3%lad~4}s zBol75QVg-qIdoi%rEK^(aY>L?Fu@~W+ulC|KNLQIFEDB(Jq#R2+wWO=> z-Qj!u1)C903pnhF00Nyqf_#@im7lsTnJc`(xmkWCLUdRt+KHI%z+z9!#3F_K~A-7a= zGGzhXVCByiF9_N0pyboZxkY&ATdWYWkuLFv#Ar=!3}r-f`_It@*w3 zk_(FEMy`F`c^*e@tN9R>eldWO711XzR%;$TNJ{`KEC$mym z-BVF5GVhacXGMEy14uu@&&Bbgm|?aJF3-C^y<~OqI+h3oIy=T?4iiS6I>%ATp#;$R zw;jui0T&~5_;xEf{Wp)nFa}>m9^-W>p~T{~rn!sJU120jSm@9dwgC!^981`*2RdJI zG=1#TdLpTs!<3KIDj1T!nM2$=I<(t#N0gCg!&xVQ=WQeBo>3DOUyLHz{v+YR zURr;(c_1HriBVY2bw$ldVdpGJr}eD53&KUQELRSwK?(+|iG4FYqBO$Dn6Xt*JiElT&tvcM%#5GrUaS*>o*X6wZtM;GvjB)-A z_O#AHtrg)BC+5w4oDs|QpnbvKNOGTzrgVP-^i96)ejO)J8@R!wSPu3v(HfcGbs-$mF&>gX` zyfu1x12+iAcb@)vn_-SKqV*>6>_()obn z{2_JM1ECfxZM^c0vUS`!Gl0{oztUN_LZ7y=61 zt~VnJEw|a^Q{El6&3$7eL*^v*;}&SMy&bkp3sp?v+|AroWf)UyPFo65HNx(b zL%Ys~s%L%*meV?}P{q(!CAedEe%qzQ5J?7IixBa^2}jJe7GX+MvBeM|h`0 z>_*q`IK_7a*gO~Thg!vQwbY^)97Sy|Q%^>UWVSKcQQu`Ys$1vhbRRKSIh}Wut+0)e za9iQdClsw6i)KBQ!5iU`BsHO4(6KkaUG)lsaM;`tEu|CcI2J@+vmJ4;%xrJ--DG$q zQ&x!sJ%n0&k*;|l%&O<-=mMVLM+B`vYV#SKJf@1hb6PHvbF?zWmBIiSb5CW5=3SJl-KYbbq4XpT{oqLmm@i z?HQTT-pXhA{wE`6PO`nx%df?Ee^EVTv5*V8_>sMDI*l+d+33r>&rM0ysChSay|bbi zrdZ7ydiwJ!_!EOgMf>wU%B#|wj!y*Jj_sdycsxsAO|82zEoF}cN2Dy{W=wh|cAvHT z^W?$Z@4Mjkjlur;7vJj>k%N5F%*(b?gkuz$5CwOf$xzOh}H z5%X)bwZI7hR0(hqlVr)Y{%L{1VQFcoTj{&Wf5NWge`}aJJO(2`@A7F!i|w78qGEw4 zD#cJ@Lp`9hKaWUtB?V0Z5jBe$fNhLTEuC)e1!pN!6)DDknd+BxKYru>Q(5%GWsIEn ztiosAZbJg(Lc7~qaD6|Fds5QI3rx4)7a0*WCr0%ZhmNN@72>mlYElRj+%sUg$D2!W z7o`u${S{}{GyLA>tvQBmsB&Knv=ZTsiB!WoTKt~NaT>oaK&kejew#!#>V8i3JNXyC z%D!+InDpgsvtk@)8;s2kQMvt5Cw9LrYznBK`j0@hzdh2FesWve#L)we7R_=n)yd$% zke0-pT1vpUqZN|u^L`v-mS<^<$4>k0%9c~d8S8{Jwt1XnIftzDK!r^;iVZau3G z$GE4Kv(zbsb_cX2(4_c^dz6RK*ti{&^SV>H6#o}%#f{y4@VQ>=$9SREAurNHfBb}p%?bDeT@ zTxcsa0WH@a%ye}mR=5FSs^90o;9 zFYPGL&cFFcVuIE-x2FG=*Exb`Lo?354y}2X<%2*YaFYktxfmDE$@BVaVJWUouhfwo zn%;AdX)6LvwtCwyH~&F2Xf1%q1VB1&YAP(4ma1~Ladp~ej57bL*y&7vAA72QGOV;p zplF3}BhZG!P+XtAlkWmxDGfixg2?uSa(ZhkY{BPvNL6NfinXE-!8$&t91iZo5$PN`(f>l6no}?YX41mIFIsX0bP0hDsraCoNSpVN^NXnEmaiAOv0s*0zl zq;T~7E-U5cmKf?m)==2lqzEPeSSF6*t_{(OAY^A^I0T+6x$*31d?)4}QLyFhIQDPO z8|(F*z5HiFvrRQkWPDuT2IOr29wtvf{MW*@-2N;>1Gi3NEz-J1^QPYMQ?rbSB|y_t z#o`1!8vW7p&DCP2X$_F1ejTZf!F_bn8iHXcdKPKyay?{L^}N&|~J zdf#_+8OhDCmUiCAU+-Rx$SJ2mc(`3@596%w*r)C%+AD1W<6jp~adF$^0*~?&ge}Yo zs}Ujk@k7MRHYjb`t&LvS_8k1#1wC~c-N?7~h44#E1_Uho+=fPJ^lm9UNMs{$@5WqpBXw6n{?q=LE z%9K{Kho`xd)*GbFC#{AvC!$^O-AB=sZ!^52e0VEVaOP>()Ju{RCY37gBzxjC%IL#s#5y_fZFm$&$n zwkn^=8T69j?DuIqzn|!;no;!D-A0GpMeJl)Qasb)Ffhz!56$v59ifIL6_Jx|mhiG# z9YG-MKyE7j?4bOCWgLnmjIIhptfXa!MtXU~7cV8z--Kx8WQt=|XnCNusP%&CTBEWx zl8-+~7-*{Uk1f>jHk>&2=1n4E;eTGul*f$!vM>*R@e1W+cZl}zT4zuTg{@&ofB#4v zA-=3f(Tv(rQ5oF9x4WXZO4vj1*wt!?q2B5JUwiX7D%EMFheLFf+dSP2m5NW7QAT=k z1=zRO9}*jUe@DTb?rEy%Je!LeO3?(P8uq(aV^KWx*`2kQGd;%C6OmL|V|ygE8-k8s z4ei@wsY$UjiZS=hanwv8RY0BWCDeMahto2h}K#>{DRkdu>8J2r^3O(7mw4Zs#4XJk#*P446|eNYqB@}UW~seQ4d zm6{JdN2NP8Xr8-FNT?I!O@K|>_Erdu!8W7kaxJ>nx)p>2ZZwN5zu&)^usOc;Db5}p zj93jp6nN+xQoe0d_e`mfRWJ;C+)NugHFOcK=NuSKIrR|SMbNl3aj2-qR1Ju2GUYz| z;M-A-4IFn$eiZyox;GV^qUs2S#RGBZ781;=!|w)S0_)O90CoU8s6|b>d%;p-7qFEt z1SsJ7beT;%=aEike;jIkvzNZ2osjpi_8Z~ooYH0jz!^1!Z!NQ5Vk}1pwDw5zn_8%` zjNJVWBQ`?@W&@|P7|EZXE)aCtnSD-O#wYlApcOR7WC5j6OKPemkYY*eaKu795Z+eZ zn!fxd++Q4v^z2E2788M?>p)CS8zYkm;fcSFfSzlr3A@dS zI}+FfNNKl5#l$Yin@JEqZL%5>FT-o0f5lUGLYKOynha8c?OtG7D{y!U`C5T8vFtjOS?0hKVn8Q!u=tpbyo4_^+2HY51ux4r_BJo3y$i zjbk7UHwr-vncM-L#g=h+wd}VqQcFDtuUP!72fcZ7n|p9uBwc6!dSI1|Hie=Szv1aS z8yB_%Jp2@4WfzC#q9crP9pO^+;^aLe&Yj$dto}kj(TEAHpijA5{g1aw8^5`3_4frh z&l*|mkPRGcBsBCAjR5X7#AXOeb7@2#2bLLVq^1;v0}WxD)`m)@{yp@kcrX3p!&O*c z8W#LJKODnf?07VVnaQ$iAy{i2v5V$fB_lHSy1(9Izdn1i2efE8vPiLE$i|@Zgq}&z zs@l@A^2x(1T5(g#^duBT(e{>)6NUji1SI)O(LTVke2Cc`#KVpAe@GaV%;vy48bXal zGu>ZvxVxRLLiYiG0bhu8;uj`eA#ET=(xXB9*HDifNcIrd=(fPK>h4V>ZJ!)z#BN*b zHY4`f1^4~4dOJUc_a-cHLrcW3t8opWpBdc&0yXpG!01}kPH7xD!=l53b~6hY(-QBA zG0F+D+M7q4z-dtQnTH)ojD&ECsbH1N+} z_~8nAI*2hYjoStdIQ+yXyu-2jA#nyzER|y4^>SZnZC;DR>H!Z24z)dnMA4!Of;^sS zQk;VE@fzG1#}WbJIa1hnlmC8@d|d0$GfpW&(`&QB>0fCBz%pwdeqx%|K_jkcaokCw zVQJ1Di#1RHetDI$&4uI~AT={d&mO+d2-S@1jQ(-wK ztWjz?Q^PHsG1&$~Hd)cOXdUvk_z5Y=I8N!JIaG|>?F4NiXx6|u;hPvwsl`$9abp0g z$F%3U6gLeJNFb3tPDzHv1U;}keqsNITVmFZNoN8$s6yMQ!i`wP$97EX@hePO)IdA?$ z$*e;cmw?>b=Ut6jM?5Gtr>6r$G|qcX$HD};T1XoMDZ_t}W#hJ+8cD%4B4OO}qh{|v zwR=D3<0hpGh*=1MltN@RlD0tYWS~O<;4qMqZ8c$`u%i(gF**y{CM{8?#ZH(uofV@| zsU)5y?F!`mBuI!2dO=Ch$2MY;1KcGknDoEb6#4Hzk$<5=VNVAUMhKy_x4@c*m1rHW zm;JU72~3#C-=ua0DfoPTfH{{U2=a3IeNCv=VN6T82|Co$$XQU^m`2hzjwM8kH~zin zg9cH}S-hwC?+`22_?>E)*Agoaq|CatcS%%Zx*0td!QE#gORgWZJIlGi&`~Zzq9^Y< zO)wMlj#az_ZQempBVrp#9QAe1<_F{GEFXuW>fi2Z@MARF&=jkC0aHw9M)5)__Ks`( z&^)cyRPC;#T;V)=Jx+N@Lkkk95}E}Qx_eWp(?bsa%P6tci?(PHgtBA!jk>y%K9B?4+bz1Uu^8xGeoqTkSkoL* z^7?cZvcmA5OK0}M%nE|64qUcvhn#$-g?OC_Y9-=ODOl17G4!nCq6CJ9meNb{lY8C2 z1C3R#i#jsyB?P{6=%K?+zuQa-$iv6NZ!R^47hWrG!uIiZiM5sZr$F^!1VL9~~E z9i+wnLd1*I$=97%ol$1dy z9C{k8quGAv;Eewgau#S#KK@&7&iUd$qdsx0uqPQ~V(*=EgwvX?pMhn;PHBhxKhRB}zz8{W09ZDgL5lUeYC|XH zNv*RQaj~x91}&mk=hX7^mcN|nRpOwP1PU$W-nOa*fU|A+4<~xj3;YX_gF)_X9 zkCQp=tU6ze~S$N++dhm?dZx8IFmR9w+A?!-Bi-qcLFmWe}z{(<=*f+Z~2@pIO z4r2vcNzxpMapZk278ht!U+kRAcg}Vkuvpe<(qc9c@tO0?)hnikyBrJdF6{<$^9L-B zbVk|jMBe(5sR}uBMqHXyN~_;Fe8V646vC5Km$9!y$82+ryBA?uTnnoDgJ4h64#kNp z>CQWb3~u2&nBS^w_H@sE@UULzzT>}dk^ax|RwG5ycXqN4+(kB`4hWG1@a$sZna7iB z-j7J^qB{OItUWFB__#^wiE8t+@SGh>Ih=+15jM!#r3us7zSm@Ljl3*Oi4nXRBC6~| zGaswG(-Q@$CGYCV@%aqfIkV+LO4m^6IzqZ2#2xSA$n8Qh?{Qrj&CaWN7v_a_?r~R2 z-7b^)Wu&Ks8XSJMT_l)eXW~s&)l`cjssbT}vYi^kHrE1c!;FssnA~-;ItsbO2rYHpVg0{!X zpb|R2-1*=|Qkm<1c=1K#tGwzZ_k~q>-uBMNyp7eid>mt&q3;5_cJxXS zS*Di6l7GUJ)-bZg`Xbi~`bdRcy<{~rbuTr*;8OYj5qF<$O{ML-z|*rxV}%;3p-B+X z(2IZxH8c$fQbY|!ML`Tj1lxoZ2t`N`73+keprQsu2NX4Q5Y$ivtP_feiW;z?qs-2; zpZ~F6?frUxg{*t!IM#Vz*ZG6GzagbbN5YafXd_V88TDe6P8uYUVs? zIq=ykFvBs^*V{J-IYysyTwHG$sgVT_#m+0&?8~G=iwsD2hYB55Sd}mK2mLwoexCqA z_QykWI+bUH^Ha+&Y3(LSg+tAK#4GyjCAJkkf;JtAS!~!W3YgERC(1^@WX&Sj12ivEm{aAh zh^oZRt^M#v)(2!^d4}iWhHlZX&1)Ekmh~mR+;VHqgdF(tMSQE2k~w?Y+KC7V?djuxzhw^P1}hQMz_$JJMSp`wWitfQ=Pjl87^i{*`m5lVro5W=IX9tq zsS4hXsioAm3x5yP`!}ZX-EE5CbLhs669Nc!xH#N!W(WLICrwLnO#Ca)?BrUVpo=tNY#$E?nhAB=U_PQq zahAR#8HS%i{wCKNHiN#W5%l5(ZB-H@dBP}N;H%BDMe0xEcij{5J|QF-`zqlE6Usle zW4OS3O5ftEWH9^1g)OU^I_PP0rQ;J^ou?Z8PQOI=oNfFtiSn+MxD42Jt!eU$SRZH1 zf_O8FZnU`6W4$E0=sRCsu1ZO?qw~u5^Yb+LsVlv;7W&+x)BQYu#j9dc`(@X+93tu| zi+GJ%!UwAj?h_N}6?tkkV6EZ5KSGH~#yWPvf$V4U zl+kVUj0p#lO-Tf3p>s3atK6~r?4t&X_p|NQfnDlHsvL$W3?*nQF*6AVk=JIlZsdWT zv_(0}VZ0l+o{vy}gLxHxkClg<%OfH4_{4jhP%it5y|Sgsqn?g&YpcTfDtz-%)i_J$ z2eUa6+$5aqaxOaSiqYN2vpSTr$NP@^;^tz!6+AGm!c=|MM(CsyFM{|_Yc?p6r8F2m zZWh#*xvJT|V53$zdK=S~NsJaJAeUAH?3W1*oT0W}%asGsC=siN@srh*c98XC%5m0kyGY4G>-vXLnkc~?riGDXGufO!!lUos0LBn#ou z$4%AuSIP))m~x*=JHA`xBq|*cIQMJ>e+~KOFn7b8Orde9-zIU`wQAQJ*{S}nNfK>4#UWpmx_{)T zu#*k9MLAZ_{M;DcAw+C@C&A=N6Qyvmz#5a`dpcEu-yID%q=>PX=_VcOA3L}kI!Y{Q z)^|O&?kzmzL3-vWxv2J*H$*5e$osMUpm>z=#%7eYsl?P*??viL_a!E{B4<11x}?v% z>HTqimO1`FvLEx)@X!1xZ76R0@wEHU~`6!d5x$|Z^+tXPPpod$wrEWbKU`<6RKT}ye_n} zC|8||?=Pm0{XS)7Md1AH-Gt!F;<1LzOz&sR7fm&pU<0uLE$EYGl$2rTSa=|z3Yqf{GqM|abEMED}FE`x0n zgafWr!!Zf}^6iPQMQw%sqKfMMXFfjnnFCknig-jP(ykOD_r+BdYz939x5wJQEjR?< z0Sxh-4yDKQY^sOV!vgdmHu_ZA$(e&YzGpR*nmQxwjc5ZuEF1@)L|6004ToUFu{Px7G*S(wAe&dU+IK&x&DT!e9pvm=tuYd+mF?e4c!evn7Z%iTqrS zKdn>~*C3P^@Sp9$IwmsqxCYlHcs45MoeN1T+N45)MTph@l4W8{(D@pWT}hz7JvO{~ zXNhPP0L8zGM>OqM&4-~ku>px_RRp+4YYH35JZw9JYPQUKvok~cH8QITk0YlUpt-6M z7*ss)N`y4u$wD`74ww1aq{AH`QQMds2Ov~3bKkcZUb zm`83#A8c*WdX=-nCIYcdfq%k5p5uT)OagA4n19@C4i$qGqkWyh4&@OOI$WOy@~J4Z zn}l2l>MAX3MLeF#TK6KknBEuZ5Ds?Hkfy%idWd?!&@!=_g@xy-{X(T^ZO1cDf=`vE zWvsu5F!-XTLitMkoOp!R2je@c;UTE`Myk3A7@ea7C4Y*!1QM(-LTwnc$*pN!Wm z^g}s%9MlMcSTdllMQf1SR$bb11s;@o-| zQH865sPB;`qlo3If-t?7onsUYMId-j4Sk{xEa0TFHfe4dKRf&VY$ZJ96BU`rLab#T z$xkOFup`H}BO+-zsvb^{*)$Vk@_sjiV;1PtuV6+pSn{U)!>)t;Q(OI$*JdYx&sZCr z>`H#U;r@v{Y}TH0iHckwvuBYEglB_cD&h)LWp7n=-r~GU0z^c4VulD$)v7G?)n*F7 za@l!QyoW8O>eD4J>FgN_4-7aBhFI33=x5P(n4&uHrL-#a!BOASrgO8Bdtz|&Ww4!H zxhV*oq9NnmvCG3XU_G@kLH}6vWgqjX>Y7^6<}%o3ReM*7h}Fg=p9W8LU)=MvdM>-n z>5C-v9grv`$XOEF&pPhgiz^oDwG$$2s;ZB=gS(Wd;X;tU`%;vC{lQI9>^#=FAe^Qs z3uw$f_wLg6=!0i^HJ*XM+KZRhRwEoM&R&#UzVb{s8+FNwh$fEL=Q*Q_Xec&C?Zl}o znoF17I${3J)d>1or}#nGDRO#EJJIi6*$}j^q)=mO*CqHW^(Qps&IkiR(bYq@8vfMY zYYQdFE?r&`1fIEZ{>^F8v!b+9*=w32vY#g2hFjv46%42%LO^*VlI!;ZWZXtrBn{3Zq zy;GF-jsfd%l9GqQf)I6>_+ARSLoiiG#ND#A{7UG2AWIiZH=yw zW+2B_sOCSOH%Ap8^jpg~!pSxwM*b+e8Gk2o6P78>ZdTpB&r@!tT-oZ|gbSc)YOqU^ ztVu7K+trB}mh@=qz+c*5>s46Of32n#{cV5xiB&nqM$!Jm?^}*+w)6tCE`E)9;SL_+ z)RbLm|E{Wbm`Cz>kQw_2~XA$Zjz@r8*0z)giG7GfUI+Tii{P(|Fpz}?u* z`pNL9?ayx^7El|X-+l8>v#$nzu!b;0Bhaz8gNdpz5c#(7-uE-sWj|5*T#JJDAqExj zBspP|eEU+0?8p1NK{q@+*)seu%0h7K!H)$}^ z#ce+CS7%z%(Mj(xKigs3U~N6$VV8P|YSZbIdciTZ)9uB1*M?3{T)q1HPWpT`&8EvQ zq}eyMD=;;OdZjDWL&})%3VRXaVbdMy(QTaC9TR66(a^o6%`tAiJO1pwWu{Hf_FpSm zsXe_Jo+G&iAB;7_n`7_cf5RQhRe#sYwmJhkqT7p6|^YY~>$rhkHUl@}dTyo;#Fq@TzUaO)I1q!o$x{}U{~EY}vph}HEQm9SY#ChH zG5CF9@EP&pxZT6iu!ke*4~NAMhZ`IJ<2Zrqhz&+HK}ItkMzc0Xa~_88;`HYmNFNW8 zlp&q&!|)pXNUChuE_B4n zcEonih}+d+hpQu=dxkwejL;vV_ECquKaBY984cJn8hCDm@o?1bE{e5pMGhOalNuc+ zkyJ_K-GfhTs(?c>w7p-|Ry)j=J!5%d!klDG%%%k7j_tM8-;5v6JZk7r3?_k)FOEig z4gTtNH7un;pfcFiwT6d`AQ{1H`VXxrVxLASvPbN&1~g57u$gayEZ-yH*iP^tYMtDZ zf~-OtQJ)%-Nau~DIakN?7BFjRn)`bupo)oo)i|OIvU_>05y!fPpVBg-dZFalk1`}m zV$|ZFM2<$RXGT z1-_RJ(*$2Vd-!rR@cAtx(s>U090+N(P#<{t;_((sj0}f@{Qb^~M+aGtx7{Sl)N?9dZ(1%GmS@jq7K`f)k|Dhqwhf^Ch^H@Y_I zbY$A(JlHDR7QPj-u*>8E}7^rHPGrcnKlt1~fc?w~=-e|`)BY&kG z{fJQ(8w!=8a`xQogyK;&&E)NqFV4*p`)ApcGw4a^^FWedwR%FS)|##QaqGdXv^P1W zruR47=t~YIZPhF0Dp&lcn3QHD zAiP^7zuS}s`f#9~RdbcA_r%`Q5_y3QUf{K@re8uewRKh9HE1pk;t$>{SZIS2?~bgU zW`4ZfDgN-i5z3UJ4@nSE2*8cdF9O&7bMxW_Rf{R>FqCz_ZMC}NdeB+^A*5 zoZ*JeUBP}BUjLyeetuE1{1MUqkrj^H3PG`0C=7EonVwtp;I zt+ND}7YZ8hWy$Y-I%rf6LhdODTbYxi;xED5o{oqge;31i*n~+4d?nlHo^0ViwWu=a za5`a5hVT;+`ewf{*L*Dye@prM8)-)8V=y7@rAFrCZ=bJu1U%OGNFz}Gz|AmiHvj!~ z+n?6CSB?I8ul+mN==5FK&LgDKZJMI%MyZEayodY+Wg|8P8db5Nj&_LJP|~4~+6a>$ z6^}LQw`szmTx(Nf(zWXo$o3_^9VXwNxN-Q$pBu*StN&_W^Q&{iukNxmDD?ji=H$1x zOEP2=6%yn9U(88o2S9{D9<$!| zQEBsl3cbZ4uqh^&qmh;f<*1wv$u_E6M%4RAeK{Lp*LVK?sO|2-*+(1f53W52`UXOm z>{CHST(35?!9v{x`b7*L`FXca!AMe3MCd8(q2&s__^@9*_ z$5fb8!mhb0x0h~my93I}xf;>4$wcoUYNHPXp`e3KQ{ap*M3d~eeoy;gU=p2AyL`Fk zg3YKJdikKhY}F;<*zS}N>+(^PT(wA$vj){Ty@jGa)IVefjbmQ+keo%Xmv+8d^`Y77 zbu80uFzL#NTZ1-<+P-5NqyCW6|G-VA-bpreIs1K@Gv=Jdd)f&EQ_wnB%J^{amzNI5 zd)uqGF}}J8=6dgJgoN>5xamD1>CL%NbHsXxhSq2(M4vj(zE3VV8`e_neEVHZxxa4{ zE%lc7f8nMs*o6a&HCIi$2p5rbO&PGJ*Je@fd*#;}#sDcxl|xT5m@-5wNYm3CDiI@~ zwcbo^DBn&r8lh|ZZ35U8cv`(B3BiB_%)|=~+);{)9#9S&WpYr)-n9H^QIWn$WAi<` znOeO|89Jmtqcb{V&VBp6Uy&5B{>!;@NxoPhP0i#Y&AG)7wgzzt`afLLWnYmFZVYGs zb6aij>VM|-oXko%$n6d#_KM$#^>&d%tA8oGboc&R=u=@%i-Rtoetnh)toi+AG-~hf zuM<13|NehtPJ{O|c0q=4&4a|Xv9N!a2M%%rEHexkW(qcLucImCqT)}Oxb7 ^}{ zR)Q!Pm$hp9BDbEApteV~^BPPc%4ZUwcdVUjV+Q$?$}pIfcw72(&}hAe^F{tqfL46Zd&<9JbisVTW1w+xQ-D|gP#$dIsVO)d zP_7kjUQlZmJQ`inyd)D9m(1u}xCI_-;Tb+`A-Xkm7`WH-3}?u3ran#5;}zi+bs>RP zcf~rkBJ<;vyw`zAyEI}|TYX0y`zbFv&bhSsA&`38e=0a9%#Tv7Iznnt115sZf zz?BvjBw#Dx3+dE&!+6_f36Nx)vcB^6-9nw(`kk$LMx)aFd)MgrES9g;p|GQ`Y`ctvIlM@67=n6e zA75ppQ8rM+Sv zRWRAa^_>i9mIH?Aq5 z4=`{8@xNyGlY6z5c6U~ZAS)26Yigl>u*s$`#?i)VCzM?DaM4F&J}x}t673oH#Cv1c zPF;HA*ZH95e9nkzvSGny{=tL~Y0MpqRGy!922Q#%(m2yqvU^QK0)WF> zHz1B~z0rj*JQ$CA9?g?7dx{OJ`9%$r+LC{e*_Tsae@zqV8&j>8eHs>|g?)4!%*y`P z%&(cm*iIZ#&-b_aqJReQaY?10k6TU%+!(b98u6USW?~`jWbS>_EMG^`FEG7@Zc6;s z>24UhvoPyt?mKzi7Lx=u2T#5(9R#xaf9+~rFUP>D9DOfBh)&7xjB?puYSM>y&t6Ix z96rZbD^rNFA>KPqO=L@Eo`%I%X_#`J4BQk$vOEU=xZ3;QAnv7;D|7ds#+Zlh(fHfMu8BS5OKh z{IF=d!i784)VF%oNfGXLd&h16CB1=yaY%~{pGgu_F5fm8BYFfI6Uv;t!ykc8U@2MW z5xmsFD_Qw63%V7&W^ZGc?@(FS^{ig%p)mUL*%>i}vg&F(LBpi&f4)-x&3F*f6k}VP zNcLtF+c$}H*n@}2n;FH&G&^vyw>OhL**`~8G`?2dq=PW}SPVc`Us2nQvuDL)Cq-xj zhx3y?gSHIAvd-3mG~Gdn7#&6(q@y)R4ZPo0)KG1DlV6rkeLi*w{I|YkB*UoP|ybtlg!?{^7!~z zA9syMJKVZ<3;9!WrvGiNqc^bTgl)aMEQhS7AdFd6eipUgU$X7P=WTZss5B-zM3i!k z9i-eu?BVE4Tc}^5;_58DvR3*Za{==^IqydBMKaiKQ5q~>EtzR_l^LYVAjU-{xXm8% z{T7gU1J!7z?senfiX6(Ma~ixIvz>;jl$%p_vPjKSVLX)r1B>Y}{3@;CT&T z>xgd4&`9Xw!54VT2s^>c8nz`99ESjlOx{j087@Y7sg{q12-+gVZA*2X*@9O!LNgQp zV{FIaokd(7FQf0!K}&VvCPA(R=45~>6@`^ZhygM+1T@(-I+4<7chw9;Gd5t7xvw%e z0w8`L8>Qmo9)kOKnW%S5(eW~5iF9YX3>hw8YoklNO*MoQ35BAf>75!qB4juSVTzEu zg+~(QZXeJ^QTF@b>8WY_gMLyqBpqL*Km^8gzuosYseY+mi4c*=#=HM{Hgqv zQ^01C;}oP2LnmboF$XNtA}rL6(0lS%f@--rqD@}q$y?xJwHQShw#q%N5u%!j*v|oM zEWmF&bbA$yh=R}~5Or!yrUG6Jr6t1c5K-V(wIR1;D8fjlmQNNYLl6#1WT4V2%0m4X z(;!iGE}VgU3y#pzE4KxL3`3tmVWSkskap;2M2Lk1-@sO3E*KS3xJW}jW2?TUB4?O* z0}3cqW-R!hQ1A}Mv(d2*U>gN&;~=#HK=#RuG&%Mv>l7-lgd>G)U?UBh%Fo;YdJ8Jr zdc01t{1;ikopHxl$yr!DMrom5M8!xYXOMRLW|tKab{xoRCir-xJK* zpu@0le3`L@I`UI$?a60fee;TuCt!$#6dC&;A@YVCKsO>rSvaCIhzvr+Q_%)fY9qH& zX9K;OLF^l{3BDbf38JF{z!^EB^=Vjl1$c;t8kArjFNu1edM#Rj`RyR)H6dMsx~Q`D`?e=EaX3zz-BfO139;R zs^VSE`9(QW`xICcQ?|?ky%#|gM*;k$#BA;d8zHzw5FgL3xYt)VH;ost!3-7_J$x1> z2DV6d=8{n^Wc6$s)VBp}hPcDh327YE`mv+w+Q;U3JAp>P>Wf4*A{xUnix9!tRQSKI z!B!CmVF$!Put>Kn4j8X_WjPRr$!CM(9JOoVs4Wr2Bq#l|9NaEzpkV1gU_M%$HlBF68^JBJ3W>hZjD$C_XprD#{V+U$jO_;eg} zKbRX$nc02mwHaX93o57)aFZeg9oZs>_e%Hlf>6S3a6smQA|it1g`)23bJNRz;D-nS zR5MsrBP((?u5l<2r=5hCm=x*fan&drApJg>1DH0Zay z5=oy=;<35Qsq|R5!_~ z^0h;>ON$(}5x3^dE1o@~D_T|TXbbQ#8~%j3`mS8MU;F$bL_Oq-J0RM4vUtl;1Fw}C z+RfJLGs-o@nL2o0iJMaed*z8bPCah!4q@8nKuGF7a=R z8c3UG*BJ2=2hu{rDy`J-Y$jGgE>Ub6U&7UNYKfa5DSudl+byZ?~UyTQ&BTA^jTIXjE=R*A%3?%#18R%Bk$E0BhKX3BisA5 z#hARR2d*Wa^VY;fCZS$}ZEnCPE`gUy1_*7Q?^h9hTv3zzkoUpAmUk12!1CSW#dapg zK8ev6^@!h`)iR}o4j0h+^#h&BuEf>{!_)nj&gi%@fxQYdmnV=g95EeC=o!?wA%*UY zM^uk`7K?gyhtfe2e%QLAeJ$|~3;pER!PV_S|3mt)O2#w0bka9MAvlut(S7bj>o)mV zh{h#WQ3VU4wZ*fBwY*zTjCuw^6-oLQS$nPgh(ofycq#6qS28`_aUEsZ>{2uSM z@hnhW(r(|MPra=jMzF)4QH%Kd?!*2kntfVTcs3K=pGpj7=@kbn9(?dPtN2^H5qXIC zP(K}&zzNk@eXj>Ts%?Tvgt$K*B~qn-tvLU(cVmq~9x|d6v+8Kqv>ZFX>G% zIjR$n4x)e?&J!okf@AFd^Y}L%i7kO2Av*kYJt(I3EclU)h&=G9wZVfGN2IeW{*ql< zvwkq(PQT;OoAq`;Vid8C^$a1NFo1T0jp+1)o!{?zY+6r5L2MA|bGi#}adgZ~$@`6i zDyppBs%I3I{zk6~l{N?ta1=kjzUjO%t0~4qsWSKwHZh+#$(%=BLR?+yIhW=krM=Uw zf|XiWW$TH(l78KXCuYyT@6E(TV_Tbz-1XzfN%3kU z?#kZt9t&Q?WLj_s?IkG>lU+<~mprO{KbJIupA98`6)b~WJ&1$ni3;$^BkW?L*}O(P zY_!2qPYisyMhq2Q{Ac$kzZ$})^~4L1dtfTj_%Sg-mb2oIj~#IIi>*XO4tPjNWV0Tx zr~)7xHjS-z`)y2QDc+-p&_m1MtVC{3$KHu!#%yr@Lo)jG)poVUuVDOB({y}EX~eE| z&KYZn_VO>kju7Rn5exBKwZFsnZ*wdMYcz(`>JNesA(;9$jk~u$uU_Z4b{QNX6TGD$ zPx@Aah-IDAI702^KmKe|gV|+FOluj?Uroea*QjUSCqyp!)Z7FcE3R$@uc#BtST8K0 z_%DaUnpW7iQ!(1{Cw|^OAL&ip25PDdKHhT7hIVy(&3{4lD`27QIWY{)`=r67ewJ_e z`6~l2HYB#xH38y(2vvlKc+D*3k4dfHzcQvxP2Lbq{OYv1eslhu!aE;tW1U{J%lntV|= zx@o&0*0y+TKDIQTb0DR5XxQ!+-XQSunW*cdcNa&$AycJdCrL%qt`{0DtZUbbjI5W7 zoffC>7Pjtwp;_A0mb%{gkL4X}TX#}ur|;=$;cweqV$lt@W&MS6Y_ph-`1|7NpR-Od zed&v(Sf)$b(K5V7x{&eRi9o9R@GljCf&iCuAUp&x9EJKW>8x; z`D4-D7VdX!Xz6q0zGr{y_P;VG6Ek245&Z@?sk5vhnM{0lvxu*!emnUxh1yX9l)O6% zDHqk9Gq9)Dm%2@`e28jQ8P@e#h;~ZL`%yRUIpQ`C1`&KCEnDRYqwORo!^kD%->fgf zv+MY<3#W>`c3t(P+=e&x=N-|yr1cf0VF`J2J}cbHsiNqUsST!~=D1BB-`+e2CfZI8 zzW60QM4|$|2Z~W|msfUdfTV9cpLUN5Yyb8DS9lC^TWSgkVGeApTRTd8aL#LW?COq$ zSD6}l|H5)+Hb^hqA;iXlV8=SUidC;4h+pImoi*FNyQwl5uB4CLh2W1@`JUETg)i=y ztm(I83x>`_-4sQxiB0hoV(V_#GGZ)8WEc9)mwg};?@OK3pC0$H)2{be<=#_nXO@oW zNn3QS!~T*UE!?u_jplCc_*JJ(A8+Z)X)Mf3e)`&L|Hk2O=9}ZvgB&B$0-MiRnj>lh zat_!!U;o3$BKv6(xxq<|tsIyQ<5pViojM0weMv9<+~tKTUoZTV;)IVQf00GkKLjVa z+|OBcqLHk@OY(MJwz^){iCKg{Sxi-pT8d=Q$5t*BZlckJc=7b@-KSUApL8s{7PG6& z^!R6!%z0((`Q&$pOV#qjFXoOlxn$J6tDEA~-)?#mXxjT+$=+qMr8WDX4<)n7Z>%0^UAPC}8FJ zea-V-SZZ`bB-K|&KwLIu7mW(u?JB5M9wu+UmsN7gk6fhrRaU%{qPasdwLK-@Fb{Pg zSMD}t)SYl-?$fP<<3~(#!j1rM7GKAAJZpPJDKLGI-q}|3)2u>pqJGx0uXJR5uaE7w z1l&6M4DsrfxOdBAst*jhz#AQgHq>E&!9vO!>=lNC_oT;SsFHM67(|U85`~3|$am-T zHjgUT6?uqUzke=NdkyudKU8co#^B@BV1(i0+ewx;gi9Jr9)HuT0apD+7Xn=ysfSqU zZo|+7bF{UQVx9)?yxD32Bv(~TT zbm+nygormbcOFgc)26CbSZ4TYeNHtaiZ7HzJNc@&N)X44o9etgYl-_g0yTG5fNC?% z2n{vxxDbPp9Ev|?u;AaCKhe&ylbKkF0=mht;1IhmqcF*Uo5`@RswF-}V++ITn?y54 z*l70a`Jjtc^~i0K%mgD9tfov|4*ohqzFk@7Y#u;7abEo*HXhZJW*S~rq2cIp7}zvk z4Rg>pCvA{S`tbKzT_*4e!is>xRT_A@jyVZ`V7Jesbbj&qT5JQR-*wyEvi}}&I~U#0 z)AEfcx-ti1r(C_yp(GQ?tQrKgp7OROmy(B;RApboU8tUK zCMV>30w1i>IP2wq1>c$$<2-qa_hJf0vJ$KTs&Q7Mk;bT&(JA9{d>&{H7VTT@%dHwK zt>E6WY}~#6M^QtZC|(a;#am%g-QYP%Mq!_JUnzMfI-zA=y|Ay(r9wg6FCRC@{SL`q zH|3N9fvrK&+ZS!@v4A+@F5*(BlmffuRH@rR2<)(P3g56?G04?D_@wR@f!<0Go-`e7 z8CBCt6=hGfuY=Mchm02W*|hm?9U`3SxTsdu(-r1An=G4Eba-jCo371yBEn9gK8elr z$xM46`ygj%B8qImbQv+Dq1Y9MDK$78u6) ziW*UzOl)CAlGRaS3gCL+exKS3%B9mAcn?xir9IB*41uSl&lEZ*Bg&Yf@6GKfRN>5p zq*PH)rK#?nG2z-$S%*N9IAZd&`|$OmH?hn8{y7)eo#fg$v2*lF5^cWL(0-xU4)aoWBVwW-eI>jOk@l*(>lyrN!PNw z9FQf0=qyjrUNn^iT=y`mkFKLXXxw@3?Al)DP}d(GTW-b6V18X0{Ba^3e{CR9uY@er zJF*_ME2+}u$>4Iru(m4`e&VlNxBVpX>|7Q|5s<%!Dk^uBv7C&c48$3>G1V+KPvcHy zmzld=$($F$h#bF%KEodL|F!&t%$0SlIUpO>Je8;(m-D0t_6PAJa)kH*d_Y|!)%v(} zi5XsMn+{5ZAq?YS=s%viYGieX7pAl7dHt>@a=_ujcKqtn4OaS+65FuD;!AI#=bcISPG}OT0;^xqxjhC!YklLB(>^c?h#5 zuHzYjv+FW%ZH^aF3%72r?I^k6)fM2nHBf#VX17+Du*3zH%D#;Ndhu}mDpLata{3rr z7jry~b{#^2de-wo$pxW_@VoTlP*)h2bRkck?+xKPM#ICTD9c~!niAv=MjMZYbaaK& z`iyNW(0iro@yr!Rh4*(i3jHUXg^ap?$s9D}x01Xu@Zr`_OUGCCQt;v$#Caro)d&fhX}U1 zcI2@N)>GjQO#TnJi&CvXZ9o`{<-FYu>>xE1K+rkCaHkyY)l2znC|uaGsW2m&n<6TR zX1b6{in3@0f)d16lJkA?sa+e9@)t3KBTtL-w%-0TLUQ)s09S- zNNvbxp_3)Z5IKBrMZa4mKdwbU7xCO6f*?NC+tv2lDN`Z&^1sniaWs%YLniye{binn zQO@xsAUx;jEaqO5gr4YgB83UC0GJB}&2E7?I|6>w~XUK(r^g-c$jL)Z0Id+To$XqV$T%RvfD4!N6A}7yT0taK@Zft&}E9$w@T2+?U~%<7@W3R1dRygU z3>C1En=FJWB>$o2(Uoq#(;_@P2fdC24{+rIA*`0)^Pk7w za*_YZkO-)KoDW$=*?_=-%Jaz?E#jb4BFr0HTh!;`QBuq zArA7MACOyt?*GXV$dD0av^oiRER3up7g#vK1N%lqk+5RMGq+6km0?$&l&p)(8ZAc41411Zt4^SFYZ>KLJccqS9QNeDgh z6`Ib1-iM5Gl_P8n$8nD9qZbq%4`h?zaUdej99ZtxhZXJ4_piKjMUL`w4cH*kKih)Z z3PI9=p|n)E9~Bu71l>s9luz=D%S9I7eC{qp-n^QBtH@N?hcd2zQ54NTwOfcb2=6{F z`so0V5nglZ%Ln>m{iN%;Y{a&&Ub(I)t0g4Rq7~!`gjGUw8FH=^@xs7wF9q&57u&=^ z(Q=~Bz%ZH7s3;-Aea;{3h6hWK$qcjldfqE1Am?nJ{yBIAt7TK=NrX)(`87=0{iJ}6 zrpWrZi~{qJ7a7OFTJ3`IXr3Pf9xg<^v<9+Smjtc?@*ETtAz1ZXO$$I*uIXh2Y|jgr zmT{D$*n}3ILo$!YFG^J|3z%d?TE&zzjUNu6dVJJ&Qt#%^y+9_4Cu{+4c1+~jW=1mJ zb$8J=8H}vq6Ic0|*V25ZK1P_OIe6jB=3=;qoUc();6?#1ZUOA(5c&+W)voJ!0Q@fo zyk-dga4sQN!LP)Z#Bq2Im2h9D;!GAQx{~kS@)CCw5tE#6{SsJr7|>iRv|0+J;kV}Y z!TegZ&`VsoxlqSQ=u9y$;1pcBx>eJd_^F1sG|wYSPGo>9Vns6ruKDXH7#_;RT$G$uD~JKzqP)_Bz9kuLKSnftBv6;_tn($Q2z{z;g!Jdde{dk;>m%B zh)5XGq(JSU>3#t6Fo);N-2B9~AcVrRXCu(dC22r@I1S+{hq#iT(*fi*)ut5lM7K4N z$Ubr3?a9AFgzunFqesEp&B9f(nF1xR>S3YV`9uj|ovX-0GS(bvMJ;z-5Pr|u8Yki= zG7467*PTuomxK1qkWHa9b2urKwG1$oM zik9_Bd3YOPIs=x;=10_XcPLSR_`*+`0cN7j`IRf;`7~OJVan7dX-s(QcFfZoj^DrCLkSo4isejOI$+o^&%xI zo{IEi^PGh6&A-*D6hsgO8LdR_ph0yi1-w4QfD{oKjarkVZ3rS6Ai_<;wTOmG_T)9%Dm)qd5b2tD4r*^S z%W2nyh_bEWi;c^v4K)yt)!>|tqi`E7-SmcloD5%+{3ZC5HzxUgo~wO$953+?ag0jG zlksYuv8?D((Of>d(rN!Plegx#?Uu@TI|*`gCCp)8fr%O~*$v2S$=^PKjDjE;vVQO= z56s~`-wyYrAwo#s5?sC)NE3Y*UIQ_x*A~LMDp4Fs5Jr2-TgsOh13RRyDNB6k`k{47 zfmU^Xu$qjbE51$4u;|eodP|2LUsMd9Zk2Lqrb>xvOVW)Vt#U=Y(;T!8i9H~6aOOpUs)bU|B zTneSrvU15*x+e=(J=S0g`I*g#esobB$65>sv{hjIJS_V<*EN^dz5>W%ag*oZ=)VA7 zbD`MhNz=CC!FwtjL)aranyTdGRq}BlyvGdXPlG!H(Dg0lGM6vwAb{5*N@LKp>`}=o z1UmblCPaZg_bJS_A$h^Hr$pZ+V}4F7aq`*mNSN_`!Q5X!(RFr&1sY$q8hVjqmNXQ5 zv6$~3!#CM`)Pr}W3peVQ@|tGDSm*r?TD#fLIk@gxMbOt(n=a4K#Z@djfc3}nN?{^D z_O-}!j=N^-VV0kajEjLjR8G>+0HwIs5#OdGyV&g-u#%XSx!QWFtMKH4Tg}DeQ^oNi z>(2#`p^|dbX7U>6R+0Rpw(6d5gzc0-qp+XIzqhYy^2-q0#0t)}-1_iBIL+KjDIOnZ zcB6hu3?xUT#YEd9*z}q0-OjYt;W5b+zMuv>9zD=_S@KaiwFXs_Is4FdqB$tccE_PU z**@M(u4crLJicV8)~0!yKz9kzI@asGi@aTwqx?dDo)a}WM&=uxOAp(#@2oRZr{{2H z*xH)N=0{u|dOSg2r(0!}+t1Oxaf2YDLbt%sfoav^n^Tjve6uCp->84PKoRkZbP~F9 zF?nOHM|?z*#Q(ja_z~^0>t_KP9s_$pv#9P0SwHPbd3@3}L+fH?0!rhNpC-W<;eptd z7-L9kU3lb|SGiHVHlU&AsJTvLRG162uLeNxkn|s4Bh8w8Nc(mCM}5MT`uO}6t5-kq zI}_C&w#ju!I>|RxRX_H55A5+pIxfa-^wyEH?L<2BIA6e>a`zdT8Ag9cJaxx;3F)7W z8!g8CAU5ONNbMsi|DYzV6CQuo-WIKNh;0^@k23Rm^vjdX%Cr}$@!>A89|u-Pe&A%} z>j~pB%dP+3?)S(ZJDDIP?akWw+&yStZGcJYi>kt9ry**87p+5@G3-=At9aJ(4vSdq8tT(I)0$B15r8xAJ*WM?M8oYw zWmu2-6uViFR@r8)ZoUC>XBPxW?hG^7=V*$yanR5_>D17AD14{7L(7e8tl~PP|G-ly z!A6qXRqHpX;ahYV(da2M`8&b!5dlG*?lg@#TRr2x0jG6sLa@Ig)O1JXLchDN`08`= zQO#yQ{T|O!v2$>VS(&|_q0bGETjr)^7I*p_zWYxyXZB6x2dBD5UY*Dh>nDDddA zc`;;kbE_kYo+piB`C0Dl623)*N*~x;7#?2^)myBuHkyC3b7pYGj#@E>UN5PCz5{y{ zE=YGtG7mJuTEIGOULI=`tc}f%ILHSzzx-@n+FVxt0NZLNQbY*MOXZJEo9nx29ki07 z=tRzs|{h`4JNThw)&aYG^m#3t{3hJIC@<(4e^#3VsEj~M_X1kfO z@-iLV&);h%pL@0em4T#WO@m1jzE&M{vRPBQ$#zJO!62<*n{WQE^_u~=4lv)8;f);< z6&OktYPk>}3vFmG*{~5M$1h*jdCKfiIydo6Ig>?GjepaM0ISej3#NYsY3|fn%rAwg zo9$us5)b%zaQn*4f~7iLAz>Xn8=78rWrF28*P<_ScK9JCY7^i0j2g+4zijR1G1iuC7P!v7-fUi_K<|HuFDWSiOHxj7A^=MEU5IUnn_&CDScLP)g< zAr(>~)i!gMMv_XkAxSEvQm^vbW{#;Sl}f!vI;$kTs@JQx*KgnN=kxwue*eMmUwB@g z&&Qs7JRkSlmERv>g5FnpIB7oF2~~YCOen>TJ;MhgRW0RVG}Ev_^fR^aVr3H?%GA9v zY-cs@WT^}{qR*n93H|)4BpV7xX%UnDrb{94{oVnRM>sKbBcj6O38&r#*5M>)5R_T#g`mnf_pNdf zQIKdiyVynCDQLhZ%y8EpL}wnk%Hw(Z!_IZ6f3Tmcgta0z*rtnzR8p zo@CpM-+Yl_E@8pVL#rYVVqta0Rhv>2JBcaeE$6qas`Rh|OP|EfBre9tqRjK1PsK6T zoM|`QZm}w6YsG64p?|BmbEhT!dEQ;~*(HJJcIl1Qg~}s%}xOy!y=F`Fp#N z5cls!(s`E$NlHZpBTX8-bYrRMFgGzbo0*USsM(XkqHgcl(AtdTgdA$ItA=`6mwyNd zyGHb_JO*}j7pyxDC<~e2vkj*9N@1@fF=S^6~_C!^Yt9I(f_C?rx_PBH8p%(ueo~a_g$uZa@ zF_H8jB(UMtm-6%K*QH85i?ZcE(1(OPEaAnjVfzM0Nxdt5gxyJ9SN#w&vCirh_!l<; zQeGX*QC={)=er{j<5tfB4y5;O4JoW%ZJ21h%nRj%X7%3w53L{MD7HBz3Lf9uOI=r6 z;WxMv2;e=ToofHa-aghBH5yK@oZ~aw0_3Nn(z5C%(9d_3zat{&a!bZBk%B(1ky>M^svYE4i# zZLzbu*fC$2o1bNe3zrbv+V6@}UIHfGi&9*rU`wu10=D|FPxK&XGVsVt#B8VLh1b%i1zyP(&RQL@$UBAWb7tBqSlY)Po}8y2XTSq;{P}n&bY_+E{_k87Vw2jo;e@) z8yR6UIDL-N38B;_Lll%$_-64Av{e+Csqp_~txhE(+(N}^lYa(^df$GmU?kT1#-mxI zVl#Q*lN62JV7%jkh!hHQWf=TH)N~(t7U>7}-a6s#1>^Hn>@feM8A1QzDz6`l3drew zn~t!ah)$RrFjjJI)g3Q#MEG<;-8H426wYZJ!cm9041s|YFYacDJG!9&Ssm>))u_W2WQ7QU{N+&t4Fv_D#?;ZUv0| zM^iYB%M4=Cv^{FIkO%U_b<3x}J`bWRRn9s7bOgJ{G5*A{UcV@wB34`OAT?Q#*yVwN zIdJ?8a?KFbN6E<=kvPO_e8bh>-3koZFW6e>#cwqKE^wlzpin%)Z|}8bi%AU0Z8P&H zMAZ5##(X(6Wprf%d;0nhh}Fh~6U!&a3;dt&j5&w`LQFz%11zuvdLy9UyTVF6E*7b# zxj)pl6rSZN{H7S5Zw&{AY4URuf78NJ9ajc+`_n3V8D3GNH4T0-1-*m4^w6f@D2?$< zeL{&M@KiY_U$9V$gF0!P#}lB<=6p65H?kq1?q!FR15x)=>iyj&5KFXNJLTdNcD$L1 zwt5*4dNM}p5vf}BR{{t|e)}OFgx*K14OcRCY6MgVx;mi?COB$?(Zc0Iv*QzdTF&&k zzjk&Fm=j!JbppU>zni8WJ`eoeEDB<@%q3(vEM81O|f z6V24``e%s89#SSPH>V-c6Zg%!p|B*Ww_8k(E)n?(f0<&+GVWC%S(P+SHW4q{+YQ6)!Jy=&7G2-WQ zvuc>>GwQ8aiS(QJW~7ug+vFZ}&Ki-JJ@K$H%HQNYDRCTHlfq-&fxi!BYePsj?@LvXt}k~?l=K%2x0A#ryT1OTvQ8>JCH zxNlz}b@4@b(-imD12!`{-A%kGA|bqU#E%M1rMs)mS;LjX{wtj{zBg4)=`EcpP@s!L z6`a{tQE;rtzUd}(eW}tN7U^DdyneVh$Vo%XkofT=qzsqs+<16w67O;3)`S|)36^B8(8 zI4!jZ@Tay%`Z9SpSDXz<2_})$o=&%r9F6>$t*?Aq_V-w#RCMvW2K z#?V2=?|L7gUF7slIV9XHIF67}ZuZ)_fmV5(`+o&qPtY*ZIjG$vQ`opOsJ8k+f9Qm$ zNecG<1`G7sW+oHo2@C(z)VeL>lP165n2i%h)AFyMJ}1ZDn3;Y#Md}NAI8+%3vJ1U= zQs0W|rP^sW1>We**@{QFvZ0%kG*;wR)R-!>Ba)7VujfmC#7=;sZJhiqffWBG?PBxv z)9}`o_*?5gqPgNYP0)(yfC{l!Q%k@k_n)`po2FrOPDw}%%+j&gp*TM}uhXT_-&0L9HkiOyqk99Xc z^Rg5AT%vU4286d;n_pdqv_}0UYQVc~%(0@;w<5#0WP8Az+W1!zKgHjqMoo!qoXT!W za)y2(Avoqs^&F+A7)Zx9sKpGlI{MfI_s`$=!3YA4W5#*E8ZLU7)GWW3EQLJfJ98!? z&z7N#hkJdpYgWF4o%G#s;lS+%()+F}^Tc;r|*i{mQf^$1(`(h&5^@a?3EdC)G zoggOr@8dkROV|ob4cZo#6W^>hJ-IEQhRaOX`0${U2~z9wJMt^$l>AFuhy9rqU)iBY z4!-aA^pmVj;(~(a>)Ss!D#XWyJY3vZKzlDm)N8p+}B3IV+hTZZvO)Pk1 z34d0h(i+2#ZkI9!9anaVNXq%^E#j9xW_kjt^#soD>U?8j0jkDmI3)9gdqHo$+Jb;^ zn3Ejta^Q4vPAp_R@Jd<2-VxCLZnm_PGBaQw6BfYo55(~(C&Y(IJTI2Go3?2R?eBM% zOj}R}Pd3%3@u9`t2fEPF{!I@^a8y8+YyqH{V4c{8t`KzveUgxzX#YV~HvwL>j@?#V9qt zqgw(8#YT7@y!7C*(ev1>l}9#uy!*6fr*FyO!u2M%POFSQu;(CJrZkR@JSr}$*Jk=ts!?#Fi*+dN+2xZXJ_VJRiVhn`U-KO&gd0^1~Y zB#p0In<*2%*%0v`mP8n*S;|`Aq9s4>cs5BbVBpDs9Qc8pIj%$RhwU124GgnxguHNZ ze4p6Y4_{s#aA4CMt^7_>;7h*lWMe4WFnw?wk66NrR)mN1(Ld}@uJrgd<9rjsFX=VR zSJ!Nj!!r?%>5z#@Shap4HQS#>c@(*QZOPi)zM5T-g^nz=J3k6~vdiCnJoy+qu+Cx2j1@W?tZSh>Ay6$JD|Q-f3VFW zvD0n{&a6LN`disy_$xL={UCrQVl|fM69$FL3Y!9h92j2R zw|jp}f^SH_`Aw4-MaDD89J60H0vHle88@nsBu

    4LfDh*zI3-~2~2HJN8PyU4BSb=W-1ZQGmtV$h!K*}Y6c(Oy1( zVEIH$!ESfgD$-!EjIhMHcsM(X7HNh^gLr>5?=M==el3!<#Z8N1&>`qHBM(=nmlooN!P36_XGU8fACzOwG21t8LLO0lS-;kJ#H*osAvny7jx=p>j@6 zPJMcO@28UZk}FoJ={x5lFJ8B~Oo_hPo!FQ*&v2<7X@5O);)vstyL;R3_yz?iM>-{A z#0UhE`YPzSTS@=m{G|JZZxY$K`?X8SQJoGKLwAnlD~`{+xq7^7Ej%_(ufp6%_WC_J z@$j~Le8>69?%tGl#{Fr>@$)0Ujy%fwT78YZ;vV_y-_;+VUrX#C6mE|!x9X@w5y{t6J&|m9y(aVoQ)iX^Q3>%Oy zH_CNr49ih%w;X31oW&>On>ysYw$gjx9_8p*;8Cm6aZCzn1_hn9i3>M7ypu7&P-`ri?;(Pi$D~#ogREQQz4_cm|HN8YkG->r;}qn^_y; zU(^ljd9M(?Jg6H$K2w+e)b6cMZau4`%kkA1jZ!q@6@;brt&Ldw!DlFW?cwTQU2+{V z#l+;2Q~6f*RevMt+W;>NKKJey-a+SluimwuAQw@w6O%Q7FEKAoZrn~=JXU(=>>!KW>npT&@7&soY@B_57J0gE1e>}|^3k<_9eYi1~ z=G}LGFNgMR?SY@h{3Y#wtxtYaNignl)JG0+!PiN}o zC+Nqbt49)=lS(iJJ+duTNp97>%iQID!%?&Nvf28#`H98Y{hzI0mfMK=ohk1sAGN>* z!mW*FS!`Ipajp@uz_Q?}*;QkY(K`R51y93Y>XrNeiW{lF>BS~`J$|byZ!>vUP;cX* z=APPa6_oZ!a^L$3xbao$&jGvY#YhVz-l@J*4edEv8>v~lld)v6Szbhym^Hk@xxHX6 ztM|JKc>s=h(r(Qi>U3@{USo1jehpI(WpjvJS69dAlD%xy@W30y^rj1P|9X0kuB z|Db2eE5BPm{TXQ&!(a_Niyj7<`oyp|n{2rm7I4a=>*e4=(`9NCn54YS8!i}s4P%@C zav4189}>RnRqc(RYV_Dj?wg94Ly?yuZEJE4uC0a!=%E^pP@O?xF_}a?W?6x((TDP6v2ProrNoaIS&>s@SshBh7p+~z<2bWbDEvb=`koT!opb$|G2`gD)-^ACpTT58U zu1EtV89zPfT|zTB>{Bv>fejhBFf59hgACn#t9w1vFnRA${J#+Vw4R9AEh?cewLZj| zQ(_Bsnt6q5Fa!MoW^buX}qi&{FfO~?aI8UygFi$cC61lsXg2VCo+N$s)*NF)UN6QphZ>R{hTUL{j-)mCN zs>~#D$~T!OQWGZn%z7BrfkwuP4I2pl1Mo+ZaTcU@u82M?C|Z^O#rpBjQ1bR0XVwb1 zCNdc};=Q1Bef&#s6y5h6L#(bcnW+Ty15LM+53Ug`HGD;p1|P1~TaB)^zKAZQ4UQtq z%$oG?E*-S!5mb8COdBjit1Z?SR%I=4N$ITB=2jgN3RKeOIXUR{*XyX~$^5q3ciR@r z*rjT|Kak9Z+b_mtl}F66AbIjOKlC~vNUKEq4Dp>Q+^3ILWiL#D?J~VU zd3fR49LaHHFp4=UDq4|alrjLJ`gd!cqH2WLMi~m677YIztgsC3=rtqSkgO+;qJl^1 zK^~Xa>#uCScKBR7r_-5S0=&d0r}*dcXnMI?(5^vu)*$F;Wk5}(S>_MTV6&tol1aDJ zGvfv6FC}dV6^Ve%V!LrskuT)s#$Do)=lCqFH*X5dX9n5%aRk^& z=`|{h@u%?TknV^CBMBrkXi|h(+LA)Qm;yJS30t=6NMj!AoSq$vs~0fiO`h5II$WCZ zr>xEY_I%i3q|x=N9izgLD>kn4HiwJ1W+ob^u?m*>?UtoythLHq9@0OPS>f-;*|4R> z-%^yZrUc;+P&@b`&%$v_*lPRkpb?qg1Z;dPDh--Jk4rUVRQm6#8G^WYyJ}W~Pl@q2*vIfH z;(Z6-Kr~({2irGKC@_FvfWk|tv}VoV_Ohab(3!iWJN~o0`)b8PD6BGQM5JFQcuMY4 z^jpMMVyoG33ol{ij+W^P;H`@0*)SxDPh%YO>UZ*}LbdokS&a>E@6rW&=I1IM7u)n=Ep*e}71w{x+2Va*Ivo zKtu}%UAn{Jq}fn8eS7o4pn57USjeXFE*5#$NG_qO`W&$lsOD0{VJtP!xN{W4W|!cK zSbfgThpIOJP}HA9|B=YUR=L%0BAUj=!ngG4E&i@(z$QZ6c|F3+A`O>F7s6(tECv~W zY~-a$Tu@2BDCXFT$P&&43-zSmN)ftO%wpr*DMZ$VA zEy7};Pi_d4&=^0WJaP4q@zu8sTA_70b-Cq4>K3 z{OfbzqD~6A2d@6e6s6NE73gUQUaLh4riQt+Yi<(LW&z%H+ENZRv4Y|g=I|~m(-DP* z3l#qpB*ovgaapt;qKK(#(6U;hQ)DD+h2bj&g(SrOEkMmstMY;@)WQYcwD~WAK_-zl z$YNlq5RDuOlb@Xtni@=FW~>=mZ)bi~+A*fUc-7+{N`5!{&5TM>nE;yw^rpKPj-kS!EzqT72xVcnl#hmB_^~t6LqoPf9!@ z0{jUf8mWjF4pziQ%-g{wa+HY(QmG`apc=8ohAW^(ZV~j~R7Md~bWVgxijWbQW#Xp` zf2vF)J54KvX7wU+CDo=;NMKOyN|e~UY>Vt_@>RCw;FRsq6s1jtjTT}Ss}l_Bm6jv6 zjKyW9C$lCiH53@+?->=UJ{|kK@u5cp-a+4F3FPzmprvlXx!;N+bD=U?EK@88xzZWx z3GB3`ltX$g!oSrLks8ouDuAyhJr(Kv2+K*`gu1JxWS#HR{x#wkN@n&oyOkP*CyOIDJtoEV5@H}M6Q(JFkq7X4aFOvZbn z6>M~7;5gG9b{kY{DLo)UrUqV#&F+_)O-5J^VnWjn(Hn$7#aFwkwe&|yJsoV--0J^| zN*-QIuN^gqv(eawzqO%X+n~D1KK;mcP&*IK3BK@q8T}B`2DKMu>W;^><$Yac=A~tr z5LcGH?~&LnhC{sZ(L*=Lv0sdv!P4d-pMzA5H+9ciJ1F50YIMF#E7k~%oe`V6tF<0( zrol$^9uVc^1nF9B^}g+yx*ns^A|i#u^|*_V{!RS*3| zd2JwBceag7ED5#ZD(<;8;H4d_uCFF`XX0~S2d!}9owbj6+-p!$MAdS>;$hv&M6>a7 zv-Y4n*;C7ohV7pbpdQHssz)^P^VUT|V=t~n1g8c`Fw8%)r%fJlr`Kd!i=6~bSTrN) z!VMQO;G?vkR3aQy`zm2DP+~eKzet`oGC2=AMbhh`MCn7jV-EvuRNk)?-lhYAU7er@ zlChhLk#DDKgneOJtQpM`pqf0=Vi)8sv|gj#3Tw>NFSgn|M2N5G#rZ&2R!(8^IDw0K z3Vi-*V`k95U;@zc&Lm7s9#KM?*)s{D#-Y^OXqBP)@MX;Ofo6anwj%*Lw~ETO|Ilae z867w-48%>FdI=fnph1`kZCqq2m2Y#Uop_-z8V3=0m4);oBfiVJ0cvD)2k!zRU+h|5 z!XcFGFp^NufRa@KOavs#YIKUA1&M+=T%-~Un=;Ci_hTfcSx^(A+{=K5ml~$`?p~Xh ziA@K|_o4%9#OtxJRDX$pMKw51puGl{53}d-(+BVg#+97+_vKi|)M*~gcLUAbhze;J z;od5ZJif42z_FTbW(W@QzR2*@74W7Qe^+5f^Y6iPjTgojK_=9wQfXpNwR$4bdnykh zbItMttvc6D#(dXmqJJTTq}MyihY*J8V#;wUL9&Y;>7?t==NcsF_wcR8YpHDNNYgj^ z4Ap|fnPzjao{~p4aG;?8eu;*g6BwIJFs#lLN1g{}=_orfvle2vA23v|wh9p+AUD9H z?>%g#+Ih%v6)$mYC`xoj2gDw@{^`Kx&p`=VCRTL7bNU~=gm9NVzrPhsQSfmImR-?S zDIWt*m3P~*0ibLJ(m|8T>NLSgi1P9Mi4+H0bJ4F1yn6N+q0XPHK!U^d2^;9 z1lqD$<)IwZSNjF9M{5F7@l3&ny2YFi^*IcupFY727RRd&1xy$iiRCLyPGGsjY)Otg zjr>-LeW5Lea&oK-C_P%9!kBCVJ$nEDP&~n<^w&|>G5 zjW<*MT2z?9UG%3yQ#|x2j%xa&no6jx`HbVxqtwVqbUzfqx(B|nb2@1Be&Me5FNmd^3OlSN4(GUpC@_*-MnBc$ zZ|(9WiUrDFC_;iIL#%gKPMH47BDy#1fa)+S0jZt^MI5-9+Vm;8Z5yuXpI3EVufX~C zB(2=6MY&h7*=%W$l^Q~+y>Fd8HTEf)$hc@&ndw4N7(_p2+!PznDZQq(X!~xE-)k8{ z#l=5j*9qOhYhcEJd#C)of#fZoR_XowS&j@)|iJg?g%-~j!1ZdL& z0M=+8B*dpFH~z*^To4;%X^}AK=1e|4NPIqSm8rQ2Ei6~vH*$I1CwaXmsS+Y}6zjW{ zQnD28n{Q}Vs!b+F@b=$rhNlc3eYdHb(l@zh*#I~9{qLLBXABzf&GH}7^h<%$mT|+@5sOsZh)#0LvuRaf#>1Su zA+T2pg5-#qo4DkG5;>}+XxXMSTC7&oX9jbc5>nOLo^PhRzQEo39(1QHl>R~tPnP5F3ve)@32%xp&BlA( zGWGZ!d;vvcE$G|39&Nj&J~&WDNH{V9-F8>3&-`d2U2gRd0(gi`>cvN$Vf}=cZNqY` z8|TK#X`@#8{Uiyc7PR0B*SSw4hBuI{6n9=h&@oC(f_CDw4VIxry1^!%JU_qvqyYgF zOXiB?suO>M5)AEhB~1@$7t<;>BKphWBP%O1&>*blBlg|%s$*(gY+GytA~@!CQH>*U zjPg|GiOU&TQ@Fb#yfpH}vV0qfyum> z-Bxcl%e|5{R1k26tlo{jxjZv?z?!>F9pQbvk$>lSQ#yK|+IZCl?w-?k>w;@OHeOkJ zDqh{uJoAh#Ms2QoT89VJk?k{8>x(kTrwSYjpWZ6>ytGlV>-+pS1218FwD~RK-+#T8 zpS6F4d^BwwRMA+Q3bRc&y>OJtOB<}=xHe-ggRi80aW)Jzx=}fBTx<6!Gu$Gj-s5{-j*82lsBY{H@L5bnyTU+rlKlGtyqP0pv zdT-xiH;~@cSnwL*Qe%n-$VEX`)5Apj9g%ENGkpwGbspX!9`?x)BDUJz5E)rqo}M0F zDt!fex{6_b-Aq|MKijdIdwZfqZS-aT!mDocBb$TGlES#FgQjeZR+^gqoG$bGplsdI zi>GIA&m|s;P2x7c$O-E-c}A9#rMnn+b$(1Xj+WB(CD_-l!?5ovD#`Yq5&hoeoM!CF zY+|2&`0s!6P9|zDpKr|{3%C2@{$#k@0cj@R-o|Vi#Wje9Ved!(S+=-yXRPb7WqkPU z%jx`0w|iHU#?oi{AA-gO#SvW;(pxn%6^7sA+;W5FY7(NT4|8hD(6w5#ybpx9?Pjya zS?{X)Z3@49VL$hJ?-TS!FujAJE!l=OA;dq}JAZdbr!^5xE`~SQU*LAFm(*Xp8T8zX z#y2}XxpEt1W<^F6j@N#EJ%mH{rj2p=3{_} zP`xn_w64h-)fdr)MF-54)Zug>gUP58O)mF@9wtG4GW&^Hec*mbqDDVQozE;S+d(H;QtG(dMeqanCb zWn+6|v}BJWAzQ{I2h;3(e+|xW%kSo z`O`s)aK?$+=oM%AFM7~kosqn&UH6`%>qg?T5=VEUYDxM-L90`$2n8Fd8tPDJTD4P6 zw(eyo;rCT#E>$^^!FES?Vt&)1XK9o(OF!g<9M;@-`F$n2YGdi`-|mv=x4qQ<3_+=B z+=Z=shtD|Q>%J{@gW(6}_;i?{Ov*518Q%_Ys4QKz=(Kt*eMN@E?NaSBWzx=i$H`=V zBoLBYw{}^Xa)vG7-_423IEju8fOJY^J|oo3R~E-uG0wm$w*M)F`)L}bQVCkEd3odVe!1-&A`{i-z5Srn;hxRXvAIh_v z53k?i24kak$qFdn#C1&#ymcZhht8#|znKCM`ddtxIoxcqaGb z`K90OL;t`;9~NzRFCZ8UssA?Ws94^V;QeG`a8XUVSbZVg+ivTVkxt^};~&%ivfAr- zuWa|Jddmx`I8@xOQ@gJWuiTavYp~uK`Tk1Bg$oWVw?3P!Hn?`<ucAx(Pz{ifemdpO)=6i2oB#_v*oH z%-Cx&t6kuFsb8IB74~kOGT5`Ht>A6%e)nHmqtt2YlHIE}5ARHP-{j@9)Z)lE3LwDYey_$7&NmH4@U@s|>U&22LAD?eJ=CieO^@*`xa!=2|yCaIPS+h6mT?0{8 zP%n#P&ei4ajP0XRr!EEIU<&V&0$;klt8vMlq5%KA`!$trjY|){l*#WbW*Ip6`Q~+IZ^y^0m$51U)Rg>vH1fNQ#rKG4ySrZ?{17I)C!mXvJOZcIDPrqbf){y4X2V zRqqXLuzbQ2V;x>1LVvLJx7z(2T6^)RoM1_HWEOf>W=iyD1K#o0l=OS|n6A+(454x) zH+kdN6Q04)5f*#k+=ErGTOg;PkbvC#FDT)4Y$Inv==Qp zY^{)dhdNL>6OK1zIk3u?1VMa$lif45np@N#3V^IQdh{uwY5wTF{Egt}Z{nu?-$Fb2 z5T5ks{DkY5{X?0@k<*A5u3P@TT?S^%7?nhPeG@KQv?CJShHJOw`r>y9V|mOGN+dG5t?5li~#| ziLr|R4)h7u{BP}lG-9tR+)6LvZsy)op2)jj!l@4_77)F?N>m5{5wXIC73d@nopazL z*0s_yfG~!YO9`;5ZtvonZc|+&E(Cxg-b&^Hseg<#Fekst6WEXgY$6vC{y)Kg%oWPg z!s6Riu=F>(M-(MvR8#>P=>tGE%R@xMB6x?*_%+k5>>@Zc;FGinHC9say(Dj{X!R&W z`M5}AT2c^GQvBA`i%B@aB%FN9K#zuqGS_-vS^IagSe<}CrTRZNYboc*l z{wpax%837I{@4Du`9IC6=r5_*`{m%2S0$XIN9;w#{i(JHQEJ*Kirk=J8Ru3#PCo2edf5BiVc(&{rbfX3Khb}6 zR$q;s)Fad)EO}TPV7c`DIEhlM@+FlOGd>b4|O<75n8(onts^+j$Mk&AJDvJKM><_julm)y7t=zqEt|*Cy zfc2 zZeeGoVsC)j0P!Tj;e~&GoH^tcqUSfW#g!;z6!0OoYlZ`pw1@ zReDnzb{)Cdq*DK!bpcE7OoA8@$0my4y})>-f|pZeZi2s)5+=+;DmDJA5dwYAHX~hm zDCHgPO-s{s(;N1{Th%~o+toDG!9|Rn3b7NR4G*)Wv^)&(LYzFD8fTe7O0Cl)-hbb5 zzIJ}J_^w>_dnQ4htrpo@IMH6<7K_VihCn+Vc{FA$v>~ zka4S1gpCHiapynx*a&@fOn~mJoAUoM0skoaKCnMWQ)M)$SE%gBJtsygXB245^uV7} zzUC|KVYw7Qy~qUY!2krApE~L09qOVQ5ZE@+G96_0%!6(#$+DQ z?#IAw`#?u`|FE-VZRbC(_}J(-ivZ{x$4YRN3=NG4EA22^<-qCRc&D`!J4R$vaH%8+ zdF`7Eo{JCHALy#!Z24g;`!5zil`)|?Y?)`una16ZES}_aa-Yn2+CUC%7B9HAFIcDJ508^6Tuid*QC?^jyHJFY-v3 zYj4J9Lsxa=?Bc%=tQ>+0Qo_vVMCedC%ydwR^qCU_6>@}akO~twCn1l>k)DGpeBN9E zh*h8igVdzsb5drg0<&(A``0arH?*XmU7LyM3KFb!9GQYH7ZYp3rcUB=vvzzEt zyP;ryXSJk>VWW3!u%;p$yyJ43)1x6pv}$VXIMyMdsr0V46h^CGu)`{s+tuUMjBA=R zwg=ExAr3I=b!n1a@pV#!iNE8D(In^6+>m6C2aHc(pzA3f{=BRR{~knncbbG&F(uZ2 z#s_;vkya0$u{L0sZ3!7KCG9??IcX!dbzI|8b}ff%^>s0#9F4hu$8Z?w_!!+7@%KBD z~nF(+9v z8=fv{Rua37P`$pwZJk&oujekBiMq};V1$1sb6f z@GDC=*jm|k?v16ul9n^%Y0J-1u|bvG(3zEUGBu}5T;kqNHSRk3ncXR`-7$0Y^vnh- zc-NZvH-=8ac=uasl*l+{4EQv~`ngqo9r}D2)<|*5Z+=uG9i`zC2H`cx&Pt9^BH@|! z7xt;GL@SFhN|79Gf8;M^amom*wkhk$Hzi3 z@|0q~8`Np$$|o8o&v`N6syncry@OUF3v^oqk)NCTRN<#wYNN=NUTYJ956lvak;EAH z=Z{D7oVqao04ZgDuzQHuv_k#+j$P7q1ErNg&Cr(QvW$kldGf#wT0?@EtwwJOb7~%o zSML~nKs{HN$%#~9B2L6oPwWr6`0QHox5y@w-`Qxh8H17awuz5(mVXJ5d?}L-UZK7Y zl6I8e`qMD)m&|I{`bmq# zZ4eKUEJ^vTli-c?>*Hjc{&#Z5a$#GZ0V$!YBF2ipsl@o=B)}eA1CH$e`@tJW?)$iU z5Zkl!;hQ4al}#t9VH7m8=TxSAXBhrP5Zvj$mUo3o|Cl0ndulNY6q+;<^f&$(Ip?T$ zujtKx&i1;dTuS(-S?>>IhhJRQ2(Ynby;U0U&qQWt&XEqq8Ca%dai#-~lXBdS{Izb@ z0)lcGR8zCN<42OVf7fxM+>0?;Y;f z5f@F1_Oi{`1kxh18+~*xS6l(ZB`}}C(vC`mpe43I`KW0In71O?cUrj;Cd4mUo6Cm? zX$v^d4B%XtfliOiX8{f1R@f9ifKB`$M{i`I(mBZ~&d3_M_;&=aX4LbNzl3Up{Ywa} z)m8Up2C&Qkq!8g1NIbzt+Q?0=*zC^p;BVE!;A6Db=)AurS$qL}69W(fuBW!>7lVWs zMZlg+;?`=Do`S;Pya3&yWzfVQ5spgJATN1vPCv|!B;{@OL=DJci%BuS$}m@B;@;%! zz5h0&x4NOylSy%dg$^)RMCJiwM)nbR;DaqeWV>PupclUf2xEy1Rq$W{2}2^!{@79f zmblqXpPM3TyvFG%gk*@2IWmL0qXkFKn%okAF^~derrvo|;={R+g;)D`6_b1~=YfM# zT9DL|w?Q?hr=B)gqD5}eqO&%qmStoYgzZOgaO>E6aATBPVXF=j>JXJA=TD|KS9hEmg}bg;0mi4p(uErNh5IZeE|BQCs30i8~eW! zKwC9x?$JJ-1VCJuwS?!na0NRziijDtK};>;*JLA8K&nNDD`7g5X<5H=Jhe)7cGaPz3Bt z?9v4N(j0V;_&|CrhxrIS1?)ZQ0eI@N`7&Uu?J@Wld>mkKF>G~O2edd0U(43jM5r_D zn3f-PiH|uW8Eed#1koZJc5e$%wpNBAqE;#Q!BiMspg!1|kgbP*6^2F#&{zG}S?LiX zGxlBa=0pW-DpTqRTZ1VZ!g>L6%XhCAyOCC}Po_a)e$;F}kb(IG>i>4w!L%&iaO1Ej6y1T6|0M{r+i%f@m4m=S zp9rN=%tH(sXj>v6p1YN{x976-ph$nPVqUKIe&+b;+?wxZoaNuGZ?POv&?bbcVP0vl zR-_;51H8*X+<%B#C0o@w=MEQV-8%<-kcmn>&H&@7Mzng=RHju3;McAf#s}iqSR@De z39@mqwV$!$Y8p9?qs!uNPWAv&0gNej)g!4mS$|h5P|Rw8eL+rB6-H20q5Vep5D_IY zq=#)V%hG9dn0-&B@G(r0D^LU=f7t;yMpMrLSZ*N9_)EH*{aO6N+LHjTj@77BToBay zPwh#_4pa*Jz-s~GgL83^tBwaL!G+@w*|#c(+5Kz`d`z+;4LFqwjJ4Z+=-YXONr;f+ zJ_ObaN1NxhsH-&M`3%fRM)qy@R^~BIi&5S)AK;Ma!aQVCT`BMeMBcoz`Kkn2YD;)B zil~1KNWSf^?Yne6hx6?!@}aT?IhBdXM3b+(tp_V|1(?)Pv_1#@;l?76b^X%wR(79k zZMy6fQXF}@R7g-^qaX$fTcn{+)aubz>G8sf&9@WoWdS=@{YzzuV6al;D+6Qjzh`tS^jjlVaL^f#QIqk?y8M-H| zE26#buO~O~GnrSw)EBuxdk9d=>cFTBQs?ov79r@w4CEdV#b@gcfJj*(&>+~DS#}d^ zgzXq+sS|)Z?LB4cHpJM@1g|)FCQdO5UnWQH&oCf<$B*m9p{DS0x@UF$NfS*Y9EwU# zYJ^u^)SHr?zJl(Rqf=zaG{}j&RX}TLot`-Q)j7Sc6PwCTa9$hlK|nhXf!7gL=jXv} zQ@~(y9oGH?&|}>7J~j2&7d>rU4>FXaoI8ym!cbEN7l7JVdBB?3USuZJs1}(2>6QE> zIjVifA89=psS?&121!Ly%vX#CLPZ#k@I4swxZ4!A8h0t$fx?8aF`11KZ>%eRD3L<@YY0W{)m^wt4#3+m)OlUaT&8ER zl+Y{J|9rHpG&Ijta|SkrK9eE$z#t>@e>yPn+uu10>;e*-9`+k)4DS5Z zcaGI@GOW7|qQQp4QDfLDCD!`}&>+%_2>}Yja6}?*m0+EJ-yOr6vxrP&>x}`p3cqO% z*cXN*EESyh1rF=Z^(6rBS>@<4RNb?vza4bf8hZh91r8RtSq?*I7zoekS;GtA7|=Fpsn(HyFsjhso8 zG{;L)Ar)QKwG&385hYPhl}cT5N$OH(o_HUV4Dk^t5K*=sQ>tnTUpt1@-UCkuoo&y0 zh8{*p?2YE;rjt#rY}4CJRHhzgu0-=nF-B#{AEt5P|FOp3qp&4mujt*QPtju{{{M@Cyvbu0UQ^LO3&Cghun@7Q8rn!=^{dt~+(ZeR1lj|VW?+Oqpc_XG0 zRO&Iz8vqpfUrfmz7SPQ?dm43ZZ|9lKEfzqF?KY+l^N{;rnQub}VNxF~t2UiI#&5aC zdJ%}$4kK>2A>C%ws4wkhEn3X?VX*I5(3?xkwf%@O4cCu)a$?1Z7a)GUPjcTpQA9(-{@gD1M;gMTwB_;D+k+YfC|oVKW%08 z01iRNN?j97%)gH>YC6cv>MsP)#SI8!JMbM+SpL_|kmu9Z+hR_<1TUQw zryVvw2|%h4m|ii@E!8{;eZXVl1%&aWIBb(fUut0tSCP@rMfs`3S~NxE6$9JiK0`N3 zW5w12bp(cCe%}MVDs0ncEGEp|f_eP)67r%6?;2Juf-3qsI#|H}>xxj-n)Ak=sSA!j zHu+$W!HEYK4Ccy)n_0oNJ{lM(a?Y#TY#-MYrk*onJSkNxp0G@Z0g#^`&?nKz4fD>R z)K}*Nbf{{%uLd!IcFsoI z80&@^#r&+;a;Kr*Wg<_{a>@5V@9h)(Mq@di7lScox4yo&$iJ}9>iMY3w5-8ANt*JTcO@F=lea=e3RV=EcfXj zIYY*%5|gU?`(_50)Mm40?_>g?y~CmFPx7M8aGO!~E76sDL=9jPib3rgwS3+T88_$X zdSMPH8i1m|{(CY92Uf2m9}SAqzca{PBb*pZXyFsf(2X43EA#7LQP1=sqUfzj?d{fI zTa^aH7PRSa*U=jeH;v2}uXFqx4m3AivdrA~aM?s&i^w=5hRC+PuhN)}p4SuaBd6FV z{@2l`(1^qOz&I9qxXY!Njz`9v;87;28882L=qYiJ%Yqtu`U6_Nliy6gb!Itwt_i(^ zb(}r+`1kAV`cJF!yezK!nq;-2VCaVkHnK*KGOKt2lE9x{`j~2aRnTHOu$}$;y;Wxc z2$LAZsiizbwH4BfjCuFVLH5cI(6s^v%X#BlMr-I5*tLWaiM_veP{x9_Z=z^nNoyW@VLfg1k;SHo1(?Nx_jtz0Xrh7W**+7*= zAx5V0zlb7ExopVHe-!^V{;Y3m!rEf1cL^6FhDFKzAw##RQxx=&jUdHJR?=zZxHC6> z#p;b8NC?ZfA5*S}U;6vmqRqT$0P;XYETG?Qtl2P|bZjCgK~uN|Q8P_DNnf`iX?*Jv z%>GHUXly}vL~v(fqO0O?D>3&=spBQ#f~wnNZgD{ndnGo?F5R-(H9liX17N0Hl4h}P;{Ei>Iu-@ zsOUC@4Aj?42JEahb97ULky7*y0Sg>`NPSY~L(5ZvMA7?WBwc3Q(lYJ;B*awO)-rJ%kyQ3@QJmso4Lt%9nVmJ{ikey2l7Xn{H za&cD>pf>yBai-9JrC|JyS)$q1A)K6kTWB7<_AU5e$g@BHI2X43(mR1P_Hii5(xY5J zddqCBY{nz@ASo>G_38HEF$<^4qc=Hy96z6X@{;TMhd^2Lc582;N6gB!cx)s5$>5MI z=OWZ$i`gx!lg5x%FC%&9dFxBjwd_k|{(wtIQ!t#c(}4*;+e|K)>!4k)h`rP6SkPeb zPx-s%&xa{T85=XAqL3U2u^{Me^zlFy6@HoT{RHB%Z_OU3q+6KkI7r$f@3nzOKIZ!sB^;nQPn*AN@V5-X+^qRuoW6&Tn3-GifUI54_#t zYlc17x_aWw9AfnrQmCb%mI2;L2zsyO9OBk(Se zZZ)}VlWaJ<_w?02KUUJ8M}^2d-D&UEI!|;oJZbMTuK24T_fd0@py=%fg>TjtoXhS_ zc8zNI{>j*5r0ED@{VSs!D*TfKiO$}HlPNNH7w0ckhOwE9$8jTno|)SIPkpo3aZk8q zj#=Pk@^!z!b>_Qbllh00lb&&gk8=w+m&|6HY^gQ zoIk?;*kvaZ&y&~dZ#v9s>K|lkc?&8YDm}4URR2pk`TldufL7Dw_gz%+ArlXAhU#BY zJE1YL2_MhCtZa1PC)dn8$M$FmSKBM|HVhu6kMoOJUUu|Op=}C#MV5+FW$QhiX{f$g z*_FM;a&LM9{Bbp4FW3R=3MZfz+LW{Gs%_1K0saI2S&Lh%3B|GImgRp&cLv8@g6k%$2hR>}Ho zqh%oGaHSq(11*N!ExJ{`lCkaAL53-F`NNWo1YRLDCe^~Uro`A_wL6!`W?xV@R2IIs z*FVh?^tZ^T_xV;l4dz?^NW!pjLQ?JGxQXeEY!|HAc2)Gz;F{iB>96iP$eSHLX+vu& zZ?3V=QMF^-&PEmow>H7&1yOKLY5Hb}4+4H zCn!p;u}f@*vM;d3Rg0RnK@T>E5-@k3PWLz@+^M71dY4}oWmsP&3n^Mmo3yLt0G%eZ z_Bp$%mUQC1_;v0G$YwsUR_iIfKMshQY&I`%+r5HYuZh3bS;!S6% zT7o%2#1^=D=<5!0Gq@J-#$ z(sf_DcapKwvwU|bI^<`;KJ^0~p)jB3*H~`L`3j3+)|A^P z9(C3zq|VDq*P6o1JLMB+*;%>h-H>mAgfZFr_t6zQK8&L%GjNO1++U86v+v1`!M`XX@P-{cZu#vi+hF~iL+&uY@cr&VL!u4Ep$ENg_d75X{V z{AeCpK>K)Yks~TNXWt&1{CQH!TRRT$}+uIvmDmpl@E`0(!Qi{{6jRQ8n<%L{@V-fLrvliEM1tXa?$fU86v-5EAm)TU)`Xk@U;R4;C zrXZ#~Qx4tqdB71XdsRt%W5G<=69@M$+qPE&Ki-2)2*8Lv6Dfdt)ijo?MDM}}Ita^o zxxUx~05RCAFArR!+Nbih_x=$6UBE4wa~@6@L@UI74>sW6RXDajvx>8Jg6<^u;2Y$I8ZqSEA&_DUT|GW6J zn>{Nf&pfhvQ;Lq-tFq&Pt$>R2IV$+dF+~9yJ-lXhLv-2dit83T$W0o>Ghcau!nd*+ z8WRomP*`jLoEr;Le8rTuu2G*c_~Rw3?;KjjMAugc%l;aKSMTMbDwy(%VSl_Cfrl=d1xA-hMMpw~G-dq~?JJmbM6c;{ z;M{U)t(d&F!HAuvUsuw_mpQuOX60^@JTlNwB)@l{#!}h$K@+HCnK(UW)S9D1 zV&s<5%WrVu`OOZE2L?~&LHFdSr@ICxm{80)_=l$o^T(^D^F}SCypSaxP67*}2P)t< zjFJUjczI@Yv*2fCh)?C;4VYJ*`*_O@Rw;s1Jo?4C$M%SK=Y~LHMYF zUn~Zt^+CN@vTf=hDcl6s=OOEo<XD<1Y|ld0?dnh^*@W2%FPfLF$*|q3 z0u~#N#l)0;aP0>Bz>B(W_T-ie;6s5uBjvXSD*+JM2z>1A85tASzd@G2C>yt}8)7Le zIf}?U*nqNpZMIWyp?1`zBynD`^z4v{uR#v=h2O!O+?oF)CbYjk*-o!4PiOh84X@09 zf1r>yB*mBIjw<}sRM{e=M-5CBmiU)5H^5F>F9nmYaxoi4vt^8cwtW>~4 z0QPe9!Nf_=!xY7iKKD_>pj4!m!eQ%sBJ1@05AG4yVju%Pa3Kvur~6BzBUbBWC)^b) z0Y_+y;4OKOPiT#=qIB^w2IK)ZId<<*b68mDXzmr5)bWo)u8O=q_u0=aJ5`kd^|Bpw zOuXtq93Gaau-(dR`*cQs#{K4pT-zmv>>qb{Y0l|{x3bgY3b$;Cya>LXB~QVC2g2l% zBDippK#x1pa&#%Cwom_67kV^bzRUG?h3NFI1@8xYOGxA{sWIu)1j@lfT}7+0Ew0M% z>=>c0A{r9d7+cd3`?YWU@bp*~AwrgTDhnH!CxldWfi>fyQK2eB8gwLq)CO`qVKIJg1&By zKO`)vvg6ooJ(|fXtD9A9VoG<`mi2NawoC;_SDG7*^+KD3B*JWHpc_fxP<)wa9*kR3 zfQfqe{?UXQI_!IHO>jxW?vBRFXb^jjtQ4KfY6vbCm$d;^1!TE7JAkD=7sM)wo|O5r zWHImu2E=3qz6{oVZ*46xO8rntmw6~4T^#u1Ez6%cz!_qb= zm#${Yd>0{wI#|7XQcbgd+qI}`7q2MiO7~xsuP8bv%e%fyx@xN!`wRf)l1obH>mcgf^#}XnUeXiKdY6S|4t6MHg?don#v6d_)y4~yP+gW%6jF>| zFGZJ7=P)=$Ua*V5BT5QgLa~ z%(WLgk`Ccb!s$jHy8K?#7*7@5@iO`Go4dJ+No95I7PWF698_F1378k39xD}efY*uQ zi~GR;iD9j1j%W^7%PfmzK4Iyj^bF{+?g>!ol3jW|#GVi*W6CcN$ahspN=GD8Bb{Fe z!Y1|svH^bO;QuC_C=*ZbV@ujTfVcf8NW-Urs@6aD29x()HawG*K1to4E%8`oSHOg= znk|XR6J9a6^`14|O)FtAWx*otc1RgC;_-9s@vm1(6&yvrUWUk~k+PjZ^^m;0KZE8< zm}16wO<9&fx`hc%z2&Y%o6O{z6$zoLZty>TLzi-A0uDDNDh3|8!9&T?()F_JJ~$45 zW~kaDc{eq=>G5X+SRHn{$$G-?F{*s*st7PYCf*MJFh6lL+Lk0OyS&HtG0aR?M3WV&F zj1%fBM5ROg%1vD|-)Py|u0Q6Rmg)8KteOWO&cN2-P5$F6*lTx-{5m_Mn%XsdDA!h5u=Y`d|FPJHj%6P@d}awqf)8|1sb|Z+TLH zLNG6NNB_R$zQ~uU0cm=q&7#!L2NqNhS*15yHZmb7IGApbwb?_*FLlHU(~gkKE*L+{ znKy<#m858Sc=LOD8^K^bRiQp-*w^HaC%H0}={krf{(f9Ga0foV+`i9U2MIu1_;(~E z!r!k%idXGCmhahq1uBgc+3m#lro+WoCrgkmhO9u4cTteE9%4~~$tKH<$1S|;_3{N+Ur>4P zuYdAiu9xXbqeWoj$+gYyh_G@V5MPaM36#@U6yCmDR=zcGinAIHb?xf)1FYcJFIjCM zuPxLwrU@pl_!4h=sq3Wd#hvt(C;%l;#-mHU)b9x`rCfCWny$}R-)ya#1r1rT>(CYvXM=l(7q)lhn_llZ97p-COvC!aV$Z9u*XOVa(t2dnqK6@3ss~#9(AvRZh%6$V9 z>Qe;h;Eu;nvZSl-tSsMw{<_Ntl&u3&Sov~c;xtTYv>Fv1ghVU_WzL==6m?`5>knpj zf#6PHgNw{lQL@=r5s#LJko!<76H$jbGa72HGGWpI;Jhzc)Wx#zur-S!-s10NG2Z}P zN%@}?TNWYy(O_RVfT_sQIAQ)7R{%^x^pl^Twh=O!92ptprR!e(1Z=Iymeot0SZX2q zQ4(E_BO7lNY`Y#5Jts};0`Y_t=|F~jF(gwA$vpn$@(lPfy3|!% zx|({ULibO-$TOWqX((%mNxUYVgE=ck8>~$u7H^EYDG-xT{tBb?1h91g?9EImo&;{x z%4$z+KO69{4GK9sT)Qn1l(Q(MvcS@BdzR#rP*(J-6*TB*uZ)pb=S9A9Zc^u0=@i$1K(n0py@~rlxzdDY8G|JYZZ5f0XR?1e=X>w9xKoBuZnr&-7(fqt9IS`_Uq;$>cYc` zqm#MKf)F$&-f`*lfyg7}UZ&eNzbKixKw5a77<5}}&sG3Q?DJdx`N&(Fb9eH4$v>Y2 zuA@Gri*i^5VT~SccHpG93ZD;oioe>IHIrGH4Y-{?a^=kHd#xXGRN#X%c2%opt&hQ9 zPeVAC=f78<7M597>>ur-;$JE2wp&VOX`s!Fg;|?T7Xy4ljx1b#S=D*2<6RViv7NKE zcXBIMz!mjll1rfWH~s7VDt?$U3%|B~e!X2D4+&pUTr^9(NGol#E-+nwa7DpZb~SZ- za=v*X#0b!E{dmiPv(@rj$g)!1orRmWd6PBM{8{%MG4u=_7v;8tc*?}%Lo{y0&1NjM znwpZ$jSg5^t7{#zx4hGW!Jp8W%<#F`GmQxrl<3lczi@nv?}ikl>AnD?I0DMXq?O#GB58Ia4w^tLsudTIZ zSLWs4;r;frBPK|K#-SW+HNFnN2nHTMKK121Y%J&E?e8RK<0qq<^uT5evWqw|PmNpLFskCG)X z+{Rs_B#7U?DojJ?zj<-$Nl7W;Y@>NIAGqqyU@HlH84N6j8=Z zwf|u>V~v+B)WuQT_-gd1e(%{oZA|6}HK3i+{a2M^#$2)=t~ zA>$|7^5Dmxeqn>N`2xa8_0Z9KKq2T3ZrSvi)4`*CfNHQ4!o$KTY7efmb|E(wDVUBg z_0={=Kj27W%bvj?$n+KQWgDk)9)lu+2uR{^dE}YaqKl|j$UZiouU^$2I#+h?`Iz^< zM&nx8Tf>7p#+=f0$NLq04 zL6G1jBBp|LWgTt=Ns6i+TK`}}!F`@n;_Myhs_^O2X#MR^7+*>v=v>s9U}$aUr`59~oVpoXau& z3(ycO5U8ASGgKEN0k=au03VNb(37>cM!?KxmlD&*fHIPE{)rtJIq{roFm=&j4rMu7 zK;As&8dMd$WcF{g7O0m|#aB*mb80PqUad~#R?W?Dmnk*8@l%`wqXX8)zQi%w0^FCL zZfW(MWjiZ@FQ7B*|96FB@8N@ptqmh#`kvw~H&^G7mj)17&029}P31)$7`fq1>GFrF zCLW@V+T#XtqPMsezi)-llR+D6eArU$z4bbbgF+JY z)N*f(mJo@LNu)_(Ww&0qb8vcWM(~WG>M7C7uf<_y~x_3wky7ecxercv!3@ z2BZgtVnU`wZn!rv>THX-lq$ym`?F)Y!?cc{2zJ;z_jGZp1RJIX8W~yAnw#G-YlK@} zZCaonDQBWod)kT9Ghi1+f!S~6gG;Eo+(SWGZ0L^g_MinZ%=!Wy;~U?OJGnT)rO^%s zS5!$tn08TvW~en&pV0RYr24vph5%}|Q<_e0eK>Dr8-wGskbSa$z8ir*Yc5UwApF>_ z53Ot;G=1114UQbE$0{{NxUo9NpY!I!BMwNMX(@U3Go-E;9JkP6b{tN=e`9|Sv4IID z&<*SgCKz7DDtDScS_(J|DPG?XPig9YX#4hkYWM7!3(;zBW!^L^RaItrScF+wzuA01 z7=m?9EB|AC8}eb7)M@X-1nDTS^F^L4xpmEx&oBq%n?>!rrDntd_#j}}t(%rTgcVoX zeVif@M}u9AYRU;G))KlrWBa3T8&p}P0MbQ{e_wQoN4#jgm8pzbYpA;X3?2?)hoD9Q zBq{v`%X0cH?=1NUta*EX@J614>p)dZ^EBdD`pv~XLl|bpLuxF5YavwCa#FZAarw=$ z>imj;Xt5v8c7Cs_{~l>n^oXjf#u#8f#mxlTt-VeYOoRV3S!gk#a%1Gb+n0j_6$ zzaFte;CTpXnXO%wxyW_D3h45m>!Xsgq3kM(4S96VK7Sr77!@DSNN6|BB1^ER45%

    ?Xo3gySL;L*68} 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 Np z5wGc{c#ty1I+`nCGZ}Zv#x%;R_BO$O+M(@;hx7UF$7Q3OeDymXQ9r&4LM}2tp`UJZ z&j6vWAHVqofhCR0jwGT&ey01I+lnDNk_Rs8 zhsm3U!^rmgq}=2#P{d7$I2+e+X^#Y)(>xCH-gb@Pn4iM&)b0!4Q+Nct0eVUbzizCW z1J_w#9Q$NR;VD#L=mmzG7V)Kn*q0f`>>~c{QVyzq80v&$9qZatfU}y>piJ1PPFS6! z)13{KOB!G1F-OWKv-~5f=CXr2zB=OT(wvxb+Qu^vBTtEpnM%<8*RpL~8offRJIzab zf%mGU@zavBa~i~C=Q5-(i5F z63U@dbuBi1vGWmH?R2j`^8TT)3&x5LcV4FXmu+BAk9^FA>!&}z} zawRyAVU>;}4HlaY;b>3dy?KA%=$ULO)BSv7{%G*;x>!8Q&lIV4cPJUbf|c}{az=SH z-q0<3>=~`&;oP^BD~oS&TKAt16^!EIvONQW1tU0{tYZ^SGi!V=-J5fbQCyqu1gY;+ z{5Q7#^4G)7oXk=FY){LBK#JS7IBBlAbCIy6+}tND+y$Rp_2fHgvbeeJ$O3cX`^$=~ z6F$~XHLuMadSz2`EQ#mbn34I?4Ml3Y_8~rMW8Nw5D#5X>mVF_=m}-6N3osrwQXCrLsRi7LCP18^ccq`6KaS)FSgTiuGF;$GGspY!DYLF2&t8^0l7j`!EiFJ{k z%!na8aeH;ieKRx$uR$X{kOS4c)1-idkYzrp?$@cN`kHhMCHG8jMnnRasnD+;ZrLk4 z@)_ltf#s#uL)R7Ae!5$Z0`wb+jI(9JG?OwOPhlvRo#JwoeR?rYDgF3Uy6}*){$hKok7*tzn29Yv8QKV3Y63ZZ^#Aix&5PW_jiWA^i! z+k{Hr-%+3B@lDhE-e@R&g<|W17VcrfO{)ym^aZ> z(`YFr#>*B$oyg!0N-bY)hOqCrO{3By)|u;b}(CgOW$!-JAcf0;Qqke-~Ens*6eO_ULctw$mD~YbMeuUr8u}SSfn2NT{VTUIamdZpUsW-k%{jea=)jFG8tFJpY((3cI+wgC4|CbEPpGLJurV| z)YAE6hC<>A+@qvLMa|AgUmJEvTcywQU0>#JL-@UIg#z;X*(_-uWY~5~jXz(8v@%lr z!71y-L^A~V{73xQu}oa7Ww*j|dmf8lKZg8~O0Q5Yu5)g_w)cV+G27auh=5p@-m~ zl#1<}7;aC9P`|L+zLBG$M3G;dcIWl&pJ0DHM^Ruv48xTiHsmPuGC;V;o(!hOifQJu zi_(P#tIsGigXEUJ6QoxTHvW!u=#~RQs1hh2Q=l|JjgR#zi?(m-K=hZ-`>+D& zmQ+!ouwF*^-8RD}maQ01Uk-Wc+|IsdPUPT{_+FLWQ!7~S2|CxtH~>6RI9 zhR(1kc|eKH5JcY@X1pP__d3Tam2MsYGp&IT8rh0f0vQ-cJCJ6)%vQ9dX4pGgZj{nd z5P3CNhm6p=6S2m9?#1lWm{wPxtL~&j;b!ERGVtCZ!FC^*)&|+a68f51Pp9|k%0O0| z1S-5<_qyL^P`X0{j^TgK}>!CxdrUZ`w=%H@iicRA~| zgKT~1&&xF(de}DJP<@TwKQCS>AA=aXsyo>9%0AybXT#sZt0=@{1G+BAuJI1N%zt1Zyf)p{^hnrwJ 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

    dD4PA@N@Qv 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 ~S-UuX6oh;A=x?-lRfy)FWL#pr#0q_#_1t_(O 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

    gaMVdA&g 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ð!OUVin8XHZCY%mnVsM) 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�Yy0z;@8@-&cJJeP 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 z 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 z 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 z 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

    5;{vLV1p-ilCs8X6J`hh3T;)(kk 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

    4yl#qUGU?vr=!s3?ZJ{C%4l1 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 u4aZ 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 F0sx=G6O#Y{ literal 0 HcmV?d00001 diff --git a/module/move/optimization_tools/plot/ac_prob_plot.png b/module/move/optimization_tools/plot/ac_prob_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2b9c6320b11d0537c96da1873de95e592fa885 GIT binary patch literal 203949 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

    JSC*Ib0qLn3V%O9fd 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 Jk1c-Xe*sy3&UgR- literal 0 HcmV?d00001 diff --git a/module/move/optimization_tools/plot/cost_plot.png b/module/move/optimization_tools/plot/cost_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..8b936f98de7f4b88dbd3a4be5a495b7b6040d6e4 GIT binary patch literal 344091 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

    9Z`)Y!OmOapo+XWcrj7TE_E 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

    03JB#1rRDvGe1voAvG8?7{FP zXaFJnD>8oaX84WqW`_JEfk-qBgXK?Chv!Q_nbp_1iV_b`2m=k-BpuGA5jb_hBr z%x1pHCb7#)G9}7l6-g9thgmyj%n7TRuVvrwYTQujNVJ@rbvo=@9)&EJxkVJ*=V0(r z75d|d9>dwr9#SN}3p%8p+(&?DqRm6^KU(l_>RvKdFVu~4cV>7d6G>rfMPZ~AdLmjp z?Q~lv8FtZVAc(maCNAD$fCbe$NjpTrKiGRb?hPr6A zZ@Chl$t2%MJf3XP?)%IqgIim7+xTZ4qv>m`j zXXbOU>Mw*GDz=W9vlTab=>DH8FnJgR4E3mHEE_ zb3n4vlgq>zu~A^{2$iYFNR@RG4fEfJsToy%iXL%f#26lSNG##F=wGSn%2$NjwZ*C& z6F%HOv%B3Cmg?lB5Y$Ps8~@KT60Z5hKNW=bLE7lED*mN+89C6B=#qG#o7g#_X)*ys ztH|A_US%Jc;$p}7&%QtvcghY`&GPCUWo3eM!`wyg*03qb9}W&V_S+%fCS$K2HJy4` zblh?rGscG9N)nWBy7sERIXl1i)jcFK(x1EMXJ2hgOgD1XS3w(!c0jE_)OshQkdq=6 z9(%)T-Grsor1KeNM_ls{3!xAH$yI#l6r{$NtbZZNhIlb~7}Zx7C9)4}V$EIH#ppUx zuA_OTFT5bVRf(~cZdWFEfzTo13c3~Wx2i%)(gnL!EzAaw`BiScJ-LqMEmk{5%Ne1P zRl=S>Zj#X)jGIJJ{LRJ`VVH6{;8f4MZ6D1vO9~glAVLW!*;6bE(u~B0 zhDZlfW22xlSZEIkkflOLiO5o7FafeuAS8i=q*AF=YDv|5^WFa~S$L@|*fXckn3DrJ z^Vp zV6IXE{y(5^(3Hq$XBD|ihf zGHNr@xoABU;E!t+G-K^dCVvvjJ|QxlWWX!;zHe($$U|Vb7s#rh$@OJxkb8Sofmftf*6TX&-Y ziSVTazz&@-&v5|2(I13e_h_1C;-Ac4)`f?xEN;)|1*4fw?>}| z{k}t@b-%h1{fzdFBibza%?s^}dj>MRK>6c)0Fe>Y$}CDDPbWn-F>{j8cWg{|6Iu=;aC0Me5*um=Kn-SnpCX9wx0C908#>l5(tbSt2qN)pAcgkML@*Q zfpLcHzW8^6lv!Ic;RM~@qXPU4{05IAu#inNW2I80>oHadMMZU?8If14`-KeeXz)5< z0M;8ASTJURR?C?29-RCk&|j{+PM;;XB7&#r^AhKwhG0&R{09^9nk^@+ z3Kq1W&&O=ZET$ENc_4_8Y&{W!A>RZgW`)@&4KlJ8^dLgU;v-^P8c|);7ch^=|K<)s zEr1ggmPbpM#cNQ>h6P!$Vd+y!JKN2haYpVS`d6aOi&zN+=ON#L%n0=@ zsh2_zz^W&y5HuYGAoLgN^JtA_o?u8AOCf-Y)d1KbPUbryDT`UT z$%$~w-WT$L(q%-qrQi-2=K|y|0QHis`pN#xL7fr<%gbAP4YFh55Sc{~WgqrN>_dbB ziFy0`vp3!b%6rGgxX@wvxJN(GA{;>~#xoR>qf;JZ*lHqIp7}_a=ljeVR0k61^7IV` zqRD;{t_YmE;otzX5C_6?WUNP@PuNf~v|(au+l-G2!AW*usR)Z0(+18Pd9^-kUf0Rx zEUj!$^ilXsS@ro#2`m6>79PUV>T^>Fx}p7mU|vFcOvr6}D`7tj9zuFj3e=|EOTv37 zz=EQpS;&|Q+e#oY+|U9mqK<~~gZ$oD4gMdY-iC^%3#i_3lunnE(@_TT|C^q zozAyC&B94!=*jSL!xPd9(RY;K#{QGLNZ~*(g1USP@?@?vmg^iO1@h}i$;nw(ZtOt9 z=9-RDqTZ}{qsC*F%(vrmW3IDVl*g}pmxGs?Hcr=S` z8BB;l09$n|(1O+6*6$|oIH6L+wqghIoZXYiH%liV6(}l_d?~W{!oub)%Vpt6QdlL6 z%;fB}vUZd4NnRTLhb2F|;Rt^CcC4J<#n;mb42raVH}(kT1|m-_R-P-GR^I0ndI4~m zhF%DJWnP@slsZW~d0EC!I*hw}ZGIJtT28V$b@Rsuba%{Ef5%73&(yR7NUlDXy&d8M zaJrj@8QXV@@!Y&Y-De*PBXm;&J5@K3_nv5&tVqxRO_1p9_b_h-OA>^`+m%MO7Z~QV zb_@&9M3VX06EgN9sq#u%FEn~cf{O_;2oNi@7xpLX2xI&c&7Tsi;L6-P)$fjJf-CyA zmoOzetAR3$1o$6x6?O%%^E!6I6;yJ&`YH1H5el#uZAuK)aOIXrGSZ4Ho z#^4rm(%?&sBSEcm-$%K3iGMs%#xO-fvY0GXw~8RSg{4I8rP(6~2*|a+C14B(dIz0Z zPBkh4ukr^1B&v}0m>J)?`!|P5c}7KiTL7&8`uOYhKXp>F0=1Yp_)Cf`LVt=W2W!Mw zq0V`Ax8{4uT`a-uLf^Z?xwN*j+@&mK?b99Q!Rf)bn$s9|EYS7sMk3(9D%3|OW_~mJ zUkB^s*bo{@LM;horvVo+XZ?we2}M{po)pgegNyAw(8jw0vj(7&{@Pjw;x-_Rk^GZL zWBqtS%N4>hB<5=HK+@I;cw?~Ngo)koscIQ7>tFIkkx>hlC_;q-1^g%u1Fb>!}bhXw)h2NG!lw@}ihEIH6!2a`&^|6Pa}ztA0G~MMmUCR?b^M5Z-bs z?B^%K_+2t|<)6|kA~^obY4^}pIJy)jQiS`J(Nk{EFRV84DG-YFKfzm`10Ur5 zAOVn<=if<;$MKtk51!tFktqmEM^tGGL5jUhn?B8638C$wt(l$TaRs%{qd6AFZ@5s) z-(9vK7KBs#Uq8F!e60qQ)i6FPE3gb1|J-pX22B{;gdD^_5p5h9b7eE0n|PsCR3Esa zgQrb9mU9{BYcbQ>u}cQX2-XW3;B6zDDgQXa;a;)p7Ppgs4BIFY^B#`6}1`J6SHWRxKOmy>x(2{o$4SDl57V zqx{e6*Oncs!U^0G0`C7#g{!+cFVXrPt=ru|hnE&rcR~?qLn|bBYE(_yn5v#L5=T7HioXft?WvR-^Z^%JD zj!h_~mUm@V{*`JKAD>xFL?bFAR(A1X;)(R+6Ga-%)`4Dik%II_$}+-LhbiP3A3rzo z+wD=UQ#7r=4oUnbRBsC0= z=z`BWrAD7?Xg^}e*n5qrXhe5F>9dgbgCR*R+YMgizgT}V6@_kA{ADkr+ktX`(xsZ~ zg;A7*xdq7_I%Uu5pE~5Ryiujkov+Jt97mEUG`uc7=}7vZro+`ko8lS{WLF}u7LhKR zSE-$=3P#42-^e%Yqk#F7KS$_p+bFATl)h!GzU70lk+;Q{SC4X1MroF2e~r$$WXy0vi@1~+Fd_jn} z0HrUnj8oDZb-of^3g$&HrRzRlmwcwq>j5$roLUu3jz`)8#>nwSeVlvp(&T^nRTw`4 zW#%cj0HHh@)G`IqL0B1oXNLfH^(;WzI(&5<9$Lb1DUUl)n ziV>pe`gMhStfb*F#;0a6N#q<9pJe(Dt|8Vsi~kT#1U2nCf_Iyq+vy5F6pjiO)4;kV zOy<0=7#pM86^CwWGk?721JPkUIPXA=<5{hvqO!3fK=DAG(Eh2_^C{)z0?$M3-llfD ziZmcUHDKvcimsB95*)p=qBvVxoiNct>xY<{ho~GMO<%6lna(uio&o(=9f-}v;yAb| z@)cw=zhB#OzlwJi4JuIVTpR5~XuB{gD=Vf2H`~(m5#o#fR_l6G8-H?q_A6-o^0@rV zzt3#>Y2SN3D!^aQk5Q>DR0*zFQ?|SxT}!9Es+4krAs;$aj`U=2wMwimuRcHD(nzU6(7^^SzUl&H^7Ii7v6zo^p1r!n);+2eWWx?m z*dFf2Q9es?FauounTFhV?=0t3@!xLGY<))Uc*fZBkg?@SUF(xt+g;j~5SOn;%iS+b zC|^cI)5^3YgEPUP@fB-QPNEW>!M)3n;P=ZlX!(Qm#E;VxcSI-b2v6J-?)jt9^~a1A zN3W?-RoT$`!Pq<+kNvq{@6SCuBJXT;@|V%&uNBYMyVLceOH5rr3S+Jp?@Y&7z70Xk zblYxZxQo_1qP0ymF-_0L)I3{x_3g^5nCaut`d;WdrsSLHo2V5Gc5TPxiB3g@Kch3z zSekgC)Pqu0Z=}a>PIv9pxpxlq?c7l1u6-C&{~>xFQ-hwrjh^RUhHm4b(G|}9#P`Wt z<=GK)ZO6vvN$-oEnE+va3}Hqm?14NXOyglFL>x*~x6FVB4q?v9gD}5_Fh`_(2|+=P zYE6ecNj;~>)ho(MWDtZ_VIH&XYopG!aY0)N6brTemufp^#zUAHy4JfeIl?PmE7o!~ z+9;^?G`IumkD!V=f+zzNm7rte2<5zx$pH?ecFevS>bZUZlc#Uu4NSGcP|@*ix+B*o zMpaK-i$$wqyVO5W!doXd#b2GG@{okB%|ort*9_b>%B5wxG$Q{}k5l3#=F1GMQnh0M zW3dfEdZq8T@P%eyxp{UmS!q*Xp)`WlM~S8)-7txe-%hks_(YxUZrx`&IVXL7EU2EF z;*P*DTlyDRWvN$T5mZ!GatC3Ujn%kMP%c2xHgLOXfXO06r7#P^p^nTu5Y;?L)0~li zEo1Legh+Ybhk3CkDXE>NMW*-4SiT$&eRMWDuXznwLssZ?`t#^N%)KkUn1aGqnrT=P zQGE|qt6%J#s!YjMA4p`)6s!<+tN9vZXuyO$j+Um|jq}fCto-F5^dMP02;1 zfJv)>SwMA&+EDndnhuCayhicbV@tYK(1<@1?cel>vTlYoOJZQ8(VJuvnU76VMHd1I~Jp=)6PzRTaGaIrA}#hv zJ(U-P-QEZQrG&CQqaUU5>L2_@Dp(rA@&k={Om!OZf<0DYN za$XfwgPOII0nGIILovlgroqHDm~O3frdXUvQIkLw04Z6~VFy~uwH>GWlkrE=lOC_a zcHZ|7MH*#j)yH#FKKXzq6-v?@Z1)&!vAVWc#NL^2ekgx)ptOOuiWI640Yc3epT5e)Uq2qrG8Q_DCN*Su-<1%+1#IPd2b>gq64UY^P-9TWa!EN#HzaU%D4a(7Yq zZ6}oKYmX|jfzPk9Kccde=4@@5VEw#{+!SOI63|^HCk);bhzoR*Y-T+Od@jW@2(_ES zC?>DV2>!jx%dQixnYG}FKR+Bxa;w(&opzzIl!AJ?+$oG~kFUeM{v%HRuDNd4iNzFc zjBWj-00!{GYV8TJt1cjH`Bm(OXF8*jsMU7E{p$0RwpzVstX}NshbXf$H%;3*&F+ps zaBWpp0L8G?_1K{3h7YYDt!WtzX;cz14~it;2J-5uTh@wbXqV@r2;{`=CneZak_T-u zgOMMZ)@-1~d)g9l`;@M4q1>AI)@C!+Bgec@d;Y3UG&z$@YS(%-MiPBW>Ui9mD8rHm z0`9%{-T>13lB3K|PnbMuQUJvZN;@^Ekn1qE1}|mSqtMHs)=2uuPK^Xi>e|Tr zfIRaXX~*0Y7azQ+$A?~YCuiswbx)vZS9)BK@iiV4{C z!YZ;V)&*-^$CNtb!hJ_km<-ZgXY!Sq29NSq1&f&UkY=j%OT0$S))%Md*6+`M=o_c6 z`|BvSU{QFrMbhwYe16jF_2(Eid}S^-ra8~jo(Hh%rbXd)?*%}Sos^S3qG;H^9|#02 zTzK=nU6JpOW#wpSR#IIs!57dm5IR`-(0Ehg;zC`Lcc2-@?rZIh*_b>*7+L+02-mR? zk^d7)u}r|2OpX|fr`##P zeWHdDjeGpg zmZHd}l>@vgKhK*?O2yceZ^uTqeU|3?D9!V)0r5b%+6bngj<%qqVT2OJ0SGg>wwRc= ziVolbTzyAO6Ja*fhLr2hFuCbG&nsD$SF%Lkw!{M7CaWqAfZ~?}Xy1R|q^GOT8M%66 zKEYFPyd6H3Oqc<|a0waN2^plEOa|&lAQgki26*);G4V#74Ffrm{5d`xNSBO`c}54B z(?sOZd5`OIsfv0=?um@t(`C7*>ryJ~-UH}J#sL*M_aZ;rvntX;`Giq{*>8!YJ7Hi3+>Ou78dp3$=<7J+`n6#*48;zDs!fMcLm~0elpDBtFZWJ z9%YxWI_XTcI%8=1ELc5zYO)j0zyr*Z=5?nhK36GhS~5U6|}jnhA$)8 zig%#^@qxU)xMQjl>VI$W_$<7SVJPQ|qQaCrNcrC0a#4@S(nrtd=R>!0f~K2;0KEGy zD@kIjFpo10C^CN*c8H6Xu+^Pu{fq{r!f5-Maaex`XCZHV=cg`hiE?==_53x zlV=yxnCDkEyFB*JCx-=(3z+o`BDZS4jmk}AB71BDw8KIYu*8(>rqHSK!?ve z1nxlbV==VKbmHYhM`8a^ij_f~9OWpGEPX8cE7vdm3u>&;YFugh?&a5EGEu}zFoN%> z5Cqj309q)0ENZN?J32OM(V=+@VH{Jk{J@Tn#r~#0T}-JIEXnrMdinZLMDwZ~zf(EhEsBT@%Rum4E!ZOtoHY8-0IpWY z)y~hanJ@Tlre>XO_Yw~pe9VKBIV-c17sPY_VcLL{|t_7eLuu!Q}HYP^-3Qu z5t(|p%T&HB_xLg|&gN8$lWA?_R3g)n|FN<8$J=P@v=Zd1y^g#dz!_33gvO#UP3yzA z>m1MNcI=|FwfOZ4Qe^f;IXFHYs8N1QzU3`L1d_do&&l`I))gmAO$*JmCR+F{1}*vB|A} zq?eH{1XTklL|i5?Hb9%%QSfH?Xdr1OXUA{Jt_p-xdu$+VbZs0Q^2EXN7U?6J;f}c{ zfNaZ`JD@w%F-|01|L*l^j$OtqDGk7?=(_xl&E>i zdxWnPVb6)1;eOv2*|?OTL)e1LUSH^>&4=*w$$7<-ePlh?*2Y3vCPiqS%C(Ms+VB=- z8Z=JvFz#;OA5nAXa1VB)3mCr{0g|9jymz1Q6(6qTp z7mH^;NcdL5+AX2#ozJXUvxXIh%3`&PF3^@@IyNGgF@HcROszu1HPrdL{m$>mUgo!I z25pw{qsGqJT^0DLiA&5hU^R_IHF81oQEc2}TI-ir?J%7NgNRIx_ud<+*n&98`Juh+ zuF?WgTok$|e+a~q(+w#}sOx7x#Gd(^O2DUT{~t7%%e?>q literal 0 HcmV?d00001 diff --git a/module/move/optimization_tools/plot/temp_plot.png b/module/move/optimization_tools/plot/temp_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..9a760057150f9298ddc1f310ff8e9299398f2386 GIT binary patch literal 204405 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 uiB^@?ZS7G=sY;WfF%h> z0YOzfbix3{jOS*WDVa4@`9SRrks;(`T`q~a)6zO$=$fqY$_1!_vmCfpdZ(f8m(>BN z{hXv0E3&1=(UpmsydwNq>0_V;#`L!(QU^{mYB-P3Rw>8g5TVD0o6a~yDcaQ>BM9uE zw#+re&-A~kh$1?>R%?g3!8a@!U*-N?W*pUL+Nt%`X@uX-Q{pX(00ks^GqBp@ zUk#^;%xyi%un$0PlHmkg?q7U_1LsE7aXCc)>Hcya3aJ=S95?MYYtc17(cWaumgF?v zB-8CQOShy6zD%lFv3&z7hZl`zo^3!=FtuR3ScWRavV*Oq`pTFpR8dtoV=YqUMhXP4 zMga_2ghIc9REVZ0hSMlG9TK$!J2XVnft-*bp8=(>G2;Q4HdBa-Qv;sIGzvsnFQvY# z7$0WL?Ri*5z`|Y*T}2n^kGn+vF^7BT%f0~h=BbBsf~bkrrw2iJEt=wxER1um%44`* zC7PIh6h;1`B%UjoO-DR3xn~#VOZl;yr34Tif3w7d%4%(<9>q%z(qxX0pdv>-Y5^DJ zGmZ10@CrCV6><=z{9pCnt=idzZXx{3APA6~igi8UY51GcYjPCy3uJ*SGO!c*KHK?@=RZ$+61L{rEmE zTYD=t(5jMqtBV&-F(S^j{?@l>)#*}oSS}ePA3BVEXz8T$s2Imu}|SqRC9C{szN3BRVXcwct!MIy>_eJT`!!dS>s%!1`_{t zL0n)%@+FyIX?VH`H;v@eZPiAJv~}9){yldr8=2bzxDlNzzS)F8I}BeA{TRibjk50ws-EKJEX^K6tFE8CJ6&%p5?KYHO2)>I%Y zD)i3+D?qVM5?1M8w;IvJz?d*Se*@SMcOd?dMp$u(mC%ib-g<$UF%>S%t@E0Yteu%n zal#nX*s{7yHth^vNxDJ{Uy>%tCwjtwtdMduk`WVp>9Zu%Ag z`%bJ_@mxVY5-}LOQB4OEc+lVhJi6qulfM<5kp zIyO-UnG@F`=l(ABzI1g}Z=dFCLXN)5LuRye0d zEjk#Bk_b61fd*Nrh@A!eu4q1$LKRdpxf#oC0_BZV6T{FDe%$4TAoa?>FSuGtYyRXS ziK--t(v>gjFbJ6B=R_1N`Nu<~%ZAx-+XYcm87Y+eRAG@sda^o>XF=m;or3LO#`=fO zTtG1uP=*v{tp}W2OO^=@&j2G+MVPc7@}xXo3p+%#I7nvn2g zU33wZq)jqerh)ZWKu~|$GN_AqI^@1>g1u>uzu!RpNTw?kiDD-pGj@QfnV^R*6@CGn zpNrdthn=glZCZ5Q70nq?$>B)ohnnl53%3PWd+~L>!K8Q1fLR z-WnOpJFP-@`GzqwD!MBYR#L{2Ai#t!AUcK{0Ko|@?V{XomXNfvk}Mr%pnPk?i~$A# zNrJ{X1b3>$7G%CcSiCyud3y>!5<-@IbFIJdQI-@Un5ViT(aEB4+{`z)?k28HFLB;< z{Ds$r+Yw@MB4x*H$Kr0Xj4X|4NIasp@cK4y{pr)M#64M_1{#M&Or?fHIGP+Z1rVij z_!B9!K&rH<{tu*+pUc^pL1z@{#(+Bmqka?QYci*xRu}i%qFe^oeXsA$xg#e}nsfrL z`!~faZQGkW^H5fOZ13K^Q%VnhAnCCL6v0*9tINi%Mi-17f9q#5?BCdzS*EwS}OFHm*xG4*l5GLv%vj9 zWgr}D_m0afKl4GqlJb^^>W-u}9+^3!@!i=mZNEur`%TT%&8NtTnps*=o|8N%W-tq_ zk+B+3MFA08SA))Y7D}=XODLu$DHe;(2~P=mUP!u|aJ7JXx@DmhV!lc@Z?0(_>6o0E z*%K+Ax&r2j?n_sEUjG`e|4%U^Uu?MHrG|42u3!TZP5>@=>VBcw>)UcR5BnkEFi#mK zqrv%*06CvK%Fgujd>?m$EbS)-A0S$adGCjIQg^L5@^t%VPsiqzyu*DV!k4z}(kfrk zjwKA|Gvr{=Ug147Z&$EWg_p@`_?Yj6#z-7^;IG#N2Qu2$*PkHl+yK6? zCIZYEC8ARSl&3u^x$!S;Q372+7Ep3 z#l-B{iLf{S0-ch~^BMV!g`e5WguT3K8}FH;&LVJ&Yqd0@_oRI9$d$EqS7L9h&S%(} zRV-#(|K6bTL;WglfEq&j@P~KbKRCH3`Q8&n(vv;;kdJ++s}sKK^+b5-A8yAj&*jNl zTip;eD}L?9Yp<;SYW3bI#$3@8@H?#ixw*T&g<{UzoS9kN>?q+J1Q3>bz zR^kC9>QN?`K^n`{<3AufT&^vaM8cC?f@JcKUs!q`~!t(U)00ZHrLhmWJ$}D>RCPus)@6BO1h4j z8X@7b?37LU+d#^%01X-5%T%>_a73LWu#VPgDIr6AP#$NjlFn0A%^-}sb%^&K*z4~1L zvPiiyxp|ngxv%p~Uuukq`l+Y(-|;}wN_uR(Be_zZ&xi2^_(`8(J8+$3D3#F~>5R7M z*xlR>U1PIzsRsO%|LU6cewx39$G_MPKp)v_k#f_~=638rE7doj7pY@IRq)OH%Q{Zi zH;{I(;ARXvCTqTw&hTyBVS7kfCMp@!%Yyf=v^xVIT=hsl2TSi(4%bodC<&pTEx+F1 z>8|%OmQL2|5`3P;kR=$z4u!J!JE-D9R*BJOgQ)7z(l;B6zvP^%ERc<2c_d)10J5`f6Ty^?R#y8`v+ndyi7|1qX;Zh1F z6VMo0{wk32ql+mi+^;tFd_ZLdG5;*vywsqmlS$V_w>Q`3HqF00c&{NDtIp%aHx5#`1Wn$M~R(h6y;Tn_Dj113Gmj*!|N}kn2-T9RyQHI=kzaS-WN|Nb}pVm zNT(Ox1G9H$eU4{?L&OT|6r=T)}g|Nq_^WuJFd#%5wv&4mU}b7>C6r^QpCnnk2qxBq9BgmZXO zRua5wvY#`UMmc0qkg`n=BiTBA6SIXY`!&y~i#vJ2%U2`qJ!)JcQiWhmt=jEliVy=g z1w8qta^gk>GvHn&?2$=J#H%~I0Jn!lY|=iYVwBave!4IeFChX#khD!DF107ITdzUs z*IuZLHB7b#rUH=tYF)f)kRO)yn`$ivPVR(S7%*0W8z{>h>gXhD&@M?U8Cj>{Y0cB| zI{p}?vy8Bkm`s0+dD<1N-Q-3*Wao&oSRHE||G{tv<9e~DJg5Un@o%b7MUk!GX$Dpb zsH1~5ggeDKx?fbK0MC9l{cUxK)xl9ZpyFl^j6u2*V9gQ-ul%$MxU_jxhHA1y`n^C?imAcVa}`?HYQSs6emaYp zgY-CfApeDMl_J0Y_zt^PJ-QWXdt9IQ`Hz%gpvzc?ASt3ZYR*FC9l40!9604zrbMjB zVKz~eXD%05^ep24S<1`|(z+oNk3#M@;(@;B=S(X=j+%_+GBW{AJUe8OC{_Z?%QipS z0gmO>ZLag`Wn@ghvksc9t|eBqn-|#TezmkBiKnI$zFPxkA?3#$PRM&|_qu z7Ve5^qfI1rvm?7KV0UspnWx;sv(3E^;!Y$vO{r%o+zX$Jwpacm#|nFQq#wyYhoCT4 zWF-Z@f+vD77IDm+lJ@UbH3XgoB)MxmcWlo^#9pv5nnhF^S&j7&Y3b>d3BCzp5A@h& zJ|ZDX1WeeB?E|eM|oMh7>QD^1E z4ecp6Gx+=eFZiVo5;uxit1En59b^hm?93~NYl%k~R7@m3g3!{89$KJUo702h3^sw* z5aK;u{6kKgNMssf<8kMFUAVrF!Zn`k|Dvh75^m=@Fx{|#h1&PEP$XUzJ2hz^^EXkW zp9-SVsY15l_lwooiHtsea5ymVgQk#!eU^yx*0Jwy4eX@`GKfaGfoK$5o|@$*+Yy!? z)((X(^6==q?Uld^x9n;&rAr@IKQaRDaO!6_Y1 zqH0}&U{VICTrchnwZ)WgidTNu+&b;{bKXIu_5IbVu0r=Mcno8z)i;2EIR&d@c;$G0 z*KfX3V8cODhmK5fu&RnGB5^e4>3-He^vKgYE`+_T)X{|sl@f|Y1|_1Yjl7T$(RwWB zCpxgk+CrVVgaf673)WZY>z~K3s>U=#Q6iXnJa-sngnj28gG|d)OVYWM`@SE%mzQFi z3mZbvQ07t$BTx!~J=C#mNYCoKA!WK5D+KppxOTOMLLDm-9_3T^Y$XB=Py}WJEJ1j& zN=Madhp)7xK^Grf14Qt$+_G~*f*6ZYjIl6m!PNkvd{++vX0v@REUHkBFjV76Ou>Zy zm-|PcBONQ!lk|rmLXBhtuS^3kUCV#9*RqFNi<+y-XnwDHSAo zb2Q|pjU`{f<%9A7W|^G~zOF0vw+N-7DAMG&NPeQriLCWIIm2WPW0vb-jOTphRrJ7HFqLQ-JaFo%bvLMFLqX7tS>sUtW4 zVu#Fe!2J1FUc}Ur%wjQF5IKx#Z$zA?(!MHFUe+8@WJQ5;EPEV>9+=E{kl2$VY7I%t zj^_JJ=F{LTnmc7SMkI112(sp*B-pTb-g2yq52(IoAb?FBb}G%hwas|Gd6sp4Ie-Cy z4?eg|dEI&^A0k&`h6{pT2w%ylj%6)Ok0c6rm(7R>X{hIA%%@rBgNz8M4ErYRk&mG! z#etmpBys|~2o@4wI}Siw8@`F{u!u?O1A28Zfu$oDOQD8c`Iz^4=jaj_$}l!__fkUV z1s!vt24rp2w0{p5Vn5Sd3*eeMQE(A@>O>n!zEb|3vIwEJ;P>fA^e~AX*b!jp?P2i> z?8@KfFvK9t7W3e9&(m#>S9K6C3+^FlkfCB!&XpPxVMZ_b2sPWF0;^TZ|IvY zylF+D`5-N|(B(!DU?ZQ`u2{*{Uxx!y%O7R~(k;@C+2s|?sD`(qPG*qB$_UQZ!2mMM z=XYnCv!=6EdboEPkgWiJ3i7VHOqIGUg7yE=?lOB&p4TH>mbP`nO|y(f9N9M=W&)3f z8-%w(e-0i_&>hY9!a~$qbRcKp9j47Q;fOVQ1Bg&#{I9eX8h zaxBv|hJ{xml)GMHR^@;NGYSle9g~$<$m_C(Fy=$c)JkO6#iuv2vA(iWy|A%3PK*6S z+UM~7>Y~YBV66$&XD&j)p1QpjnBXhix|;GfA?OHkUeTl>w7xNX9%bR4&9Q9Zp09Ae zVEU)q*P-r^VmxirEYtw%Uf&{|^frtGl9({jy)6B&`Yx#vE!;rR)*8=A`874j4VA|T zH)fUboPI`W^Vrb`s)i%R-Wie2sxwNv18NgSLwaf!ztakTh}7J5^QKE8qH(@^e!J6#-LP2AMPkQAG!J zEa69P4j0x63sYuZM4E2KvX_|;e~nc_z;F@9GOI|Ux<-45!`6IVeA8@u+Rj%VBmA2r zQuhHCggZxBR(Qv%mC~lPxUCps+J~!SMMRHV@9Dc4D}2l~=`z)^OxGCsJ{(-0tWpm< zR#>d07PzZpUHtjd6U0!r4HqG}<38CT)ZXJ<8E1$sP{~m!A3V%L6&X6N_`Sc?ZP3S} zR-6KzKC>M9yIR=td*>QPSxTva@Z0e&AugDz(*i<}`Yp}p#?~pM|4x4j=BTHJEXzLx zT6Kv4d$X^NqXhJEIl^zdoVO@dsuPNMF57#STJzWHSP?x-BN{8Jows^k5yc+Uu22xj z-Hc^#S13ZWI@ZOTFB5TXZv(HM*F~Q%*R7)uG{NDg-uog17t*doJ~bm^RZXILIhGw( zwX>UzT!^uZl?v+9+-NakZu2C^lGhj!3vJ3PcQckL`i0M(%dsxve97IbI4^s_PM+7r zpD*LK%g%FO7lfJ&8yjuoWam||!w^inM5nN)q7>*kS?!E$z4FBCcbZ|3)8#_^|FoBU zaauW zaEYM0o zU3NBMw@zQ@W^IcyVD8+xWe<-UHL9zYrfVY6iVpO7t_fw8`C7&4-k#I{QJC|OmX?+i zWuKhr+?^1BZ>QBT-M<%Ty7#oRc46_kzmO|Z{@-U0IQKrB{mA`lb9v3?GY;38IM8#ox3kk&afwr%DUODqcC?QKq7*WRMk!;vX);Eo62_~v{D9j2ycX1eyx z&EL1s-TB3+q{Ds2w~+ZDd8bwQ#(AEdK7IQ7hw|%U3hLaQJKSZTuP*;?)YqJO53YGl zX>CsZ{KPc)&sFX$Kd`e$)`4j;tsU>Abi4z9OB}Cn+c9_W*e^aJ7dm^F)s+(Pr_cFF z$=`<~b$!MM?!6QeZ$|yvMDyyK8igicz~5cJUzW zAsiKl5oL%nPR-KM%FHja51q#Ph}*!uz`+9PEH%&n{J&nu!l=(b0vE|h=bwI#k3gAD zTi0&fLzM{6zipnUt#{3ZTpC#IFJMo3*15HNvry7Saoau^_itZX)v)+mj+mI3N_gMy z?D@O;w#KGlqtn0K=|2=7Jd}R!zVvN9_rZ6w9CoFhW;47>X?SR9Z5O#!-b~?@c%dB< zweiAuPePTChcO)Wx5JW3zKY_#1+}NI^u7|_vQlrNs9G_0W45S$PS`GnH(Lz<*KRBu zf10y3G4EdVyOI`+G3u)e^xiAy=47_bLD6Mcw@#aXwH!q_ea1)Z>gl#{`m}uSN4w2G z2#Y1}xq6F|op|t>J*P^&6`MEr?mXoU-g>$&#`(vN2lkx%LuUIQ*sl%#jd!QFKAXPX z9&YIhIFupeY}k^iv~0bt?8N4Z6Q%hzrTL8w1&uq)KHhoq7}R-pZNM&&z6jWqZtK< z2NxWM6qe~cmcH@Q&Vr6oS2ziEcz|2I{H$kNUa|-79#P{k^1!rTt|F25RLtcb{WNeZZA$u~?%ZX>H= zove^w?Pe@nspUwb^FM7iJ?P#ji)n>^$(~Ng zM3~DkA;$`lw6#UPcQaN*<|`^afqGsSf4*+|C*8S3n-M^JB)w-^gxvSnx>-A~Oa4asjI!;BLQXfb;E2M6 zI+k%eX3_wda@rwwh4#j>2Wix?qS{s)+}c=91Yk#P9AGSr{zm#7(N@J2zPgbGM-(RH zSW#{5Od;CdSoR=|94o4Abwu;^jr2JzC8}}0{M9$o=hlN6OL-a)8zQu|6Q!RKZSA;? zl>DkHnU!xy+SAa|!ycQcjuq85(P(eg%~%nI33V*vHC{-mxM{5aY4i1s^jT7Zrnq5; zeeFid8&R0BDOa`?qHT_4i+%0p8Y2qP-Hi2(^f{uu+}B#C8sV-~%NEoA^c(3jb)JnR zM0X<#jwr0kv7*}Anb=o*W7%V06-p4Y{num2f#gx#1j)XC06re~_H zt%@m3gy>>q?nY#bne1jPdqNSx0EW6oTU$F*__8_Hg}6qOSwvWuC3iRTWpww6OmKR> z4m;*w^iX|$xGTQ z&r5wHlC51tV?`DwE7N}#pK;1$BJs37|~dfg$a3HrtMfn z!WzjY+8fIrq>*D?{P~(R`fvd{==4`mU+KPk#@R2>>a9v{dm`GZm_kle{nAW3IT^k} zjb)0B;XU$1l1?2fnr)&fM0Yb*L}5Z5OJ20KqprBd@ZsLxSoR=|I@ZOXFN00FmIbo) z>VKyUQnzW0C>;nB_^;7N>6~MmH?Xvw7fZY z%9JVPUyP~vqCQ^9j$lt`*Z{(0zRp!Pc;vCs@&4E2{eOxX`6ZS4H*IVv&dM##s_y}x zqrv%PH~^ocKaovK1)L;mPaUkCAIUyaf6QPj*$cqQs0y|T_rlDm8jeD6W`dK^+>z}& zQVO=+IAF^}XX|ul;sblgV`%~mhiYnS;#(exZ~0=dv%ODYc4VghIw%kb<7Bkiw|87- z*_jU}m6ZQm_Qs;zyX#&a(Wvh=7ts|f6JMDU%*ZWl%`SAdFLch>y|B0!xg_Mi6_@)~ zymBVqwYfBR#L(_O;CN-*bpMg`;KZo!aN&)iePRMfn`b=!^!_bddOQU~si&Pa)Hc)> zsO-A1eeSKpX{)q-^RYLUPW1#@4jw#Mzr9e=Y%<`T@j$7!prf&|@l5@81r`_omVJ75 z{Kvf~3R8#R!qIQ<;v*~VY9Bl$Z-H#2I!kKJ|! zKGWpKXQtpY?vC5>vBcW!8+B_aA~+dHAiFTtOru2cm$=B2>#aw(<7Zs4v!%4)L}@bC zMbEU8@28!dp4>3KAW-cJ^mLx?S=fI>3q1lXIu_boimq!PTdG|7%hjKODkc|=V)tiH zJ_`WQZ|b|VTrX)8__NRxNbFFsS-USgy1OrKHmoZNM^4c``QD-9I2 z_^c(oy?ptN#d{+9i}KwQz9lhtB_(|^h4PSr7szqsaZ z-Fk2Fc6o5V)YBe=IbhOC(_j3F1KV8np#!2n>%Z6hvc$it#6PvEWvat6pcduB)214p zb#Ja&v!*C-M^Rp9eSFnK{O-KIH|LI=JZaJigx;ItmA37oom+3;3+Zhyz)x`bhSJjX zhG)|niVBVu&7=oM&c3Y!HmqOoTaeJcpwQJ>-=ogzVVJ{ior5CMfI z1y!g_K6Ur@mZ2DHAry}YWUtP1Xo?usMhDvnfj zeq0s)%V#n2?lI;67*qby>avgem4DhV|NYdw_a8_+c&^CRUW7j`Or!fTHtopR+ArtV zemSJ#@Q|sSj=cdlDv$h$*AZY$3*wq7jCtGUd)w$^pDY{Ey4vGkozVJpLhCIhXK%?o z_mj+XSn1c0y;eFtpB(nWx;ZxvV0@Rr^|Euv5YO2mp6cB4>Ph8$C*{94IPbkNW!uK& z?JUjP8ST~O0m_~GMS|}aIP;RTIP;&-&ve?J2NDBxcR5lh|GA68`28j4?%#SF;l3d& z$}pM#z+|p2`xNtu$xJ-}K!nM3wf_YO9Fw^MlbLn|lQ|!=RB;$E%1`cI1kZ7}1fS(x zJ^dM5Y`vetI%bbAa(o+_dji0sXvX3qS{aM5G7|m2#o~Z5*D>-XbpzJZ&5h=K#&E2a z(*rh~Yv(4Pd!5}!fb&P#JU~z!!0J0oXYPq&@z|SQ2icCbmAX1g$G2STK67m)IfSyO z)J2@(?ftWo&b=O+j~U*Yl|47B?Ocj-Zj{sisTWRxr$a7@Bjgr~UujWJ6!&5WdU>As zdAo8525=2;JVCp(*Rex+E;qMhYx2ph#hus^9qv;o_9?FN((HMq`wkvFQV?bb6?!P8 z8;e;6p?sa4bc1O}NKSAE4;&c3=9lqpv*Ozx@Sb~M&mGva1^x~j%FX5F0a_L*1!ot! zU|=_O$s4rG+|=^32tV?jcTYw&X|#t}`o=NrpXaVEZ~6SxsZ+5XZ^q`Hg=g=J zqmrKIPw3+9uoNr^cDA?Xdt3AAF^(|mpdZust#`mtoeHxE7Wa>0P3ojm+Y3%^$F^V& zcBF9~XRs-y08wmxx>3#YjRVeHE}j+zwdZJc;NMvk(_eez*s$dKVZ|-)thA;9g0x3_ zVhJX$;LFb^l^m?C4ZexF!~TCqn3b(@10$XAEp#QnTu-jdpp*jYT~h z->rYy_M2D9$8hqgJ;|p)UEp`vs{lvX^!uludFC0jQ}cGKGqZd%Mno`2Q`^f;ZNr?+ z!(2+MODS$@FZL)M9@@9JzzX`reC&(C8eBq;|Cj^Qw)eOHrU=o`vw%FM^k54fpI455 z?gY*;yM8_hp<7P_8a!Ru9~RTL-`paf6zPgDy=PNLMN{ssJFCl1?yNYO(zz|=K+cIZ zIOBRen0l8T*jawvQ+S-)fAc93W>5cPW%AhFw5V?Vw|P}it>ZV8mtP5^iCGeO);8qVHf(#T?}5y$tkS03p*6L&m!Vep&CQ!@T1OU5$;|AD z0wV;gQys-S0q|!*#Vx0KV#o62z)8T&ZvWNj}yKec67%+`$s=b;Dwfv0)y2>v97kQ8z);_f@5-+ zOK5J!O1X1ja$|jRBk@nwCw%zvbhw=^EKK86gdL~%Q;;?m)@L8vy`r%FkA>}ooU>*W zW$ic2o5h^O%rwu*7jRE6Z>?pI`W3$iKUdMzfZ@pW{@+C;6QXc{$1tdMVD28=61<;_cb9d)DExF1ltbmp8X34cmCK zuFml;o`wy2R`L^z&&N%^ZhKZiLsk$^^v`3J)3M5*6a0T}&nsR${<)`~a*PLK9C|Ftx4+t2o7*(k)ixJE($#V3&?ApuQYqL_!*Q3vUVFzxX|FBk1CN-FOICk&oPM)2 zGlNGn2h6#_coo*8iK}jCfIIhctc$q(PvgqH9p&D*ye)CKlQ^ex?QkR9Rm1u^uDa@~ znS}e2-5EC*^}p^q2R$X_lX~gWrIqB2UvMZ6|6(+HaKJ?0ILN}C`avAm83*|}F{97X z6Laf`vYxkvJm{&sGLqH=b8XPwo_ z36anYRZ7MNRp^n)&sYzq5BHXyHTWf3}I< zykSpa9XV)Kg6Pj=xd7dburkqZ!)A9=prrbjH%s_A-z!pqLaiuy|n*|Hb%Aa}HMLAH;^h-M-k}9`-x$*Mq?cIb!&~%H!n} zFi^2D`Pjk%9s9Ny{9{!9zdDk@aODzBffG%{iOyI`EYS!MVbp$rWveIvNAcI69_Hj= zLjygKYCCs%J1L&0omiiCVx6;NT@#$B)BP*bb3jlmj$-`q=O&LHcRbbQOZ5^xg~Z$V z$18|4AR4Z0S54V20w>GB`VmRRD6%O3I%pb)hRtobk&7vx6GT8dU7fS0+E3eQ__Ci! zET~UR!}anq!2 zETohsqk9Nzmz}DqxRoX$mL@ldgWimTW;V~jaY3~PDaTAF7Uf@iizFq8h>uD-Kf=ZJ zbA7Zj?<2%l z!T5KNE}1m&@McfPW*02$kN#oY)OLD4lh?Jt!Tk%)jdH!y)RC35GHX-FPd6@^wDzSJ z(X^u}Nb6|a)Qv}SJ*~N9>pyAj#+wILbl@0di;qA20S9O*r#3iT&wXhdb>YcKs=qd) zsyNV2eR1T!*txa3kY(*8Uw-W6oYQySTAJ6?TF?Yz(kwitf4q%iw(>D{#kZCoI7>JL ze>iw&_4vMh@D*=>c7UY^p5BSCw5DYpd{)NMq_eLUmOXQ9H#-6a{^bLFev_&J=}1*<0@KlEuafGM{)T-5KqjaB;Vgs0>LIF$T*afkH+`2K0)ks9{6z{oe}Ny zapt!Yw#q$-3!c8~&OT?XW)7QYOx4{L9W zd$r|`2O2(EMi29My-%*+ge}vRi3cis{(rw*O~uDgZM`xHY@vKxAl93;6N`QGp*7@_ zwe`xx(+=%zalT{Tcw!U8{FxQ)k2jWDeo*&)u}7Zw@RB#^bnwJERG^Kh`=G^vmRg^$ z?lQ#Bd*GY-)X~Ki@Eyq1<|5=21#f*tXfVQ*lkl13PeuNt79aLp`_Jiv5MGDmTD>=H z%e8B|`TE@D%a<4W|5}*y@uLHVE!~C8YO@~#5=0tLZ-=Wn(basb_w23we(ALheDTrB zQW8ECa+naJ71zeZ?AeKJAUb>%O~`VmpM~a$S_Exc+d(meK+NaJfzrX;{=c~eth2a< zfWPrKgzc*m+_`K-RwLmfay@P;Zw>Bu2lgM#@&+h@Q-2rs^93tUJ+UPFLE4lf1ijz< z-$RSQPxa$J63a{Qxq1lR&-z2Y^r_`(rF-xH9vTdeZ=q*j6Cp3k)vSDQ*(C)n8LsCh zP3qkSfVztk@)Y`r*lgaFNHAgGX#yAP_tMU2-&>DTbG-rnzt0V}6)JaGACNQbo_@Nq-I|_njW34M7buk{3@XZJVOOzW4|2b%=ylo z(wx<$AAL-*_1GqolpXj_xBnk>BOPhf5$OAcGd?Ea+;U=Nf+UZpz4`eR6 zx$aqN8ifq-Z#&Rt6+mMnIH-TB29!S4GzVWSWNG*F1jAJkwNV+7Cve9&26{r<=)DeR3QCD4Xs(NNo{{Et{ z%P8(%Db2Hf%m*j+@87?C8`AH4ko5r+Y{Xu0J)Sf4@FD(uS?#f91=u}jPoKW7se=Gx zM`dhhCFQh{E!tIka@TJhnVlH%4jb+D*qp&$|++)i^{X5U)hhmt!vir{Tx}b7l|z_00S@~ z^zk;{{I1Jxc+Sb literal 0 HcmV?d00001 diff --git a/module/move/optimization_tools/src/hybrid_optimizer/gen_alg.rs b/module/move/optimization_tools/src/hybrid_optimizer/gen_alg.rs new file mode 100644 index 0000000000..f801811227 --- /dev/null +++ b/module/move/optimization_tools/src/hybrid_optimizer/gen_alg.rs @@ -0,0 +1,306 @@ +//! Implementation of genetic algorithm for sudoku solving. +//! +//! Initial population is generated by randomly filling every block in sudoku board with unique numbers. +//! +//! Fitness is calculated as number of errors in board. +//! +//! New population is generated partially from fittest individuals( percent is determined by elite_selection_rate ), +//! partially from randomly chosen individuals( percent is determined by random_selection_rate ) and rest is generated +//! as offspring of crossover of random pair of individuals, selected by tournament method. +//! +//! Tournament is performed by randomly selecting a group of individuals from the population( the number of individuals selected is equal to the tournament_size value). +//! Likelihood of win of the fittest participant is determined by tournament_selection_pressure. +//! +//! Crossover is performed by combining blocks from parents' boards, split in several randomly chosen crossover points. +//! +//! New population is modified by appling mutation to some individuals in the population. Individual's likelihood of being mutated id determined by mutation_rate value. +//! +//! Termination: process is stopped if sudoku solution is found or if max_dynasties_number value is exseeded. +//! + +use std::fmt::Debug; +use deterministic_rand::{ Rng, Hrng, seq::SliceRandom }; + +/// Functionality of crossover genetic operator. +pub trait CrossoverOperator : Debug +{ + /// Type that represents solution that crossover is performed on. + type Person : Individual + Clone; + + /// Produce new Individual using genetic matherial of two selected Individuals. + fn crossover( &self, hrng : Hrng, parent1 : &Self::Person, parent2 : &Self::Person ) -> Self::Person; +} + +/// Performs selection of Individuals for genetic crossover and production of new Individual for next generation. +pub trait SelectionOperator< P : Individual > : Debug +{ + /// Select Individuals which will be used by GA crossover and mutation operators for production of new individual. + fn select< 'a >( &self, hrng : Hrng, population : &'a Vec< P > ) -> &'a P; +} + +/// Selection operator which randomly selects a group of individuals from the population( the number of individuals selected is equal to the size value) and choosing the most fit with probability defined by selection_pressure value. +#[ derive( Debug ) ] +pub struct TournamentSelection +{ + /// Number of Individuals selected to compete in tournament. + pub size : usize, + /// Probabilistic measure of a individuals likelihood of being selected in the tournament. + pub selection_pressure : f64, +} + +impl Default for TournamentSelection +{ + fn default() -> Self + { + Self + { + size : 2, + selection_pressure : 0.85, + } + } +} + +/// Functionality of Individual(potential solution) for optimization with SA and GA. +pub trait Individual +{ + /// Objective function value that is used to measure how close Individual solution is to optimum. + fn fitness( &self ) -> usize; + /// Recalculate fitness value of individual. + fn update_fitness( &mut self, value : f64 ); + /// Check if current solution is optimal. + fn is_optimal( &self ) -> bool; +} + +/// Mutation operator, used to randomly change person's genome and intoduce more diversity into population. +pub trait MutationOperator : Debug +{ + /// Type that represents possible solution of initial problem. + type Person : Individual; + /// Additional Information for mutation. + type Problem : InitialProblem; + + /// Randomly changes person's genome. + fn mutate( &self, hrng : Hrng, person : &mut Self::Person, context : &Self::Problem ); +} + +/// Fuctionality of operator responsible for creation of initial solutions population. +pub trait InitialProblem +{ + /// Type that represents Individual in population of solutions in optimization process. + type Person : Individual + Clone + PartialEq + Send + Sync + Debug; + + /// Create the initial population for the optimization algorithm. + fn initial_population( &self, hrng : Hrng, size : usize ) -> Vec< Self::Person > + { + let mut population = Vec::new(); + for _ in 0..size + { + population.push( self.get_random_person( hrng.clone() ) ); + } + population + } + + /// Get random initial solution. + fn get_random_person( &self, hrng : Hrng ) -> Self::Person; + + /// Evaluate fitness of provided solution. + fn evaluate( &self, person : &Self::Person ) -> f64; +} + +/// Indicates state of population proportions with no percentage for elites selection set. +#[ derive( Debug ) ] +pub struct NoElites; +/// Indicates state of population proportions with no percentage for mutating population set. +#[ derive( Debug ) ] +pub struct NoMutations; +/// Indicates state of population proportions with no percentage for crossover set. +#[ derive( Debug ) ] +pub struct NoCrossover; + +/// Proportion of population modifications with crossover, mutations and elites cloning. +#[ derive( Debug ) ] +pub struct PopulationModificationProportions< E, M, C > +{ + /// Percent of most fit individuals cloned to next population. + elite_selection_rate : E, + /// Percent of individuals mutated in new population. + mutation_rate : M, + /// Percent of individuals in new population created by crossover of two selected parents. + crossover_rate : C, +} + +impl PopulationModificationProportions< NoElites, NoMutations, NoCrossover > +{ + /// Create new uniniatialized proportions. + pub fn new() -> PopulationModificationProportions< NoElites, NoMutations, NoCrossover > + { + PopulationModificationProportions + { + elite_selection_rate : NoElites, + mutation_rate : NoMutations, + crossover_rate : NoCrossover, + } + } + + /// Set part of population that will be replaced by crossover. + pub fn set_crossover_rate( self, crossover : f64 ) -> PopulationModificationProportions< NoElites, NoMutations, f64 > + { + PopulationModificationProportions + { + crossover_rate : crossover, + elite_selection_rate : self.elite_selection_rate, + mutation_rate : self.mutation_rate, + } + } + + /// Set part of population tha will be mutated to create new population. + pub fn set_mutation_rate( self, mutation : f64 ) -> PopulationModificationProportions< NoElites, f64, NoCrossover > + { + PopulationModificationProportions + { + crossover_rate : self.crossover_rate, + elite_selection_rate : self.elite_selection_rate, + mutation_rate : mutation, + } + } + + /// Set part of most fit population that will be cloned. + pub fn set_elites_selection_rate( self, elites : f64 ) -> PopulationModificationProportions< f64, NoMutations, NoCrossover > + { + PopulationModificationProportions + { + crossover_rate : self.crossover_rate, + elite_selection_rate : elites, + mutation_rate : self.mutation_rate, + } + } +} + +impl PopulationModificationProportions< f64, NoMutations, NoCrossover > +{ + /// Set part of population that will be replaced by crossover, calculate remaining mutation part. + pub fn set_crossover_rate( self, crossover : f64 ) -> PopulationModificationProportions< f64, f64, f64 > + { + PopulationModificationProportions + { + crossover_rate : crossover, + elite_selection_rate : self.elite_selection_rate, + mutation_rate : 1.0 - self.elite_selection_rate - crossover, + } + } + + /// Set part of population tha will be mutated to create new population, calculate remaining crossover part. + pub fn set_mutation_rate( self, mutation : f64 ) -> PopulationModificationProportions< f64, f64, f64 > + { + PopulationModificationProportions + { + crossover_rate : 1.0 - self.elite_selection_rate - mutation, + elite_selection_rate : self.elite_selection_rate, + mutation_rate : mutation, + } + } +} + +impl PopulationModificationProportions< NoElites, f64, NoCrossover > +{ + /// Set part of population that will be replaced by crossover, calculate remaining elites part. + pub fn set_crossover_rate( self, crossover : f64 ) -> PopulationModificationProportions< f64, f64, f64 > + { + PopulationModificationProportions + { + crossover_rate : crossover, + elite_selection_rate : 1.0 - self.mutation_rate - crossover, + mutation_rate : self.mutation_rate, + } + } + + /// Set part of most fit population that will be cloned, calculate remaining crossover part. + pub fn set_elites_selection_rate( self, elites : f64 ) -> PopulationModificationProportions< f64, f64, f64 > + { + PopulationModificationProportions + { + crossover_rate : 1.0 - elites - self.mutation_rate, + elite_selection_rate : elites, + mutation_rate : self.mutation_rate, + } + } +} + +impl PopulationModificationProportions< NoElites, NoMutations, f64 > +{ + /// Set part of population tha will be mutated to create new population, calculate remaining elites part. + pub fn set_mutation_rate( self, mutation : f64 ) -> PopulationModificationProportions< f64, f64, f64 > + { + PopulationModificationProportions + { + crossover_rate : self.crossover_rate, + elite_selection_rate : 1.0 - mutation - self.crossover_rate, + mutation_rate : mutation, + } + } + + /// Set part of most fit population that will be cloned, calculate remaining mutated part. + pub fn set_elites_selection_rate( self, elites : f64 ) -> PopulationModificationProportions< f64, f64, f64 > + { + PopulationModificationProportions + { + mutation_rate : 1.0 - elites - self.crossover_rate, + elite_selection_rate : elites, + crossover_rate : self.crossover_rate, + } + } +} + +impl PopulationModificationProportions< f64, f64, f64 > +{ + /// Get population part modified by mutation. + pub fn mutation_rate( &self ) -> f64 + { + self.mutation_rate + } + + /// Get population part of most fit Inidividuals that are cloned. + pub fn elite_selection_rate( &self ) -> f64 + { + self.elite_selection_rate + } + + /// Get population part, modified by crossover. + pub fn crossover_rate( &self ) -> f64 + { + self.crossover_rate + } +} + +impl< P : Individual > SelectionOperator< P > for TournamentSelection +{ + fn select< 'a > + ( + &self, hrng : Hrng, + population : &'a Vec< P > + ) -> &'a P + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let mut candidates = Vec::new(); + for _ in 0..self.size + { + candidates.push( population.choose( &mut *rng ).unwrap() ); + } + candidates.sort_by( | c1, c2 | c1.fitness().cmp( &c2.fitness() ) ); + + let rand : f64 = rng.gen(); + let mut selection_pressure = self.selection_pressure; + let mut winner = *candidates.last().unwrap(); + for i in 0..self.size + { + if rand < selection_pressure + { + winner = candidates[ i ]; + break; + } + selection_pressure += selection_pressure * ( 1.0 - selection_pressure ); + } + winner + } +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/hybrid_optimizer/mod.rs b/module/move/optimization_tools/src/hybrid_optimizer/mod.rs new file mode 100644 index 0000000000..90f381f6b6 --- /dev/null +++ b/module/move/optimization_tools/src/hybrid_optimizer/mod.rs @@ -0,0 +1,541 @@ +//! Contains implementation of hybrid optimization using Simulated Annealing and Genetic optimization methods. +//! + +use crate::*; +#[ cfg( feature="static_plot" ) ] +use crate::plot::{ PlotDescription, PlotOptions, plot }; +use iter_tools::Itertools; +use std::ops::RangeInclusive; +use rayon::iter::{ ParallelIterator, IndexedParallelIterator}; +use deterministic_rand::{ Seed, seq::{ SliceRandom, IteratorRandom } }; +use derive_tools::exposed::Display; +use optimal_params_search::OptimalProblem; + +mod gen_alg; +pub use gen_alg::*; +mod sim_anneal; +pub use sim_anneal::*; + +/// Pause execution of optimizer. +pub fn sleep() +{ + std::thread::sleep( std::time::Duration::from_secs( 5 ) ); +} + +/// Represents the reasons for the termination or proceeding with the Sudoku solving. +#[ derive( PartialEq, Eq, Clone, Copy, Debug, Display ) ] +pub enum Reason +{ + /// Optimization process was finished with optimal result. + GoodEnough, + /// Optimization process finished due to reaching limit of resets. + ResetLimit, + /// Optimization process finished due to reaching limit of dynasties. + DynastiesLimit, +} + +/// Configuration for Hybrid Optimizer. +#[ derive( Debug ) ] +pub struct Config +{ + /// Max amount of mutations in dynasty. + pub sa_mutations_per_dynasty_limit : usize, + + /// Max allowed number of resets. + pub reset_limit : usize, + + /// Number of fittest individuals that will be cloned to new population. + pub elite_selection_rate : f64, + + /// Number of individuals that will be replaced by crossover operation. + pub crossover_rate : f64, + + /// Probabilistic measure of a individual mutation likelihood. + pub mutation_rate : f64, + + /// Recalculate fitness on every iteration. + pub fitness_recalculation : bool, + + /// Max number of iteration without improvement in population. + pub max_stale_iterations : usize, + + /// Hierarchical random numbers generator. + pub hrng : Hrng, + + /// Percent of population selected for next cycle of optimization. + pub population_percent : f64, + + /// Max number of dynasties, termination condition. + pub dynasties_limit : usize, + + /// Number of Individuals in initial generation of solutions. + pub population_size : usize, +} + +impl Default for Config +{ + fn default() -> Self + { + Self + { + max_stale_iterations : 100, + sa_mutations_per_dynasty_limit : 300, + reset_limit : 1_000, + crossover_rate : 0.5, + fitness_recalculation : false, + mutation_rate : 0.25, + elite_selection_rate : 0.25, + hrng : Hrng::master_with_seed( Seed::default() ), + dynasties_limit : 10_000, + population_size : 10_000, + population_percent : 1.0, + } + } +} + +/// Specific optimization problem for Hybrid Optimizer. +#[ derive( Debug ) ] +pub struct Problem< S : InitialProblem, C, M > +{ + /// Temperature update operator. + pub sa_temperature_schedule : Box< dyn TemperatureSchedule >, + + /// Crossover genetic operator, which defines how new Individuals are produced by combiniting traits of Individuals from current generation. + pub ga_crossover_operator : C, + + /// Selection genetic operator, which defines how Individuals from current generation are selected to be breeders of new generation. + pub ga_selection_operator : Box< dyn SelectionOperator< < S as InitialProblem >::Person > >, + + /// Struct responsible for creation of initial population. + pub seeder : S, + + /// Mutation operator, randomly changes person's genome to introduce diversity into population. + pub mutation_operator : M, +} + +impl< S : InitialProblem, C, M > Problem< S, C, M > +{ + /// Create new instance of optimization problem for Hybrid Optimizer. + pub fn new( initial : S, crossover_operator : C, mutation_operator : M ) -> Self + where TournamentSelection : SelectionOperator< < S as InitialProblem >::Person > + { + let selection_operator = Box::new( TournamentSelection + { + size : 2, + selection_pressure : 0.85, + } ); + + Self + { + seeder : initial, + sa_temperature_schedule : Box::new( LinearTempSchedule + { + coefficient : ( 0.999 ).into(), + constant : 0f64.into(), + reset_increase_value : 1f64.into() + } ), + ga_crossover_operator : crossover_operator, + ga_selection_operator : selection_operator, + mutation_operator : mutation_operator, + } + } +} + +/// Represents hybrid optimization method with both Simulated Annealing and Genetic Algorithm. +#[ derive( Debug ) ] +pub struct HybridOptimizer< S : InitialProblem, C, M > +{ + /// Configuration of Hybrid Optimizer. + config : Config, + + /// Specific optimization problem. + problem : Problem< S, C, M >, +} + +impl< S : InitialProblem + Sync, C : CrossoverOperator::< Person = < S as InitialProblem>::Person >, M > HybridOptimizer< S, C, M > +where M : MutationOperator::< Person = < S as InitialProblem >::Person > + Sync, + M : MutationOperator::< Problem = S > + Sync +{ + /// Create new instance of hybrid optimizer using given problem and configuration. + pub fn new( config : Config, problem : Problem ) -> Self + { + Self + { + config, + problem, + } + } + /// Set size of initial population. + pub fn set_population_size( mut self, size : usize ) -> Self + { + self.config.population_size = size; + self + } + + /// Set max dynasties number. + pub fn set_dynasties_limit( mut self, limit : usize ) -> Self + { + self.config.dynasties_limit = limit; + self + } + + /// Set temperature schedule for optimization. + pub fn set_sa_temp_schedule( mut self, schedule : Box< dyn TemperatureSchedule > ) -> Self + { + self.problem.sa_temperature_schedule = schedule; + self + } + + /// Set selection operator. + pub fn set_selection_operator( mut self, selection_op : Box< dyn SelectionOperator< < S as InitialProblem >::Person > > ) -> Self + { + self.problem.ga_selection_operator = selection_op; + self + } + + /// Set max amount of mutations per one dynasty. + pub fn set_sa_max_mutations_per_dynasty( mut self, number : usize ) -> Self + { + self.config.sa_mutations_per_dynasty_limit = number; + self + } + + /// Set mutation rate for GA. + pub fn set_population_proportions( mut self, proportions : PopulationModificationProportions< f64, f64, f64 > ) -> Self + { + self.config.mutation_rate = proportions.mutation_rate(); + self.config.elite_selection_rate = proportions.elite_selection_rate(); + self.config.crossover_rate = proportions.crossover_rate(); + self + } + + /// Set stale iterations limit. + pub fn set_max_stale_iterations( mut self, limit : usize ) -> Self + { + self.config.max_stale_iterations = limit; + self + } + + /// Perform hybrid SA/GA optimization. + pub fn optimize( &self ) -> ( Reason, Option< < S as InitialProblem >::Person > ) + { + let mut population = self.problem.seeder.initial_population( self.config.hrng.clone(), self.config.population_size ); + population.sort_by( | p1, p2 | p1.fitness().cmp( &p2.fitness() ) ); + let mut dynasties_number = 0; + let mut stale_generations = 0; + let mut prev_best = population[ 0 ].clone(); + let mut temperature = self.initial_temperature(); + let mut reset_number = 0; + + loop + { + if dynasties_number > self.config.dynasties_limit + { + + return ( Reason::DynastiesLimit, [ prev_best, population[ 0 ].clone() ].into_iter().min_by( | p1, p2 | p1.fitness().cmp( &p2.fitness() ) ) ); + } + + if self.population_has_solution( &population ) + { + return ( Reason::GoodEnough, Some( population[ 0 ].clone() ) ); + } + + if reset_number > self.config.reset_limit + { + population = self.problem.seeder.initial_population( self.config.hrng.clone(), self.config.population_size ); + temperature = self.initial_temperature(); + } + + if stale_generations > self.config.max_stale_iterations + { + if temperature > self.initial_temperature() + { + population = self.problem.seeder.initial_population( self.config.hrng.clone(), self.config.population_size ); + temperature = self.initial_temperature(); + reset_number = 0; + } + else + { + temperature = self.problem.sa_temperature_schedule.reset_temperature( temperature ); + reset_number += 1; + } + } + + if population[ 0 ].fitness() < prev_best.fitness() + { + stale_generations = 0; + + { + prev_best = population[ 0 ].clone(); + } + } + else + { + stale_generations += 1; + } + + let mut new_population = Vec::with_capacity( population.len() ); + + new_population.extend( + population + .iter() + .cloned() + .take( ( ( population.len() as f64 ) * self.config.elite_selection_rate ) as usize ) + ); + for i in ( ( ( population.len() as f64 ) * self.config.elite_selection_rate ) as usize )..population.len() + { + let mut person = self.evolve( population[ i ].clone(), &population, &temperature ); + + person.update_fitness( self.problem.seeder.evaluate( &person ) ); + if person.is_optimal() + { + return ( Reason::GoodEnough, Some( person.clone() ) ); + } + + new_population.push( person ); + } + + new_population.sort_by( | p1, p2 | p1.fitness().cmp( &p2.fitness() ) ); + temperature = self.problem.sa_temperature_schedule.calculate_next_temp( temperature ); + + population = new_population.into_iter().take( ( population.len() as f64 * self.config.population_percent ) as usize ).collect_vec(); + + dynasties_number += 1; + } + } + + /// Check if candidate person represents vital state. + fn is_vital + ( + &self, + person : &< S as InitialProblem >::Person, + candidate : &< S as InitialProblem >::Person, + temperature : &Temperature + ) -> bool + { + let rng_ref = self.config.hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let cost_difference = 0.5 + candidate.fitness() as f64 - person.fitness() as f64; + let threshold = ( - cost_difference / temperature.unwrap() ).exp(); + + let rand : f64 = rng.gen(); + rand < threshold + } + + /// Check if population has solution. + fn population_has_solution( &self, population : &Vec< < S as InitialProblem >::Person > ) -> bool + { + for person in population + { + if person.is_optimal() + { + return true; + } + } + false + } + + /// Update person using crossover operator or mutation. + fn evolve + ( + &self, + person : < S as InitialProblem >::Person, + population : &Vec< < S as InitialProblem >::Person >, + temperature : &Temperature, + ) -> < S as InitialProblem >::Person + { + + let rng_ref = self.config.hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let operator = [ ( 0, self.config.mutation_rate ), ( 1, self.config.crossover_rate ) ] + .choose_weighted( &mut *rng, | item | item.1 ) + .unwrap() + .0 + ; + drop( rng ); + + let mut child = + if operator == 1 + { + let parent1 = self.problem.ga_selection_operator.select( self.config.hrng.clone(), &population ); + let parent2 = self.problem.ga_selection_operator.select( self.config.hrng.clone(), &population ); + let candidate = self.problem.ga_crossover_operator.crossover( self.config.hrng.clone(), parent1, parent2 ); + if self.is_vital( &person, &candidate, temperature ) + { + candidate + } + else + { + person.clone() + } + } + else + { + let mut n_mutations : usize = 0; + let mut expected_number_of_mutations = 4; + + loop + { + if n_mutations > self.config.sa_mutations_per_dynasty_limit + { + { + return person.clone(); + } + } + + let hrng = self.config.hrng.clone(); + let mutation_op = &self.problem.mutation_operator; + let mutation_context = &self.problem.seeder; + + let candidates = rayon::iter::repeat( () ) + .take( expected_number_of_mutations ) + .enumerate() + .map( | ( i, _ ) | hrng.child( i ) ) + .flat_map( | hrng | + { + let mut candidate = person.clone(); + mutation_op.mutate( hrng.clone(), &mut candidate, mutation_context ); + + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let cost_difference = 0.5 + candidate.fitness() as f64 - person.fitness() as f64; + let threshold = ( - cost_difference / temperature.unwrap() ).exp(); + + log::trace! + ( + "cost : {} | cost_difference : {cost_difference} | temperature : {}", + person.fitness(), + temperature, + ); + let rand : f64 = rng.gen(); + let vital = rand < threshold; + if vital + { + let emoji = if cost_difference > 0.0 + { + "🔼" + } + else if cost_difference < 0.0 + { + "✔ï¸" + } + else + { + "🔘" + }; + log::trace!( " {emoji} vital | rand( {rand} ) < threshold( {threshold} )" ); + if cost_difference == 0.0 + { + // sleep(); + } + Some( candidate ) + } + else + { + log::trace!( " ⌠non-vital | rand( {rand} ) > threshold( {threshold} )" ); + None + } + + } ) + .collect::< Vec< _ > >() + ; + + if candidates.len() > 0 + { + let rng_ref = self.config.hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + if let Some( index ) = ( 0..candidates.len() - 1 ).choose( &mut *rng ) + { + break candidates[ index ].clone() + } + else + { + break candidates[ 0 ].clone() + } + } + + n_mutations += expected_number_of_mutations; + if expected_number_of_mutations < 32 + { + expected_number_of_mutations += 4; + } + } + }; + + if self.config.fitness_recalculation + { + child.update_fitness( self.problem.seeder.evaluate( &child ) ); + } + + child + } + + /// Calculate the initial temperature for the optimization process. + pub fn initial_temperature( &self ) -> Temperature + { + use statrs::statistics::Statistics; + let rand_person = self.problem.seeder.get_random_person( self.config.hrng.clone() ); + const N : usize = 16; + let mut costs : [ f64 ; N ] = [ 0.0 ; N ]; + for i in 0..N + { + let mut person2 = rand_person.clone(); + self.problem.mutation_operator.mutate( self.config.hrng.clone(), &mut person2, &self.problem.seeder ); + costs[ i ] = self.problem.seeder.evaluate( &person2 ) as f64; + } + costs[..].std_dev().into() + } + +} + +/// Starting parameters for optimal parameters search for hybrid optimization configuration. +pub fn starting_params_for_hybrid() -> Result< OptimalProblem< RangeInclusive< f64 > >, optimal_params_search::Error > +{ + let opt_problem = OptimalProblem::new() + .add( Some( String::from( "temperature decrease factor" ) ), Some( 0.0..=1.0 ), Some( 0.999 ), Some( 0.0002 ) )? + .add( Some( String::from( "mutation per dynasty" ) ), Some( 10.0..=200.0 ), Some( 100.0 ), Some( 20.0 ) )? + .add( Some( String::from( "mutation rate" ) ), Some( 0.0..=1.0 ), Some( 0.25 ), Some( 0.1 ) )? + .add( Some( String::from( "crossover rate" ) ), Some( 0.0..=1.0 ), Some( 0.5 ), Some( 0.2 ) )? + .add( Some( String::from( "max stale iterations" ) ), Some( 1.0..=100.0 ), Some( 30.0 ), Some( 5.0 ) )? + .add( Some( String::from( "population size" ) ), Some( 1.0..=1000.0 ), Some( 300.0 ), Some( 200.0 ) )? + .add( Some( String::from( "dynasties limit" ) ), Some( 100.0..=2000.0 ), Some( 1000.0 ), Some( 300.0 ) )? + ; + + Ok( opt_problem ) +} + +/// Starting parameters for optimal parameters search for SA optimization configuration. +pub fn starting_params_for_sa() -> Result< OptimalProblem< RangeInclusive< f64 > >, optimal_params_search::Error > +{ + let opt_problem = OptimalProblem::new() + .add( Some( String::from( "temperature decrease factor" ) ), Some( 0.0..=1.0 ), Some( 0.999 ), Some( 0.0002 ) )? + .add( Some( String::from( "mutation per dynasty" ) ), Some( 10.0..=200.0 ), Some( 100.0 ), Some( 20.0 ) )? + .add( Some( String::from( "mutation rate" ) ), Some( 1.0..=1.0 ), Some( 1.0 ), Some( 0.0 ) )? + .add( Some( String::from( "crossover rate" ) ), Some( 0.0..=0.0 ), Some( 0.0 ), Some( 0.0 ) )? + .add( Some( String::from( "max stale iterations" ) ), Some( 1.0..=100.0 ), Some( 30.0 ), Some( 5.0 ) )? + .add( Some( String::from( "population size" ) ), Some( 1.0..=1.0 ), Some( 1.0 ), Some( 0.0 ) )? + .add( Some( String::from( "dynasties limit" ) ), Some( 100.0..=5000.0 ), Some( 1000.0 ), Some( 300.0 ) )? + ; + + Ok( opt_problem ) +} + +/// Starting parameters for optimal parameters search for GA optimization configuration. +pub fn starting_params_for_ga() -> Result< OptimalProblem< RangeInclusive< f64 > >, optimal_params_search::Error > +{ + let opt_problem = OptimalProblem::new() + .add( Some( String::from( "temperature decrease factor" ) ), Some( 0.0..=1.0 ), Some( 0.999 ), Some( 0.0002 ) )? + .add( Some( String::from( "mutation per dynasty" ) ), Some( 10.0..=200.0 ), Some( 100.0 ), Some( 20.0 ) )? + .add( Some( String::from( "mutation rate" ) ), Some( 0.1..=1.0 ), Some( 0.25 ), Some( 0.1 ) )? + .add( Some( String::from( "crossover rate" ) ), Some( 0.1..=1.0 ), Some( 0.5 ), Some( 0.2 ) )? + .add( Some( String::from( "max stale iterations" ) ), Some( 1.0..=100.0 ), Some( 30.0 ), Some( 5.0 ) )? + .add( Some( String::from( "population size" ) ), Some( 10.0..=2000.0 ), Some( 300.0 ), Some( 200.0 ) )? + .add( Some( String::from( "dynasties limit" ) ), Some( 100.0..=2000.0 ), Some( 1000.0 ), Some( 300.0 ) )? + ; + + Ok( opt_problem ) +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/hybrid_optimizer/sim_anneal.rs b/module/move/optimization_tools/src/hybrid_optimizer/sim_anneal.rs new file mode 100644 index 0000000000..f7d4c5743a --- /dev/null +++ b/module/move/optimization_tools/src/hybrid_optimizer/sim_anneal.rs @@ -0,0 +1,95 @@ +//! Implementation of Simulated Annealing for Hybrid Optimizer. + +use derive_tools::{ From, InnerFrom, exposed::Display }; +/// Represents temperature of SA process. +#[ derive( Default, Debug, Display, Clone, Copy, PartialEq, PartialOrd, From, InnerFrom ) ] +pub struct Temperature( f64 ); + +impl Temperature +{ + /// Returns inner value of Temperature struct. + pub fn unwrap( &self ) -> f64 + { + self.0 + } +} + +/// Transforms f32 value into Temperature. +impl From< f32 > for Temperature +{ + #[ inline ] + fn from( src : f32 ) -> Self + { + Self( src as f64 ) + } +} + +// use derive_tools::{ Add, Sub, Mul, Div, AddAssign, SubAssign, MulAssign, DivAssign }; + +/// Struct that represents coefficient to change temperature value. +#[ derive( Debug, Display, Clone, Copy, PartialEq, PartialOrd, From, InnerFrom ) ] +// #[ derive( Add, Sub, Mul, Div, AddAssign, SubAssign, MulAssign, DivAssign ) ] +pub struct TemperatureFactor( pub f64 ); + +impl TemperatureFactor +{ + /// Returns inner value of TemperatureFactor struct. + pub fn unwrap( &self ) -> f64 + { + self.0 + } +} + +/// Default value of TemperatureFactor struct. +impl Default for TemperatureFactor +{ + fn default() -> Self + { + 0.001.into() + } +} + +/// Transforms f32 value into TemperatureFactor. +impl From< f32 > for TemperatureFactor +{ + #[ inline ] + fn from( src : f32 ) -> Self + { + Self( src as f64 ) + } +} + +/// Functionality of temperature schedule for SA responsible for updating temperature value. +pub trait TemperatureSchedule : std::fmt::Debug +{ + /// Calculate next temperature value from current value. + fn calculate_next_temp( &self, prev_temp : Temperature ) -> Temperature; + + /// Update temperature for reset in SA. + fn reset_temperature( &self, prev_temp : Temperature ) -> Temperature; +} + +/// Temperature schedule for SA that uses linear function for calculation of new temperature value. +#[ derive( Debug, Clone ) ] +pub struct LinearTempSchedule +{ + /// Constant term of linear function. + pub constant : Temperature, + /// Slope coefficient of linear function. + pub coefficient : TemperatureFactor, + /// Value for increasing temperature for reset. + pub reset_increase_value : Temperature, +} + +impl TemperatureSchedule for LinearTempSchedule +{ + fn calculate_next_temp( &self, prev_temp : Temperature ) -> Temperature + { + Temperature::from( prev_temp.unwrap() * self.coefficient.unwrap() + self.constant.unwrap() ) + } + + fn reset_temperature( &self, prev_temp : Temperature ) -> Temperature + { + Temperature( prev_temp.unwrap() + self.reset_increase_value.unwrap() ) + } +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/lib.rs b/module/move/optimization_tools/src/lib.rs new file mode 100644 index 0000000000..134318a76f --- /dev/null +++ b/module/move/optimization_tools/src/lib.rs @@ -0,0 +1,14 @@ +//! Optimization tools for lonear and non-linear problem solving. +//! + +use deterministic_rand::{ Hrng, Rng }; +pub use deterministic_rand::Seed; + +pub mod problems; +pub mod hybrid_optimizer; +pub mod simplex; +pub mod optimal_params_search; +#[ cfg( feature="static_plot" ) ] +pub mod plot; +#[ cfg( feature="dynamic_plot" ) ] +pub mod plot_dynamic; diff --git a/module/move/optimization_tools/src/main.rs b/module/move/optimization_tools/src/main.rs new file mode 100644 index 0000000000..b4af159641 --- /dev/null +++ b/module/move/optimization_tools/src/main.rs @@ -0,0 +1,56 @@ +//! Performs solving of sudoku puzzle using Simmulated Annealing algorithm. +//! + +use optimization_tools::*; +use hybrid_optimizer::HybridOptimizer; +use problems::sudoku::*; + +const INPUT : &str = r#" +024007000 +600000000 +003680415 +431005000 +500000032 +790000060 +209710800 +040093000 +310004750 +"#; + +fn main() +{ + let _ = env_logger::builder() + .filter_level( log::LevelFilter::max() ) + .try_init(); + + let board = Board::from( INPUT ); + println!("{board}"); + let initial = SudokuInitial::new( board ); + let sudoku_problem = hybrid_optimizer::Problem::new( initial, BestRowsColumnsCrossover{}, RandomPairInBlockMutation{} ); + let optimizer = HybridOptimizer::new( hybrid_optimizer::Config::default(), sudoku_problem ); + + let ( reason, solution ) = optimizer.optimize( ); + + log::trace!( "reason : {reason}" ); + assert!( solution.is_some() ); + let solution = solution.unwrap(); + log::trace!( "{solution:#?}" ); + log::trace!( "{:#?}", solution.board ); + + // let mut dp = plot_dynamic::init_dyn_plotter( String::from( "Cost change" ), 800, 400 ); + + // let handle = std::thread::spawn + // ( move || + // { + // let seed : deterministic_rand::Seed = "seed3".into(); + // let initial = crate::optimization::SudokuInitial::new( Board::default(), seed ); + // let ( _reason, generation ) = initial.solve_with_sa(); + // let _generation = generation.unwrap(); + // } + // ); + + // dp.plot_dynamically(); + + // _ = handle.join(); + +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/optimal_params_search/mod.rs b/module/move/optimization_tools/src/optimal_params_search/mod.rs new file mode 100644 index 0000000000..39390502e0 --- /dev/null +++ b/module/move/optimization_tools/src/optimal_params_search/mod.rs @@ -0,0 +1,309 @@ +//! Funcions for calculation optimal config parameters. +//! +pub mod results_serialize; +pub mod nelder_mead; +pub mod sim_annealing; +use std::ops::RangeBounds; +use iter_tools::Itertools; +use ordered_float::OrderedFloat; +use crate::hybrid_optimizer::*; +use results_serialize::read_results; + +/// Configuration for optimal parameters search. +#[ derive( Debug, Clone ) ] +pub struct OptimalParamsConfig +{ + /// Minimal value detected as improvement in objective function result. + pub improvement_threshold : f64, + + /// Max amount of steps performed without detected improvement, termination condition. + pub max_no_improvement_steps : usize, + + /// Limit of total iterations of optimization process, termination condition. + pub max_iterations : usize, +} + +impl Default for OptimalParamsConfig +{ + fn default() -> Self + { + Self + { + improvement_threshold : 0.005, + max_no_improvement_steps : 10, + max_iterations : 50, + } + } +} + +/// Problem for optimal parameters search using Nelder-Mead algorithm. +#[ derive( Debug, Clone ) ] +pub struct OptimalProblem< R : RangeBounds< f64 > > +{ + /// Containes names of parameters if provided. + pub params_names : Vec< Option< String > >, + + /// Contains bounds for parameters, may be unbounded or bounded on one side. + pub bounds : Vec< Option< R > >, + + /// Starting point coordinates for optimization process. + pub starting_point : Vec< Option< f64 > >, + + /// Size of initial simplex for optimization. + pub simplex_size : Vec< Option< f64 > >, +} + +impl< 'a, R : RangeBounds< f64 > > OptimalProblem< R > +{ + /// Create new instance for optimization problem + pub fn new() -> Self + { + Self + { + params_names : Vec::new(), + bounds : Vec::new(), + starting_point : Vec::new(), + simplex_size : Vec::new(), + } + } + + /// Add parameter to optimal parameters search problem. + pub fn add + ( + mut self, + name : Option< String >, + bounds : Option< R >, + start_value : Option< f64 >, + simplex_size : Option< f64 >, + ) -> Result< Self, Error > + { + if let Some( ref name ) = name + { + if self.params_names.iter().cloned().filter_map( | n | n ).contains( name ) + { + return Err( Error::NameError ); + } + } + + if let Some( start_value ) = start_value + { + if let Some( ref bounds ) = bounds + { + if !bounds.contains( &start_value ) + { + return Err( Error::OutOfBoundsError ); + } + } + } + + self.params_names.push( name ); + self.bounds.push( bounds ); + self.simplex_size.push( simplex_size ); + self.starting_point.push( start_value ); + + Ok( self ) + } +} + +/// Calculate optimal params for hybrid optimization. +pub fn find_hybrid_optimal_params< R, S, C, M > +( + config : OptimalParamsConfig, + problem : OptimalProblem< R >, + hybrid_problem : Problem< S, C, M >, + intermediate_results_file : Option< String >, +) -> Result< nelder_mead::Solution, nelder_mead::Error > +where R : RangeBounds< f64 > + Sync, + S : InitialProblem + Sync + Clone, + C : CrossoverOperator::< Person = < S as InitialProblem >::Person > + Clone + Sync, + M : MutationOperator::< Person = < S as InitialProblem >::Person > + Sync, + M : MutationOperator::< Problem = S > + Sync + Clone, + TournamentSelection: SelectionOperator< < S as InitialProblem >::Person > +{ + let seeder = hybrid_problem.seeder.clone(); + let ga_crossover_operator = hybrid_problem.ga_crossover_operator.clone(); + let mutation_operator = hybrid_problem.mutation_operator.clone(); + + let objective_function = | case : &nelder_mead::Point | + { + log::info! + ( + "temp_decrease_coefficient : {:.4?}, max_mutations_per_dynasty: {}, mutation_rate: {:.2}, crossover_rate: {:.2};", + case.coords[ 0 ], case.coords[ 1 ] as usize, case.coords[ 2 ], case.coords[ 3 ] + ); + + log::info! + ( + "max_stale_iterations : {:?}, population_size: {}, dynasties_limit: {};", + case.coords[ 4 ] as usize, case.coords[ 5 ] as usize, case.coords[ 6 ] as usize + ); + + let temp_schedule = LinearTempSchedule + { + constant : 0.0.into(), + coefficient : case.coords[ 0 ].into(), + reset_increase_value : 1.0.into(), + }; + + let h_problem = Problem + { + seeder : seeder.clone(), + sa_temperature_schedule : Box::new( temp_schedule ), + ga_crossover_operator : ga_crossover_operator.clone(), + ga_selection_operator : Box::new( TournamentSelection::default() ), + mutation_operator : mutation_operator.clone(), + }; + + let props = crate::hybrid_optimizer::PopulationModificationProportions::new() + .set_crossover_rate( case.coords[ 3 ] ) + .set_mutation_rate( case.coords[ 2 ] ) + ; + + let optimizer = HybridOptimizer::new( Config::default(), h_problem ) + .set_sa_max_mutations_per_dynasty( case.coords[ 1 ] as usize ) + .set_population_proportions( props ) + .set_max_stale_iterations( case.coords[ 4 ] as usize ) + .set_population_size( case.coords[ 5 ] as usize ) + .set_dynasties_limit( case.coords[ 6 ] as usize ) + ; + let ( _reason, _solution ) = optimizer.optimize(); + }; + + let res = optimize_by_time( config, problem, objective_function, intermediate_results_file ); + + log::info!( "result: {:?}", res ); + + res +} + +/// Wrapper for optimizing objective function by execution time instead of value. +pub fn optimize_by_time< F, R > +( + config : OptimalParamsConfig, + problem : OptimalProblem< R >, + objective_function : F, + intermediate_results_file : Option< String >, +) -> Result< nelder_mead::Solution, nelder_mead::Error > +where F : Fn( &nelder_mead::Point ) + Sync, R : RangeBounds< f64 > + Sync +{ + let objective_function = | case : &nelder_mead::Point | + { + + let now = std::time::Instant::now(); + objective_function( case ); + let elapsed = now.elapsed(); + + log::info! + ( + "execution duration: {:?}", + elapsed + ); + elapsed.as_secs_f64() + }; + + // let mut bounds = Vec::new(); + // for bound in problem.bounds + // { + // if let Some( bound ) = bound + // { + // bounds.push( bound ); + // } + // } + + // let optimizer = sim_annealing::Optimizer + // { + // bounds : bounds, + // objective_function : objective_function, + // max_iterations : 50, + // }; + + let mut optimizer = nelder_mead::Optimizer::new( objective_function ); + optimizer.bounds = problem.bounds; + optimizer.set_starting_point( problem.starting_point ); + optimizer.set_simplex_size( problem.simplex_size ); + optimizer.add_constraint( | p : &nelder_mead::Point | p.coords[ 2 ] + p.coords[ 3 ] <= 1.0.into() ); + + optimizer.improvement_threshold = config.improvement_threshold; + optimizer.max_iterations = config.max_iterations; + optimizer.max_no_improvement_steps = config.max_no_improvement_steps; + + if let Some( results_file ) = intermediate_results_file + { + let calculated_points = read_results( &results_file ); + if let Ok( calculated_points ) = calculated_points + { + optimizer.set_calculated_results( calculated_points ); + } + + optimizer.set_save_results_file( results_file ); + } + + optimizer.optimize_from_random_points() +} + +/// Possible error when building OptimalProblem. +#[ derive( thiserror::Error, Debug ) ] +pub enum Error +{ + /// Error for parameters with duplicate names. + #[ error( "parameter with similar name exists" ) ] + NameError, + + /// Error for value located out of its bounds. + #[ error( "starting value is out of bounds" ) ] + OutOfBoundsError, +} + +#[ derive( Debug, Clone, PartialEq, Hash, Eq ) ] +pub struct Point( ( OrderedFloat< f64 >, usize, OrderedFloat< f64 >, OrderedFloat< f64 >, usize, usize, usize ) ); + +impl From< nelder_mead::Point > for Point +{ + fn from( value: nelder_mead::Point ) -> Self + { + Self + ( ( + OrderedFloat( value.coords[ 0 ] ), + value.coords[ 1 ] as usize, + OrderedFloat( value.coords[ 2 ] ), + OrderedFloat( value.coords[ 3 ] ), + value.coords[ 4 ] as usize, + value.coords[ 5 ] as usize, + value.coords[ 6 ] as usize, + ) ) + } +} + +impl From< ( f64, u32, f64, f64, u32, u32, u32 ) > for Point +{ + fn from( value: ( f64, u32, f64, f64, u32, u32, u32 ) ) -> Self + { + Self + ( ( + OrderedFloat( value.0 ), + value.1 as usize, + OrderedFloat( value.2 ), + OrderedFloat( value.3 ), + value.4 as usize, + value.5 as usize, + value.6 as usize, + ) ) + } +} + +impl From< Point > for ( f64, u32, f64, f64, u32, u32, u32 ) +{ + fn from( value: Point ) -> Self + { + let coords = value.0; + ( + coords.0.into_inner(), + coords.1.try_into().unwrap(), + coords.2.into_inner(), + coords.3.into_inner(), + coords.4.try_into().unwrap(), + coords.5.try_into().unwrap(), + coords.6.try_into().unwrap(), + ) + } +} diff --git a/module/move/optimization_tools/src/optimal_params_search/nelder_mead.rs b/module/move/optimization_tools/src/optimal_params_search/nelder_mead.rs new file mode 100644 index 0000000000..cf90936c8b --- /dev/null +++ b/module/move/optimization_tools/src/optimal_params_search/nelder_mead.rs @@ -0,0 +1,861 @@ +//! Implementation of Nelder–Mead method used to find the minimum of an objective function in a multidimensional space. +//! It operates by adjusting a simplex(geometric shape) to explore and converge toward the optimal solution. +//! + +use std:: +{ + collections::HashMap, + fs::{ File, OpenOptions }, + ops::{ Bound, RangeBounds }, + sync::{ Arc, Mutex }, +}; +use deterministic_rand::{ Hrng, Seed, Rng }; +use iter_tools::Itertools; +use rayon::iter::{ IntoParallelIterator, ParallelIterator }; + +use super::results_serialize::save_result; + +/// Represents point in multidimensional space where optimization is performed. +#[ derive( Debug, Clone ) ] +pub struct Point +{ + /// Coordinates of the point. + pub coords : Vec< f64 >, +} + +impl Point +{ + /// Create new point from given coordinates. + pub fn new( coords : Vec< f64 > ) -> Self + { + Self { coords : coords.into_iter().map( | elem | elem.into() ).collect_vec() } + } +} + +/// Represents geometric shape formed by a set of n+1 points in a multidimensional space, where n is a number of dimensions. +/// Simplex is used to navigate through solution space, adjusting its shape based on the performance of the objective function at different points. +#[ derive( Debug, Clone ) ] +pub struct Simplex +{ + /// Points of simplex. + pub points : Vec< Point >, +} + +/// Constraints for points of optimization process. +#[ derive( Debug, Clone ) ] +pub enum Constraints +{ + NoConstraints, + WithConstraints( Vec< fn( &Point ) -> bool > ), +} + +impl Constraints +{ + /// Add constraint to constraints list. + pub fn add_constraint( &mut self, constraint : fn( &Point ) -> bool ) + { + match self + { + Self::NoConstraints => *self = Self::WithConstraints( vec![ constraint ] ), + Self::WithConstraints( constraints ) => constraints.push( constraint ), + } + } +} + +#[ derive( Debug, Clone ) ] +pub struct Stats +{ + pub number_of_iterations : usize, + pub number_of_starting_points : usize, + pub resumed_after_stale : usize, + pub starting_point : Point, + pub differences : Vec< Vec< f64 > >, + pub positive_change : Vec< usize >, + pub cached_points : ( usize, usize ), +} + +impl Stats +{ + pub fn new( starting_point : Point) -> Self + { + let dimensions = starting_point.coords.len(); + Self + { + number_of_iterations : 0, + number_of_starting_points : 1, + resumed_after_stale : 0, + starting_point, + differences : vec![ Vec::new(); dimensions ], + positive_change : vec![ 0; dimensions ], + cached_points : ( 0, 0 ), + } + } + + pub fn record_diff( &mut self, start_point : &Point, point : &Point ) + { + for i in 0..start_point.coords.len() + { + self.differences[ i ].push( ( start_point.coords[ i ] - point.coords[ i ] ).into() ) + } + } + + pub fn record_positive_change( &mut self, prev_point : &Point, point : &Point ) + { + for i in 0..point.coords.len() + { + if ( prev_point.coords[ i ] - point.coords[ i ] ).abs() > 0.0 + { + self.positive_change[ i ] += 1; + } + } + } +} + +/// Struct which holds initial configuration for NelderMead optimization, and can perform optimization if all necessary information were provided during initialization process. +#[ derive( Debug, Clone ) ] +pub struct Optimizer< R, F > +{ + /// Bounds for parameters of objective function, may be unbounded or bounded on one side. + pub bounds : Vec< Option< R > >, + /// Staring point for optimization process. + pub start_point : Point, + /// Initial simplex set in starting point. + pub initial_simplex : Simplex, + /// Function to optimize. + pub objective_function : F, + /// Threshold used to detect improvement in optimization process. + /// If difference between current best value and previous best value is less than the threshold, it is considered that no improvement was achieved. + pub improvement_threshold : f64, + /// Max number of iteration for optimization process, stop execution if exceeded. + pub max_iterations : usize, + /// Max number of steps without improvement, stop execution if exceeded. + pub max_no_improvement_steps : usize, + /// Coefficient used for calculating reflection point - point opposite to one with the highest value of objective function. + /// It is expected that lower values of objective function lie in the opposite direction from point with highest value. + pub alpha : f64, + /// Coefficient used for calculating expansion point. + /// Expansion happents if previously calculated reflection point has the lowest value. + /// If so, expand simplex in the same direction by calculating expansion point. + pub gamma : f64, + /// Coefficient used for calculating contraction point. + /// Contraction happens when previously calculated reflection point is the worst point in the simplex. + /// It means that minimum lies within the simplex, so contracting vertices helps to find better values. + pub rho : f64, + /// Coefficient used for shrinking simplex. + /// If previously calculated contraction point doesn't improve the objective function shrinking is performed to adjust simplex size. + /// Shrinking involves reducing the distance between the vertices of the simplex, making it smaller. + pub sigma : f64, + /// Values of objective function calculated in previous executions. + pub calculated_results : Option< HashMap< super::Point, f64 > >, + /// File for saving values of objective function during optimization process. + pub save_results_file : Option< Arc< Mutex< File > > >, + /// Additional constraint for coordinates of function. + pub constraints : Constraints, +} + +impl< R, F > Optimizer< R, F > +where R : RangeBounds< f64 > + Sync, + F : Fn( &Point ) -> f64 + Sync, +{ + /// Create new instance of Nelder-Mead optimizer. + pub fn new( objective_function : F ) -> Self + { + Self + { + objective_function, + bounds : Vec::new(), + start_point : Point::new( Vec::new() ), + initial_simplex : Simplex { points : Vec::new() }, + improvement_threshold : 10e-6, + max_iterations : 1000, + max_no_improvement_steps : 10, + alpha : 1.0, + gamma : 2.0, + rho : -0.5, + sigma : 0.5, + calculated_results : None, + save_results_file : None, + constraints : Constraints::NoConstraints, + } + } + + /// Add set of previosly calculated values of objective function. + pub fn set_calculated_results( &mut self, res : HashMap< super::Point, f64 > ) + { + self.calculated_results = Some( res ); + } + + /// Set file for saving results of calculations. + pub fn set_save_results_file( &mut self, file_path : String ) + { + let file_res = OpenOptions::new() + .write( true ) + .append( true ) + .create( true ) + .open( file_path ) + ; + + if let Ok( file ) = file_res + { + self.save_results_file = Some( Arc::new( Mutex::new( file ) ) ); + } + } + + /// Add constraint function. + pub fn add_constraint( &mut self, constraint : fn( &Point ) -> bool ) + { + self.constraints.add_constraint( constraint ); + } + + /// Calculate value of objective function at given point or get previously calculated value if such exists. + pub fn evaluate_point( &self, p : &Point, stats : &mut Stats ) -> f64 + { + if let Constraints::WithConstraints( constraint_vec ) = &self.constraints + { + let valid = constraint_vec.iter().fold( true, | acc, constraint | acc && constraint( p ) ); + if !valid + { + return f64::INFINITY; + } + } + + if let Some( points ) = &self.calculated_results + { + if let Some( value ) = points.get( &p.clone().into() ) + { + stats.cached_points.0 += 1; + return *value; + } + } + let result = ( self.objective_function )( p ); + stats.cached_points.1 += 1; + + if let Some( file ) = &self.save_results_file + { + _ = save_result + ( + p.clone().into(), + result, + file.clone(), + ); + } + + result + } + + /// Set bounds for parameters. + pub fn set_bounds( &mut self, bounds : Vec< Option< R > > ) + { + self.bounds = bounds + } + + /// Set staring point for optimizer. + pub fn set_starting_point( &mut self, p : Vec< Option< f64 > > ) + { + self.calculate_start_point(); + for i in 0..p.len() + { + if let Some( value ) = p[ i ] + { + self.start_point.coords[ i ] = value.into() + } + } + } + + /// Initialize simplex by providing its size for optimizer. + pub fn set_simplex_size( &mut self, size : Vec< Option< f64 > > ) + { + if self.start_point.coords.len() == 0 + { + if self.bounds.len() != 0 + { + self.calculate_start_point(); + } + else + { + self.start_point.coords = vec![ 0.0; size.len() ]; + } + } + + self.calculate_regular_simplex(); + + for i in 0..size.len() + { + if let Some( size ) = size[ i ] + { + let mut x = self.start_point.clone(); + x.coords[ i ] += size; + self.initial_simplex.points[ i + 1 ] = x; + } + } + } + + /// Checks if point is in bounded region. + pub fn in_bounds( &self, point : &Point ) -> bool + { + let coords = &point.coords; + let mut res = false; + for i in 0..coords.len() + { + if let Some( bound ) = &self.bounds[ i ] + { + if bound.contains( &coords[ i ] ) + { + res = true; + } + } + } + res + } + + /// Checks if point left the domain, if so, performs projection: all coordinates that lie out of domain bounds are set to closest coordinate included in bounded space. + /// Returns projected point. + fn check_bounds( &self, point : Point ) -> Point + { + let mut coords = point.coords; + for i in 0..self.bounds.len() + { + if let Some( bound ) = &self.bounds[ i ] + { + if !bound.contains( &coords[ i ] ) + { + match bound.start_bound() + { + Bound::Included( val ) => + { + if val < &coords[ i ] + { + coords[ i ] = ( *val ).into(); + } + }, + Bound::Excluded( val ) => + { + if val <= &coords[ i ] + { + coords[ i ] = ( val + f64::EPSILON ).into(); + } + }, + Bound::Unbounded => {} + } + match bound.end_bound() + { + Bound::Included( val ) => + { + if val > &coords[ i ] + { + coords[ i ] = ( *val ).into(); + } + }, + Bound::Excluded( val ) => + { + if val >= &coords[ i ] + { + coords[ i ] = ( val - f64::EPSILON ).into(); + } + }, + Bound::Unbounded => {} + } + } + } + } + Point::new( coords ) + } + + fn calculate_regular_simplex( &mut self ) + { + let n = self.start_point.coords.len() as f64; + + let p = ( 1.0 / ( n * 2f64.sqrt() ) ) * ( n - 1.0 + ( n + 1.0 ).sqrt() ); + let q = ( 1.0 / ( n * 2f64.sqrt() ) ) * ( ( n + 1.0 ).sqrt() - 1.0 ); + + let mut points = Vec::new(); + + points.push( self.start_point.clone() ); + + for i in 1..self.start_point.coords.len() + 1 + { + let mut coords = Vec::new(); + for j in 0..self.start_point.coords.len() + { + if j == i - 1 + { + coords.push( self.start_point.coords[ j ] + p ); + } + else + { + coords.push( self.start_point.coords[ j ] + q ); + } + } + + points.push( Point::new( coords ) ) + } + self.initial_simplex = Simplex { points } + } + + fn calculate_start_point( &mut self ) + { + let mut new_coords = Vec::new(); + for bound in &self.bounds + { + if let Some( bound ) = bound + { + if bound.start_bound() != Bound::Unbounded + { + let mut start_bound = 0.0; + if let Bound::Excluded( val ) = bound.start_bound() + { + start_bound = *val; + } + if let Bound::Included( val ) = bound.start_bound() + { + start_bound = *val; + } + if bound.end_bound() != Bound::Unbounded + { + let mut end_bound = 0.0; + if let Bound::Excluded( val ) = bound.end_bound() + { + end_bound = *val; + } + if let Bound::Included( val ) = bound.end_bound() + { + end_bound = *val; + } + new_coords.push( ( start_bound + end_bound ) / 2.0 ) + } + else + { + new_coords.push( start_bound ) + } + } + else + { + if bound.end_bound() != Bound::Unbounded + { + let mut end_bound = 0.0; + if let Bound::Excluded( val ) = bound.end_bound() + { + end_bound = *val; + } + if let Bound::Included( val ) = bound.end_bound() + { + end_bound = *val; + } + new_coords.push( end_bound ) + } + else + { + new_coords.push( 0.0 ) + } + } + } + } + self.start_point = Point::new( new_coords ); + } + + /// Optimization starting from several random points. + pub fn optimize_from_random_points( &mut self ) -> Result< Solution, Error > + { + let points_number = self.start_point.coords.len() * 4; + let mut points = Vec::new(); + let hrng = Hrng::master_with_seed( Seed::default() ); + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + for _ in 0..points_number + { + let mut point = Vec::new(); + + for bound in &self.bounds + { + if let Some( bound ) = bound + { + let start = match bound.start_bound() + { + Bound::Included( start ) => *start, + Bound::Excluded( start ) => *start + f64::EPSILON, + Bound::Unbounded => unreachable!(), + }; + let end = match bound.end_bound() { + Bound::Included( end ) => *end + f64::EPSILON, + Bound::Excluded( end ) => *end, + Bound::Unbounded => unreachable!(), + }; + + let x = rng.gen_range( start..end ); + point.push( x ); + } + } + + points.push( Point::new( point ) ); + } + + let results = points.into_par_iter().map( | point | + { + let mut stats = Stats::new( point.clone() ); + stats.number_of_starting_points = points_number; + let x0 = point.clone(); + let dimensions = x0.coords.len(); + let mut prev_best = self.evaluate_point( &x0, &mut stats ); + let mut steps_with_no_improv = 0; + let mut res = vec![ ( x0.clone(), prev_best ) ]; + + for i in 1..=dimensions + { + let x = self.initial_simplex.points[ i ].clone(); + let score = self.evaluate_point( &x, &mut stats ); + res.push( ( x, score ) ); + } + let mut iterations = 0; + loop + { + res.sort_by( | ( _, a ), ( _, b ) | a.total_cmp( b ) ); + + let best = res.first().clone().unwrap(); + + if self.max_iterations <= iterations + { + stats.number_of_iterations = iterations; + return Result::< Solution, Error >::Ok ( Solution + { + point : res[ 0 ].0.clone(), + objective : res[ 0 ].1, + reason : TerminationReason::MaxIterations, + stats : Some( stats ), + } ) + } + + if best.1 < prev_best - self.improvement_threshold + { + if steps_with_no_improv > 0 + { + stats.resumed_after_stale += 1; + } + steps_with_no_improv = 0; + prev_best = best.1; + } + else + { + steps_with_no_improv += 1; + } + + if steps_with_no_improv >= self.max_no_improvement_steps + { + stats.number_of_iterations = iterations; + return Ok ( Solution + { + point : res[ 0 ].0.clone(), + objective : res[ 0 ].1, + reason : TerminationReason::NoImprovement, + stats : Some( stats ), + } ) + } + + iterations += 1; + + //centroid + let mut x0_center = vec![ 0.0; dimensions ]; + for ( point, _ ) in res.iter().take( res.len() - 1 ) + { + for ( i, coordinate ) in point.coords.iter().enumerate() + { + x0_center[ i ] += coordinate / ( res.len() - 1 ) as f64; + } + } + + //reflection + let worst_dir = res.last().clone().unwrap(); + let mut x_ref = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_ref[ i ] = x0_center[ i ] + self.alpha * ( x0_center[ i ] - worst_dir.0.coords[ i ] ); + } + // check if point left the domain, if so, perform projection + let x_ref = self.check_bounds( Point::new( x_ref ) ); + stats.record_diff( &self.start_point, &x_ref ); + + let reflection_score = self.evaluate_point( &x_ref, &mut stats ); + let second_worst = res[ res.len() - 2 ].1; + if res[ 0 ].clone().1 <= reflection_score && reflection_score < second_worst + { + let prev_point = res.pop().unwrap().0; + stats.record_positive_change( &prev_point, &x_ref ); + res.push( ( x_ref, reflection_score ) ); + continue; + } + + //expansion + if reflection_score < res[ 0 ].1 + { + let mut x_exp = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_exp[ i ] = x0_center[ i ] + self.gamma * ( x_ref.coords[ i ] - x0_center[ i ] ); + } + // check if point left the domain, if so, perform projection + let x_exp = self.check_bounds( Point::new( x_exp ) ); + stats.record_diff( &self.start_point, &x_exp ); + let expansion_score = self.evaluate_point( &x_exp, &mut stats ); + + if expansion_score < reflection_score + { + let prev_point = res.pop().unwrap().0; + stats.record_positive_change( &prev_point, &x_exp ); + res.push( ( x_exp, expansion_score ) ); + continue; + + } + else + { + let prev_point = res.pop().unwrap().0; + stats.record_positive_change( &prev_point, &x_ref ); + res.push( ( x_ref, reflection_score ) ); + continue; + } + } + + //contraction + let mut x_con = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_con[ i ] = x0_center[ i ] + self.rho * ( x0_center[ i ] - worst_dir.0.coords[ i ] ); + } + let x_con = self.check_bounds( Point::new( x_con ) ); + stats.record_diff( &self.start_point, &x_con ); + let contraction_score = self.evaluate_point( &x_con, &mut stats ); + + if contraction_score < worst_dir.1 + { + let prev_point = res.pop().unwrap().0; + stats.record_positive_change( &prev_point, &x_con ); + res.push( ( x_con, contraction_score ) ); + continue; + } + + //shrink + let x1 = res[ 0 ].clone().0; + let mut new_res = Vec::new(); + for ( point, _ ) in res + { + let mut x_shrink = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_shrink[ i ] = x1.coords[ i ] + self.sigma * ( point.coords[ i ] - x1.coords[ i ] ); + } + let x_shrink = self.check_bounds( Point::new( x_shrink ) ); + stats.record_diff( &self.start_point, &x_shrink ); + let score = self.evaluate_point( &x_shrink, &mut stats ); + new_res.push( ( x_shrink, score ) ); + } + res = new_res; + } + } ).collect::< Vec< _ > >(); + + let results = results.into_iter().flatten().collect_vec(); + let res = results.into_iter().min_by( | res1, res2 | res1.objective.total_cmp( &res2.objective ) ).unwrap(); + Ok( res ) + } + + /// Optimize provided objective function with using initialized configuration. + pub fn optimize( &mut self ) -> Result< Solution, Error > + { + let mut stats = Stats::new( self.start_point.clone() ); + if self.start_point.coords.len() == 0 + { + self.calculate_start_point(); + } + + if self.start_point.coords.len() == 0 + { + return Err ( Error::StartPointError ); + } + + if self.initial_simplex.points.len() == 0 + { + self.calculate_regular_simplex(); + } + + let x0 = self.start_point.clone(); + + let dimensions = x0.coords.len(); + let mut prev_best = self.evaluate_point( &x0, &mut stats ); + let mut steps_with_no_improv = 0; + let mut res = vec![ ( x0.clone(), prev_best ) ]; + + for i in 1..=dimensions + { + let x = self.initial_simplex.points[ i ].clone(); + let score = self.evaluate_point( &x, &mut stats ); + res.push( ( x, score ) ); + } + let mut iterations = 0; + loop + { + res.sort_by( | ( _, a ), ( _, b ) | a.total_cmp( b ) ); + + let best = res.first().clone().unwrap(); + + if self.max_iterations <= iterations + { + return Ok ( Solution + { + point : res[ 0 ].0.clone(), + objective : res[ 0 ].1, + reason : TerminationReason::MaxIterations, + stats : None, + } ) + } + + iterations += 1; + + if best.1 < prev_best - self.improvement_threshold + { + steps_with_no_improv = 0; + prev_best = best.1; + } + else + { + steps_with_no_improv += 1; + } + + if steps_with_no_improv >= self.max_no_improvement_steps + { + return Ok ( Solution + { + point : res[ 0 ].0.clone(), + objective : res[ 0 ].1, + reason : TerminationReason::NoImprovement, + stats : None, + } ) + } + + //centroid + let mut x0_center = vec![ 0.0; dimensions ]; + for ( point, _ ) in res.iter().take( res.len() - 1 ) + { + for ( i, coordinate ) in point.coords.iter().enumerate() + { + x0_center[ i ] += coordinate / ( ( res.len() - 1 ) as f64 ); + } + } + + //reflection + let worst_dir = res.last().clone().unwrap(); + let mut x_ref = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_ref[ i ] = x0_center[ i ] + self.alpha * ( x0_center[ i ] - worst_dir.0.coords[ i ] ); + } + // check if point left the domain, if so, perform projection + let x_ref = self.check_bounds( Point::new( x_ref ) ); + + let reflection_score = self.evaluate_point( &x_ref, &mut stats ); + let second_worst = res[ res.len() - 2 ].1; + if res[ 0 ].clone().1 <= reflection_score && reflection_score < second_worst + { + res.pop(); + res.push( ( x_ref, reflection_score ) ); + continue; + } + + //expansion + if reflection_score < res[ 0 ].1 + { + let mut x_exp = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_exp[ i ] = x0_center[ i ] + self.gamma * ( x_ref.coords[ i ] - x0_center[ i ] ); + } + // check if point left the domain, if so, perform projection + let x_exp = self.check_bounds( Point::new( x_exp ) ); + let expansion_score = self.evaluate_point( &x_exp, &mut stats ); + + if expansion_score < reflection_score + { + res.pop(); + res.push( ( x_exp, expansion_score ) ); + continue; + } + else + { + res.pop(); + res.push( ( x_ref, reflection_score ) ); + continue; + } + } + + //contraction + let mut x_con = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_con[ i ] = x0_center[ i ] + self.rho * ( x0_center[ i ] - worst_dir.0.coords[ i ] ); + } + let x_con = self.check_bounds( Point::new( x_con ) ); + let contraction_score = self.evaluate_point( &x_con, &mut stats ); + + if contraction_score < worst_dir.1 + { + res.pop(); + res.push( ( x_con, contraction_score ) ); + continue; + } + + //shrink + let x1 = res[ 0 ].clone().0; + let mut new_res = Vec::new(); + for ( point, _ ) in res + { + let mut x_shrink = vec![ 0.0; dimensions ]; + for i in 0..dimensions + { + x_shrink[ i ] = x1.coords[ i ] + self.sigma * ( point.coords[ i ] - x1.coords[ i ] ); + } + let x_shrink = self.check_bounds( Point::new( x_shrink ) ); + let score = self.evaluate_point( &x_shrink, &mut stats ); + new_res.push( ( x_shrink, score ) ); + } + + res = new_res; + } + } +} + +/// Result of optimization process. +#[ derive( Debug, Clone ) ] +pub struct Solution +{ + /// Point in which objective function had the lowest value at the moment of termination. + pub point : Point, + /// Lowest value of objective function found during optimization. + pub objective : f64, + /// Reason for termination. + pub reason : TerminationReason, + /// Staticstics. + pub stats : Option< Stats >, +} + +/// Reasons for termination of optimization process. +#[ derive( Debug, Clone, derive_tools::Display ) ] +pub enum TerminationReason +{ + /// Reached limit of total iterations. + MaxIterations, + /// Reached limit of iterations without improvement in objective function values. + NoImprovement, +} + +/// Possible error when building NMOptimizer. +#[ derive( thiserror::Error, Debug ) ] +pub enum Error { + /// Error for Simplex size that have less dimessions than starting point. + #[ error( "simplex size must have exactly one value for every dimension" ) ] + SimplexSizeDimError, + + /// Error if calculation of starting point failed. + #[error("cannot calculate starting point, no bounds provided")] + StartPointError, + + /// Error for given starting point that lies out of provided bounds. + #[error("starting point is out of bounds")] + StartPointOutOfBoundsError, +} diff --git a/module/move/optimization_tools/src/optimal_params_search/results_serialize.rs b/module/move/optimization_tools/src/optimal_params_search/results_serialize.rs new file mode 100644 index 0000000000..746fd9919a --- /dev/null +++ b/module/move/optimization_tools/src/optimal_params_search/results_serialize.rs @@ -0,0 +1,69 @@ +//! Caching of results for optimal parameters search. + +use std:: +{ + collections::HashMap, + fs::{ File, OpenOptions }, + io::{ BufRead, BufReader, Write }, + sync::{ Arc, Mutex }, +}; +use rkyv::{ Archive, Deserialize, Serialize } ; +// use crate::optimal_params_search::nelder_mead::Point; + +#[ derive( Archive, Deserialize, Serialize, Debug ) ] +#[ archive +( + compare( PartialEq ), + check_bytes, +) ] + +#[ archive_attr( derive( Debug ) ) ] +struct ObjectiveFunctionValue +{ + point : ( f64, u32, f64, f64, u32, u32, u32 ), + value : f64, +} + +/// Save results of optimal parameters search. +pub fn save_result( point : super::Point, value : f64, file : Arc< Mutex< File > > ) -> Result< (), Box< dyn std::error::Error > > +{ + let obj_value = ObjectiveFunctionValue{ point : point.into(), value }; + let bytes = rkyv::to_bytes::< _, 256 >( &obj_value ).unwrap(); + + let mut file = file.lock().unwrap(); + file.write( &bytes )?; + file.write( &vec![ 0x0A as u8 ] )?; + + Ok( () ) +} + +/// Read results from previous execution. +pub fn read_results( file_path : &str ) -> Result< HashMap< super::Point, f64 >, Box< dyn std::error::Error > > +{ + let read_file = OpenOptions::new().read( true ).open( file_path )?; + let mut reader = BufReader::new( read_file ); + let mut buffer: Vec< u8 > = Vec::new(); + let mut data = HashMap::new(); + loop + { + let n = reader.read_until( 0x0A as u8, &mut buffer )?; + if n == 0 + { + break; + } + + let archived = rkyv::check_archived_root::< ObjectiveFunctionValue >( &buffer[ ..buffer.len() - 1 ] ); + if let Ok( archived ) = archived + { + let deserialized: Result< ObjectiveFunctionValue, _ > = archived.deserialize( &mut rkyv::Infallible ); + if let Ok( deserialized ) = deserialized + { + data.insert( super::Point::from( deserialized.point ), deserialized.value ); + } + } + + buffer = Vec::new(); + } + + Ok( data ) +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/optimal_params_search/sim_annealing.rs b/module/move/optimization_tools/src/optimal_params_search/sim_annealing.rs new file mode 100644 index 0000000000..084cbaee51 --- /dev/null +++ b/module/move/optimization_tools/src/optimal_params_search/sim_annealing.rs @@ -0,0 +1,209 @@ +//! Optimal parameters search using Simulated Annealing. + +use std::ops::{ Bound, RangeBounds }; + +use deterministic_rand::{ Hrng, Seed, seq::IteratorRandom, Rng }; +use rayon::iter::{ IndexedParallelIterator, ParallelIterator }; +use super::nelder_mead::{ self, Point, Solution, TerminationReason }; + +/// Optimizer for optimal parameters search using Simmulated Annealing. +#[ derive( Debug, Clone ) ] +pub struct Optimizer< R, F > +{ + /// Bounds for parameters of objective function. + pub bounds : Vec< R >, + + /// Oblective function to optimize. + pub objective_function : F, + + /// Iterations limit, execution stops when exceeded. + pub max_iterations : usize, +} + +impl< R : RangeBounds< f64 > + Sync, F : Fn( nelder_mead::Point ) -> f64 + Sync > Optimizer< R, F > +{ + /// Calculate the initial temperature for the optimization process. + pub fn initial_temperature( &self ) -> f64 + { + use statrs::statistics::Statistics; + let hrng = Hrng::master_with_seed( Seed::default() ); + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let mut starting_point = Vec::new(); + + for bound in &self.bounds + { + let start = match bound.start_bound() + { + Bound::Included( start ) => *start, + Bound::Excluded( start ) => *start + f64::EPSILON, + Bound::Unbounded => unreachable!(), + }; + let end = match bound.end_bound() { + Bound::Included( end ) => *end + f64::EPSILON, + Bound::Excluded( end ) => *end, + Bound::Unbounded => unreachable!(), + }; + + let x = rng.gen_range( start..end ); + starting_point.push( x ); + } + + const N : usize = 10; + let mut costs : [ f64 ; N ] = [ 0.0 ; N ]; + for i in 0..N + { + let mut candidate = starting_point.clone(); + let position = rng.gen_range( 0..candidate.len() ); + let bound = &self.bounds[ position ]; + + let start = match bound.start_bound() + { + Bound::Included( start ) => *start, + Bound::Excluded( start ) => *start + f64::EPSILON, + Bound::Unbounded => unreachable!(), + }; + let end = match bound.end_bound() { + Bound::Included( end ) => *end + f64::EPSILON, + Bound::Excluded( end ) => *end, + Bound::Unbounded => unreachable!(), + }; + + let x = rng.gen_range( start..end ); + candidate[ position ] = x; + costs[ i ] = ( self.objective_function )( Point::new( candidate ) ); + } + costs[..].std_dev().into() + } + + /// Find optimal solution for objective function using Simulated Annealing. + pub fn optimize( &self ) -> Result< Solution, nelder_mead::Error > + { + let hrng = Hrng::master_with_seed( Seed::default() ); + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let mut starting_point = Vec::new(); + + for bound in &self.bounds + { + let start = match bound.start_bound() + { + Bound::Included( start ) => *start, + Bound::Excluded( start ) => *start + f64::EPSILON, + Bound::Unbounded => unreachable!(), + }; + let end = match bound.end_bound() { + Bound::Included( end ) => *end + f64::EPSILON, + Bound::Excluded( end ) => *end, + Bound::Unbounded => unreachable!(), + }; + + let x = rng.gen_range( start..end ); + starting_point.push( x ); + } + + let mut iterations = 0; + let mut expected_number_of_candidates = 4; + let mut point = starting_point.clone(); + let mut value = ( self.objective_function )( Point::new( starting_point ) ); + drop( rng ); + + let mut best_found = ( point.clone(), value.clone() ); + let mut temperature = self.initial_temperature(); + + loop + { + if iterations > self.max_iterations + { + break; + } + + let solutions = rayon::iter::repeat( () ) + .take( expected_number_of_candidates ) + .enumerate() + .map( | ( i, _ ) | hrng.child( i ) ) + .flat_map( | hrng | + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let mut candidate = point.clone(); + let position = rng.gen_range( 0..candidate.len() ); + let bound = &self.bounds[ position ]; + + let start = match bound.start_bound() + { + Bound::Included( start ) => *start, + Bound::Excluded( start ) => *start + f64::EPSILON, + Bound::Unbounded => unreachable!(), + }; + let end = match bound.end_bound() { + Bound::Included( end ) => *end + f64::EPSILON, + Bound::Excluded( end ) => *end, + Bound::Unbounded => unreachable!(), + }; + + let x = rng.gen_range( start..end ); + candidate[ position ] = x; + + let candidate_value = ( self.objective_function )( Point::new( candidate.clone() ) ); + + let difference = candidate_value - value; + let threshold = ( - difference / temperature ).exp(); + let rand : f64 = rng.gen(); + let vital = rand < threshold; + if vital + { + Some( ( candidate, candidate_value ) ) + } + else + { + None + } + + } ) + .collect::< Vec< _ > >() + ; + + if solutions.len() > 0 + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + if let Some( index ) = ( 0..solutions.len() - 1 ).choose( &mut *rng ) + { + point = solutions[ index ].0.clone(); + value = solutions[ index ].1; + } + else + { + point = solutions[ 0 ].0.clone(); + value = solutions[ 0 ].1; + } + if value < best_found.1 + { + best_found = ( point.clone(), value ); + } + } + else + { + if expected_number_of_candidates < 32 + { + expected_number_of_candidates += 4; + } + } + + temperature *= 0.999; + iterations += 1; + } + + Ok ( Solution + { + point : Point::new( best_found.0.clone() ), + objective : best_found.1, + reason : TerminationReason::MaxIterations, + stats : None, + } ) + } +} diff --git a/module/move/optimization_tools/src/plot/mod.rs b/module/move/optimization_tools/src/plot/mod.rs new file mode 100644 index 0000000000..62325a8ed1 --- /dev/null +++ b/module/move/optimization_tools/src/plot/mod.rs @@ -0,0 +1,250 @@ +//! Plotting of data series to png file. +//! + +use plotters:: +{ + backend::BitMapBackend, + drawing::IntoDrawingArea, + element::{ Circle, EmptyElement }, + series::{ LineSeries, PointSeries }, + style:: + { + full_palette::{ BLACK, WHITE }, + Color, IntoFont, TextStyle, + }, + chart::ChartBuilder +}; +use iter_tools::Itertools; +use std::{ sync::{ Mutex, OnceLock }, collections::HashMap }; + +/// Struct that can be accessed in any place in code to add some data to draw plots. +pub static PLOTS : OnceLock< Mutex< Plots > > = OnceLock::new(); + +/// Struct that aggregates data to plot with description about that data. +#[ derive( Debug ) ] +pub struct Plots +{ + pub series : HashMap< String, Vec< ( f32, f32 ) > >, + pub descriptions : HashMap< String, PlotDescription >, +} + +impl Plots +{ + /// Create new empty Plots struct. + fn new() -> Self + { + Self + { + series : HashMap::new(), + descriptions : HashMap::new(), + } + } + + /// Adds new series with data to plot, or extends existing series with provided data. + fn add_data( &mut self, plot_options : PlotOptions ) + { + self.series + .entry( plot_options.name.clone() ) + .and_modify( | v | v.push( ( plot_options.x, plot_options.y ) ) ) + .or_insert( vec![ ( plot_options.x, plot_options.y ) ] ) + ; + + self.descriptions + .entry( plot_options.name ) + .or_insert( plot_options.description ) + ; + + } +} + +/// Represents new point of data to add to plot at a time. +#[ derive( Debug ) ] +pub struct PlotOptions +{ + pub name : String, + pub x : f32, + pub y : f32, + pub description : PlotDescription, +} + +/// Fixed info about plot, that remains unchanged with every new added piece of data. +#[ derive( Debug ) ] +pub struct PlotDescription +{ + pub x_label : String, + pub y_label : String, + pub filename : String, + pub plot_line : bool, + pub y_log_coords : bool, +} + +/// Default values for description of plot. +impl Default for PlotDescription +{ + fn default() -> Self + { + Self + { + x_label : String::new(), + y_label : String::new(), + filename : String::from( "plot" ), + plot_line : true, + y_log_coords : false, + } + } +} + +/// Wraps adding new piece of data for plotting to static aggregator. +pub fn plot( plot_options : PlotOptions ) +{ + PLOTS + .get_or_init( | | Mutex::new( Plots::new() ) ) + .lock() + .unwrap() + .add_data(plot_options) + ; +} + +/// Performs drawing of plots from stored data. Must be called at the end of execution when data is fully gathered. +pub fn draw_plots() +{ + let plots_opt = PLOTS.get(); + + if let Some( plots ) = plots_opt + { + let mut plots = plots.lock().unwrap(); + + if !plots.series.is_empty() + { + for plot_name in plots.series.keys() + { + plot_data + ( + &plots.series[ plot_name ] + .iter() + .map( | s | ( s.0, s.1 ) ) + .collect_vec(), + &plot_name, + &plots.descriptions[ plot_name ], + ) + .unwrap() + ; + } + } + + plots.series.clear(); + plots.descriptions.clear(); + } + +} + +/// Create tagret files and directory. +pub fn dst_file_path( file_name : String ) -> Result< String, Box< dyn std::error::Error > > +{ + use std::env; + use std::fs; + let current_dir = env::current_dir()?; + let dir_path = &format!("{}/target/plots", current_dir.display()); + + fs::create_dir_all( dir_path )?; + let file_path = format!( "{dir_path}/{file_name}.png" ); + + Ok( file_path ) + +} + +/// Draw plot from given point series and plot description. +pub fn plot_data +( + series : &Vec< ( f32, f32 ) >, + name : &str, + description : &PlotDescription, +) -> Result< (), Box< dyn std::error::Error > > +{ + let dir_path = format!( "{}/target/plots", crate::simplex::drawing::workspace_dir().to_string_lossy() ); + _ = std::fs::create_dir( &dir_path ); + let path = format!( "{}/{}.png", dir_path, description.filename.clone() ); + let root = BitMapBackend::new( &path, ( 4000, 960 ) ).into_drawing_area(); + + root.fill( &WHITE )?; + let root = root.margin( 20, 20, 20, 20 ); + + let max_x = series + .iter() + .map( | ( x, _ ) | *x ) + .max_by( | a, b | a.partial_cmp( b ).unwrap() ) + .unwrap() + ; + + let min_x = series + .iter() + .map( | ( x, _ ) | *x ) + .min_by( | a, b | a.partial_cmp( b ).unwrap() ) + .unwrap() + ; + + let max_y = series + .iter() + .map( | ( _, y ) | *y ) + .max_by( | a, b | a.partial_cmp( b ).unwrap() ) + .unwrap() + ; + + let min_y = series + .iter() + .map( | ( _, y ) | *y ) + .min_by( | a, b | a.partial_cmp( b ).unwrap() ) + .unwrap() + ; + + let x_spec = ( 0.0f32 ).min( min_x - 0.2 * min_x.abs() )..max_x + max_x.abs() * 0.2; + let y_spec = ( 0.0f32 ).min( min_y - 0.2 * min_y.abs() )..max_y + max_y.abs() * 0.2; + + let mut chart = ChartBuilder::on( &root ) + .caption( name, ( "sans-serif", 30 ) ) + .x_label_area_size( 40 ) + .y_label_area_size( 60 ) + .build_cartesian_2d( x_spec, y_spec )? + ; + + chart + .configure_mesh() + .x_label_style( TextStyle::from( ( "sans-serif", 15 ).into_font() ) ) + .axis_desc_style( TextStyle::from( ( "sans-serif", 18 ).into_font() ) ) + .y_label_style( TextStyle::from( ( "sans-serif", 15 ).into_font() ) ) + .x_label_formatter( &| x | format!( "{}", x ) ) + .x_desc( &description.x_label ) + .y_desc( &description.y_label ) + .draw()? + ; + + chart.draw_series( PointSeries::of_element + ( + series.iter().enumerate().map( | ( i, ( x, y ) ) | ( *x, *y, i ) ), + 1, + &BLACK, + &| c, s, _st | + { + EmptyElement::at( ( c.0, c.1 ) ) + + Circle::new + ( + ( 0, 0) , + s, + ( &BLACK ).filled(), + ) + }, + ))? + ; + + if description.plot_line + { + chart.draw_series( LineSeries::new + ( + series.iter().map( | ( x, y ) | ( *x, *y ) ), + &BLACK, + ) )?; + } + + Ok( () ) + +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/plot_dynamic/mod.rs b/module/move/optimization_tools/src/plot_dynamic/mod.rs new file mode 100644 index 0000000000..0028cbec01 --- /dev/null +++ b/module/move/optimization_tools/src/plot_dynamic/mod.rs @@ -0,0 +1,134 @@ +//! Dynamic plotting of data series. +//! + +use plotters:: +{ + drawing::IntoDrawingArea, + series::LineSeries, + style::full_palette::{ BLACK, WHITE }, + chart::ChartBuilder, +}; +use crate::plot::PlotOptions; + +use piston_window::{ EventLoop, PistonWindow }; +mod plotters_backend; +pub use plotters_backend::draw_piston_window; + +use std::sync::{ OnceLock, mpsc::{ Receiver, Sender } }; + +/// Struct that can be accessed in any place in code to add some data to draw plots. +pub static DPLOT : OnceLock< Sender< PlotOptions > > = OnceLock::new(); + +pub struct DynPlotter +{ + rx : Receiver< PlotOptions >, + window : PistonWindow, +} + +pub fn init_dyn_plotter( name : String, width : u32, height : u32 ) -> DynPlotter +{ + let ( tx,rx ) = std::sync::mpsc::channel::< PlotOptions >(); + _ = DPLOT.set( tx ); + + let window = piston_window::WindowSettings::new( name, [ width, height ] ) + .samples( 1 ) + .exit_on_esc( true ) + .build() + .unwrap() + ; + + DynPlotter + { + window, + rx + } +} + +pub fn dyn_plot( options : PlotOptions ) +{ + if let Some( tx ) = DPLOT.get() + { + _ = tx.send( options ); + } +} + +impl DynPlotter +{ + pub fn plot_dynamically( &mut self ) + { + + self.window.set_ups( 100 ); + self.window.set_max_fps( 120 as u64 ); + + let mut data = Vec::new(); + while let Some( _ ) = draw_piston_window( &mut self.window, | b | + { + + let root = b.into_drawing_area(); + root.fill( &WHITE )?; + + let max_x : f32 = data + .iter() + .map( | x : &( f32, f32 ) | x.0 ) + .max_by( | a : &f32, b : &f32 | a.partial_cmp( b ).unwrap() ) + .unwrap_or( 10.0 ) + ; + + let min_x = data + .iter() + .map( | ( x, _ ) | *x ) + .min_by( | a, b | a.partial_cmp( b ).unwrap() ) + .unwrap_or( 0.0 ) + ; + + let max_y = data + .iter() + .map( | ( _, y ) | *y ) + .max_by( | a, b | a.partial_cmp( b ).unwrap() ) + .unwrap_or( 10.0 ) + ; + + let min_y = data + .iter() + .map( | ( _, y ) | *y ) + .min_by( | a, b | a.partial_cmp( b ).unwrap() ) + .unwrap_or( 0.0 ) + ; + + let x_spec = ( 0.0f32 ).min( min_x - 0.2 * min_x.abs() )..max_x + max_x.abs() * 0.2; + let y_spec = ( 0.0f32 ).min( min_y - 0.2 * min_y.abs() )..max_y + max_y.abs() * 0.2; + + let mut cc = ChartBuilder::on( &root ) + .margin( 10 ) + .x_label_area_size( 40 ) + .y_label_area_size( 50 ) + .build_cartesian_2d( x_spec.clone(), y_spec.clone() )? + ; + + for _ in 0..5 + { + if let Ok( msg ) = self.rx.recv() + { + data.push( ( msg.x, msg.y ) ); + + cc.configure_mesh() + .x_desc( msg.description.x_label ) + .y_desc( msg.description.y_label ) + .axis_desc_style( ( "sans-serif", 15 ) ) + .draw()? + ; + + cc.draw_series( LineSeries::new + ( + data.iter().map( | ( x, y ) | ( *x, *y ) ), + &BLACK, + ) )?; + } + } + + Ok( () ) + + } ) {} + } +} + diff --git a/module/move/optimization_tools/src/plot_dynamic/plotters_backend.rs b/module/move/optimization_tools/src/plot_dynamic/plotters_backend.rs new file mode 100644 index 0000000000..53bfdfb227 --- /dev/null +++ b/module/move/optimization_tools/src/plot_dynamic/plotters_backend.rs @@ -0,0 +1,283 @@ +//! Contains piston_window backend for plotters crate. +//! + +use piston_window::context::Context; +use piston_window::ellipse::circle; +use piston_window::{ circle_arc, ellipse, line, rectangle, Event, Loop }; +use piston_window::{ G2d, PistonWindow }; + +use plotters_backend:: +{ + BackendColor, BackendCoord, BackendStyle, DrawingBackend, DrawingErrorKind, +}; + +/// Error type for plotters backend. +#[ derive( Debug ) ] +pub struct DummyBackendError; + +impl std::fmt::Display for DummyBackendError +{ + fn fmt( &self, fmt : &mut std::fmt::Formatter ) -> std::fmt::Result + { + write!( fmt, "{:?}", self ) + } +} + +impl std::error::Error for DummyBackendError {} + +/// Represents plotters backend structure configuration. +pub struct PistonBackend< 'a, 'b > +{ + size : ( u32, u32 ), + scale : f64, + context : Context, + graphics : &'b mut G2d< 'a >, +} + +/// Convert plotters color to array format. +fn make_piston_rgba( color : &BackendColor ) -> [ f32; 4 ] +{ + let ( r, g, b ) = color.rgb; + let a = color.alpha; + + [ + r as f32 / 255.0, + g as f32 / 255.0, + b as f32 / 255.0, + a as f32, + ] +} + +/// Implements scaling of pair of points. +fn make_point_pair( a : BackendCoord, b : BackendCoord, scale : f64 ) -> [ f64; 4 ] +{ + [ + a.0 as f64 * scale, + a.1 as f64 * scale, + b.0 as f64 * scale, + b.1 as f64 * scale, + ] +} + +impl< 'a, 'b > PistonBackend< 'a, 'b > +{ + /// Create new instance of PistonBackend. + pub fn new( size : ( u32, u32 ), scale : f64, context : Context, graphics : &'b mut G2d< 'a > ) -> Self + { + Self + { + size, + context, + graphics, + scale, + } + } +} + +/// Implementation of plotters Backend trait for custom piston backend struct. +impl< 'a, 'b > DrawingBackend for PistonBackend< 'a, 'b > +{ + type ErrorType = DummyBackendError; + + /// Get size of drawing area. + fn get_size( &self ) -> ( u32, u32 ) + { + self.size + } + + /// Checks if drawing can start. + fn ensure_prepared( &mut self ) -> Result< (), DrawingErrorKind< DummyBackendError > > + { + Ok( () ) + } + + /// Checks if drawing is performed. + fn present( &mut self ) -> Result< (), DrawingErrorKind< DummyBackendError > > + { + Ok( () ) + } + + /// Draw one colored point. + fn draw_pixel + ( + &mut self, + point : BackendCoord, + color : BackendColor, + ) -> Result< (), DrawingErrorKind< Self::ErrorType > > + { + piston_window::rectangle + ( + make_piston_rgba( &color ), + make_point_pair( point, ( 1, 1 ), self.scale ), + self.context.transform, + self.graphics, + ); + + Ok( () ) + } + + /// Draw line by given coordinates and style. + fn draw_line< S : BackendStyle > + ( + &mut self, + from : BackendCoord, + to : BackendCoord, + style : &S, + ) -> Result<(), DrawingErrorKind< Self::ErrorType > > + { + line + ( + make_piston_rgba( &style.color() ), + self.scale, + make_point_pair( from, to, self.scale ), + self.context.transform, + self.graphics, + ); + + Ok( () ) + } + + /// Draw rectangle by given two corners and style. + fn draw_rect< S : BackendStyle > + ( + &mut self, + upper_left : BackendCoord, + bottom_right : BackendCoord, + style : &S, + fill : bool, + ) -> Result< (), DrawingErrorKind< Self::ErrorType > > + { + if fill + { + rectangle + ( + make_piston_rgba( &style.color() ), + make_point_pair + ( + upper_left, + ( bottom_right.0 - upper_left.0, bottom_right.1 - upper_left.1 ), + self.scale, + ), + self.context.transform, + self.graphics, + ); + } + else + { + let color = make_piston_rgba( &style.color() ); + let [ x0, y0, x1, y1 ] = make_point_pair( upper_left, bottom_right, self.scale ); + line + ( + color, + self.scale, + [ x0, y0, x0, y1 ], + self.context.transform, + self.graphics, + ); + line + ( + color, + self.scale, + [ x0, y1, x1, y1 ], + self.context.transform, + self.graphics, + ); + line + ( + color, + self.scale, + [ x1, y1, x1, y0 ], + self.context.transform, + self.graphics, + ); + line + ( + color, + self.scale, + [ x1, y0, x0, y0 ], + self.context.transform, + self.graphics, + ); + } + + Ok( () ) + } + + /// Draw circle by given center coordinates, radius and style. + fn draw_circle< S : BackendStyle > + ( + &mut self, + center : BackendCoord, + radius : u32, + style : &S, + fill : bool, + ) -> Result< (), DrawingErrorKind< Self::ErrorType > > + { + let rect = circle( center.0 as f64, center.1 as f64, radius as f64 ); + if fill + { + ellipse + ( + make_piston_rgba( &style.color() ), + rect, + self.context.transform, + self.graphics, + ); + } + else + { + circle_arc + ( + make_piston_rgba( &style.color() ), + self.scale, + std::f64::consts::PI, + 0.0, + rect, + self.context.transform, + self.graphics, + ); + circle_arc + ( + make_piston_rgba( &style.color() ), + self.scale, + 0.0, + std::f64::consts::PI, + rect, + self.context.transform, + self.graphics, + ); + } + Ok( () ) + + } +} + +/// General drawing method. +pub fn draw_piston_window< F : FnOnce( PistonBackend ) -> Result< (), Box< dyn std::error::Error > > > +( + window : &mut PistonWindow, + draw : F, +) -> Option< Event > +{ + if let Some( event ) = window.next() + { + window.draw_2d( &event, | c, g, _ | match event + { + Event::Loop( Loop::Render( arg ) ) => + { + draw( PistonBackend::new + ( + ( arg.draw_size[ 0 ], arg.draw_size[ 1 ] ), + arg.window_size[ 0 ] / arg.draw_size[ 0 ] as f64, + c, + g, + ) ) + .ok() + ; + } + _ => {} + }); + return Some( event ); + } + None +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/problems/mod.rs b/module/move/optimization_tools/src/problems/mod.rs new file mode 100644 index 0000000000..1ed00854c3 --- /dev/null +++ b/module/move/optimization_tools/src/problems/mod.rs @@ -0,0 +1,6 @@ +//! Problems for Hybrid Optimization. + +pub mod sudoku; +pub use sudoku::*; +pub mod traveling_salesman; +pub use traveling_salesman::*; \ No newline at end of file diff --git a/module/move/optimization_tools/src/problems/sudoku/block_index.rs b/module/move/optimization_tools/src/problems/sudoku/block_index.rs new file mode 100644 index 0000000000..3c334bb9dd --- /dev/null +++ b/module/move/optimization_tools/src/problems/sudoku/block_index.rs @@ -0,0 +1,86 @@ +//! Block index structure used to perform operations on single Sudoku 3×3 field block. +//! + +use super::*; +use deterministic_rand::{ Rng, distributions::{Distribution, Standard } }; +use core::ops::Range; + +/// Represents the index of a Sudoku block. +#[ derive( Default, Debug, Clone, Copy, PartialEq, Eq, Hash ) ] +pub struct BlockIndex( u8, u8 ); + +impl BlockIndex +{ + /// Get first cell in block. + #[ inline ] + pub fn first_cell( &self ) -> CellFlatIndex + { + ( self.0 as usize * 3 + ( self.1 as usize * 27 ) ).into() + } + /// Interval in which cell indcies of the block reside. + #[ inline ] + pub fn cells_intervals( &self ) -> ( Range< usize >, Range< usize > ) + { + ( + self.0 as usize * 3 .. self.0 as usize * 3 + 3, + self.1 as usize * 3 .. self.1 as usize * 3 + 3, + ) + } + /// Get column value of block. + #[ inline ] + pub fn col( &self ) -> u8 + { + self.0 + } + /// Get column value of block. + #[ inline ] + pub fn row( &self ) -> u8 + { + self.1 + } +} + +/// Transform a tuple of elements, that can be converted to u8, into block index. +impl< T > From< ( T, T ) > for BlockIndex +where + T : Into< u8 >, +{ + fn from( src : ( T, T ) ) -> Self + { + let a = src.0.into(); + let b = src.1.into(); + debug_assert!( a <= 2 ); + debug_assert!( b <= 2 ); + Self ( a, b ) + } +} + +/// Convert value of type CellIndex into BlockIndex. +impl From< CellIndex > for BlockIndex +{ + #[ inline ] + fn from( src : CellIndex ) -> Self + { + Self( src.col() / 3, src.row() / 3 ) + } +} + +/// Convert value of type CellFlatIndex into BlockIndex. +impl From< CellFlatIndex > for BlockIndex +{ + #[ inline ] + fn from( src : CellFlatIndex ) -> Self + { + let src : CellIndex = src.into(); + src.into() + } +} + +/// Get random value of BlockIndex. +impl Distribution< BlockIndex > for Standard +{ + fn sample< R : Rng + ?Sized >( &self, rng : &mut R) -> BlockIndex + { + ( rng.gen_range( 0..=2 ), rng.gen_range( 0..=2 ) ).into() + } +} diff --git a/module/move/optimization_tools/src/problems/sudoku/board.rs b/module/move/optimization_tools/src/problems/sudoku/board.rs new file mode 100644 index 0000000000..d73dc5290d --- /dev/null +++ b/module/move/optimization_tools/src/problems/sudoku/board.rs @@ -0,0 +1,437 @@ +//! Contains representation of Sudoku board and methods to operate on it. +//! + +use super::*; +use std::fmt; +use std::collections::HashSet; +use iter_tools::Itertools; +use deterministic_rand::{ Hrng, IfDeterminismIteratorExt, seq::SliceRandom }; + +/// Represents a Sudoku board as vector of CellVal values. +#[ derive( PartialEq, Eq, Hash, Clone ) ] +pub struct Board +{ + storage : Vec< CellVal >, +} + +impl Board +{ + /// Create new instance of Board from vector of CellVal. + pub fn new( storage : Vec< CellVal > ) -> Self + { + debug_assert_eq!( storage.len(), 81 ); + Self { storage } + } + + /// Get value of cell by given index. + #[ inline ] + pub fn cell< IntoCellFlatIndex >( &self, index : IntoCellFlatIndex ) -> CellVal + where + IntoCellFlatIndex : Into< CellFlatIndex >, + { + let index : usize = index.into().into(); + self.storage[ index ] + } + + /// Get sequence of pairs of CellIndexes and CellVal values. + pub fn cells( &self ) -> impl Iterator< Item = ( CellIndex, CellVal ) > + '_ + { + self.storage.iter().enumerate().map( | ( k, e ) | ( CellIndex::from( CellFlatIndex::from( k ) ), *e ) ) + } + + /// Get sequence of values in given row. + pub fn row( &self, index : usize ) -> impl Iterator< Item = CellVal > + '_ + { + self.storage.iter().cloned().skip( index * 9 ).take( 9 ) + } + + /// Get sequence of rows in sudoku board. + pub fn rows( &self ) -> impl Iterator< Item = impl Iterator< Item = CellVal > + '_ > + { + ( 0..9 ).map( move | i | self.row( i ) ) + } + + /// Get sequence of values of column by its index. + pub fn col( &self, index : usize ) -> impl Iterator< Item = CellVal > + '_ + { + self.storage.iter().cloned().skip( index ).step_by( 9 ) + } + + /// Get sequence columns columns in sudoku board. + pub fn cols( &self ) -> impl Iterator< Item = impl Iterator< Item = CellVal > + '_ > + { + ( 0..9 ).map( move | i | self.col( i ) ) + } + + /// Get sequence of values of block by block index. + pub fn block( &self, index : BlockIndex ) -> impl Iterator< Item = CellVal > + '_ + { + let mut i = 0; + let offset = index.first_cell().into(); + let result = self.storage.iter().cloned().skip( offset ).take( 3 ); + i += 1; + let result = result.chain( self.storage.iter().cloned().skip( offset + i*9 ).take( 3 ) ); + i += 1; + let result = result.chain( self.storage.iter().cloned().skip( offset + i*9 ).take( 3 ) ); + result + } + + /// Get sequence of blocks in sudoku board. + pub fn blocks( &self ) -> impl Iterator< Item = BlockIndex > + { + ( 0..9 ).map( move | i | ( i % 3, i / 3 ).into() ) + } + + /// Get sequence of cell values by its indices. + pub fn select< 'a >( &'a self, indices : impl Iterator< Item = CellFlatIndex > + 'a ) -> impl Iterator< Item = CellVal > + 'a + { + indices.map( | i | self.storage[ usize::from( i ) ] ) + } + + /// Get sequence of cell values by its indices with mutable access. + pub fn select_mut< 'a >( &'a mut self, indices : impl Iterator< Item = CellFlatIndex > + 'a ) -> impl Iterator< Item = &'a mut CellVal > + 'a + { + let storage_ptr = self.storage.as_mut_ptr(); + indices.map( move | i | unsafe { &mut *storage_ptr.add( usize::from( i ) ) } ) + } + + /// Get iterator over indices of cells in block by given block index. + pub fn block_cells( &self, index : BlockIndex ) -> std::array::IntoIter< CellFlatIndex, 9 > + { + + let mut indices : [ CellFlatIndex ; 9 ] = [ 0.into() ; 9 ]; + let mut i1 = 0; + let mut i2: usize = index.first_cell().into(); + for _ in 0..3 + { + for _ in 0..3 + { + indices[ i1 ] = i2.into(); + i1 += 1; + i2 += 1; + } + i2 += 9 - 3; + } + + indices.into_iter() + } + +// pub fn blocks_indices( &self ) -> Vec< impl Iterator< Item = usize > + '_ > +// { +// use std::sync::OnceLock; +// +// static CELL : OnceLock< Vec< std::array::IntoIter< usize, 9 > > > = OnceLock::new(); +// let result = CELL.get_or_init +// ( || +// { +// ( 0..9 ).map( move | i | self.block_cells( ( i % 3, i / 3 ).into() ) ).collect() +// }); +// +// result.clone() +// } + + /// Get digits that are missing in block by its index. + pub fn block_missing_vals( &self, index : BlockIndex ) -> HashSet< CellVal > + { + use std::sync::OnceLock; + static DIGITS : OnceLock< HashSet< CellVal > > = OnceLock::new(); + let digits: &HashSet< CellVal > = DIGITS.get_or_init + ( || + { + [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ].into_iter().map( | e | e.into() ).collect() + }); + + let has : HashSet< CellVal > = self.block( index ).filter( | &e | e != 0.into() ).unique().collect(); + digits.difference( &has ).cloned().collect() + } + + /// Randomly fills empty positions in sudoku board. + pub fn fill_missing_randomly( &mut self, hrng : Hrng ) -> &mut Self + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + for block in self.blocks() + { + let missing_vals = self.block_missing_vals( block ); + // println!( "for block {block:?} missing {missing_vals:?}" ); + let mut missing_vals : Vec< CellVal > = missing_vals.into_iter().if_determinism_then_sort().collect(); + missing_vals.shuffle( &mut *rng ); + let mut missing_val = missing_vals.into_iter(); + let cells = self.block_cells( block ); + cells.for_each( | cell_index | + { + let cell_val = &mut self.storage[ usize::from( cell_index ) ]; + if *cell_val != 0.into() + { + return; + } + *cell_val = missing_val.next().unwrap(); + }); + } + self + } + + /// Calculates number of errors in column and row that given cell position belongs to. + pub fn cross_error( &self, index : CellIndex ) -> usize + { + let mut error : usize = 0; + error += 9 - self.col( index.col() as usize ).filter( | &e | e != 0.into() ).unique().count(); + error += 9 - self.row( index.row() as usize ).filter( | &e | e != 0.into() ).unique().count(); + error + } + + /// Calculates number of errors in column and row that given cell position belongs to. + pub fn cross_error_for_value( &self, index : CellIndex, value : CellVal, other_index : CellIndex, other_value : CellVal ) -> usize + { + let mut error : usize = 0; + + error += 9 - self + .col( index.col() as usize ) + .enumerate() + .filter_map( | ( i, e ) | + { + if e != 0.into() + { + if i == index.row() as usize && index.col() != other_index.col() + { + return Some( value ) + } + + Some( e ) + } else { None } + }).unique().count(); + + error += 9 - self + .row( index.row() as usize ) + .enumerate() + .filter_map( | ( i, e ) | + { + if e != 0.into() + { + if i == index.col() as usize && index.row() != other_index.row() + { + return Some( value ) + } + Some( e ) + } else { None } + }).unique().count(); + + error += 9 - self + .col( other_index.col() as usize ) + .enumerate() + .filter_map( | ( i, e ) | + { + if e != 0.into() + { + if i == other_index.row() as usize && index.col() != other_index.col() + { + return Some( other_value ) + } + Some( e ) + } else { None } + }).unique().count(); + + error += 9 - self + .row( other_index.row() as usize ) + .enumerate() + .filter_map( | ( i, e ) | + { + if e != 0.into() + { + if i == other_index.col() as usize && index.row() != other_index.row() + { + return Some( other_value ) + } + Some( e ) + } else { None } + }).unique().count(); + + error + } + + /// Calculates number of errors(duplicate digits) in sudoku board. + pub fn total_error( &self ) -> usize + { + let mut error : usize = 0; + for i in 0..9 + { + error += self.cross_error( ( i, i ).into() ); + } + error + } + + /// Swaps two cell values in provided positions. + pub fn cells_swap( &mut self, index1 : CellIndex, index2 : CellIndex ) + { + self.storage.swap( index1.into(), index2.into() ); + } + + /// Calculates coefficient which determines difficulty level of the board. + /// easy <= 2 + /// 2 < medium <= 2.5 + /// 2.5 < hard <= 3 + /// 3 < expert/master + pub fn calculate_difficulty( &self ) -> f64 + { + let mut possible_values: Vec< Vec > > = vec![ vec![ vec![ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; 9 ]; 9 ]; + + let _clues = self + .cells() + .filter( | cell | cell.1 != 0.into() ) + .map( | cell | ( usize::from( cell.1 ), cell.0.row(), cell.0.col()) ) + .for_each( | ( val, row, col ) | + { + for (index, possible_vals ) in possible_values[ row as usize ].iter_mut().enumerate() + { + if index == col as usize + { + *possible_vals = possible_vals.iter().filter( | &&v | v == val ).map( | v | *v ).collect_vec(); + } + else + { + if possible_vals.contains( &val ) + { + *possible_vals = possible_vals.iter().filter( | &&v | v != val ).map( | v | *v ).collect_vec(); + } + } + } + + for ( index, possible_vals ) in possible_values.iter_mut().enumerate() + { + if index != row as usize + { + if possible_vals[ col as usize ].contains( &val ) + { + possible_vals[ col as usize ] = possible_vals[ col as usize ].iter().filter( | &&v | v != val ).map( | v | *v ).collect_vec(); + } + } + } + + let block = BlockIndex::from( crate::problems::sudoku::CellIndex::from( ( col, row ) ) ); + let ( cols, rows ) = block.cells_intervals(); + for i in rows + { + for j in cols.clone() + { + if !( row as usize == i && col as usize == j ) + { + if possible_values[ i ][ j ].contains( &val ) + { + possible_values[ i ][ j ] = possible_values[ i ][ j ].iter().filter( | &&v | v != val ).map( | v | *v ).collect_vec(); + } + } + } + } + } ); + + let mut possibilities_count = std::collections::HashMap::new(); + + for row in &possible_values + { + for val in row + { + possibilities_count.entry( val.len() ).and_modify( | num | *num += 1 ).or_insert_with( || 1usize ); + } + } + let coeff = possibilities_count.into_iter().fold( 0, | acc, val | acc + val.0 * val.1 ) as f64 / 81.0 ; + coeff + } + + pub fn calculate_level( &self ) -> Level + { + match self.calculate_difficulty() + { + n if n >= 0.0 && n<= 2.0 => Level::Easy, + n if n > 2.0 && n <= 2.5 => Level::Medium, + n if n > 2.5 && n < 3.0 => Level::Hard, + _ => Level::Expert, + } + } + +} + +/// Level of difficulty of sudoku board. +#[ derive( Debug, Clone, Copy, PartialEq, Eq, Hash ) ] +pub enum Level +{ + /// Easy level with difficulty <= 2. + Easy, + /// Medium, 2 < difficulty <= 2.5. + Medium, + /// Hard level, 2.5 < difficulty <= 3. + Hard, + /// Expert level with difficulty > 3. + Expert, +} + +impl Level { + /// Iterates over sudoku difficulty levels. + pub fn iterator() -> impl Iterator< Item = Level > + { + use Level::*; + [ Easy, Medium, Hard, Expert ].iter().copied() + } +} + +/// Sets default value for board. +impl Default for Board +{ + fn default() -> Self + { + let storage : Vec< CellVal > = + [ + 3,1,0, 0,0,0, 0,2,0, + 0,0,6, 1,0,9, 0,0,5, + 0,0,0, 0,8,0, 0,0,0, + 0,2,0, 8,0,4, 0,5,0, + 0,0,4, 0,7,0, 0,0,0, + 0,0,0, 0,6,0, 0,0,8, + 0,6,0, 0,0,0, 9,0,0, + 0,0,9, 4,0,5, 0,0,1, + 0,0,0, 0,0,7, 0,0,0, + ].into_iter().map( | e | e.into() ).collect(); + Board::new( storage ) + } +} + +/// Create Board from value that can be converted to str. +impl< Src > From< Src > for Board +where + Src : AsRef< str >, +{ + fn from( src : Src ) -> Self + { + let src = src.as_ref().trim(); + let storage: Vec< CellVal > = src + .split( '\n' ) + .flat_map( | e | e.chars().filter( | ch | ch.is_ascii_digit() ) ) + .filter_map( | e | e.to_digit( 10 ).map( | num | num.into() ) ) + .collect() + ; + Self::new( storage ) + } +} + +/// Output representation of sudoku board. +impl fmt::Display for Board +{ + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + for row in self.rows() + { + let mut line_str = row.map( | e | e.to_string() ).collect::< String >(); + line_str.push_str( "\n" ); + write!( f, "{line_str}" )?; + } + write!( f, "" ) + } +} + +impl fmt::Debug for Board +{ + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + fmt::Display::fmt( self, f ) + } +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/problems/sudoku/cell_index.rs b/module/move/optimization_tools/src/problems/sudoku/cell_index.rs new file mode 100644 index 0000000000..f2bd4b20b5 --- /dev/null +++ b/module/move/optimization_tools/src/problems/sudoku/cell_index.rs @@ -0,0 +1,133 @@ +//! Provides structures for representetion of position of single digit on Sudoku board. +//! +//! CellFlatIndex is used for indexing Sudoku board as one-dimensional array. +//! CellIndex is used for two-dimensional Sudoku board representation, where first value of +//! the tuple if row index and second value is index of the column. +//! + +use super::*; +use deterministic_rand::{ Rng, distributions::{ Distribution, Standard } }; +// use super::BlockIndex; + +/// Represents an index of a Sudoku cell in one-dimensional board array. +#[ derive( Default, Debug, Clone, Copy, PartialEq, Eq ) ] +pub struct CellFlatIndex( usize ); + +impl CellFlatIndex +{ + /// Converts CellFlatIndex into its inner usize value. + #[ inline ] + pub fn unwrap( self ) -> usize + { + self.0 + } +} + +/// Convert usize value into CellFlatIndex value. +impl From< usize > for CellFlatIndex +{ + #[ inline ] + fn from( src : usize ) -> Self + { + let a = src.into(); + debug_assert!( a < 81 ); + Self ( a ) + } +} + +/// Convert two-dimensional CellIndex value into CellFlatIndex value. +impl From< CellIndex > for CellFlatIndex +{ + #[ inline ] + fn from( src : CellIndex ) -> Self + { + Self( src.0 as usize + src.1 as usize * 9 ) + } +} + +/// Convert CellFlatIndex value into usize. +impl From< CellFlatIndex > for usize +{ + #[ inline ] + fn from( src : CellFlatIndex ) -> Self + { + src.0 + } +} + +/// Represents an index of a Sudoku cell in two-dimensional board representation. +#[ derive( Default, Debug, Clone, Copy, PartialEq, Eq ) ] +pub struct CellIndex( u8, u8 ); + +impl CellIndex +{ + /// Random cell in a block. + pub fn random_in_block( block : BlockIndex, hrng : Hrng ) -> Self + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let intervals = block.cells_intervals(); + + ( rng.gen_range( intervals.0 ) as u8, rng.gen_range( intervals.1 ) as u8 ).into() + } + + /// Column index of cell. + #[ inline ] + pub fn col( &self ) -> u8 + { + self.0 + } + + /// Row index of cell. + #[ inline ] + pub fn row( &self ) -> u8 + { + self.1 + } +} + +/// Get random CellIndex value. +impl Distribution< CellIndex > for Standard +{ + fn sample< R : Rng + ?Sized >( &self, rng : &mut R) -> CellIndex + { + ( rng.gen_range( 0..=8 ), rng.gen_range( 0..=8 ) ).into() + } +} + +/// Transform a tuple of elements, that can be converted to u8, into CellIndex value. +impl< T > From< ( T, T ) > for CellIndex +where + T : Into< u8 >, +{ + fn from( src : ( T, T ) ) -> Self + { + let a = src.0.into(); + let b = src.1.into(); + debug_assert!( a <= 8 ); + debug_assert!( b <= 8 ); + Self ( a, b ) + } +} + +/// Convert CellFlatIndex value into CellIndex value. +impl From< CellFlatIndex > for CellIndex +{ + #[ inline ] + fn from( src : CellFlatIndex ) -> Self + { + Self( src.0 as u8 % 9, src.0 as u8 / 9 ) + } +} + +/// Convert CellIndex value into usize value. +impl From< CellIndex > for usize +{ + #[ inline ] + fn from( src : CellIndex ) -> Self + { + let index : CellFlatIndex = src.into(); + index.into() + } +} diff --git a/module/move/optimization_tools/src/problems/sudoku/cell_val.rs b/module/move/optimization_tools/src/problems/sudoku/cell_val.rs new file mode 100644 index 0000000000..f17b3db378 --- /dev/null +++ b/module/move/optimization_tools/src/problems/sudoku/cell_val.rs @@ -0,0 +1,72 @@ +//! Contains CellVal structure that corresponds to single digit on Sudoku field. +//! + +use derive_tools::exposed::Display; + +/// Represents the value of a cell in Sudoku. It can have a value from 1 to 9 or 0 if the cell is not assigned. +#[ derive( Default, Debug, Display, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash ) ] +pub struct CellVal( u8 ); + +impl CellVal +{ + /// Returns inner u8 value of CellVal. + #[ inline ] + pub fn unwrap( self ) -> u8 + { + self.0 + } +} + +/// Converts usize value into CellVal. +impl From< usize > for CellVal +{ + #[ inline ] + fn from( src : usize ) -> Self + { + debug_assert!( src < 10 ); + Self ( src as u8 ) + } +} + +/// Converts i32 value into CellVal. +impl From< i32 > for CellVal +{ + #[ inline ] + fn from( src : i32 ) -> Self + { + debug_assert!( 0 <= src && src < 10 ); + Self ( src as u8 ) + } +} + +/// Converts u32 value into CellVal. +impl From< u32 > for CellVal +{ + #[ inline ] + fn from( src : u32 ) -> Self + { + debug_assert!( src < 10 ); + Self ( src as u8 ) + } +} + +/// Converts u8 value into CellVal. +impl From< u8 > for CellVal +{ + #[ inline ] + fn from( src : u8 ) -> Self + { + debug_assert!( src < 10 ); + Self ( src ) + } +} + +/// Converts CellVal value into usize. +impl From< CellVal > for usize +{ + #[ inline ] + fn from( src : CellVal ) -> Self + { + src.0 as usize + } +} diff --git a/module/move/optimization_tools/src/problems/sudoku/mod.rs b/module/move/optimization_tools/src/problems/sudoku/mod.rs new file mode 100644 index 0000000000..eb4d3f49d3 --- /dev/null +++ b/module/move/optimization_tools/src/problems/sudoku/mod.rs @@ -0,0 +1,17 @@ +//! Contains representation of Sudoku board and methods to operate on it. +//! + +use crate::*; + +pub mod block_index; +pub use block_index::*; +pub mod cell_index; +pub use cell_index::*; +pub mod cell_val; +pub use cell_val::*; +pub mod board; +pub use board::*; +pub mod sudoku_sets; +pub use sudoku_sets::*; +pub mod sudoku; +pub use sudoku::*; diff --git a/module/move/optimization_tools/src/problems/sudoku/sudoku.rs b/module/move/optimization_tools/src/problems/sudoku/sudoku.rs new file mode 100644 index 0000000000..eac6a5dbda --- /dev/null +++ b/module/move/optimization_tools/src/problems/sudoku/sudoku.rs @@ -0,0 +1,416 @@ +//! Implementation of sudoku problem for Hybrid Optimizer. + +use std::collections::HashSet; +use crate::hybrid_optimizer::*; +use crate::problems::sudoku::*; + +use derive_tools::{ From, InnerFrom, exposed::Display }; +use deterministic_rand::{ Hrng, Rng, seq::SliceRandom }; +use iter_tools::Itertools; + +/// Trait that implements SA specific methods for sudoku board. +trait BoardExt +{ + /// Validate that each bloack has at least one non-fixed cell. + fn validate_block_has_non_fixed_cells( &self, block : BlockIndex ) -> bool; +} + +impl BoardExt for Board +{ + fn validate_block_has_non_fixed_cells( &self, block : BlockIndex ) -> bool + { + let fixed = self.block_cells( block ) + .map( | cell | self.cell( cell ) ) + .fold( 0, | acc, e | if e == 0.into() { acc + 1 } else { acc } ) + ; + if fixed <= 1 || fixed >= 10 + { + log::info!( "can't swap cells in block {block:?} that has {fixed} fixed cells" ); + return false; + } + + true + } +} + +/// Get a pair of random non-fixed cells in a specified block. +pub fn cells_pair_random_in_block( initial : &Board, block : BlockIndex, hrng : Hrng ) -> Option< ( CellIndex, CellIndex ) > +{ + + if !initial.validate_block_has_non_fixed_cells( block.clone() ) + { + return None; + } + + let cell1 = loop + { + let cell1 = CellIndex::random_in_block( block, hrng.clone() ); + log::trace!( "cell1 : {cell1:?}" ); + let is_fixed = initial.cell( cell1 ) != 0.into(); + if !is_fixed + { + break cell1; + } + }; + + let cell2 = loop + { + let cell2 = CellIndex::random_in_block( block, hrng.clone() ); + log::trace!( "cell2 : {cell2:?}" ); + if cell1 == cell2 + { + continue; + } + let is_fixed = initial.cell( cell2 ) != 0.into(); + if !is_fixed + { + break cell2; + } + }; + + Some( ( cell1, cell2 ) ) +} + +/// Represents number of errors in sudoku board. +#[ derive( Default, Debug, Display, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash, From, InnerFrom ) ] +pub struct SudokuCost( usize ); + +// xxx : derive, please +impl SudokuCost +{ + /// Converts SudokuCost struct into its inner usize value. + pub fn unwrap( self ) -> usize + { + self.0 + } +} + +/// Transforms SudokuCost into f64. +impl From< SudokuCost > for f64 +{ + #[ inline ] + fn from( src : SudokuCost ) -> Self + { + src.0 as f64 + } +} + +/// Represents state of sudoku board filled with random digits and the number of the errors of the board as the cost. +#[ derive( PartialEq, Eq, Clone, Debug ) ] +pub struct SudokuPerson +{ + /// Sudoku board. + pub board : Board, + /// Number of errors in sudoku board. + pub cost : SudokuCost, +} + +impl Individual for SudokuPerson +{ + fn is_optimal( &self ) -> bool + { + if self.cost == 0.into() + { + true + } + else + { + false + } + } + + fn fitness( &self ) -> usize + { + self.cost.into() + } + + fn update_fitness( &mut self, value : f64 ) + { + self.cost = ( value as usize ).into(); + } +} + +impl SudokuPerson +{ + /// Create new SudokuPerson from initial configuration of sudoku board. + pub fn new( initial_board : &Board, hrng : Hrng ) -> Self + { + let mut board = initial_board.clone(); + board.fill_missing_randomly( hrng.clone() ); + let cost : SudokuCost = board.total_error().into(); + SudokuPerson { board, cost } + } + + /// Create new SudokuPerson from board filled with values. + pub fn with_board( board : Board ) -> Self + { + let cost : SudokuCost = board.total_error().into(); + SudokuPerson { board, cost } + } + + /// Change state of the board by applying provided mutagen to current sudoku board. + pub fn mutate( &mut self, mutagen : &SudokuMutagen ) + { + let old_cross_error = self.board.cross_error( mutagen.cell1 ) + + self.board.cross_error( mutagen.cell2 ); + + log::trace!( "cells_swap( {:?}, {:?} )", mutagen.cell1, mutagen.cell2 ); + self.board.cells_swap( mutagen.cell1, mutagen.cell2 ); + self.cost = SudokuCost( self.cost.unwrap() - old_cross_error ) ; + self.cost = SudokuCost( self.cost.unwrap() + self.board.cross_error( mutagen.cell1 ) ); + self.cost = SudokuCost( self.cost.unwrap() + self.board.cross_error( mutagen.cell2 ) ); + } + + /// Create random mutagen and apply it current board. + pub fn mutate_random( &self, initial_board : &Board, hrng : Hrng ) -> Self + { + let mutagen = self.mutagen( initial_board, hrng ); + let mut p = self.clone(); + p.mutate( &mutagen.into() ); + p + } + + /// Create new SudokuMutagen as random cells pair in random sudoku block in current board. + pub fn mutagen( &self, initial : &Board, hrng : Hrng ) -> SudokuMutagen + { + let mutagen; + loop + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let block : BlockIndex = rng.gen(); + drop( rng ); + if let Some( m ) = cells_pair_random_in_block( &initial, block, hrng.clone() ) + { + mutagen = m; + break; + } + } + mutagen.into() + } +} + +/// Represents single change(mutation) which contains indeces of two swapped cells. It is used to generate new state of the board for sudoku solving process. +#[ derive( PartialEq, Eq, Clone, Debug, From, InnerFrom ) ] +pub struct SudokuMutagen +{ + /// Index of cell swapped in mutation. + pub cell1 : CellIndex, + /// Index of cell swapped in mutation. + pub cell2 : CellIndex, +} + +/// Initial sudoku. +#[ derive( Debug, Clone ) ] +pub struct SudokuInitial +{ + /// Initial sudoku board with empty fields. + board : Board, +} + +impl SudokuInitial +{ + /// Create new instance of initial sudoku. + pub fn new( board : Board ) -> Self + { + Self { board } + } +} + +impl InitialProblem for SudokuInitial +{ + type Person = SudokuPerson; + + fn get_random_person( &self, hrng : Hrng ) -> SudokuPerson + { + SudokuPerson::new( &self.board, hrng.clone() ) + } + + fn evaluate( &self, person : &SudokuPerson ) -> f64 + { + person.board.total_error() as f64 + } +} + +/// Mutation that randomly swaps two values in sudoku board, excluding values set in initial board. +#[ derive( Debug, Clone ) ] +pub struct RandomPairInBlockMutation; + +impl MutationOperator for RandomPairInBlockMutation +{ + type Person = SudokuPerson; + type Problem = SudokuInitial; + + fn mutate( &self, hrng : Hrng, person : &mut Self::Person, context : &Self::Problem ) + { + let mutagen : SudokuMutagen = + loop + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let block : BlockIndex = rng.gen(); + drop( rng ); + if let Some( m ) = cells_pair_random_in_block( &context.board, block, hrng.clone() ) + { + break m; + } + }.into(); + let old_cross_error = person.board.cross_error( mutagen.cell1 ) + + person.board.cross_error( mutagen.cell2 ); + + log::trace!( "cells_swap( {:?}, {:?} )", mutagen.cell1, mutagen.cell2 ); + person.board.cells_swap( mutagen.cell1, mutagen.cell2 ); + person.cost = SudokuCost( person.cost.unwrap() - old_cross_error ); + person.cost = SudokuCost( person.cost.unwrap() + person.board.cross_error( mutagen.cell1 ) ); + person.cost = SudokuCost( person.cost.unwrap() + person.board.cross_error( mutagen.cell2 ) ); + } + +} + +/// Crossover is performed by combining blocks from parents' boards, split in several randomly chosen crossover points. +#[ derive( Debug, Clone ) ] +pub struct MultiplePointsBlockCrossover; + +impl CrossoverOperator for MultiplePointsBlockCrossover +{ + type Person = SudokuPerson; + fn crossover( &self, hrng : Hrng, parent1 : &Self::Person, parent2 : &Self::Person ) -> Self::Person + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let possible_values = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; + let first_parent_blocks_number = possible_values.choose( &mut *rng ).unwrap(); + let mut first_parent_blocks : HashSet< BlockIndex > = HashSet::new(); + + while first_parent_blocks.len() != *first_parent_blocks_number + { + first_parent_blocks.insert( rng.gen() ); + } + + let mut child_storage: Vec< CellVal > = vec![ 0.into(); 81 ]; + + for i in parent1.board.blocks() + { + if first_parent_blocks.contains( &i ) + { + let parent_block = parent1.board.block( i ).collect_vec(); + let cells = parent1.board.block_cells( i ); + for ( index, cell_index ) in cells.enumerate() + { + child_storage[ usize::from( cell_index ) ] = parent_block[ index ]; + } + } + else + { + let parent_block = parent2.board.block( i ).collect_vec(); + let cells = parent2.board.block_cells( i ); + for ( index, cell_index ) in cells.enumerate() + { + child_storage[ usize::from( cell_index ) ] = parent_block[ index ]; + } + } + } + + let child = SudokuPerson::with_board( Board::new( child_storage ) ); + child + } +} + +/// Crossover performed by selecting blocks with best rows or columns from two Individuals. +#[ derive( Debug, Clone ) ] +pub struct BestRowsColumnsCrossover; + +impl CrossoverOperator for BestRowsColumnsCrossover +{ + type Person = < SudokuInitial as InitialProblem >::Person; + + fn crossover( &self, _hrng : Hrng, parent1 : &Self::Person, parent2 : &Self::Person ) -> Self::Person + { + let mut rows_costs = vec![ Vec::new(); 2 ]; + let mut columns_costs = vec![ Vec::new(); 2 ]; + for ( index, parent ) in [ parent1, parent2 ].iter().enumerate() + { + rows_costs[ index ] = parent.board + .rows() + .map( | row | row.collect::< HashSet< _ > >().len() ) + .collect_vec() + .chunks( 3 ) + .map( | costs | 27 - costs.iter().fold( 0, | acc, cost | acc + cost ) ) + .collect_vec() + ; + + columns_costs[ index ] = parent.board + .cols() + .map( | row | row.collect::< HashSet< _ > >().len() ) + .collect_vec() + .chunks( 3 ) + .map( | costs | 27 - costs.iter().fold( 0, | acc, cost | acc + cost ) ) + .collect_vec() + ; + } + + let mut child1_storage = vec![ CellVal::from( 0 ); 81 ]; + for i in 0..3 + { + if rows_costs[ 0 ][ i ] < rows_costs[ 1 ][ i ] + { + for j in 0..3 + { + let parent_block = parent1.board.block( BlockIndex::from( ( j as u8, i as u8 ) ) ).collect_vec(); + let cells = parent1.board.block_cells( BlockIndex::from( ( j as u8, i as u8 ) ) ); + for ( index, cell_index ) in cells.enumerate() + { + child1_storage[ usize::from( cell_index ) ] = parent_block[ index ]; + } + } + } + else + { + for j in 0..3 + { + let parent_block = parent2.board.block( BlockIndex::from( ( j as u8, i as u8 ) ) ).collect_vec(); + let cells = parent2.board.block_cells( BlockIndex::from( ( j as u8, i as u8 ) ) ); + for ( index, cell_index ) in cells.enumerate() + { + child1_storage[ usize::from( cell_index ) ] = parent_block[ index ]; + } + } + } + } + + let mut child2_storage = vec![ CellVal::from( 0 ); 81 ]; + for i in 0..3 + { + for j in 0..3 + { + if columns_costs[ 0 ][ j ] < columns_costs[ 1 ][ j ] + { + let parent_block = parent1.board.block( BlockIndex::from( ( j as u8, i as u8 ) ) ).collect_vec(); + let cells = parent1.board.block_cells( BlockIndex::from( ( j as u8, i as u8 ) ) ); + for ( index, cell_index ) in cells.enumerate() + { + child2_storage[ usize::from( cell_index ) ] = parent_block[ index ]; + } + } + else + { + let parent_block = parent2.board.block( BlockIndex::from( ( j as u8, i as u8 ) ) ).collect_vec(); + let cells = parent2.board.block_cells( BlockIndex::from( ( j as u8, i as u8 ) ) ); + for ( index, cell_index ) in cells.enumerate() + { + child2_storage[ usize::from( cell_index ) ] = parent_block[ index ]; + } + } + } + } + + let min_board = [ Board::new( child1_storage ), Board::new( child2_storage ) ] + .into_iter() + .min_by( | b1, b2 | b1.total_error().cmp( &b2.total_error() ) ) + .unwrap() + ; + + SudokuPerson::with_board( min_board ) + } +} diff --git a/module/move/optimization_tools/src/problems/sudoku/sudoku_sets.rs b/module/move/optimization_tools/src/problems/sudoku/sudoku_sets.rs new file mode 100644 index 0000000000..2c97f2ab52 --- /dev/null +++ b/module/move/optimization_tools/src/problems/sudoku/sudoku_sets.rs @@ -0,0 +1,695 @@ +//! Sudoku sets for finding optimal parameters for solving sudoku with SA algorithm. +//! Grouped by difficulty level. + +/// Sudoku sets by levels. +pub const _TRAINING : [ &[ &str ]; 4 ] = +// easy +[ + &[ + r#" + 080924060 + 920060105 + 360080029 + 408209600 + 106003802 + 002806390 + 840690070 + 009705208 + 075040036 + "#, + r#" + 000079200 + 000000467 + 700162090 + 060910720 + 340087509 + 090000300 + 006040170 + 801720040 + 473000052 + "#, + r#" + 801920000 + 040850726 + 056073090 + 598004100 + 700000530 + 002600400 + 900300680 + 683190050 + 000000013 + "#, + r#" + 000310509 + 649000801 + 531080670 + 210040306 + 096208000 + 700601080 + 105900700 + 900003000 + 300160008 + "#, + r#" + 000008050 + 410000209 + 052040000 + 100020000 + 003004508 + 000093027 + 027430896 + 831560042 + 900780000 + "#, + r#" + 004020000 + 030009071 + 096000405 + 501060000 + 708912304 + 309405618 + 010000700 + 003704000 + 000230046 + "#, + r#" + 209060038 + 004508100 + 605000409 + 050340020 + 000001000 + 470006891 + 000420913 + 042910600 + 097000204 + "#, + r#" + 680007100 + 020915807 + 900603520 + 056002000 + 300000000 + 092060058 + 700056081 + 008349006 + 000801430 + "#, + r#" + 000027089 + 004013002 + 072590300 + 900401803 + 047900000 + 108006000 + 009175200 + 001060507 + 005048091 + "#, + r#" + 004100000 + 000290301 + 090070860 + 130907582 + 948506107 + 002803000 + 610700000 + 407000210 + 000080006 + "#, + ], + // medium + &[ + r#" + 000042730 + 308000024 + 400360000 + 006050840 + 900403501 + 500000070 + 095006000 + 000284956 + 000005000 + "#, + r#" + 000010032 + 080900005 + 000024196 + 010700004 + 004000050 + 002050000 + 920005370 + 008003000 + 340208001 + "#, + r#" + 090060001 + 000380040 + 000400000 + 100290000 + 900000005 + 037100960 + 074030200 + 203510006 + 610004050 + "#, + r#" + 260104000 + 000000500 + 080007029 + 600500032 + 000963040 + 307842100 + 008090600 + 035000000 + 000000207 + "#, + r#" + 105000000 + 670029801 + 000001740 + 060000300 + 381050006 + 059010070 + 007032000 + 900000100 + 004000507 + "#, + r#" + 000800690 + 026309085 + 001000007 + 070002560 + 000098000 + 038060920 + 000027050 + 600000030 + 004600700 + "#, + r#" + 000005071 + 000001000 + 751482000 + 190203700 + 802010005 + 006000100 + 603024000 + 000350200 + 024000308 + "#, + r#" + 006300000 + 740801056 + 000026040 + 060000000 + 300100500 + 100008700 + 608000420 + 402087010 + 010050003 + "#, + r#" + 080070030 + 260050018 + 000000400 + 000602000 + 390010086 + 000709000 + 004000800 + 810040052 + 050090070 + "#, + ], + // hard + &[ + r#" + 000700208 + 000800090 + 284160050 + 410080060 + 008516000 + 000090000 + 002000500 + 801070040 + 000030000 + "#, + r#" + 007000302 + 200005010 + 000801400 + 010096008 + 760000049 + 000000000 + 000103000 + 801060000 + 000700063 + "#, + r#" + 080000090 + 070060210 + 006048700 + 800000530 + 020000000 + 163000000 + 000401900 + 000000070 + 209700005 + "#, + r#" + 020060000 + 905040000 + 000007452 + 801020043 + 009800600 + 006400008 + 500000000 + 030005970 + 700000805 + "#, + r#" + 000500084 + 038000200 + 005000000 + 514060070 + 007080009 + 820070561 + 051006000 + 000000005 + 402053100 + "#, + r#" + 016400000 + 200009000 + 400000062 + 070230100 + 100000003 + 003087040 + 960000005 + 000800007 + 000006820 + "#, + r#" + 049008605 + 003007000 + 000000030 + 000400800 + 060815020 + 001009000 + 010000000 + 000600400 + 804500390 + "#, + r#" + 000605000 + 003020800 + 045090270 + 500000001 + 062000540 + 400000007 + 098060450 + 006040700 + 000203000 + "#, + r#" + 409000705 + 000010000 + 006207800 + 200000009 + 003704200 + 800000004 + 002801500 + 000060000 + 905000406 + "#, + r#" + 000010030 + 040070501 + 002008006 + 680000003 + 000302000 + 300000045 + 200500800 + 801040020 + 090020000 + "#, + ], + // expert + &[ + r#" + 000000690 + 028100000 + 000000005 + 600400301 + 030050000 + 009000080 + 100030040 + 396507000 + 080000000 + "#, + r#" + 008906005 + 043000020 + 000000000 + 004000900 + 500040680 + 000100000 + 200080070 + 000034100 + 060009000 + "#, + r#" + 000000000 + 590034600 + 060000080 + 400008009 + 010000076 + 000000500 + 070900003 + 300800260 + 050070000 + "#, + r#" + 050900000 + 200000400 + 001608020 + 000030000 + 070000005 + 006201040 + 000090080 + 003040000 + 060803700 + "#, + r#" + 200000008 + 700090000 + 605030000 + 300000600 + 008407900 + 100680000 + 003200001 + 050000006 + 000800040 + "#, + r#" + 760500000 + 000060008 + 000000403 + 200400800 + 080000030 + 005001007 + 809000000 + 600010000 + 000003041 + "#, + r#" + 090050800 + 803060002 + 040300000 + 000005004 + 608700500 + 900000000 + 030000000 + 507600400 + 000020010 + "#, + r#" + 000670050 + 087004003 + 100000000 + 400000001 + 900002000 + 021050030 + 000040800 + 032008007 + 090000000 + "#, + r#" + 083090750 + 500000002 + 000700006 + 300100870 + 000000600 + 001020000 + 000000005 + 800200130 + 090004000 + "#, + r#" + 100500600 + 020700000 + 008026003 + 900000008 + 000600000 + 050041300 + 005000040 + 040032100 + 000070000 + "#, + r#" + 160000700 + 094070020 + 000001000 + 000005002 + 009806400 + 400100000 + 000500000 + 040080390 + 003000046 + "#, + ], +]; +/// Sudoku sets by levels for control. +pub const _CONTROL : [ &[ &str ]; 4 ] = +[ + // easy + &[ + r#" + 068027901 + 000910008 + 107003040 + 470206000 + 051349700 + 020870350 + 019060000 + 030500006 + 605000407 + "#, + r#" + 984007100 + 010590008 + 257803000 + 802005090 + 045009802 + 000248307 + 400030000 + 008401200 + 060902400 + "#, + r#" + 630000050 + 205340000 + 000006900 + 070690500 + 000013740 + 002000030 + 310984075 + 729035086 + 004000091 + "#, + r#" + 080072001 + 050031649 + 000040807 + 008050400 + 040000208 + 601200050 + 920763080 + 070010062 + 165900300 + "#, + r#" + 001070009 + 609831750 + 807009006 + 004900100 + 080063000 + 000410073 + 000107230 + 210390500 + 053204600 + "#, + ], + // medium + &[ + r#" + 096751000 + 000603040 + 003400006 + 500206084 + 000130200 + 807005000 + 005007020 + 062000000 + 000809001 + "#, + r#" + 000001506 + 005600000 + 800040009 + 008100740 + 002000000 + 004580001 + 500809030 + 700300060 + 409062015 + "#, + r#" + 004000000 + 087010304 + 900000500 + 009002650 + 100008000 + 508004201 + 020049010 + 300800000 + 890056007 + "#, + r#" + 600500208 + 908072305 + 200030490 + 087005000 + 000000851 + 000020000 + 803100000 + 000000002 + 069004530 + "#, + r#" + 000009000 + 000854793 + 079003000 + 700042901 + 003900840 + 900000060 + 208000054 + 400320000 + 000405620 + "#, + ], + // hard + &[ + r#" + 600500080 + 040006090 + 010000700 + 000008300 + 920050017 + 003100000 + 005000070 + 090800020 + 060004001 + "#, + r#" + 900703004 + 600090200 + 007060000 + 080000500 + 006040700 + 009000080 + 000050800 + 001020003 + 200901005 + "#, + r#" + 005000080 + 700405000 + 090600705 + 200000006 + 001204800 + 300000004 + 903002010 + 000506009 + 070000200 + "#, + r#" + 480000019 + 000000000 + 007010300 + 001604900 + 004000800 + 060070020 + 009701500 + 028050730 + 000030000 + "#, + r#" + 400000380 + 060580490 + 000000506 + 000012000 + 000000800 + 284007169 + 600100900 + 001940275 + 000000030 + "#, + ], + // expert + &[ + r#" + 035000006 + 000070800 + 001009000 + 920000078 + 050000020 + 300000500 + 000500010 + 094000200 + 000607004 + "#, + r#" + 300400090 + 000000064 + 800090100 + 000000000 + 030002900 + 500010700 + 070050300 + 020100607 + 060040000 + "#, + r#" + 090050800 + 803060002 + 040300000 + 000005004 + 608700500 + 900000000 + 030000000 + 507600400 + 000020010 + "#, + r#" + 000670050 + 087004003 + 100000000 + 400000001 + 900002000 + 021050030 + 000040800 + 032008007 + 090000000 + "#, + r#" + 083090750 + 500000002 + 000700006 + 300100870 + 000000600 + 001020000 + 000000005 + 800200130 + 090004000 + "#, + ] +]; diff --git a/module/move/optimization_tools/src/problems/traveling_salesman.rs b/module/move/optimization_tools/src/problems/traveling_salesman.rs new file mode 100644 index 0000000000..2eab112158 --- /dev/null +++ b/module/move/optimization_tools/src/problems/traveling_salesman.rs @@ -0,0 +1,375 @@ +//! Solving Traveling Salesman Problem using HybridOptiomizer. +//! +//! Initial population generated as random routes where each node appears exactly once( except for starting node, which apperars at the beginning and at the end ). +//! +//! Selection operator performes tourmanent selection: randomly selecting a group of individuals from the population( the number of individuals selected is equal to the tournament_size value). +//! Likelihood of win of the fittest participant is determined by tournament_selection_pressure. +//! +//! Crossover operator performs ordered crossover to preserve uniqueness of each node in route: a subroute from the first parent is selected and the remainder of the route is filled +//! with the nodes from the second parent in the order in which they appear, without duplicating any nodes in the selected subroute from the first parent. +//! +//! Mutation operator alters solution in one of three different ways, determined randomly: +//! - by swapping two nodes within the route( start and end nodes excluded ), +//! - by reversing subroute, +//! - by changing position of subroute. +//! + +use std::collections::HashMap; +use crate::hybrid_optimizer::*; + +use derive_tools::{ From, InnerFrom }; +use deterministic_rand::{ Hrng, seq::{ SliceRandom, IteratorRandom } }; +use iter_tools::Itertools; + +/// Functionality for symmetrical traveling salesman problem undirected graph representation. +pub trait Graph +{ + /// Graph node type. + type N; + /// Graph edge type. + type E; + + /// Checks if edge connecting two nodes exists. + fn has_edge( &self, node1 : &Self::N, node2 : &Self::N ) -> bool; + + /// Adds edge to graph, connecting two nodes. + fn add_edge( &mut self, node1 : Self::N, node2 : Self::N, weight : f64 ); + + /// Return list of graph nodes. + fn nodes( &self ) -> Vec< Self::N >; + + /// Get edge that connects two given nodes. Returns None if edge doesn't exist. + fn get_edge( &self, node1 : &Self::N, node2 : &Self::N ) -> Option< Self::E >; +} + +/// Graph for traveling salesman problem. +#[ derive( Debug, Clone ) ] +pub struct TSPGraph +{ + /// Maps nodes of the graph with list of connected nodes and weight of edge that connects them. + adjacency_list : HashMap< NodeIndex, Vec < ( NodeIndex, EdgeWeight ) > >, +} + +impl TSPGraph +{ + /// Create new instance of graph. + pub fn new() -> Self + { + Self { adjacency_list : HashMap::new() } + } +} + +impl Default for TSPGraph +{ + fn default() -> Self + { + let mut graph = TSPGraph::new(); + graph.add_edge( NodeIndex( 1 ), NodeIndex( 2 ), 10.0 ); + graph.add_edge( NodeIndex( 1 ), NodeIndex( 3 ), 15.0 ); + graph.add_edge( NodeIndex( 1 ), NodeIndex( 4 ), 20.0 ); + graph.add_edge( NodeIndex( 2 ), NodeIndex( 3 ), 35.0 ); + graph.add_edge( NodeIndex( 2 ), NodeIndex( 4 ), 25.0 ); + graph.add_edge( NodeIndex( 3 ), NodeIndex( 4 ), 30.0 ); + graph + } +} + +/// Node for traveling salesman route graph. +#[ derive( Debug, PartialEq, Eq, Hash ) ] +pub struct Node< T > +{ + /// Value of node. + pub value : T, + /// Index of node. + pub index : NodeIndex, +} + +/// Wrapper for index of graph node. +#[ derive( Debug, PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord ) ] +pub struct NodeIndex( pub usize ); + +/// Weight of graph edge. +#[ derive( Debug, From, InnerFrom, Clone, Copy ) ] +pub struct EdgeWeight( pub f64 ); + +/// Edge for undirected weighted graph. +#[ derive( Debug, Clone ) ] +pub struct Edge( NodeIndex, NodeIndex, EdgeWeight ); + +impl Edge +{ + /// Get weight of the edge. + pub fn weight( &self ) -> EdgeWeight + { + self.2 + } +} + +impl Graph for TSPGraph +{ + type N = NodeIndex; + type E = Edge; + fn has_edge( &self, node1 : &Self::N, node2 : &Self::N ) -> bool + { + if let Some( node_vec ) = self.adjacency_list.get( &node1 ) + { + if node_vec.iter().find( | ( n, _ ) | n == node2 ).is_some() + { + return true; + } + } + false + } + + fn get_edge( &self, node1 : &Self::N, node2 : &Self::N ) -> Option< Edge > + { + if let Some( node_vec ) = self.adjacency_list.get( &node1 ) + { + if let Some( ( _, weight ) ) = node_vec.iter().find( | ( n, _ ) | n == node2 ) + { + return Some( Edge( *node1, *node2, *weight ) ); + } + } + None + } + + fn add_edge( &mut self, node1 : Self::N, node2 : Self::N, weight : f64 ) + { + self.adjacency_list.entry( node1 ).or_default().push( ( node2, weight.into() ) ); + self.adjacency_list.entry( node2 ).or_default().push( ( node1, weight.into() ) ); + } + + fn nodes( &self ) -> Vec< NodeIndex > + { + self.adjacency_list.keys().map( | k | *k ).collect_vec() + } +} + +/// Initial configuration of symmetrical traveling salesman problem. +#[ derive( Debug, Clone ) ] +pub struct TSProblem +{ + /// Node to start route from. + pub starting_node : NodeIndex, + + /// Weighted graph with nodes and weighted edges that connect them. + pub graph : TSPGraph, +} + +impl TSProblem +{ + /// Create new instance of Traveling Salesman Problem. + pub fn new( graph : TSPGraph, starting_node : NodeIndex ) -> Self + { + Self { graph, starting_node } + } +} + +/// Possible solution of traveling salesman problem, contains route and its distance. +#[ derive( Debug, PartialEq, Clone ) ] +pub struct TSPerson +{ + /// Route which contains starting node at first and last position and every other node exactly once. + pub route : Vec< NodeIndex >, + + /// Total distance of the route. + pub distance : f64, +} + +impl TSPerson +{ + /// Create new instance of TSPerson from given list of nodes and with defaul distance. + pub fn new( route : Vec< NodeIndex > ) -> Self + { + Self { route, distance : Default::default() } + } +} + +impl Individual for TSPerson +{ + fn fitness( &self ) -> usize + { + self.distance as usize + } + + fn is_optimal( &self ) -> bool + { + false + } + + fn update_fitness( &mut self, value : f64 ) + { + self.distance = value; + } +} + +impl InitialProblem for TSProblem +{ + type Person = TSPerson; + + fn get_random_person( &self, hrng : Hrng ) -> TSPerson + { + let mut list = Vec::new(); + list.push( self.starting_node ); + + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let mut nodes = self.graph.nodes().iter().cloned().sorted_by( | n1, n2 | n1.cmp( &n2 ) ).filter( | &n | n != self.starting_node ).collect_vec(); + deterministic_rand::seq::SliceRandom::shuffle( nodes.as_mut_slice(), &mut *rng ); + + list.append( &mut nodes ); + list.push( self.starting_node ); + let mut person = TSPerson::new( list ); + let dist = self.evaluate( &person ); + + person.update_fitness( dist ); + + person + } + + fn evaluate( &self, person : &TSPerson ) -> f64 + { + let mut dist = 0.0; + for ( node1, node2 ) in person.route.iter().tuple_windows() + { + if let Some( edge ) = self.graph.get_edge( node1, node2 ) + { + dist += f64::from( edge.weight() ) + } + else + { + dist += f64::from( f64::INFINITY ); + } + } + + dist + } +} + +/// Randomly selects a subroute from the first parent and fills the remainder of the route with the nodes from the second parent in the order in which they appear, without duplicating any nodes in the selected subroute from the first parent. +#[ derive( Debug, Clone ) ] +pub struct OrderedRouteCrossover; + +impl CrossoverOperator for OrderedRouteCrossover +{ + type Person = TSPerson; + fn crossover( &self, hrng : Hrng, parent1 : &Self::Person, parent2 : &Self::Person ) -> Self::Person + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let mut child_list = Vec::new(); + + let subroute_point1 = ( 1..parent1.route.len() - 2 ).choose( &mut *rng ).unwrap(); + let subroute_point2 = ( 1..parent1.route.len() - 2 ).choose( &mut *rng ).unwrap(); + + let start = subroute_point1.min( subroute_point2 ); + let end = subroute_point1.max( subroute_point2 ); + + let mut parent1_part = parent1.route.iter().skip( start ).take( end - start ).collect_vec(); + let mut parent2_part = parent2.route.iter().filter( | n | !parent1_part.contains( n ) ).collect_vec(); + + for i in ( 0..parent1.route.len() ).rev() + { + if i >= start && i < end + { + child_list.push( *parent1_part.pop().unwrap() ); + } + else + { + child_list.push( *parent2_part.pop().unwrap() ); + } + } + + child_list.reverse(); + + TSPerson::new( child_list ) + } +} + +/// Randomly mutates route in three different ways: by swapping two nodes, by reversing subroute, or by changing position of subroute. +#[ derive( Debug, Clone ) ] +pub struct TSRouteMutation; + +impl TSRouteMutation +{ + /// Randomly selects subroute(omitting starting node) and reverses it. + pub fn reverse_subroute( hrng : Hrng, person : &mut TSPerson ) + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let ( pos1, pos2 ) = ( 1..person.route.len() - 2 ).choose_multiple( &mut *rng, 2 ).into_iter().collect_tuple().unwrap(); + let start = pos1.min( pos2 ); + let mut end = pos1.max( pos2 ); + + if end - start == 0 + { + end += 1; + } + + let mut new_route = person.route.iter().take( start ).collect_vec(); + new_route.extend( person.route.iter().skip( start ).take( end - start - 1 ).rev() ); + new_route.extend( person.route.iter().skip( end - 1 ) ); + let new_route = new_route.into_iter().map( | n | *n ).collect_vec(); + + person.route = new_route; + } + + /// Randomly chooses two nodes that aren't starting node, and swaps them. + pub fn swap_nodes( hrng : Hrng, person : &mut TSPerson ) + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + + let ( pos1, pos2 ) = ( 1..person.route.len() - 2 ).choose_multiple( &mut *rng, 2 ).into_iter().collect_tuple().unwrap(); + let node1 = person.route[ pos1 ]; + let node2 = std::mem::replace( &mut person.route[ pos2 ], node1 ); + let _ = std::mem::replace( &mut person.route[ pos1 ], node2 ); + } + + /// Randomly selects subroute(omitting starting node) and inserts selected subroute into random position within route. + pub fn move_subroute( hrng :Hrng, person : &mut TSPerson ) + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let ( pos1, pos2, ) = ( 1..person.route.len() - 1 ).choose_multiple( &mut *rng, 2 ).into_iter().collect_tuple().unwrap(); + let start = pos1.min( pos2 ); + let end = pos1.max( pos2 ); + + let mut sub_route = Vec::new(); + sub_route.extend( person.route.iter().take( start ) ); + sub_route.extend( person.route.iter().skip( end ) ); + let insert_position = ( 1..sub_route.len() - 1 ).choose( &mut *rng ).unwrap(); + + let mut new_route = Vec::new(); + new_route.extend( sub_route.iter().take( insert_position ) ); + new_route.extend( person.route.iter().skip( start ).take( end - start ) ); + new_route.extend( sub_route.iter().skip( insert_position ) ); + + person.route = new_route; + } +} + +impl MutationOperator for TSRouteMutation +{ + type Person = TSPerson; + type Problem = TSProblem; + + fn mutate( &self, hrng : Hrng, person : &mut Self::Person, _context : &Self::Problem ) + { + let rng_ref = hrng.rng_ref(); + let mut rng = rng_ref.lock().unwrap(); + let mutation = [ 1, 2, 3 ].choose( &mut *rng ).unwrap(); + + drop( rng ); + + match mutation + { + 1 => Self::move_subroute( hrng.clone(), person ), + 2 => Self::reverse_subroute( hrng.clone(), person ), + 3 => Self::swap_nodes( hrng.clone(), person ), + _ => unreachable!() + } + } +} diff --git a/module/move/optimization_tools/src/simplex/drawing.rs b/module/move/optimization_tools/src/simplex/drawing.rs new file mode 100644 index 0000000000..bed0fc15dd --- /dev/null +++ b/module/move/optimization_tools/src/simplex/drawing.rs @@ -0,0 +1,113 @@ +//! Tools for graphical representation of two dimensional linear programming problem. +//! + +use plotters:: +{ + backend::BitMapBackend, + drawing::IntoDrawingArea, + element::{ Circle, EmptyElement }, + series::{ LineSeries, PointSeries, AreaSeries }, + style:: + { + full_palette::{ BLACK, WHITE, RED }, + Color, IntoFont, + }, + chart::ChartBuilder +}; +use std::{ env, path::{ PathBuf, Path }, process::Command }; +use super::{ solver::ExtremePoint, linear_problem::Problem }; + +/// Get path of workspace or return current if fail to get path of workspace. +pub fn workspace_dir() -> PathBuf +{ + let output = Command::new( env!( "CARGO" ) ) + .arg( "locate-project" ) + .arg( "--workspace" ) + .arg( "--message-format=plain" ) + .output() + ; + if let Ok( output ) = output + { + let path = output.stdout; + let cargo_path = Path::new( std::str::from_utf8( &path ).unwrap().trim() ); + cargo_path.parent().unwrap().to_path_buf() + } + else + { + std::env::current_dir().unwrap() + } +} + +/// Create plot with linear programming problem. +pub fn draw_problem +( + problem : &Problem, + extreme_points : Vec< ExtremePoint >, + file_name : String, +) -> Result< (), Box< dyn std::error::Error > > +{ + let dir_path = format!( "{}/target/plots", workspace_dir().to_string_lossy() ); + _ = std::fs::create_dir( &dir_path ); + let path = format!( "{}/{}.png", dir_path, file_name ); + let root = BitMapBackend::new( &path, ( 640, 480 ) ).into_drawing_area(); + root.fill( &WHITE )?; + let mut chart = ChartBuilder::on( &root ) + .caption( "2d problem", ( "sans-serif", 30 ).into_font() ) + .margin( 15 ) + .x_label_area_size( 40 ) + .y_label_area_size( 40 ) + .build_cartesian_2d( 0f32..20f32, 0f32..20f32 )?; + + chart.configure_mesh().draw()?; + + //constraints + for constraint in &problem.constraints + { + let mut series = Vec::new(); + + let mut x = 0f32; + let mut y = ( ( constraint.value - x as f64 * constraint.coefs[ 0 ] ) / constraint.coefs[ 1 ] ) as f32; + series.push( ( x, y ) ); + y = 0f32; + x = ( ( constraint.value - x as f64 * constraint.coefs[ 1 ] ) / constraint.coefs[ 0 ] ) as f32; + + series.push( ( x, y ) ); + + chart.draw_series( LineSeries::new + ( + series.iter().map( | ( x, y ) | ( *x, *y ) ), + &BLACK, + ) )?; + + chart.draw_series + ( + AreaSeries::new + ( + series.iter().map( | ( x, y ) | ( *x, *y ) ), + 0.0, + RED.mix( 0.2 ), + ) + .border_style( RED ), + )?; + } + // extreme points + chart.draw_series( PointSeries::of_element + ( + extreme_points.into_iter().map( | p | ( p.point[ 0 ] as f32, p.point[ 1 ] as f32 ) ), + 2, + &BLACK, + &| c, s, _st | + { + EmptyElement::at( ( c.0, c.1 ) ) + Circle::new + ( + ( 0, 0 ), + s, + ( &BLACK ).filled(), + ) + }, + ) )?; + + root.present()?; + + Ok( () ) +} diff --git a/module/move/optimization_tools/src/simplex/linear_problem.rs b/module/move/optimization_tools/src/simplex/linear_problem.rs new file mode 100644 index 0000000000..8e1ab239cb --- /dev/null +++ b/module/move/optimization_tools/src/simplex/linear_problem.rs @@ -0,0 +1,207 @@ +//! Structs that represent linear programming problem and its components. +//! + +use iter_tools::Itertools; +use ndarray::{ Array1, Array2, ArrayBase }; + +/// Variable of objective function. +#[ derive( Clone, Debug, PartialEq ) ] +pub struct Variable +{ + /// Variable coefficient. + pub coefficient : f64, + /// Upper bound of variable. + pub max : f64, + /// Lower bound of variable. + pub min : f64, +} + +impl Variable +{ + /// Create new objective function variable with coefficient. + pub fn new( coeff : f64 ) -> Self + { + Self { coefficient : coeff, min : f64::MIN, max : f64::MAX } + } + + /// Add max value for objective function variable. + pub fn max( self, max : f64 ) -> Self + { + Self { max, coefficient : self.coefficient, min : self.min } + } + + /// Add min value for objective function variable. + pub fn min( self, min : f64 ) -> Self + { + Self { min, coefficient : self.coefficient, max : self.max } + } + + /// Check if given value satisfies max and min restrictions of variable. + pub fn is_in_bounds( &self, val : f64 ) -> bool + { + if val >= self.min && val <= self.max + { + true + } + else + { + false + } + } +} + +/// Represents inequation constraint. +#[ derive( Clone, Debug, PartialEq ) ] +pub struct Constraint +{ + /// Coefficients of variables in inequation. + pub coefs : Vec< f64 >, + /// Right-hand constant value. + pub value : f64, + /// Type of comparison. + pub comparison : Comp, +} + +/// Type of comparison in inequation. +#[ derive( Clone, Debug, PartialEq ) ] +pub enum Comp +{ + /// Less than comparison. + Less, + /// Greater than comparison. + Greater, + /// Constraint is equation. + Equal, +} + +impl Constraint +{ + /// Create new constraint. + pub fn new( coefs : Vec< f64 >, value : f64, comparison : Comp ) -> Self + { + Self + { + coefs, + value, + comparison, + } + } +} + +/// Represents linear problem. +#[ derive( Clone, Debug ) ] +pub struct Problem +{ + /// Coefficients of variables in function to optimize. + pub var_coeffs : Vec< f64 >, + /// Set of inequation constraints. + pub constraints : Vec< Constraint >, + variables : Vec< Variable >, +} + +impl Problem +{ + /// Create new linear problem. + pub fn new( vars : Vec< Variable >, constraints : Vec< Constraint > ) -> Self + { + Self { var_coeffs : vars.iter().map( | var | var.coefficient ).collect_vec(), constraints, variables : vars } + } + + /// Create normalized problem from linear programming problem. + pub fn normalized( &self ) -> NormalizedProblem + { + let mut equations_coefficients = Vec::new(); + let mut vars = self.variables.clone(); + + for i in 1..=self.constraints.len() + { + let mut coeffs = self.constraints[ i - 1 ].coefs.clone(); + for _ in 1..=self.constraints.len() + { + coeffs.push( 0.0 ); + } + match self.constraints[ i - 1 ].comparison + { + Comp::Less => + { + coeffs[ self.var_coeffs.len() + i - 1 ] = 1.0; + vars.push( Variable::new( 0.0 ).min( 0.0 ) ); + } + Comp::Greater => + { + coeffs[ self.var_coeffs.len() + i - 1 ] = -1.0; + vars.push( Variable::new( 0.0 ).min( 0.0 ) ); + } + Comp::Equal => {} + } + equations_coefficients.push( coeffs ); + + } + + NormalizedProblem::new + ( + &equations_coefficients, + &self.constraints.iter().map( | c | c.value ).collect_vec(), + &vars, + ) + } + +} + +/// Represents normalized linear problem. +#[ derive( Clone, Debug ) ] +pub struct NormalizedProblem +{ + /// Coefficients of normalized equations. + pub coeffs : Array2< f64 >, + /// Rhs values of equations. + pub rhs : Array1< f64 >, + /// Variables of objective function. + pub variables : Vec< Variable >, +} + +impl NormalizedProblem +{ + /// Create new normalized problem. + pub fn new( matrix : &Vec< Vec< f64 > >, rhs : &Vec< f64 >, vars : &Vec< Variable > ) -> Self + { + Self + { + coeffs : Array2::from_shape_vec + ( + ( matrix.len(), matrix[ 0 ].len() ), + matrix.iter().flat_map( | vec | vec.clone() ).collect_vec() + ).unwrap(), + rhs : ArrayBase::from_vec( rhs.clone() ), + variables : vars.clone(), + } + } + + /// Check if basic solution is feasible. + pub fn is_feasible_solution( &self, bs : &BasicSolution ) -> bool + { + for ( index, bv ) in bs.bv.iter().enumerate() + { + if let Some( var ) = self.variables.get( bv - 1 ) + { + if !var.is_in_bounds( bs.bv_values[ index ] ) + { + return false; + } + } + } + true + } +} + +/// Basic solution of linear problem. +#[ derive( Clone, Debug ) ] +pub struct BasicSolution +{ + /// Non-basic variables indices. + pub nbv : Vec< usize >, + /// Basic variables indices. + pub bv : Vec< usize >, + /// Basic variables values. + pub bv_values : Vec< f64 >, +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/simplex/mod.rs b/module/move/optimization_tools/src/simplex/mod.rs new file mode 100644 index 0000000000..e8bf16bc73 --- /dev/null +++ b/module/move/optimization_tools/src/simplex/mod.rs @@ -0,0 +1,13 @@ +//! Contains implementation of Simplex optimization method. +//! + +pub mod solver; +pub use solver::*; +pub mod drawing; +pub use drawing::*; +pub mod linear_problem; +pub use linear_problem::*; +#[ cfg( feature = "lp_parse" ) ] +pub mod parser; +#[ cfg( feature = "lp_parse" ) ] +pub use parser::*; diff --git a/module/move/optimization_tools/src/simplex/parser.rs b/module/move/optimization_tools/src/simplex/parser.rs new file mode 100644 index 0000000000..62d916f50b --- /dev/null +++ b/module/move/optimization_tools/src/simplex/parser.rs @@ -0,0 +1,105 @@ +//! Parser for linear programming problem. +//! + +use super::linear_problem::{ Problem, Variable, Constraint, Comp }; +use exmex::{ prelude::*, ops_factory, BinOp, MakeOperators, Operator }; +use iter_tools::Itertools; +use std::collections::HashSet; + +/// Parses linear programming problem from str to Problem struct. +#[ derive( Debug ) ] +pub struct ProblemParser {} + +impl ProblemParser +{ + /// Creates Problem struct from objective function and constraints passed as string slices. + pub fn parse( opt_function : &str, constraints_str : Vec< &str > ) -> Problem + { + ops_factory! + ( + BitwiseOpsFactory, + bool, + Operator::make_bin + ( + "<=", + BinOp + { + apply : | a, b | a <= b, + prio : 0, + is_commutative : false, + } + ) + ); + + let mut z_coeffs = Vec::new(); + + let z_expr = FlatEx::< f64 >::parse( opt_function ).unwrap(); + let var_number = z_expr.var_indices_ordered().len(); + let var_names = z_expr.var_names().into_iter().cloned().collect::< HashSet< _ > >(); + for val in 0..var_number + { + let deep_ex = z_expr.clone().to_deepex().unwrap(); + let coeff = deep_ex.partial( val ).unwrap(); + z_coeffs.push( coeff.eval( vec![ 0.0; var_number ].as_slice() ).unwrap() ); + } + + let mut constraints = Vec::new(); + for constraint in &constraints_str + { + let mut left_hand = ""; + let mut right_hand = ""; + let mut comp = Comp::Less; + if constraint.contains( "<=" ) + { + ( left_hand, right_hand ) = constraint.split( "<=" ).collect_tuple().unwrap(); + } + + if constraint.contains( ">=" ) + { + ( left_hand, right_hand ) = constraint.split( ">=" ).collect_tuple().unwrap(); + comp = Comp::Greater; + } + + let mut coeffs = Vec::new(); + let mut expr = FlatEx::< f64 >::parse( left_hand ).unwrap(); + + let con_var_names = expr.var_names(); + let con_var_names = con_var_names.into_iter().cloned().collect::< HashSet< _ > >(); + let unused_vars = var_names.difference( &con_var_names ); + for unused_var in unused_vars + { + expr = expr.operate_binary( FlatEx::< f64 >::parse + ( + ( String::from( "0*" ) + unused_var ).as_str() + ).unwrap(), "+" ) + .unwrap() + ; + } + let var_number = expr.var_indices_ordered().len(); + for val in 0..var_number + { + let deep_ex = expr.clone().to_deepex().unwrap(); + let coeff = deep_ex.partial( val ).unwrap(); + coeffs.push( coeff.eval( vec![ 0.0; var_number ].as_slice() ).unwrap() ); + } + constraints.push( Constraint + { + coefs : coeffs, + value : FlatEx::< f64 >::parse( right_hand ).unwrap().eval( &[] ).unwrap(), + comparison : comp, + } ); + } + + let variables = z_coeffs + .into_iter() + .map( | coeff | Variable::new( coeff ).min( 0.0 ) ) + .collect_vec() + ; + + Problem::new + ( + variables, + constraints, + ) + } +} \ No newline at end of file diff --git a/module/move/optimization_tools/src/simplex/solver.rs b/module/move/optimization_tools/src/simplex/solver.rs new file mode 100644 index 0000000000..775f05f5f7 --- /dev/null +++ b/module/move/optimization_tools/src/simplex/solver.rs @@ -0,0 +1,376 @@ +//! Solver of linear programming problems by Simplex Method. +//! + +use std::collections::HashSet; +use iter_tools::Itertools; +use super::linear_problem::{ Problem, BasicSolution }; + +/// Extreme point of feasible region. +#[ derive( Clone, Debug ) ] +pub struct ExtremePoint +{ + /// Basic variables indices. + bv : Vec< usize >, + /// Extreme point coordinates. + pub point : Vec< f64 >, + /// Value of function to optimize. + z : f64, +} + +impl PartialEq for ExtremePoint { + fn eq(&self, other: &Self) -> bool { + self.point == other.point + } +} + +impl Eq for ExtremePoint {} + +impl Default for ExtremePoint +{ + fn default() -> Self + { + Self { bv : Vec::new(), point : Vec::new(), z : f64::MAX } + } +} + +impl ExtremePoint +{ + /// Create new extreme point from basic solution and coeffiicients of function to optimize. + pub fn new( solution : BasicSolution, problem_coeffs : Vec< f64 > ) -> Self + { + let m = solution.bv.len(); + let mut point = vec![ 0.0; m ]; + for index in 1..= m + { + if solution.bv.contains( &index ) + { + point[ index - 1 ] = solution.bv_values[ solution.bv.iter().position( | a | *a == index ).unwrap() ]; + } + } + + let z = problem_coeffs + .iter() + .zip( &point ) + .fold( 0.0, | sum, elem | sum + elem.0 * elem.1 ) + ; + + Self + { + bv : solution.bv, + point, + z, + } + } + /// Checks if two extreme points is adjacent. + pub fn is_adjacent( &self, other : &ExtremePoint ) -> bool + { + let bv = self.bv.iter().collect::< HashSet< _ > >(); + let other_bv = other.bv.iter().collect::< HashSet< _ > >(); + if bv.intersection( &other_bv ).collect_vec().len() == bv.len() - 1 + { + return true; + } + false + } +} + +impl PartialOrd for ExtremePoint +{ + fn partial_cmp( &self, other : &Self ) -> Option< std::cmp::Ordering > + { + Some( self.z.partial_cmp( &other.z ).unwrap() ) + } +} + +impl Ord for ExtremePoint +{ + fn cmp( &self, other : &Self ) -> std::cmp::Ordering + { + self.z.partial_cmp( &other.z ).unwrap() + } +} + +/// Implementation of Simplex method solver. +#[ derive( Debug ) ] +pub struct SimplexSolver {} + +impl SimplexSolver +{ + /// Calculates extreme points of linear problem. + pub fn extreme_points ( p : &mut Problem ) -> Vec< ExtremePoint > + { + let bfs = Self::basic_feasible_solutions( p.clone() ); + let extreme_points = bfs + .into_iter() + .map( | s | ExtremePoint::new( s, p.var_coeffs.clone() ) ) + .collect::< Vec< ExtremePoint > >() + ; + + extreme_points + } + + /// Calculates basic feasible solutions for linear problem. + fn basic_feasible_solutions( p : Problem ) -> Vec< BasicSolution > + { + let total_variables_number = p.var_coeffs.len() + p.constraints.len(); + let basic_variables_number = p.var_coeffs.len(); + let non_basic_variables_number = p.constraints.len(); + let number_of_basic_solutions : u128 = ( 1..=total_variables_number as u128 ).product::< u128 >() + / ( ( 1..=basic_variables_number as u128 ).product::< u128 >() * ( 1..=non_basic_variables_number as u128 ).product::< u128 >() ); + + let p = p.normalized(); + + let mut bs = vec![ BasicSolution + { + bv_values: vec![ -1.0; basic_variables_number ], + bv: vec![ 0; basic_variables_number ], + nbv: vec![ 0; non_basic_variables_number ] + }; + number_of_basic_solutions as usize ]; + + let mut result = ( 1..=total_variables_number ) + .into_iter() + .map( | elem | { HashSet::from( [ elem ] ) } ) + .collect_vec() + ; + + for _ in 0..basic_variables_number + { + result = ( 1..=total_variables_number ) + .cartesian_product( result ).map( | ( elem, mut set ) | + { + set.insert( elem ); + set + } ) + .collect_vec() + ; + } + + let mut result = result + .into_iter() + .filter( | set | set.len() == basic_variables_number ) + .collect_vec() + ; + + let mut final_result = Vec::with_capacity(number_of_basic_solutions as usize); + while let Some( combination ) = result.pop() + { + if !result.contains( &combination ) + { + final_result.push( combination ); + } + } + + for ( index, bs ) in bs.iter_mut().enumerate() + { + bs.bv = final_result[ index ].clone().iter().map( | elem | *elem ).collect_vec(); + bs.bv.sort(); + } + + for basic_solution in bs.iter_mut() + { + let indices = ( 1..=total_variables_number ).into_iter().collect::< HashSet< _ > >(); + let bv_set = basic_solution.bv.clone().into_iter().collect::< HashSet< _ > >(); + let set = indices.difference( &bv_set ); + basic_solution.nbv = set.into_iter().map( | elem | *elem ).collect_vec(); + } + for basic_solution in bs.iter_mut() + { + let rows = basic_solution.nbv.len(); + let columns = basic_solution.bv.len(); + + let mut m = ndarray::Array::zeros( ( rows, columns ) ); + for ( index, bv ) in basic_solution.bv.iter().enumerate() + { + for i in 0..m.shape()[ 1 ] + { + m.row_mut( i )[ index ] = p.coeffs.row( i )[ bv - 1 ]; + } + } + + let b = faer::Mat::from_fn( p.rhs.len(), 1, | i, _ | p.rhs[ i ] ); + let m = faer::IntoFaer::into_faer( m.view() ); + let lu = faer::FaerMat::partial_piv_lu( &m ); + + let solution = faer::sparse::solvers::SpSolver::solve(&lu, &b); + + basic_solution.bv_values = solution.col_as_slice(0).iter().map( | a | *a ).collect_vec(); + } + + bs.into_iter().filter( | bs | p.is_feasible_solution( bs ) ).collect_vec() + + } + + /// Solves linear problem using Simplex method. + pub fn solve( &self, p : Problem ) -> Vec< ExtremePoint > + { + let basic_variables_number = p.var_coeffs.len(); + + let p = p.normalized(); + let mut table = Vec::new(); + + let mut z_coeff = p.variables.iter().map( | var | -var.coefficient ).collect_vec(); + + z_coeff.push( 0.0 ); + table.push( z_coeff ); + + for i in 0..p.coeffs.shape()[ 0 ] + { + let vec_rhs = p.coeffs.row( i ).clone(); + let mut vec_rhs = vec_rhs.to_slice().unwrap().to_vec(); + vec_rhs.push( p.rhs[ i ] ); + table.push( vec_rhs ); + } + + let mut points = Vec::new(); + let mut candidate = ExtremePoint::default(); + + loop + { + let mut bv_pos = Vec::new(); + let mut nbv_pos = Vec::new(); + + for j in 0..table[ 0 ].len() - 1 + { + let mut is_bv = true; + let mut non_zero_count = 0; + for i in 1..table.len() + { + if table[ i ][ j ].abs() != 0.0 + { + non_zero_count += 1; + if table[ i ][ j ].abs() != 1.0 + { + is_bv = false; + } + } + } + + if is_bv && non_zero_count == 1 + { + bv_pos.push( j + 1 ); + for i in 1..table.len() + { + if table[ i ][ j ] == -1.0 + { + for k in 0..table[ 0 ].len() + { + table[ i ][ k ] = - table[ i ][ k ]; + } + } + } + } + else + { + nbv_pos.push( j + 1 ); + } + } + + let mut initial_bs = BasicSolution + { + bv_values: vec![ -1.0; basic_variables_number ], + bv: bv_pos, + nbv: nbv_pos, + }; + + let rows = initial_bs.nbv.len(); + let columns = initial_bs.bv.len(); + + let mut m = ndarray::Array::zeros( ( rows, columns ) ); + for ( index, bv ) in initial_bs.bv.iter().enumerate() + { + for i in 0..m.shape()[ 1 ] + { + m.row_mut( i )[ index ] = p.coeffs.row( i )[ bv - 1 ]; + } + } + + let b = faer::Mat::from_fn( p.rhs.len(), 1, | i, _ | p.rhs[ i ] ); + let m = faer::IntoFaer::into_faer( m.view() ); + let lu = faer::FaerMat::partial_piv_lu( &m ); + + let solution = faer::sparse::solvers::SpSolver::solve( &lu, &b ); + + initial_bs.bv_values = solution.col_as_slice( 0 ).iter().map( | a | *a ).collect_vec(); + + let initial_point = ExtremePoint::new( initial_bs.clone(), p.variables.iter().map( | var | var.coefficient ).collect_vec() ); + + let mut min_coeff = f64::MAX; + let mut pos = 0; + for ( index, coeff ) in table[ 0 ].iter().enumerate() + { + if initial_bs.nbv.contains( &( index + 1 ) ) + { + if coeff < &min_coeff + { + min_coeff = *coeff; + pos = index + 1; + } + } + } + + if candidate.z == initial_point.z + { + if !points.contains( &initial_point ) + { + points.push(initial_point.clone()); + } + break; + } + + if min_coeff == 0.0 + { + if !points.contains( &initial_point ) + { + points.push(initial_point.clone()); + } + if points.len() > initial_bs.bv.len() + { + break; + } + } + + if min_coeff > 0.0 + { + points.push( initial_point.clone() ); + break; + } + candidate = initial_point; + + let mut var_row = 1; + let mut r = table[ 1 ].last().unwrap() / table[ 1 ][ pos - 1 ]; + for i in 2..table.len() + { + let row_r = table[ i ].last().unwrap() / table[ i ][ pos - 1 ]; + if row_r < r + { + r = row_r; + var_row = i; + } + } + + + let mut new_table = table.clone(); + for i in 0..table[ 0 ].len() + { + new_table[ var_row ][ i ] = table[ var_row ][ i ] / table[ var_row ][ pos - 1 ]; + } + + for i in 0..table.len() + { + if i == var_row + { + continue; + } + let coeff = table[ i ][ pos - 1 ]; + for j in 0..table[ 0 ].len() + { + new_table[ i ][ j ] = table[ i ][ j ] - new_table[ var_row ][ j ] * coeff; + } + } + table = new_table; + }; + + points + } +} diff --git a/module/move/optimization_tools/sudoku_results.md b/module/move/optimization_tools/sudoku_results.md new file mode 100644 index 0000000000..d6b9c2b786 --- /dev/null +++ b/module/move/optimization_tools/sudoku_results.md @@ -0,0 +1,264 @@ +# Sudoku Problem + +## For hybrid: + + - max number of iterations: 50 + + - max no improvement iterations : 10 + + - improvement threshold : 0.005s + + - termination reason: NoImprovement + + - iterations number: 48 + + - resumed after stale: 8 + + - points from cache: 43/133 + + - level: Easy + + - execution time: 0.117s + + - parameters: + +``` +┌─────────────┬────────┬────────┬─────────┬─────────────┬──────────┬─────────┬────────┠+│ │ start │ min │ max │ sum of diff │ expected │ changes │ final │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ temperature │ 0.4043 │ 0.00 │ 1.00 │ 0.10 │ 0.00 │ 41 │ 1.0000 │ +│ decrease │ │ │ │ │ │ │ │ +│ coefficient │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 37 │ 10.00 │ 200.00 │ 8265.03 │ 65.08 │ 41 │ 177 │ +│ mutations │ │ │ │ │ │ │ │ +│ per │ │ │ │ │ │ │ │ +│ dynasty │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ mutation │ 0.16 │ 0.00 │ 1.00 │ 17.64 │ 0.14 │ 41 │ 0.41 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ crossover │ 0.93 │ 0.00 │ 1.00 │ 42.41 │ 0.33 │ 41 │ 0.10 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ elitism │ -0.09 │ - │ - │ - │ - │ - │ 0.49 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 30 │ 1.00 │ 100.00 │ 160.48 │ 1.26 │ 41 │ 31 │ +│ stale │ │ │ │ │ │ │ │ +│ iterations │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ population │ 549 │ 1.00 │ 1000.00 │ 33602.75 │ 264.59 │ 41 │ 11 │ +│ size │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ dynasties │ 439 │ 100.00 │ 2000.00 │ 58761.38 │ 462.69 │ 41 │ 1521 │ +│ limit │ │ │ │ │ │ │ │ +└─────────────┴────────┴────────┴─────────┴─────────────┴──────────┴─────────┴────────┘ +``` + + +#### List: + + + - `max number of iterations` : limit of total iterations of optimization process, termination condition + - `max no improvement iterations` : max amount of steps performed without detected improvement, termination condition + - `improvement threshold` : minimal value detected as improvement in objective function result + - `termination reason` : the reason why optimization process was stopped + - `iterations number` : actual number of iterations performed during optimization + - `resumed after stale` : how many times optimization progress was resumed after some iterations without improvement + - `points from cache` : points calculated during previous optimizations and read from cache + - `level` : sudoku board difficulty level + - `execution time` : duration of shortest found hybrid optimization process using final parameters, measured in seconds +#### Table: + - `start` : initial value of parameter in starting point + - `min` : lower bound of parameter + - `max` : upper bound of parameter + - `sum of diff` : sum of absolute differences between starting value and next value + - `expected` : mathematical expectation of difference between starting value and next value + - `changes` : number of successful changes of parameter value to more optimal + - `final` : calculated value of parameter for which execution time was the lowest +## For SA: + + - max number of iterations: 50 + + - max no improvement iterations : 10 + + - improvement threshold : 0.005s + + - termination reason: NoImprovement + + - iterations number: 12 + + - resumed after stale: 1 + + - points from cache: 31/32 + + - level: Easy + + - execution time: 0.026s + + - parameters: + +``` +┌─────────────┬────────┬────────┬─────────┬─────────────┬──────────┬─────────┬────────┠+│ │ start │ min │ max │ sum of diff │ expected │ changes │ final │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ temperature │ 0.8244 │ 0.00 │ 1.00 │ 0.83 │ 0.03 │ 11 │ 0.9554 │ +│ decrease │ │ │ │ │ │ │ │ +│ coefficient │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 157 │ 10.00 │ 200.00 │ 423.98 │ 17.67 │ 11 │ 116 │ +│ mutations │ │ │ │ │ │ │ │ +│ per │ │ │ │ │ │ │ │ +│ dynasty │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ mutation │ 1.00 │ 1.00 │ 1.00 │ 0.00 │ 0.00 │ 0 │ 1.00 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ crossover │ 0.00 │ 0.00 │ 0.00 │ 0.00 │ 0.00 │ 1 │ 0.00 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ elitism │ -0.00 │ - │ - │ - │ - │ - │ 0.00 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 67 │ 1.00 │ 100.00 │ 265.64 │ 11.07 │ 11 │ 39 │ +│ stale │ │ │ │ │ │ │ │ +│ iterations │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ population │ 1 │ 1.00 │ 1.00 │ 0.00 │ 0.00 │ 0 │ 1 │ +│ size │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ dynasties │ 3455 │ 100.00 │ 5000.00 │ 17618.46 │ 734.10 │ 11 │ 1646 │ +│ limit │ │ │ │ │ │ │ │ +└─────────────┴────────┴────────┴─────────┴─────────────┴──────────┴─────────┴────────┘ +``` + + +#### List: + + + - `max number of iterations` : limit of total iterations of optimization process, termination condition + - `max no improvement iterations` : max amount of steps performed without detected improvement, termination condition + - `improvement threshold` : minimal value detected as improvement in objective function result + - `termination reason` : the reason why optimization process was stopped + - `iterations number` : actual number of iterations performed during optimization + - `resumed after stale` : how many times optimization progress was resumed after some iterations without improvement + - `points from cache` : points calculated during previous optimizations and read from cache + - `level` : sudoku board difficulty level + - `execution time` : duration of shortest found hybrid optimization process using final parameters, measured in seconds +#### Table: + - `start` : initial value of parameter in starting point + - `min` : lower bound of parameter + - `max` : upper bound of parameter + - `sum of diff` : sum of absolute differences between starting value and next value + - `expected` : mathematical expectation of difference between starting value and next value + - `changes` : number of successful changes of parameter value to more optimal + - `final` : calculated value of parameter for which execution time was the lowest +## For GA: + + - max number of iterations: 50 + + - max no improvement iterations : 10 + + - improvement threshold : 0.005s + + - termination reason: NoImprovement + + - iterations number: 30 + + - resumed after stale: 4 + + - points from cache: 87/93 + + - level: Easy + + - execution time: 0.175s + + - parameters: + +``` +┌─────────────┬────────┬────────┬─────────┬─────────────┬──────────┬─────────┬────────┠+│ │ start │ min │ max │ sum of diff │ expected │ changes │ final │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ temperature │ 0.3698 │ 0.00 │ 1.00 │ 4.51 │ 0.05 │ 25 │ 0.9432 │ +│ decrease │ │ │ │ │ │ │ │ +│ coefficient │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 108 │ 10.00 │ 200.00 │ 751.96 │ 8.74 │ 25 │ 109 │ +│ mutations │ │ │ │ │ │ │ │ +│ per │ │ │ │ │ │ │ │ +│ dynasty │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ mutation │ 0.22 │ 0.10 │ 1.00 │ 4.71 │ 0.05 │ 25 │ 0.32 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ crossover │ 0.16 │ 0.10 │ 1.00 │ 3.75 │ 0.04 │ 25 │ 0.54 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ elitism │ 0.61 │ - │ - │ - │ - │ - │ 0.15 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 61 │ 1.00 │ 100.00 │ 523.70 │ 6.09 │ 25 │ 35 │ +│ stale │ │ │ │ │ │ │ │ +│ iterations │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ population │ 1743 │ 10.00 │ 2000.00 │ 29942.40 │ 348.17 │ 25 │ 12 │ +│ size │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ dynasties │ 1626 │ 100.00 │ 2000.00 │ 10424.65 │ 121.22 │ 25 │ 1092 │ +│ limit │ │ │ │ │ │ │ │ +└─────────────┴────────┴────────┴─────────┴─────────────┴──────────┴─────────┴────────┘ +``` + + +#### List: + + + - `max number of iterations` : limit of total iterations of optimization process, termination condition + - `max no improvement iterations` : max amount of steps performed without detected improvement, termination condition + - `improvement threshold` : minimal value detected as improvement in objective function result + - `termination reason` : the reason why optimization process was stopped + - `iterations number` : actual number of iterations performed during optimization + - `resumed after stale` : how many times optimization progress was resumed after some iterations without improvement + - `points from cache` : points calculated during previous optimizations and read from cache + - `level` : sudoku board difficulty level + - `execution time` : duration of shortest found hybrid optimization process using final parameters, measured in seconds +#### Table: + - `start` : initial value of parameter in starting point + - `min` : lower bound of parameter + - `max` : upper bound of parameter + - `sum of diff` : sum of absolute differences between starting value and next value + - `expected` : mathematical expectation of difference between starting value and next value + - `changes` : number of successful changes of parameter value to more optimal + - `final` : calculated value of parameter for which execution time was the lowest +## Summary: +``` +┌────────┬─────────────┬───────────┬──────────┬───────────┬─────────┬────────────┬────────────┬───────────┬───────────┠+│ mode │ temperature │ max │ mutation │ crossover │ elitism │ max │ population │ dynasties │ execution │ +│ │ decrease │ mutations │ rate │ rate │ rate │ stale │ size │ limit │ time │ +│ │ coefficient │ per │ │ │ │ iterations │ │ │ │ +│ │ │ dynasty │ │ │ │ │ │ │ │ +├────────┼─────────────┼───────────┼──────────┼───────────┼─────────┼────────────┼────────────┼───────────┼───────────┤ +│ hybrid │ 1.0000 │ 177 │ 0.41 │ 0.10 │ 0.49 │ 31 │ 11 │ 1521 │ 0.117s │ +├────────┼─────────────┼───────────┼──────────┼───────────┼─────────┼────────────┼────────────┼───────────┼───────────┤ +│ SA │ 0.9554 │ 116 │ 1.00 │ 0.00 │ 0.00 │ 39 │ 1 │ 1646 │ 0.026s │ +├────────┼─────────────┼───────────┼──────────┼───────────┼─────────┼────────────┼────────────┼───────────┼───────────┤ +│ GA │ 0.9432 │ 109 │ 0.32 │ 0.54 │ 0.15 │ 35 │ 12 │ 1092 │ 0.175s │ +└────────┴─────────────┴───────────┴──────────┴───────────┴─────────┴────────────┴────────────┴───────────┴───────────┘ +``` + + - `temperature decrease coefficient` : coefficient by which temperature is lowered at each iteration of optimization process + - `max mutations per dynasty` : max number of mutations used to produce vital individual in dynasty + - `mutation rate` : percent of individuals in population that are created using mutation + - `crossover rate` : percent of individuals in population that are created using crossover of selected parents + - `elitism rate` : percent of most fit individuals in population that are cloned without changes + - sum of mutation rate, crossover rate and elitism rate always equals 1 + - `max stale iterations` : max allowed number of iterations that do not produce individuals with better fittness + - `population size` : number of individuals in population + - `dynasties limit` : max number of dynasties of new solutions produced during optimization process, terminates if exceeded + - `execution time` : time spent searching for optimal solution, measured in seconds +## To run: + - Sudoku problem: +`cargo test -- --ignored find_opt_params_sudoku` + - Traveling salesman problem: +`cargo test -- --ignored find_opt_params_tsp` diff --git a/module/move/optimization_tools/sudoku_results_old.md b/module/move/optimization_tools/sudoku_results_old.md new file mode 100644 index 0000000000..b53f4a5c93 --- /dev/null +++ b/module/move/optimization_tools/sudoku_results_old.md @@ -0,0 +1,47 @@ +Sudoku Problem + +For parameters: + - temperature decrease coefficient : 0.9991; + - max mutations per dynasty : 307; + - mutation rate : 0.29; + - crossover rate : 0.50; + - elitism rate : 0.21; + - max stale iterations : 31; + + +| Level | Population size | Dynasties limit | Execution time | +|----------------------|----------------------|----------------------|----------------------|- +| Easy | 116 | 1110 | 0.571s | + + + +For parameters: + - temperature decrease coefficient : 0.9992; + - max mutations per dynasty : 299; + - mutation rate : 1.00; + - crossover rate : 0.00; + - elitism rate : 0.00; + - max stale iterations : 29; + + +| Level | Population size | Dynasties limit | Execution time | +|----------------------|----------------------|----------------------|----------------------|- +| Easy | 1 | 115 | 0.052s | + + + +For parameters: + - temperature decrease coefficient : 0.9991; + - max mutations per dynasty : 285; + - mutation rate : 0.24; + - crossover rate : 0.46; + - elitism rate : 0.30; + - max stale iterations : 32; + + +| Level | Population size | Dynasties limit | Execution time | +|----------------------|----------------------|----------------------|----------------------|- +| Easy | 265 | 1167 | 0.709s | + + + diff --git a/module/move/optimization_tools/tests/board.rs b/module/move/optimization_tools/tests/board.rs new file mode 100644 index 0000000000..e3b62ac413 --- /dev/null +++ b/module/move/optimization_tools/tests/board.rs @@ -0,0 +1,309 @@ +use optimization_tools::*; +use problems::sudoku::*; +use test_tools::prelude::*; +use deterministic_rand::Hrng; + +// #[ macro_export ] +// macro_rules! cells_container +// { +// ( $( $Tokens : tt )+ ) => +// {{ +// [ $( $Tokens )+ ].into_iter().map( | e | e.into() ).collect() +// }} +// } + +// zzz : move to iter_tools, maybe +fn each_into< T, IntoIter, IntoCellVal >( src : IntoIter ) -> impl Iterator< Item = T > +where + IntoIter : IntoIterator< Item = IntoCellVal >, + IntoCellVal : Into< T >, +{ + src.into_iter().map( | e | e.into() ) +} + +#[ test ] +fn from_string() +{ + let src = " +310 000 020 +006 109 005 +000 080 000 + +020 804 050 +004 070 000 +000 060 008 + +060 000 900 +009 405 001 +000 007 000 +"; + let got : Board = src.into(); + let storage : Vec< CellVal > = each_into + ([ + 3,1,0, 0,0,0, 0,2,0, + 0,0,6, 1,0,9, 0,0,5, + 0,0,0, 0,8,0, 0,0,0, + 0,2,0, 8,0,4, 0,5,0, + 0,0,4, 0,7,0, 0,0,0, + 0,0,0, 0,6,0, 0,0,8, + 0,6,0, 0,0,0, 9,0,0, + 0,0,9, 4,0,5, 0,0,1, + 0,0,0, 0,0,7, 0,0,0, + ]).collect(); + let exp = Board::new( storage ); + a_id!( got, exp ); +} + +#[ test ] +fn cell() +{ + + let board = Board::default(); + let mut cells = board.cells(); + + assert_eq!( ( CellIndex::from( ( 0, 0 ) ), CellVal::from( 3 ) ), cells.next().unwrap() ); + assert_eq!( ( CellIndex::from( ( 1, 0 ) ), CellVal::from( 1 ) ), cells.next().unwrap() ); + assert_eq!( ( CellIndex::from( ( 2, 0 ) ), CellVal::from( 0 ) ), cells.next().unwrap() ); + + cells.next(); + cells.next(); + cells.next(); + + cells.next(); + cells.next(); + cells.next(); + + cells.next(); + cells.next(); + cells.next(); + + assert_eq!( ( CellIndex::from( ( 3, 1 ) ), CellVal::from( 1 ) ), cells.next().unwrap() ); + assert_eq!( ( CellIndex::from( ( 4, 1 ) ), CellVal::from( 0 ) ), cells.next().unwrap() ); + assert_eq!( ( CellIndex::from( ( 5, 1 ) ), CellVal::from( 9 ) ), cells.next().unwrap() ); + +} + +#[ test ] +fn col() +{ + let board = Board::default(); + + let exp : Vec< CellVal > = each_into([ 3, 0, 0, 0, 0, 0, 0, 0, 0 ]).collect(); + let got = board.col( 0 ).collect::< Vec< _ > >(); + a_id!( got, exp ); + + let exp : Vec< CellVal > = each_into([ 0, 5, 0, 0, 0, 8, 0, 1, 0 ]).collect(); + let got = board.col( 8 ).collect::< Vec< _ > >(); + a_id!( got, exp ); + + a_id!( board.cols().count(), 9 ); + +} + +#[ test ] +fn row() +{ + let board = Board::default(); + + let exp : Vec< CellVal > = each_into([ 3, 1, 0, 0, 0, 0, 0, 2, 0 ]).collect(); + let got = board.row( 0 ).collect::< Vec< _ > >(); + a_id!( got, exp ); + + let exp : Vec< CellVal > = each_into([ 0, 0, 0, 0, 0, 7, 0, 0, 0 ]).collect(); + let got = board.row( 8 ).collect::< Vec< _ > >(); + a_id!( got, exp ); + + a_id!( board.rows().count(), 9 ); + +} + +#[ test ] +fn block() +{ + let board = Board::default(); + + let got = board.block( ( 0, 0 ).into() ).collect::< Vec< _ > >(); + let exp : Vec< CellVal > = each_into([ 3, 1, 0, 0, 0, 6, 0, 0, 0 ]).collect(); + a_id!( got, exp ); + + let got = board.block( ( 1, 0 ).into() ).collect::< Vec< _ > >(); + let exp : Vec< CellVal > = each_into([ 0, 0, 0, 1, 0, 9, 0, 8, 0 ]).collect(); + a_id!( got, exp ); + + let got = board.block( ( 2, 2 ).into() ).collect::< Vec< _ > >(); + let exp : Vec< CellVal > = each_into([ 9, 0, 0, 0, 0, 1, 0, 0, 0 ]).collect(); + a_id!( got, exp ); + + a_id!( board.blocks().count(), 9 ); + +} + +#[ test ] +fn select() +{ + let board = Board::default(); + + let indices = board.block_cells( ( 0, 0 ).into() ); + let got : Vec< CellVal > = board.select( indices ).collect(); + let exp : Vec< CellVal > = each_into([ 3, 1, 0, 0, 0, 6, 0, 0, 0 ]).collect(); + a_id!( got, exp ); + + let indices = board.block_cells( ( 1, 0 ).into() ); + let got : Vec< CellVal > = board.select( indices ).collect(); + let exp : Vec< CellVal > = each_into([ 0, 0, 0, 1, 0, 9, 0, 8, 0 ]).collect(); + a_id!( got, exp ); + + let indices = board.block_cells( ( 2, 2 ).into() ); + let got : Vec< CellVal > = board.select( indices ).collect(); + let exp : Vec< CellVal > = each_into([ 9, 0, 0, 0, 0, 1, 0, 0, 0 ]).collect(); + a_id!( got, exp ); + +} + +#[ test ] +fn select_mut() +{ + let mut board = Board::default(); + + let indices = board.block_cells( ( 0, 0 ).into() ); + board.select_mut( indices ).for_each( | e | *e = CellVal::from( e.unwrap() + 1 ) ); + let indices = board.block_cells( ( 0, 0 ).into() ); + let got : Vec< CellVal > = board.select( indices ).collect(); + let exp : Vec< CellVal > = each_into([ 4, 2, 1, 1, 1, 7, 1, 1, 1 ]).collect(); + + a_id!( got, exp ); + +} + +#[ test ] +fn cross_error() +{ + let board = Board::default(); + + let exp = 14; + let got = board.cross_error( ( 0, 0 ).into() ); + a_id!( got, exp ); + + let exp = 12; + let got = board.cross_error( ( 1, 0 ).into() ); + a_id!( got, exp ); + + let exp = 14; + let got = board.cross_error( ( 8, 8 ).into() ); + a_id!( got, exp ); + +} + +#[ test ] +fn total_error() +{ + let board = Board::default(); + + let exp = 116; + let got = board.total_error(); + a_id!( got, exp ); + +} + +#[ test ] +fn cells_swap() +{ + + let storage : Vec< CellVal > = each_into + ([ + 0,1,0, 0,0,0, 0,2,0, + 0,0,6, 1,0,9, 0,0,5, + 0,0,0, 0,8,0, 0,0,0, + 0,2,0, 8,0,4, 0,5,0, + 0,0,4, 0,7,0, 0,0,0, + 0,0,0, 0,6,0, 0,0,8, + 0,6,0, 0,0,0, 9,0,0, + 0,0,9, 4,0,5, 0,0,1, + 0,0,0, 0,0,7, 0,0,3, + ]).collect(); + let exp = Board::new( storage ); + let mut got = Board::default(); + got.cells_swap( ( 0, 0 ).into(), ( 8, 8 ).into() ); + a_id!( got, exp ); + + let storage : Vec< CellVal > = each_into + ([ + 3,1,0, 0,0,0, 0,2,0, + 0,0,6, 1,0,9, 0,0,2, + 0,0,0, 0,8,0, 0,0,0, + 0,5,0, 8,0,4, 0,5,0, + 0,0,4, 0,7,0, 0,0,0, + 0,0,0, 0,6,0, 0,0,8, + 0,6,0, 0,0,0, 9,0,0, + 0,0,9, 4,0,5, 0,0,1, + 0,0,0, 0,0,7, 0,0,0, + ]).collect(); + let exp = Board::new( storage ); + let mut got = Board::default(); + got.cells_swap( ( 1, 3 ).into(), ( 8, 1 ).into() ); + dbg!( &got ); + dbg!( &exp ); + a_id!( got, exp ); + +} + +#[ test ] +fn block_missing_vals() +{ + + let board = Board::default(); + let got = board.block_missing_vals( ( 0, 0 ).into() ); + let exp = hset!( 2, 4, 5, 7, 8, 9 ); + a_id!( got, exp ); + +} + +#[ test ] +fn fill_missing_randomly() +{ + + let hrng = Hrng::master_with_seed( "seed1".into() ); + let mut board = Board::default(); + println!( "{board}" ); + let full_board = board.fill_missing_randomly( hrng ); + for cell in full_board.cells() + { + // println!( "cell : {cell:?}" ); + assert!( cell.1 != 0.into() ); + } + for block in full_board.blocks() + { + let missing = full_board.block_missing_vals( block ); + assert!( missing.len() == 0 ); + } + println!( "{full_board} with hash {}", hash( &full_board ) ); + println!( "total_error : {}", full_board.total_error() ); + + let hrng = Hrng::master_with_seed( "seed1".into() ); + let mut board2 = Board::default(); + println!( "{board2}" ); + let full_board2 = board2.fill_missing_randomly( hrng ); + println!( "{full_board2} with hash {}", hash( &full_board2 ) ); + assert_eq!( hash( &full_board ), hash( &full_board2 ) ); + + // assert!( false ); +} + +fn hash< T : std::hash::Hash >( t : &T ) -> u64 +{ + use std::hash::Hasher; + use std::collections::hash_map::DefaultHasher; + let mut hasher = DefaultHasher::new(); + t.hash( &mut hasher ); + hasher.finish() +} + +// 310 000 020 +// 006 109 005 +// 000 080 000 +// 020 804 050 +// 004 070 000 +// 000 060 008 +// 060 000 900 +// 009 405 001 +// 000 007 000 diff --git a/module/move/optimization_tools/tests/ga_optimization.rs b/module/move/optimization_tools/tests/ga_optimization.rs new file mode 100644 index 0000000000..e42568aee6 --- /dev/null +++ b/module/move/optimization_tools/tests/ga_optimization.rs @@ -0,0 +1,96 @@ +use iter_tools::Itertools; +use optimization_tools::*; +use hybrid_optimizer::CrossoverOperator; +use problems::sudoku::*; +use deterministic_rand::{ Seed, Hrng }; + +mod tools; +use tools::*; + +#[ test ] +fn crossover() +{ + logger_init(); + + let board = Board::default(); + let hrng = Hrng::master_with_seed( Seed::default() ); + + let parent1 = SudokuPerson::new( &board, hrng.clone() ); + log::trace!( "parent 1{parent1:#?}" ); + + let parent2 = SudokuPerson::new( &board, hrng.clone() ); + log::trace!( "parent 2{parent2:#?}" ); + + let operator = MultiplePointsBlockCrossover; + + let child = operator.crossover( hrng.clone(), &parent1, &parent2 ); + log::trace!( "child {child:#?}" ); + let mut is_child = true; + let mut has_first_parent_blocks = false; + let mut has_second_parent_blocks = false; + + for i in child.board.blocks() + { + if child.board.block( i ).collect_vec() != parent1.board.block( i ).collect_vec() + && child.board.block( i ).collect_vec() != parent2.board.block( i ).collect_vec() + { + is_child = false; + } + + if child.board.block( i ).collect_vec() == parent1.board.block( i ).collect_vec() + { + has_first_parent_blocks = true; + } + + if child.board.block( i ).collect_vec() == parent2.board.block( i ).collect_vec() + { + has_second_parent_blocks = true; + } + } + assert!( is_child && has_first_parent_blocks && has_second_parent_blocks ); +} + +/// Test GA on sudoku +/// +/// # Usage +/// +/// cargo test solve_with_ga --release +/// +#[ ignore ] +#[ test ] +fn solve_with_ga() +{ + use test_tools::prelude::*; + use hybrid_optimizer::{ Config, HybridOptimizer, Problem }; + let sudoku : &str = r#" + 801920000 + 040850726 + 056073090 + 598004100 + 700000530 + 002600400 + 900300680 + 683190050 + 000000013 + "#; + + logger_init(); + log::set_max_level( log::LevelFilter::Warn ); + + let initial = SudokuInitial::new( Board::from( sudoku ) ); + let problem = Problem::new( initial, BestRowsColumnsCrossover, RandomPairInBlockMutation ); + + let optimizer = HybridOptimizer::new( Config::default(), problem ); + + let ( reason, solution ) = optimizer.optimize(); + + log::trace!( "reason : {reason}" ); + a_true!( solution.is_some() ); + let solution = solution.unwrap(); + log::trace!( "{solution:#?}" ); + log::trace!( "{:#?}", solution.board ); + + a_id!( solution.cost, 0.into() ); + +} + diff --git a/module/move/optimization_tools/tests/nelder_mead.rs b/module/move/optimization_tools/tests/nelder_mead.rs new file mode 100644 index 0000000000..f913ec64c2 --- /dev/null +++ b/module/move/optimization_tools/tests/nelder_mead.rs @@ -0,0 +1,76 @@ +use std::ops::Range; + +use optimization_tools::*; +use optimal_params_search::nelder_mead; + +#[ test ] +fn power_two() -> Result< (), nelder_mead::Error > +{ + let f = | x : &nelder_mead::Point | ( x.coords[ 0 ] * x.coords[ 0 ] ); + let mut optimizer = nelder_mead::Optimizer::new( f ); + optimizer.bounds = vec![ Some( -1.0..=8.0 ), Some( 2.0..=4.0 ), Some( 3.0..=6.0 ) ]; + optimizer.start_point = nelder_mead::Point::new( vec![ 3.0, 3.0, 3.0 ] ); + optimizer.set_simplex_size( vec![ Some( 0.1 ), Some( 0.1 ), Some( 0.1 ) ] ); + + let res = optimizer.optimize()?; + assert!( res.objective.abs() < 10e-6 ); + + Ok( () ) +} + +#[ test ] +fn sin_cos() -> Result< (), nelder_mead::Error > +{ + let f = | x : &nelder_mead::Point | x.coords[ 0 ].sin() * x.coords[ 1 ].cos() * ( 1.0 / ( x.coords[ 2 ].abs() + 1.0 ) ) ; + let mut optimizer: nelder_mead::Optimizer< Range< f64 >, _ > = nelder_mead::Optimizer::new( f ); + optimizer.set_simplex_size( vec![ Some( 0.1 ), Some( 0.1 ), Some( 0.1 ) ] ); + + let res = optimizer.optimize()?; + + assert!( ( -1.5808971014312196 - res.point.coords[ 0 ] ).abs() < 10e-5 ); + assert!( ( -1.0 - res.objective ).abs() <= 10e-5 ); + + Ok( () ) +} + +#[ test ] +fn rosenbrock() -> Result< (), nelder_mead::Error > +{ + let f = | x : &nelder_mead::Point | ( 1.0 - x.coords[ 0 ] ).powi( 2 ) + 100.0 * ( x.coords[ 1 ] - x.coords[ 0 ].powi( 2 )).powi( 2 ) ; + let mut optimizer: nelder_mead::Optimizer< Range< f64 >, _ > = nelder_mead::Optimizer::new( f ); + optimizer.start_point = nelder_mead::Point::new( vec![ 0.0, 0.0 ] ); + optimizer.set_simplex_size( vec![ Some( 0.1 ), Some( 0.1 ) ] ); + + let res = optimizer.optimize()?; + + assert!( ( 1.0 - res.point.coords[ 0 ] ).abs() < 10e-5 ); + assert!( ( 1.0 - res.point.coords[ 1 ] ).abs() < 10e-5 ); + assert!( res.objective < 10e-5 ); + + Ok( () ) +} + +#[ test ] +fn himmelblau() -> Result< (), nelder_mead::Error > +{ + let f = | x : &nelder_mead::Point | ( x.coords[ 0 ].powi( 2 ) + x.coords[ 1 ] - 11.0 ).powi( 2 ) + ( x.coords[ 0 ] + x.coords[ 1 ].powi( 2 ) - 7.0 ).powi( 2 ) ; + let mut optimizer: nelder_mead::Optimizer< Range< f64 >, _ > = nelder_mead::Optimizer::new( f ); + optimizer.start_point = nelder_mead::Point::new( vec![ 0.0, 0.0 ] ); + optimizer.set_simplex_size( vec![ Some( 0.1 ); 2 ] ); + optimizer.max_no_improvement_steps = 15; + + let res = optimizer.optimize()?; + let mut is_one_of_minima_points = false; + + for minima in [ ( 3.0, 2.0 ), ( -2.805118, 3.131312 ), ( -3.779310, -3.283186 ), ( 3.584428, -1.848126 ) ] + { + if ( ( minima.0 - res.point.coords[ 0 ] ).abs() < 10e-5 ) && ( ( minima.1 - res.point.coords[ 1 ] ).abs() < 10e-5 ) + { + is_one_of_minima_points = true; + } + } + assert!( is_one_of_minima_points ); + assert!( res.objective < 10e-5 ); + + Ok( () ) +} \ No newline at end of file diff --git a/module/move/optimization_tools/tests/opt_params.rs b/module/move/optimization_tools/tests/opt_params.rs new file mode 100644 index 0000000000..d50ffdba76 --- /dev/null +++ b/module/move/optimization_tools/tests/opt_params.rs @@ -0,0 +1,561 @@ +use std::ops::{ Bound, RangeBounds }; + +use iter_tools::Itertools; +use optimization_tools::{ optimal_params_search::nelder_mead::Stats, * }; +use optimal_params_search::OptimalParamsConfig; +use problems::{ sudoku::*, traveling_salesman::* }; +use hybrid_optimizer::*; +use tabled::{ builder::Builder, settings::Style }; + + +mod tools; +use tools::*; + +pub struct Statistics +{ + pub table_params : Vec< Vec< String > >, + pub list_params : Vec< ( String, String ) >, +} + +impl Statistics +{ + pub fn new() -> Self + { + Self + { + table_params : Vec::new(), + list_params : Vec::new(), + } + } +} + +fn named_results_list< R : RangeBounds< f64 > > +( + params : Vec< f64 >, + stats : Stats, + bounds : Vec< Option< R > >, +) -> Vec< Vec< String > > +{ + let mut str_params = Vec::new(); + str_params.push( format!( "{:.4}", params[ 0 ] ) ); + str_params.push( format!( "{:?}", params[ 1 ] as usize ) ); + str_params.push( format!( "{:.2}", params[ 2 ] ) ); + str_params.push( format!( "{:.2}", params[ 3 ] ) ); + str_params.push( format!( "{:.2}", ( 1.0 - params[ 2 ] - params[ 3 ] ) ) ); + str_params.push( format!( "{:?}", params[ 4 ] as usize ) ); + str_params.push( format!( "{}", params[ 5 ] as usize ) ); + str_params.push( format!( "{}", params[ 6 ] as usize ) ); + + let mut start_params = Vec::new(); + start_params.push( format!( "{:.4}", stats.starting_point.coords[ 0 ] ) ); + start_params.push( format!( "{:?}", stats.starting_point.coords[ 1 ] as usize ) ); + start_params.push( format!( "{:.2}", stats.starting_point.coords[ 2 ] ) ); + start_params.push( format!( "{:.2}", stats.starting_point.coords[ 3 ] ) ); + start_params.push( format!( "{:.2}", ( 1.0 - stats.starting_point.coords[ 2 ] - stats.starting_point.coords[ 3 ] ) ) ); + start_params.push( format!( "{}", stats.starting_point.coords[ 4 ] as usize ) ); + start_params.push( format!( "{}", stats.starting_point.coords[ 5 ] as usize ) ); + start_params.push( format!( "{}", stats.starting_point.coords[ 6 ] as usize ) ); + + let params_name = + [ + "temperature decrease coefficient", + "max mutations per dynasty", + "mutation rate", + "crossover rate", + "elitism rate", + "max stale iterations", + "population size", + "dynasties limit", + ]; + + let mut diff_sum_vec = stats.differences + .iter() + .map( | vec | format!( "{:.2}", vec.iter().fold( 0.0, | acc, val | acc + val.abs() ) ) ) + .collect_vec() + ; + + diff_sum_vec.insert( 4, String::from( "-" ) ); + + let mut expectation_vec = Vec::new(); + for i in 0..stats.differences.len() + { + expectation_vec.push + ( + format! + ( + "{:.2}", + stats.differences[ i ] + .iter() + .fold( 0.0, | acc, val | acc + val.abs() / stats.differences[ i ].len() as f64 ) + ) + ); + } + expectation_vec.insert( 4, String::from( "-" ) ); + + let mut bounds_vec = bounds.iter().map( | bounds | + { + let mut str = ( String::from( "-" ), String::from( "-" ) ); + if let Some( range ) = bounds + { + let mut upper = String::new(); + let mut lower = String::new(); + match range.start_bound() + { + Bound::Included( val ) => + { + lower = format!( "{:.2}", val ); + }, + Bound::Excluded( val ) => + { + lower = format!( "{:.2}", val ); + }, + Bound::Unbounded => {} + } + + match range.end_bound() + { + Bound::Included( val ) => + { + upper = format!( "{:.2}", val ); + }, + Bound::Excluded( val ) => + { + upper = format!( "{:.2}", val ); + }, + Bound::Unbounded => {} + } + str = ( lower, upper ); + } + str + } ).collect_vec(); + bounds_vec.insert( 4, ( String::from( "-" ), String::from( "-" ) ) ); + + let mut change_vec = Vec::new(); + for i in 0..stats.positive_change.len() + { + change_vec.push( format!( "{}", stats.positive_change[ i ] ) ); + } + // elitism + change_vec.insert( 4, String::from( "-" ) ); + + let mut list = Vec::new(); + + for i in 0..params_name.len() + { + list.push + ( + vec! + [ + params_name[ i ].to_owned(), + start_params[ i ].clone(), + bounds_vec[ i ].0.clone(), + bounds_vec[ i ].1.clone(), + diff_sum_vec[ i ].clone(), + expectation_vec[ i ].clone(), + change_vec[ i ].clone(), + str_params[ i ].clone() + ] + ); + } + + list +} + +fn write_results +( + filename : String, + title : String, + mut hybrid_res : Statistics, + mut sa_res : Statistics, + mut ga_res : Statistics, +) -> Result< (), std::io::Error > +{ + let mut file = std::fs::File::create( format!( "{}.md", filename ) )?; + std::io::Write::write( &mut file, format!( "# {}\n\n", title ).as_bytes() )?; + + for ( mode, params ) in &mut [ ( "hybrid", &mut hybrid_res ), ( "SA", &mut sa_res ), ( "GA", &mut ga_res ) ] + { + std::io::Write::write(&mut file, format!( "## For {}:\n\n", mode ).as_bytes() )?; + for param in ¶ms.list_params + { + std::io::Write::write(&mut file, format!( " - {}: {}\n\n", param.0, param.1 ).as_bytes() )?; + } + + std::io::Write::write(&mut file, format!( " - parameters: \n\n" ).as_bytes() )?; + + let mut builder = Builder::default(); + let head_row = [ "", "start", "min", "max", "sum of diff", "expected", "changes", "final" ] + .into_iter() + .map( str::to_owned ) + .collect_vec() + ; + + builder.push_record( head_row.clone() ); + + for i in 0..params.table_params.len() + { + let mut row = Vec::new(); + + if *mode == "SA" && [ 2, 3, 4, 6 ].contains( &i ) + { + row.push( format!( "{}", params.table_params[ i ][ 0 ].clone().replace( " ", "\n") ) ); + } + else + { + row.push( params.table_params[ i ][ 0 ].clone().replace( " ", "\n") ); + } + + row.extend( params.table_params[ i ].iter().skip( 1 ).cloned() ); + builder.push_record( row ); + + } + + let table = builder.build().with( Style::modern() ).to_string(); + std::io::Write::write( &mut file, format!( "```\n{}\n```", table ).as_bytes() )?; + std::io::Write::write( &mut file, format!("\n\n\n" ).as_bytes() )?; + + std::io::Write::write(&mut file, format!( "#### List:\n" ).as_bytes() )?; + let problem_level = if params.list_params[ params.list_params.len() - 2 ].0 == String::from( "level" ) + { + " - `level` : sudoku board difficulty level\n" + } + else + { + " - `number of nodes` : number of nodes in graph representing cities from traveling salesman problem\n" + }; + + let list_legend = concat! + ( + "\n\n", + " - `max number of iterations` : limit of total iterations of optimization process, termination condition\n", + " - `max no improvement iterations` : max amount of steps performed without detected improvement, termination condition\n", + " - `improvement threshold` : minimal value detected as improvement in objective function result\n", + " - `termination reason` : the reason why optimization process was stopped\n", + " - `iterations number` : actual number of iterations performed during optimization\n", + " - `resumed after stale` : how many times optimization progress was resumed after some iterations without improvement\n", + " - `points from cache` : points calculated during previous optimizations and read from cache\n", + ); + + std::io::Write::write(&mut file, list_legend.as_bytes() )?; + std::io::Write::write(&mut file, problem_level.as_bytes() )?; + std::io::Write::write(&mut file, b" - `execution time` : duration of shortest found hybrid optimization process using final parameters, measured in seconds\n" )?; + std::io::Write::write(&mut file, format!( "#### Table:\n" ).as_bytes() )?; + let str_legend = concat! + ( + " - `start` : initial value of parameter in starting point\n", + " - `min` : lower bound of parameter\n", + " - `max` : upper bound of parameter\n", + " - `sum of diff` : sum of absolute differences between starting value and next value\n", + " - `expected` : mathematical expectation of difference between starting value and next value\n", + " - `changes` : number of successful changes of parameter value to more optimal\n", + " - `final` : calculated value of parameter for which execution time was the lowest\n", + ); + + std::io::Write::write( &mut file, str_legend.as_bytes() )?; + } + + //final table + std::io::Write::write(&mut file, format!( "## Summary:\n" ).as_bytes() )?; + let mut builder = Builder::default(); + let mut headers = vec![ String::from( "mode" ) ]; + for i in 0..hybrid_res.table_params.len() + { + headers.push( hybrid_res.table_params[ i ][ 0 ].clone().replace( " ", "\n") ); + } + + headers.push( String::from( "execution\ntime" ) ); + + builder.push_record( headers ); + for ( mode, params ) in [ ( "hybrid", &hybrid_res ), ( "SA", &sa_res ), ( "GA", &ga_res ) ] + { + let mut row = Vec::new(); + for i in 0..params.table_params.len() + 1 + { + if i == 0 + { + row.push( mode.to_owned() ); + } + else + { + row.push( params.table_params[ i - 1 ].last().unwrap().clone() ); + } + } + row.push( params.list_params.last().unwrap().1.clone() ); + + builder.push_record( row ); + } + + let table = builder.build().with( Style::modern() ).to_string(); + std::io::Write::write( &mut file, format!( "```\n{}\n```", table ).as_bytes() )?; + + let final_legend = concat! + ( + "\n\n", + " - `temperature decrease coefficient` : coefficient by which temperature is lowered at each iteration of optimization process\n", + " - `max mutations per dynasty` : max number of mutations used to produce vital individual in dynasty\n", + " - `mutation rate` : percent of individuals in population that are created using mutation\n", + " - `crossover rate` : percent of individuals in population that are created using crossover of selected parents\n", + " - `elitism rate` : percent of most fit individuals in population that are cloned without changes\n", + " - sum of mutation rate, crossover rate and elitism rate always equals 1\n", + " - `max stale iterations` : max allowed number of iterations that do not produce individuals with better fittness\n", + " - `population size` : number of individuals in population\n", + " - `dynasties limit` : max number of dynasties of new solutions produced during optimization process, terminates if exceeded\n", + " - `execution time` : time spent searching for optimal solution, measured in seconds\n", + ); + std::io::Write::write( &mut file, final_legend.as_bytes() )?; + + std::io::Write::write(&mut file, format!( "## To run:\n" ).as_bytes() )?; + std::io::Write::write( &mut file, b" - Sudoku problem:\n" )?; + std::io::Write::write( &mut file, b"`cargo test -- --ignored find_opt_params_sudoku`\n" )?; + std::io::Write::write( &mut file, b" - Traveling salesman problem:\n" )?; + std::io::Write::write( &mut file, b"`cargo test -- --ignored find_opt_params_tsp`\n" )?; + + Ok( () ) +} + +#[ ignore ] +#[ test ] +fn find_opt_params_sudoku() -> Result< (), Box< dyn std::error::Error > > +{ + let easy = r#" + 080924060 + 920060105 + 360080029 + 408209600 + 106003802 + 002806390 + 840690070 + 009705208 + 075040036 + "#; + + logger_init(); + log::set_max_level( log::LevelFilter::Info ); + + let dir_path = format!( "{}/target", crate::simplex::drawing::workspace_dir().to_string_lossy() ); + _ = std::fs::create_dir( &dir_path ); + let path = format!( "{}/output_sudoku", dir_path ); + + let config = OptimalParamsConfig::default(); + let initial = SudokuInitial::new( Board::from( easy ) ); + + let mut hybrid_res = Statistics::new(); + let mut sa_res = Statistics::new(); + let mut ga_res = Statistics::new(); + for mode in [ "hybrid", "sa", "ga" ] + { + let mut starting_params = hybrid_optimizer::starting_params_for_hybrid()?; + match mode + { + "hybrid" => {}, + "sa" => starting_params = hybrid_optimizer::starting_params_for_sa()?, + "ga" => starting_params = hybrid_optimizer::starting_params_for_ga()?, + _ => unreachable!(), + } + + let hybrid_problem = Problem::new + ( + initial.clone(), + BestRowsColumnsCrossover, + RandomPairInBlockMutation, + ); + + let res = optimal_params_search::find_hybrid_optimal_params + ( + config.clone(), + starting_params.clone(), + hybrid_problem, + Some( path.clone() ), + ); + assert!( res.is_ok() ); + + if let Ok( solution ) = res + { + assert!( solution.stats.is_some() ); + let stats = solution.stats.clone().unwrap(); + let cached = stats.cached_points; + let final_res = Statistics + { + table_params : named_results_list + ( + solution.point.coords + .into_iter() + .map( | val | val ) + .collect_vec(), + solution.stats.unwrap(), + starting_params.bounds, + ), + list_params : vec! + [ + ( String::from( "max number of iterations" ), format!( "{}", config.max_iterations ) ), + ( String::from( "max no improvement iterations " ), format!( "{}", config.max_no_improvement_steps ) ), + ( String::from( "improvement threshold " ), format!( "{}s", config.improvement_threshold ) ), + ( String::from( "termination reason" ), format!( "{}", solution.reason ) ), + ( String::from( "iterations number" ), format!( "{}", stats.number_of_iterations ) ), + ( String::from( "resumed after stale" ), format!( "{}", stats.resumed_after_stale ) ), + ( String::from( "points from cache" ), format!( "{}/{}", cached.0, cached.1 + cached.0 ) ), + ( String::from( "level" ), format!( "{:?}", Board::from( easy ).calculate_level() ) ), + ( String::from( "execution time" ), format!( "{:.3}s", solution.objective ) ), + ] + }; + + match mode + { + "hybrid" => hybrid_res = final_res, + "sa" => sa_res = final_res, + "ga" => ga_res = final_res, + _ => unreachable!(), + } + } + } + + write_results( String::from( "sudoku_results" ), String::from( "Sudoku Problem" ), hybrid_res, sa_res, ga_res )?; + Ok( () ) +} + +#[ ignore ] +#[ test ] +fn find_opt_params_tsp() -> Result< (), Box< dyn std::error::Error > > +{ + logger_init(); + log::set_max_level( log::LevelFilter::Info ); + + let dir_path = format!( "{}/target", crate::simplex::drawing::workspace_dir().to_string_lossy() ); + _ = std::fs::create_dir( &dir_path ); + let path = format!( "{}/output_tsp", dir_path ); + + let config = OptimalParamsConfig::default(); + let graph = TSPGraph::default(); + let number_of_nodes = graph.nodes().len(); + let initial = TSProblem { graph, starting_node : NodeIndex( 1 ) }; + + let hybrid_problem = Problem::new( + initial.clone(), + OrderedRouteCrossover, + TSRouteMutation, + ); + let starting_params = hybrid_optimizer::starting_params_for_hybrid()?; + let res = optimal_params_search::find_hybrid_optimal_params + ( + config.clone(), + starting_params.clone(), + hybrid_problem, + Some( path.clone() ), + ); + assert!( res.is_ok() ); + let mut hybrid_res = Statistics::new(); + if let Ok( solution ) = res + { + let cached = solution.stats.clone().unwrap().cached_points; + hybrid_res = Statistics + { + table_params : named_results_list + ( + solution.point.coords + .into_iter() + .map( | val | val ) + .collect_vec(), + solution.stats.unwrap(), + starting_params.bounds, + ), + list_params : vec! + [ + ( String::from( "max number of iterations" ), format!( "{}", config.max_iterations ) ), + ( String::from( "max no improvement iterations " ), format!( "{}", config.max_no_improvement_steps ) ), + ( String::from( "improvement threshold " ), format!( "{}s", config.improvement_threshold ) ), + ( String::from( "calculated points" ), format!( "{} from {}", cached.1, cached.1 + cached.0 ) ), + ( String::from( "points from cache" ), format!( "{} from {}", cached.0, cached.1 + cached.0 ) ), + ( String::from( "number of nodes" ), format!( "{}", number_of_nodes ) ), + ( String::from( "execution time" ), format!( "{:.3}s", solution.objective ) ), + ] + } + } + + // SA + let hybrid_problem = Problem::new( + initial.clone(), + OrderedRouteCrossover, + TSRouteMutation, + ); + let starting_params = hybrid_optimizer::starting_params_for_sa()?; + let res = optimal_params_search::find_hybrid_optimal_params( + config.clone(), + starting_params.clone(), + hybrid_problem, + Some( path.clone() ), + ); + assert!( res.is_ok() ); + let mut sa_res = Statistics::new(); + if let Ok( solution ) = res + { + let cached = solution.stats.clone().unwrap().cached_points; + sa_res = Statistics + { + table_params : named_results_list + ( + solution.point.coords + .into_iter() + .map( | val | val ) + .collect_vec(), + solution.stats.unwrap(), + starting_params.bounds, + ), + list_params : vec! + [ + ( String::from( "max number of iterations" ), format!( "{}", config.max_iterations ) ), + ( String::from( "max no improvement iterations " ), format!( "{}", config.max_no_improvement_steps ) ), + ( String::from( "improvement threshold " ), format!( "{}s", config.improvement_threshold ) ), + ( String::from( "calculated points" ), format!( "{} from {}", cached.1, cached.1 + cached.0 ) ), + ( String::from( "points from cache" ), format!( "{} from {}", cached.0, cached.1 + cached.0 ) ), + ( String::from( "number of nodes" ), format!( "{}", number_of_nodes ) ), + ( String::from( "execution time" ), format!( "{:.3}s", solution.objective ) ), + ] + } + } + + // GA + let hybrid_problem = Problem::new( + initial, + OrderedRouteCrossover, + TSRouteMutation, + ); + let starting_params = hybrid_optimizer::starting_params_for_ga()?; + let res = optimal_params_search::find_hybrid_optimal_params( + config.clone(), + starting_params.clone(), + hybrid_problem, + Some( path ), + ); + assert!( res.is_ok() ); + let mut ga_res = Statistics::new(); + + if let Ok( solution ) = res + { + let cached = solution.stats.clone().unwrap().cached_points; + ga_res = Statistics + { + table_params : named_results_list + ( + solution.point.coords + .into_iter() + .map( | val | val ) + .collect_vec(), + solution.stats.unwrap(), + starting_params.bounds, + ), + list_params : vec! + [ + ( String::from( "max number of iterations" ), format!( "{}", config.max_iterations ) ), + ( String::from( "max no improvement iterations " ), format!( "{}", config.max_no_improvement_steps ) ), + ( String::from( "improvement threshold " ), format!( "{}s", config.improvement_threshold ) ), + ( String::from( "calculated points" ), format!( "{} from {}", cached.1, cached.1 + cached.0 ) ), + ( String::from( "points from cache" ), format!( "{} from {}", cached.0, cached.1 + cached.0 ) ), + ( String::from( "number of nodes" ), format!( "{}", number_of_nodes ) ), + ( String::from( "execution time" ), format!( "{:.3}s", solution.objective ) ), + ] + } + } + + write_results( String::from( "tsp_results" ), String::from( "Traveling Salesman Problem" ), hybrid_res, sa_res, ga_res )?; + Ok( () ) +} diff --git a/module/move/optimization_tools/tests/optimization.rs b/module/move/optimization_tools/tests/optimization.rs new file mode 100644 index 0000000000..329cfbe213 --- /dev/null +++ b/module/move/optimization_tools/tests/optimization.rs @@ -0,0 +1,211 @@ +use optimization_tools::*; +use problems::sudoku::*; +use hybrid_optimizer::*; +use test_tools::prelude::*; +use deterministic_rand::{ Seed, Hrng }; + +mod tools; +use tools::*; + +#[ test ] +fn person_mutate() +{ + logger_init(); + + //let initial = SudokuInitial::new_sa( Board::default(), Seed::default() ); + let board = Board::default(); + let hrng = Hrng::master_with_seed( Seed::default() ); + + let mut person = SudokuPerson::new( &board, hrng.clone() ); + log::trace!( "{person:#?}" ); + a_id!( person.cost, 45.into() ); + a_id!( person.cost, person.board.total_error().into() ); + + let mutagen = person.mutagen( &board, hrng.clone() ); + // make sure block is the same + a_id!( BlockIndex::from( mutagen.cell1 ), BlockIndex::from( mutagen.cell2 ) ); + person.mutate( &mutagen ); + log::trace!( "{person:#?}" ); + a_id!( person.cost, 48.into() ); + a_id!( person.cost, person.board.total_error().into() ); + + let mutagen = person.mutagen( &board, hrng.clone() ); + // make sure block is the same + a_id!( BlockIndex::from( mutagen.cell1 ), BlockIndex::from( mutagen.cell2 ) ); + person.mutate( &mutagen ); + log::trace!( "{person:#?}" ); + a_id!( person.cost, 48.into() ); + a_id!( person.cost, person.board.total_error().into() ); + + // a_true!( false ); +} + +#[ test ] +fn initial_temperature() +{ + logger_init(); + let initial = SudokuInitial::new( Board::default() ); + let p = Problem::new( initial, BestRowsColumnsCrossover{}, RandomPairInBlockMutation{} ); + let optimizer = HybridOptimizer::new( Config::default(), p ); + + let temperature = optimizer.initial_temperature(); + a_true!( temperature.unwrap() >= 0f64 ); + a_id!( temperature.unwrap(), 1.591644851508443 ); + +} + +/// Test SA on sudoku +/// +/// # Usage +/// +/// cargo test solve_with_sa --release +/// +#[ ignore ] +#[ test ] +fn solve_with_sa() +{ + logger_init(); + log::set_max_level( log::LevelFilter::Warn ); + + let input = r#" + 801920000 + 040850726 + 056073090 + 598004100 + 700000530 + 002600400 + 900300680 + 683190050 + 000000013 + "#; + + let seed : Seed = "seed3".into(); + let initial = SudokuInitial::new( Board::from( input ) ); + let problem = Problem::new( initial, BestRowsColumnsCrossover, RandomPairInBlockMutation ); + let optimizer = HybridOptimizer::new( Config::default(), problem ); + + log::set_max_level( log::LevelFilter::max() ); + let ( reason, solution ) = optimizer.optimize(); + + log::trace!( "reason : {reason}" ); + a_true!( solution.is_some() ); + let solution = solution.unwrap(); + log::trace!( "{solution:#?}" ); + log::trace!( "{:#?}", solution.board ); + + a_id!( solution.cost, 0.into() ); + #[ cfg( feature = "static_plot" ) ] + plot::draw_plots(); + // a_true!( false ); +} + +/// Test SA on sudoku +/// +/// # Usage +/// +/// cargo test solve_empty_full_block --release +/// +#[ ignore ] +#[ test ] +fn solve_empty_full_block() +{ + let _sudoku : &str = r#" + 402000000 + 000038000 + 090000018 + 000000601 + 000007530 + 000120000 + 000056100 + 003940000 + 206080047 + "#; + + let sudoku : &str = r#" + 350964170 + 700020003 + 019003524 + 491758032 + 507302801 + 283600090 + 900580317 + 800017209 + 170039406 + "#; + log::set_max_level( log::LevelFilter::Warn ); + + let initial = SudokuInitial::new( Board::from( sudoku ) ); + let problem = Problem::new( initial, BestRowsColumnsCrossover, RandomPairInBlockMutation ); + let optimizer = HybridOptimizer::new( Config::default(), problem ); + + log::set_max_level( log::LevelFilter::max() ); + let ( reason, solution ) = optimizer.optimize(); + + log::trace!( "reason : {reason}" ); + a_true!( solution.is_some() ); + let solution = solution.unwrap(); + log::trace!( "{solution:#?}" ); + println!( "{:#?}", solution.board ); + + a_id!( solution.cost, 0.into() ); + } + +// +// seed: "seed1" +// n_resets: 2, +// n_generation: 6850, +// +// seed: "seed2" +// n_resets: 0, +// n_generation: 1602, +// +// seed: "seed3" +// temperature: 0.3878543693250874, +// n_resets: 4, +// n_generation: 6992, +// +// 318756429 +// 276149385 +// 495283617 +// 927834156 +// 684571293 +// 153962748 +// 562318974 +// 739425861 +// 841697532 +// + +/// Test performance +/// +/// # Usage +/// +/// cargo test time_measure --release +/// +#[ ignore ] +#[ test ] +fn time_measure() +{ + let input = r#" + 801920000 + 040850726 + 056073090 + 598004100 + 700000530 + 002600400 + 900300680 + 683190050 + 000000013 + "#; + + + for i in 0..=3 { + let initial = SudokuInitial::new( Board::from( input ) ); + + let mut config = Config::default(); + config.hrng = Hrng::master_with_seed( Seed::new( i.to_string() ) ); + let problem = Problem::new( initial, BestRowsColumnsCrossover, RandomPairInBlockMutation ); + + let optimizer = HybridOptimizer::new( config, problem ); + let ( _reason, _solution ) = optimizer.optimize(); + } +} diff --git a/module/move/optimization_tools/tests/simplex.rs b/module/move/optimization_tools/tests/simplex.rs new file mode 100644 index 0000000000..7310f74d39 --- /dev/null +++ b/module/move/optimization_tools/tests/simplex.rs @@ -0,0 +1,147 @@ +use optimization_tools::*; +use simplex::*; + +#[ test ] +fn constraint() +{ + let c = Constraint::new( vec![ 1.0, 2.0 ], 4.0, Comp::Greater ); + assert_eq!( c.value, 4.0 ); +} + +#[ test ] +fn problem_2_vars() +{ + let p = Problem::new + ( + vec![ Variable::new( 3.0 ).min( 0.0 ), Variable::new( 2.0 ).min( 0.0 ) ], + vec![ Constraint::new( vec![ 2.0, 1.0 ], 9.0, Comp::Less ), Constraint::new( vec![ 1.0, 2.0 ], 9.0, Comp::Less ) ], + ); + + let solution = SimplexSolver{}.solve( p ); + assert_eq!( solution.len(), 1 ); + assert_eq!( solution[ 0 ].point, vec![ 3.0, 3.0 ] ) +} + +#[ test ] +fn problem_inf_solutions() +{ + use iter_tools::Itertools; + let p = Problem::new + ( + vec![ Variable::new( 4.0 ).min( 0.0 ), Variable::new( 2.0 ).min( 0.0 ) ], + vec![ Constraint::new( vec![ 2.0, 1.0 ], 9.0, Comp::Less ), Constraint::new( vec![ 1.0, 2.0 ], 9.0, Comp::Less ) ], + ); + + let solution = SimplexSolver{}.solve( p ); + assert_eq!( solution.len(), 2 ); + let points = solution.iter().map( | extr_point | extr_point.point.clone() ).collect_vec(); + assert!( points.contains( &[ 3.0, 3.0 ].to_vec() ) ); + assert!( points.contains( &[ 4.5, 0.0 ].to_vec() ) ); +} + +#[ test ] +fn problem_3_vars() +{ + let p = Problem::new + ( + vec![ Variable::new( 1.0 ).min( 0.0 ), Variable::new( 1.0 ).min( 0.0 ), Variable::new( 1.0 ).min( 0.0 ) ], + vec! + [ + Constraint::new( vec![ 1.0, 2.0, 0.0 ], 20.0, Comp::Less ), + Constraint::new( vec![ 0.0, 3.0, 1.0 ], 30.0, Comp::Less ), + Constraint::new( vec![ 3.0, 0.0, 2.0 ], 60.0, Comp::Less ), + ], + ); + + let solution = SimplexSolver{}.solve( p ); + assert_eq!( solution.len(), 1 ); + assert_eq!( solution[ 0 ].point, [ 20.0, 0.0, 0.0 ] ); +} + +#[ test ] +fn problem_4_vars() +{ + let p = Problem::new + ( + vec! + [ + Variable::new( 5.0 ).min( 0.0 ), + Variable::new( 10.0 ).min( 0.0 ), + Variable::new( 15.0 ).min( 0.0 ), + Variable::new( 4.0 ).min( 0.0 ), + ], + vec! + [ + Constraint::new( vec![ 1.0, 1.0, 0.0, 0.0 ], 700.0, Comp::Less ), + Constraint::new( vec![ 0.0, 0.0, 1.0, 1.0 ], 800.0, Comp::Less ), + Constraint::new( vec![ 1.0, 0.0, 1.0, 0.0 ], 600.0, Comp::Less ), + Constraint::new( vec![ 0.0, 1.0, 0.0, 1.0 ], 400.0, Comp::Less ), + ], + ); + + let solution = SimplexSolver{}.solve( p ); + assert_eq!( solution.len(), 1 ); + assert_eq!( solution[ 0 ].point, vec![ 0.0, 400.0, 600.0, 0.0 ] ) +} + +#[ test ] +fn problem_5_vars() +{ + let p = Problem::new + ( + vec! + [ + Variable::new( 5.0 ).min( 0.0 ), + Variable::new( 10.0 ).min( 0.0 ), + Variable::new( 15.0 ).min( 0.0 ), + Variable::new( 4.0 ).min( 0.0 ), + Variable::new( 8.0 ).min( 0.0 ), + ], + vec! + [ + Constraint::new( vec![ 1.0, 1.0, 0.0, 0.0, 0.0 ], 700.0, Comp::Less ), + Constraint::new( vec![ 0.0, 0.0, 1.0, 1.0, 0.0 ], 800.0, Comp::Less ), + Constraint::new( vec![ 1.0, 0.0, 0.0, 0.0, 1.0 ], 600.0, Comp::Less ), + Constraint::new( vec![ 0.0, 1.0, 0.0, 1.0, 0.0 ], 400.0, Comp::Less ), + Constraint::new( vec![ 0.0, 0.0, 1.0, 0.0, 1.0 ], 300.0, Comp::Less ), + ], + ); + + let solution = SimplexSolver{}.solve( p ); + assert_eq!( solution.len(), 1 ); + assert_eq!( solution[ 0 ].point, vec![ 300.0, 400.0, 300.0, 0.0, 0.0 ] ) +} + +// for issue https://github.com/plotters-rs/plotters/issues/573 +#[ cfg( not( all( debug_assertions, target_os = "linux" ) ) ) ] +#[ test ] +fn problem_draw() +{ + let mut p = Problem::new + ( + vec![ Variable::new( 3.0 ), Variable::new( 2.0 ) ], + vec![ Constraint::new( vec![ 2.0, 1.0 ], 9.0, Comp::Less ), Constraint::new( vec![ 1.0, 2.0 ], 9.0, Comp::Less ) ], + ); + + let ex_points = SimplexSolver::extreme_points( &mut p ); + let _ = drawing::draw_problem( &p, ex_points, String::from("plot") ); +} + +#[ cfg( feature = "lp_parse" ) ] +#[ test ] +fn problem_parse() +{ + let p = Problem::new + ( + vec![ Variable::new( 2.0 ).min( 0.0 ), Variable::new( -3.0 ).min( 0.0 ), Variable::new( 4.0 ).min( 0.0 ) ], + vec! + [ + Constraint::new( vec![ 2.0, -3.0, 1.0 ], 3.0, Comp::Less ), + Constraint::new( vec![ 1.0, -1.0, 0.0 ], 4.0, Comp::Less ) + ], + ); + let parsed = crate::parser::ProblemParser::parse( "2*x - 3*y + 4*z", vec![ "2*x -3*y +z <= 3", "-y + x <=4" ] ); + + assert_eq!( p.var_coeffs, parsed.var_coeffs ); + assert_eq!( p.constraints, parsed.constraints ); +} diff --git a/module/move/optimization_tools/tests/tools/mod.rs b/module/move/optimization_tools/tests/tools/mod.rs new file mode 100644 index 0000000000..1df7d55dcc --- /dev/null +++ b/module/move/optimization_tools/tests/tools/mod.rs @@ -0,0 +1,27 @@ +// use optimization_tools::*; +// use sudoku::*; +// use optimization::*; +// use test_tools::prelude::*; +// use deterministic_rand::Seed; + +pub fn logger_init() +{ + use std::io::Write; + + // env_logger::init(); + + let _ = env_logger::builder() + // Ensure events are captured by `cargo test` + .is_test( true ) + // Include all events in tests + .filter_level( log::LevelFilter::max() ) + .format( | buf, record | + { + // let tab = record.key_values().get( "tab" ); + writeln!( buf, "{}", record.args() ) + // record.key_values().map(|(k, v)| format!("{}: {}", k, v)).collect::>().join(", ") + }) + // Ignore errors initializing the logger if tests race to configure it + .try_init() + ; +} diff --git a/module/move/optimization_tools/tests/traveling_salesman.rs b/module/move/optimization_tools/tests/traveling_salesman.rs new file mode 100644 index 0000000000..513a1a86c9 --- /dev/null +++ b/module/move/optimization_tools/tests/traveling_salesman.rs @@ -0,0 +1,111 @@ +use iter_tools::Itertools; +use optimization_tools::*; +use problems::traveling_salesman::*; +use hybrid_optimizer::*; +use test_tools::prelude::*; +use deterministic_rand::{ Seed, Hrng }; + +mod tools; +use tools::*; + +#[ test ] +fn tsp_person() +{ + logger_init(); + + let hrng = Hrng::master_with_seed( Seed::default() ); + let graph = TSPGraph::default(); + + let tsp_initial = TSProblem{ graph, starting_node : NodeIndex( 1 ) }; + let population = tsp_initial.initial_population( hrng.clone(), 1 ); + let person = population[ 0 ].clone(); + + log::trace!( "{person:#?}" ); + a_id!( person.route[ 0 ], NodeIndex( 1 ) ); + a_id!( person.route.len(), 5 ); + a_id!( person.route[ person.route.len() - 1 ], NodeIndex( 1 ) ); + + let unique = person.route.iter().unique().collect_vec(); + + a_id!( person.route.len() - 1, unique.len() ); + +} + +#[ test ] +fn tsp_person_mutate() +{ + logger_init(); + + let hrng = Hrng::master_with_seed( Seed::from_integer(1) ); + let graph = TSPGraph::default(); + + let tsp_initial = TSProblem{ graph, starting_node : NodeIndex( 1 ) }; + let population = tsp_initial.initial_population( hrng.clone(), 1 ); + let mut person = population[ 0 ].clone(); + + log::trace!( "{person:#?}" ); + + TSRouteMutation::swap_nodes( hrng.clone(), &mut person ); + + log::trace!( "{person:#?}" ); + + a_id!( person.route[ 0 ], NodeIndex( 1 ) ); + a_id!( person.route.len(), 5 ); + a_id!( person.route[ person.route.len() - 1 ], NodeIndex( 1 ) ); + + let unique = person.route.iter().unique().collect_vec(); + + a_id!( person.route.len() - 1, unique.len() ); + + TSRouteMutation::reverse_subroute( hrng.clone(), &mut person ); + + log::trace!( "{person:#?}" ); + + a_id!( person.route[ 0 ], NodeIndex( 1 ) ); + a_id!( person.route.len(), 5 ); + a_id!( person.route[ person.route.len() - 1 ], NodeIndex( 1 ) ); + + let unique = person.route.iter().unique().collect_vec(); + + a_id!( person.route.len() - 1, unique.len() ); + + TSRouteMutation::move_subroute( hrng.clone(), &mut person ); + + log::trace!( "{person:#?}" ); + + a_id!( person.route[ 0 ], NodeIndex( 1 ) ); + a_id!( person.route.len(), 5 ); + a_id!( person.route[ person.route.len() - 1 ], NodeIndex( 1 ) ); + + let unique = person.route.iter().unique().collect_vec(); + + a_id!( person.route.len() - 1, unique.len() ); +} + +#[ ignore ] +#[ test ] +fn find_route() +{ + logger_init(); + log::set_max_level( log::LevelFilter::Warn ); + + let graph = TSPGraph::default(); + + let tsp_initial = TSProblem{ graph, starting_node : NodeIndex( 1 ) }; + + let tsp = Problem::new( tsp_initial, OrderedRouteCrossover{}, TSRouteMutation{} ); + + let optimizer = HybridOptimizer::new( Config::default(), tsp ) + .set_population_size( 100 ) + .set_dynasties_limit( 100 ); + + log::set_max_level( log::LevelFilter::max() ); + let ( reason, solution ) = optimizer.optimize(); + + log::trace!( "reason : {reason}" ); + a_true!( solution.is_some() ); + let solution = solution.unwrap(); + log::trace!( "{solution:#?}" ); + log::trace!( "{:#?}", solution.route ); + a_id!( solution.fitness(), 80 ); +} diff --git a/module/move/optimization_tools/tsp_results.md b/module/move/optimization_tools/tsp_results.md new file mode 100644 index 0000000000..22ec13075b --- /dev/null +++ b/module/move/optimization_tools/tsp_results.md @@ -0,0 +1,252 @@ +# Traveling Salesman Problem + +## For hybrid: + + - max number of iterations: 50 + + - max no improvement iterations : 10 + + - improvement threshold : 0.005s + + - calculated points: 79 from 79 + + - points from cache: 0 from 79 + + - number of nodes: 4 + + - execution time: 0.018s + + - parameters: + +``` +┌─────────────┬────────┬────────┬─────────┬─────────────┬──────────┬─────────┬────────┠+│ │ start │ min │ max │ sum of diff │ expected │ changes │ final │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ temperature │ 0.8572 │ 0.00 │ 1.00 │ 0.14 │ 0.00 │ 50 │ 0.9999 │ +│ decrease │ │ │ │ │ │ │ │ +│ coefficient │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 150 │ 10.00 │ 200.00 │ 2920.64 │ 35.19 │ 50 │ 54 │ +│ mutations │ │ │ │ │ │ │ │ +│ per │ │ │ │ │ │ │ │ +│ dynasty │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ mutation │ 0.57 │ 0.00 │ 1.00 │ 21.60 │ 0.26 │ 50 │ 0.02 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ crossover │ 0.56 │ 0.00 │ 1.00 │ 17.49 │ 0.21 │ 50 │ 0.31 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ elitism │ -0.13 │ - │ - │ - │ - │ - │ 0.66 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 35 │ 1.00 │ 100.00 │ 152.19 │ 1.83 │ 50 │ 30 │ +│ stale │ │ │ │ │ │ │ │ +│ iterations │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ population │ 148 │ 1.00 │ 1000.00 │ 20174.02 │ 243.06 │ 50 │ 10 │ +│ size │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ dynasties │ 1982 │ 100.00 │ 2000.00 │ 63109.09 │ 760.35 │ 50 │ 130 │ +│ limit │ │ │ │ │ │ │ │ +└─────────────┴────────┴────────┴─────────┴─────────────┴──────────┴─────────┴────────┘ +``` + + +#### List: + + + - `max number of iterations` : limit of total iterations of optimization process, termination condition + - `max no improvement iterations` : max amount of steps performed without detected improvement, termination condition + - `improvement threshold` : minimal value detected as improvement in objective function result + - `termination reason` : the reason why optimization process was stopped + - `iterations number` : actual number of iterations performed during optimization + - `resumed after stale` : how many times optimization progress was resumed after some iterations without improvement + - `points from cache` : points calculated during previous optimizations and read from cache + - `number of nodes` : number of nodes in graph representing cities from traveling salesman problem + - `execution time` : duration of shortest found hybrid optimization process using final parameters, measured in seconds +#### Table: + - `start` : initial value of parameter in starting point + - `min` : lower bound of parameter + - `max` : upper bound of parameter + - `sum of diff` : sum of absolute differences between starting value and next value + - `expected` : mathematical expectation of difference between starting value and next value + - `changes` : number of successful changes of parameter value to more optimal + - `final` : calculated value of parameter for which execution time was the lowest +## For SA: + + - max number of iterations: 50 + + - max no improvement iterations : 10 + + - improvement threshold : 0.005s + + - calculated points: 33 from 33 + + - points from cache: 0 from 33 + + - number of nodes: 4 + + - execution time: 0.007s + + - parameters: + +``` +┌─────────────┬────────┬────────┬─────────┬─────────────┬──────────┬─────────┬────────┠+│ │ start │ min │ max │ sum of diff │ expected │ changes │ final │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ temperature │ 0.1471 │ 0.00 │ 1.00 │ 8.73 │ 0.35 │ 17 │ 1.0000 │ +│ decrease │ │ │ │ │ │ │ │ +│ coefficient │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 112 │ 10.00 │ 200.00 │ 188.84 │ 7.55 │ 17 │ 110 │ +│ mutations │ │ │ │ │ │ │ │ +│ per │ │ │ │ │ │ │ │ +│ dynasty │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ mutation │ 1.00 │ 1.00 │ 1.00 │ 0.00 │ 0.00 │ 0 │ 1.00 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ crossover │ 0.00 │ 0.00 │ 0.00 │ 0.00 │ 0.00 │ 1 │ 0.00 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ elitism │ -0.00 │ - │ - │ - │ - │ - │ 0.00 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 99 │ 1.00 │ 100.00 │ 1208.63 │ 48.35 │ 17 │ 100 │ +│ stale │ │ │ │ │ │ │ │ +│ iterations │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ population │ 1 │ 1.00 │ 1.00 │ 0.00 │ 0.00 │ 0 │ 1 │ +│ size │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ dynasties │ 808 │ 100.00 │ 5000.00 │ 38996.81 │ 1559.87 │ 17 │ 123 │ +│ limit │ │ │ │ │ │ │ │ +└─────────────┴────────┴────────┴─────────┴─────────────┴──────────┴─────────┴────────┘ +``` + + +#### List: + + + - `max number of iterations` : limit of total iterations of optimization process, termination condition + - `max no improvement iterations` : max amount of steps performed without detected improvement, termination condition + - `improvement threshold` : minimal value detected as improvement in objective function result + - `termination reason` : the reason why optimization process was stopped + - `iterations number` : actual number of iterations performed during optimization + - `resumed after stale` : how many times optimization progress was resumed after some iterations without improvement + - `points from cache` : points calculated during previous optimizations and read from cache + - `number of nodes` : number of nodes in graph representing cities from traveling salesman problem + - `execution time` : duration of shortest found hybrid optimization process using final parameters, measured in seconds +#### Table: + - `start` : initial value of parameter in starting point + - `min` : lower bound of parameter + - `max` : upper bound of parameter + - `sum of diff` : sum of absolute differences between starting value and next value + - `expected` : mathematical expectation of difference between starting value and next value + - `changes` : number of successful changes of parameter value to more optimal + - `final` : calculated value of parameter for which execution time was the lowest +## For GA: + + - max number of iterations: 50 + + - max no improvement iterations : 10 + + - improvement threshold : 0.005s + + - calculated points: 51 from 58 + + - points from cache: 7 from 58 + + - number of nodes: 4 + + - execution time: 0.036s + + - parameters: + +``` +┌─────────────┬────────┬────────┬─────────┬─────────────┬──────────┬─────────┬────────┠+│ │ start │ min │ max │ sum of diff │ expected │ changes │ final │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ temperature │ 0.9963 │ 0.00 │ 1.00 │ 0.05 │ 0.00 │ 32 │ 1.0000 │ +│ decrease │ │ │ │ │ │ │ │ +│ coefficient │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 170 │ 10.00 │ 200.00 │ 2888.32 │ 53.49 │ 32 │ 24 │ +│ mutations │ │ │ │ │ │ │ │ +│ per │ │ │ │ │ │ │ │ +│ dynasty │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ mutation │ 0.39 │ 0.10 │ 1.00 │ 7.22 │ 0.13 │ 32 │ 0.10 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ crossover │ 0.81 │ 0.10 │ 1.00 │ 8.82 │ 0.16 │ 32 │ 0.28 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ elitism │ -0.20 │ - │ - │ - │ - │ - │ 0.61 │ +│ rate │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ max │ 58 │ 1.00 │ 100.00 │ 1589.45 │ 29.43 │ 32 │ 100 │ +│ stale │ │ │ │ │ │ │ │ +│ iterations │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ population │ 572 │ 10.00 │ 2000.00 │ 38470.00 │ 712.41 │ 32 │ 46 │ +│ size │ │ │ │ │ │ │ │ +├─────────────┼────────┼────────┼─────────┼─────────────┼──────────┼─────────┼────────┤ +│ dynasties │ 1824 │ 100.00 │ 2000.00 │ 34862.61 │ 645.60 │ 32 │ 115 │ +│ limit │ │ │ │ │ │ │ │ +└─────────────┴────────┴────────┴─────────┴─────────────┴──────────┴─────────┴────────┘ +``` + + +#### List: + + + - `max number of iterations` : limit of total iterations of optimization process, termination condition + - `max no improvement iterations` : max amount of steps performed without detected improvement, termination condition + - `improvement threshold` : minimal value detected as improvement in objective function result + - `termination reason` : the reason why optimization process was stopped + - `iterations number` : actual number of iterations performed during optimization + - `resumed after stale` : how many times optimization progress was resumed after some iterations without improvement + - `points from cache` : points calculated during previous optimizations and read from cache + - `number of nodes` : number of nodes in graph representing cities from traveling salesman problem + - `execution time` : duration of shortest found hybrid optimization process using final parameters, measured in seconds +#### Table: + - `start` : initial value of parameter in starting point + - `min` : lower bound of parameter + - `max` : upper bound of parameter + - `sum of diff` : sum of absolute differences between starting value and next value + - `expected` : mathematical expectation of difference between starting value and next value + - `changes` : number of successful changes of parameter value to more optimal + - `final` : calculated value of parameter for which execution time was the lowest +## Summary: +``` +┌────────┬─────────────┬───────────┬──────────┬───────────┬─────────┬────────────┬────────────┬───────────┬───────────┠+│ mode │ temperature │ max │ mutation │ crossover │ elitism │ max │ population │ dynasties │ execution │ +│ │ decrease │ mutations │ rate │ rate │ rate │ stale │ size │ limit │ time │ +│ │ coefficient │ per │ │ │ │ iterations │ │ │ │ +│ │ │ dynasty │ │ │ │ │ │ │ │ +├────────┼─────────────┼───────────┼──────────┼───────────┼─────────┼────────────┼────────────┼───────────┼───────────┤ +│ hybrid │ 0.9999 │ 54 │ 0.02 │ 0.31 │ 0.66 │ 30 │ 10 │ 130 │ 0.018s │ +├────────┼─────────────┼───────────┼──────────┼───────────┼─────────┼────────────┼────────────┼───────────┼───────────┤ +│ SA │ 1.0000 │ 110 │ 1.00 │ 0.00 │ 0.00 │ 100 │ 1 │ 123 │ 0.007s │ +├────────┼─────────────┼───────────┼──────────┼───────────┼─────────┼────────────┼────────────┼───────────┼───────────┤ +│ GA │ 1.0000 │ 24 │ 0.10 │ 0.28 │ 0.61 │ 100 │ 46 │ 115 │ 0.036s │ +└────────┴─────────────┴───────────┴──────────┴───────────┴─────────┴────────────┴────────────┴───────────┴───────────┘ +``` + + - `temperature decrease coefficient` : coefficient by which temperature is lowered at each iteration of optimization process + - `max mutations per dynasty` : max number of mutations used to produce vital individual in dynasty + - `mutation rate` : percent of individuals in population that are created using mutation + - `crossover rate` : percent of individuals in population that are created using crossover of selected parents + - `elitism rate` : percent of most fit individuals in population that are cloned without changes + - sum of mutation rate, crossover rate and elitism rate always equals 1 + - `max stale iterations` : max allowed number of iterations that do not produce individuals with better fittness + - `population size` : number of individuals in population + - `dynasties limit` : max number of dynasties of new solutions produced during optimization process, terminates if exceeded + - `execution time` : time spent searching for optimal solution, measured in seconds +## To run: + - Sudoku problem: +`cargo test -- --ignored find_opt_params_sudoku` + - Traveling salesman problem: +`cargo test -- --ignored find_opt_params_tsp` diff --git a/module/move/plot_interface/Cargo.toml b/module/move/plot_interface/Cargo.toml new file mode 100644 index 0000000000..39ad1ab4f8 --- /dev/null +++ b/module/move/plot_interface/Cargo.toml @@ -0,0 +1,69 @@ +[package] +name = "plot_interface" +version = "0.1.3" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/plot_interface" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/plot_interface" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/plot_interface" +description = """ +Plot interface. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/_blank", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "plot_interface" +path = "src/plot/plot_interface_lib.rs" + +[[test]] +name = "plot_interface_test" +path = "tests/plot/plot_interface_tests.rs" + +# [lib] +# name = "plot_interface" +# path = "src/_blank/standard_lib.rs" +# +# [[test]] +# name = "plot_interface_test" +# path = "tests/_blank/tests.rs" + +[[test]] +name = "plot_interface_smoke_test" +path = "tests/smoke_test.rs" + +# [[example]] +# name = "plot_interface_trivial" +# path = "examples/plot_interface_trivial/src/main.rs" + +[dependencies] +wplot = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/move/plot_interface/License b/module/move/plot_interface/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/plot_interface/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/plot_interface/Readme.md b/module/move/plot_interface/Readme.md new file mode 100644 index 0000000000..0e604acfb8 --- /dev/null +++ b/module/move/plot_interface/Readme.md @@ -0,0 +1,30 @@ + + +# Module :: plot_interface + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_plot_interface_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_plot_interface_push.yml) [![docs.rs](https://img.shields.io/docsrs/plot_interface?color=e3e8f0&logo=docs.rs)](https://docs.rs/plot_interface) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Plot interface. + +### Basic use-case + + + +```rust +``` + +### To add to your project + +```bash +cargo add plot_interface +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/plot_interface_trivial +cargo run +``` diff --git a/module/move/plot_interface/src/plot/abs/change.rs b/module/move/plot_interface/src/plot/abs/change.rs new file mode 100644 index 0000000000..c4ed6fba10 --- /dev/null +++ b/module/move/plot_interface/src/plot/abs/change.rs @@ -0,0 +1,34 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// Context. + #[ clone_dyn ] + pub trait ChangeInterface + where + Self : + fmt::Debug + + , + { + + /// Add change to queue of events. + fn add_to< C : ChangerInterface >( self, changer : &mut C ) -> &mut C + where + Self : Sized + 'static, + { + changer.change_add( self ) + } + + } + + // + +} + +crate::mod_interface! +{ + + prelude use ChangeInterface; + +} diff --git a/module/move/plot_interface/src/plot/abs/changer.rs b/module/move/plot_interface/src/plot/abs/changer.rs new file mode 100644 index 0000000000..b3db57d644 --- /dev/null +++ b/module/move/plot_interface/src/plot/abs/changer.rs @@ -0,0 +1,58 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// Context. + pub trait ChangerInterface + where + Self : + fmt::Debug + + Clone + + , + { + /// Type of root changer. + type Root : ChangerInterface; + /// Type of parent changer. + type Parent : ChangerInterface; + + /// Get root. + #[ inline ] + fn root( &mut self ) -> &mut Self::Root + { + // Safaty : that's safe becuase root type is the same for all nodes. + unsafe + { + core::mem::transmute::< _, _ >( self.parent().root() ) + } + } + + /// Get back to root changer. + fn context( self ) -> Self::Root; + + /// Get parent. + fn parent( &mut self ) -> &mut Self::Parent; + + /// Get back to parent changer. + fn end( self ) -> Self::Parent; + + /// Add change. + #[ inline ] + fn change_add< Change >( &mut self, change : Change ) -> &mut Self + where + Change : ChangeInterface + 'static, + { + self.root().change_add( change ); + self + } + + } + +} + +crate::mod_interface! +{ + + prelude use ChangerInterface; + +} diff --git a/module/move/plot_interface/src/plot/abs/context.rs b/module/move/plot_interface/src/plot/abs/context.rs new file mode 100644 index 0000000000..a168563487 --- /dev/null +++ b/module/move/plot_interface/src/plot/abs/context.rs @@ -0,0 +1,33 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + // use crate::abs::*; + // use once_cell::sync::Lazy; + // use std::sync::Mutex; + // use dashmap::DashMap; + // use std::sync::Arc; + + /// Registry of contexts. + pub trait ContextInterface + where + Self : + HasIdInterface + + From_0 + + fmt::Debug + + , + { + /// Type of changer of the context. + type Changer : ChangerInterface; + /// Get changer of the context. + fn changer( &mut self ) -> Self::Changer; + } + +} + +crate::mod_interface! +{ + + prelude use ContextInterface; + +} diff --git a/module/move/plot_interface/src/plot/abs/identity.rs b/module/move/plot_interface/src/plot/abs/identity.rs new file mode 100644 index 0000000000..9c44106555 --- /dev/null +++ b/module/move/plot_interface/src/plot/abs/identity.rs @@ -0,0 +1,86 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use once_cell::sync::Lazy; + use std::sync::Mutex; + use core::hash::Hash; + // use core::any::TypeId; + + static mut COUNTER : Lazy< Mutex< i64 > > = Lazy::new( || + { + Mutex::new( 0 ) + }); + + /// ID interface. + pub trait IdInterface + where + Self : + fmt::Debug + + Clone + + Copy + + PartialEq + + Eq + + Hash + + , + { + } + + /// Has id. + pub trait HasIdInterface + where + Self : + fmt::Debug + + { + /// Get id. + fn id( &self ) -> Id; + } + + /// Reference on context. + #[ derive( Clone, Copy, PartialEq, Eq, Hash ) ] + pub struct Id + { + // #[ allow( dead_code ) ] + // tp_id : core::any::TypeId, + #[ allow( dead_code ) ] + in_id : i64, + } + + impl Id + { + /// Construct a new id increasing counter. + pub fn new< T >() -> Self + where + T : core::any::Any, + { + // SAFETY : mutex guard it + let mut c = unsafe { COUNTER.lock().unwrap() }; + *c += 1; + Self + { + in_id : *c, + } + } + } + + impl IdInterface for Id + { + } + + impl fmt::Debug for Id + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "id::{:?}", self.in_id ) ) + } + } + +} + +crate::mod_interface! +{ + + exposed use Id; + prelude use { IdInterface, HasIdInterface }; + +} diff --git a/module/move/plot_interface/src/plot/abs/mod.rs b/module/move/plot_interface/src/plot/abs/mod.rs new file mode 100644 index 0000000000..eefd98908c --- /dev/null +++ b/module/move/plot_interface/src/plot/abs/mod.rs @@ -0,0 +1,18 @@ +crate::mod_interface! +{ + + /// Describe change. + layer change; + /// Describe changer. + layer changer; + /// Describe system. + layer context; + + /// Identity of resource. + layer identity; + /// Registry. + layer registry; + + // exposed use Drawing; + +} \ No newline at end of file diff --git a/module/move/plot_interface/src/plot/abs/registry.rs b/module/move/plot_interface/src/plot/abs/registry.rs new file mode 100644 index 0000000000..82a18645a4 --- /dev/null +++ b/module/move/plot_interface/src/plot/abs/registry.rs @@ -0,0 +1,78 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + // use crate::abs::*; + use once_cell::sync::Lazy; + use std::sync::Mutex; + use dashmap::DashMap; + use std::sync::Arc; + + /// Registry of contexts. + #[ derive( Debug ) ] + pub struct Registry< Context > + where + Context : ContextInterface, + { + contexts : DashMap< Id, Context >, + contexts_with_name : DashMap< String, Id >, + current_context_name : Option< String >, + } + + impl< Context > Registry< Context > + where + Context : ContextInterface, + { + + /// Static constructor. + pub const fn new() -> Lazy< Arc< Mutex< Registry< Context > > > > + { + Lazy::new( || + { + let contexts = DashMap::new(); + let contexts_with_name = DashMap::new(); + let current_context_name = None; + Arc::new( Mutex::new( Registry::< Context > + { + contexts, + contexts_with_name, + current_context_name, + })) + }) + } + + /// Construct a new context. + pub fn current( _registry : &mut Lazy< Arc< Mutex< Registry< Context > > > > ) -> Context::Changer + { + let registry = _registry.lock().unwrap(); + let mut current_name : Option< String > = registry.current_context_name.clone(); + if current_name.is_none() + { + current_name = Some( "default".into() ) + } + let current_name = current_name.unwrap(); + if registry.contexts_with_name.contains_key( ¤t_name ) + { + let id = *registry.contexts_with_name.get( ¤t_name ).unwrap().value(); + registry.contexts.get_mut( &id ).unwrap().value_mut().changer() + } + else + { + let context : Context = from!(); + let id = context.id(); + registry.contexts_with_name.insert( current_name, context.id() ); + registry.contexts.insert( id, context ); + registry.contexts.get_mut( &id ).unwrap().value_mut().changer() + } + } + + } + +} + +crate::mod_interface! +{ + + orphan use Registry; + +} diff --git a/module/move/plot_interface/src/plot/color.rs b/module/move/plot_interface/src/plot/color.rs new file mode 100644 index 0000000000..b41399f253 --- /dev/null +++ b/module/move/plot_interface/src/plot/color.rs @@ -0,0 +1,103 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use num_traits::{ Zero }; /* zzz : consider as submodule for wtools */ + + /// Convertable into RGBA. + pub trait RgbaInterface< T > + where + T : Zero + fmt::Debug + Clone + Copy, + { + /// Convert into RGBA. + fn into_rgba( self ) -> Rgba< T >; + } + + // zzz : use type_constructor::Enumberable for indexed access to color components + + /// RGBA + #[ derive( Debug, Clone ) ] + pub struct Rgba< T = f32 > + where + T : Zero + fmt::Debug + Clone + Copy, + { + /// Red. + pub r : T, + /// Green. + pub g : T, + /// Blue. + pub b : T, + /// Alpha. + pub a : T, + } + + impl< T > Default for Rgba< T > + where + T : Zero + fmt::Debug + Clone + Copy, + { + fn default() -> Self + { + Self + { + r : Zero::zero(), + g : Zero::zero(), + b : Zero::zero(), + a : Zero::zero(), + } + } + } + + impl< T > RgbaInterface< T > for Rgba< T > + where + T : Zero + fmt::Debug + Clone + Copy, + { + fn into_rgba( self ) -> Rgba< T > + { + self + } + } + + impl RgbaInterface< f32 > + for [ f32 ; 3 ] + { + fn into_rgba( self ) -> Rgba< f32 > + { + Rgba::< f32 > + { + r : self[ 0 ], + g : self[ 1 ], + b : self[ 2 ], + a : 1.0, + } + } + } + + impl RgbaInterface< f32 > + for [ f32 ; 4 ] + { + fn into_rgba( self ) -> Rgba< f32 > + { + Rgba::< f32 > + { + r : self[ 0 ], + g : self[ 1 ], + b : self[ 2 ], + a : self[ 3 ], + } + } + } + +} + +crate::mod_interface! +{ + + protected use ::rgb::*; + + #[ cfg( not( feature = "no_std" ) ) ] + exposed use Rgba; + + #[ cfg( not( feature = "no_std" ) ) ] + prelude use RgbaInterface; + +} diff --git a/module/move/plot_interface/src/plot/plot_interface_lib.rs b/module/move/plot_interface/src/plot/plot_interface_lib.rs new file mode 100644 index 0000000000..0f2bd16dd0 --- /dev/null +++ b/module/move/plot_interface/src/plot/plot_interface_lib.rs @@ -0,0 +1,19 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/plot_interface/latest/plot_interface/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] + +//! +//! Plot interface. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use wplot::*; diff --git a/module/move/plot_interface/src/plot/sys/context.rs b/module/move/plot_interface/src/plot/sys/context.rs new file mode 100644 index 0000000000..9b11a3f80a --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/context.rs @@ -0,0 +1,90 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use crate::abs::*; + + use once_cell::sync::Lazy; + use std::sync::Mutex; + use std::sync::Arc; + + /// Context. + #[ derive( Debug, Clone ) ] + pub struct Context + { + id : Id, + stroke : Option< StrokeBrush >, + drawing : Option< Drawing >, + } + + impl Context + { + } + + impl From_0 for Context + { + fn from_0() -> Self + { + let id = Id::new::< Self >(); + let stroke = None; + let drawing = None; + Self + { + id, + stroke, + drawing, + } + } + } + + impl ContextInterface for Context + { + + type Changer = ContextChanger; + + fn changer( &mut self ) -> Self::Changer + { + let id = self.id(); + let stroke = self.stroke.as_ref().map( | stroke | stroke.id() ); + let drawing = self.drawing.as_ref().map( | drawing | drawing.id() ); + let changes = Vec::new(); + ContextChanger + { + id, + stroke, + drawing, + changes, + } + } + + } + + impl HasIdInterface for Context + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + + /// Registry of contexts. + pub static mut REGISTRY : Lazy< Arc< Mutex< Registry< Context > > > > = Registry::< Context >::new(); + + /// Get current context. + pub fn current() -> ContextChanger + { + // Safety : under mutex. + unsafe + { + Registry::< Context >::current( &mut REGISTRY ) + } + } + +} + +crate::mod_interface! +{ + protected use { REGISTRY, current }; + exposed use { Context, current as context }; +} diff --git a/module/move/plot_interface/src/plot/sys/context_changer.rs b/module/move/plot_interface/src/plot/sys/context_changer.rs new file mode 100644 index 0000000000..e32452adf9 --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/context_changer.rs @@ -0,0 +1,104 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// Context. + #[ allow( dead_code ) ] + #[ derive( Clone ) ] + pub struct ContextChanger + { + /// Id. + pub( crate ) id : Id, + /// Stroke brush. + pub( crate ) stroke : Option< Id >, + /// Drawing. + pub( crate ) drawing : Option< Id >, + /// Queue of changes. + pub changes : Vec< Box< dyn ChangeInterface > >, + } + + impl ContextChanger + { + /// Parameters of stroke. + #[ inline ] + pub fn stroke( self ) -> StrokeBrushChanger + { + StrokeBrushChanger::_new( self ) + } + /// Draw. + #[ inline ] + pub fn draw( self ) -> DrawChanger + { + DrawChanger::_new( self ) + } + } + + impl fmt::Debug for ContextChanger + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_str( "ContextChanger" )?; + for ( _i, e ) in self.changes.iter().enumerate() + { + f.write_str( &wtools::string::indentation( " ", format!( "\n{:?}", e ), "" ) )?; + } + Ok( () ) + } + } + + impl ChangerInterface for ContextChanger + { + type Parent = ContextChanger; + type Root = ContextChanger; + + #[ inline ] + fn root( &mut self ) -> &mut Self::Root + { + self + } + + #[ inline ] + fn context( self ) -> Self::Root + { + self + } + + #[ inline ] + fn parent( &mut self ) -> &mut Self::Parent + { + self + } + + #[ inline ] + fn end( self ) -> Self::Parent + { + self + } + + #[ inline ] + fn change_add< Change >( &mut self, change : Change ) -> &mut Self + where + Change : ChangeInterface + 'static, + { + self.changes.push( Box::new( change ) ); + self + } + + } + + impl HasIdInterface for ContextChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +crate::mod_interface! +{ + exposed use ContextChanger; +} diff --git a/module/move/plot_interface/src/plot/sys/drawing.rs b/module/move/plot_interface/src/plot/sys/drawing.rs new file mode 100644 index 0000000000..2efa4e8eaa --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing.rs @@ -0,0 +1,57 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// Drawing. + #[ derive( Debug, Clone ) ] + pub struct Drawing + { + pub( crate ) id : Id, + } + + impl Drawing + { + /// Constructor. + pub fn new() -> Self + { + let id = Id::new::< Self >(); + Self + { + id, + } + } + } + + impl HasIdInterface for Drawing + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +crate::mod_interface! +{ + + /// Draw changer. + layer changer; + /// ChangeInterface for drawing constructor. + layer change_new; + /// Draw command. + layer command; + /// Draw queue. + layer queue; + /// New shape : rectangle. + layer rect_change_new; + /// Change region of the rectangle. + layer rect_change_region; + /// Rectangle change. + layer rect_changer; + + exposed use Drawing; + +} diff --git a/module/move/plot_interface/src/plot/sys/drawing/change_new.rs b/module/move/plot_interface/src/plot/sys/drawing/change_new.rs new file mode 100644 index 0000000000..08b0125b77 --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing/change_new.rs @@ -0,0 +1,32 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct DrawingChangeNew + { + id : Id, + } + + impl DrawingChangeNew + { + /// Constructor. + pub fn new( id : Id ) -> Self + { + Self{ id } + } + } + + impl ChangeInterface for DrawingChangeNew + { + } + +} + +crate::mod_interface! +{ + exposed use DrawingChangeNew; +} diff --git a/module/move/plot_interface/src/plot/sys/drawing/changer.rs b/module/move/plot_interface/src/plot/sys/drawing/changer.rs new file mode 100644 index 0000000000..eaa2d0c76f --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing/changer.rs @@ -0,0 +1,81 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct DrawChanger + { + pub( crate ) id : Id, + pub( crate ) context_changer : ContextChanger, + } + + impl DrawChanger + { + /// Constructor. + #[ inline ] + pub( crate ) fn _new( mut context_changer : ContextChanger ) -> Self + { + let id = &mut context_changer.drawing; + if id.is_none() + { + *id = Some( Id::new::< Self >() ); + DrawingChangeNew::new( id.unwrap() ).add_to( &mut context_changer ); + } + let id = context_changer.drawing.unwrap(); + Self + { + id, + context_changer, + } + } + /// ChangeInterface color. + #[ inline ] + pub fn rect( self ) -> RectChanger + { + RectChanger::_new( self ) + } + } + + impl ChangerInterface for DrawChanger + { + type Parent = ContextChanger; + type Root = ContextChanger; + + #[ inline ] + fn context( self ) -> Self::Root + { + self.context_changer + } + + #[ inline ] + fn parent( &mut self ) -> &mut Self::Parent + { + &mut self.context_changer + } + + #[ inline ] + fn end( self ) -> Self::Parent + { + self.context_changer + } + + } + + impl HasIdInterface for DrawChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.context_changer.id() + } + } + +} + +crate::mod_interface! +{ + exposed use DrawChanger; +} diff --git a/module/move/plot_interface/src/plot/sys/drawing/command.rs b/module/move/plot_interface/src/plot/sys/drawing/command.rs new file mode 100644 index 0000000000..8108cbcf17 --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing/command.rs @@ -0,0 +1,18 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + + // /// Interface of command to draw something. + // pub trait DrawCommandInterface + // where + // Self : fmt::Debug, + // { + // } + +} + +crate::mod_interface! +{ + // exposed use DrawCommandInterface; +} diff --git a/module/move/plot_interface/src/plot/sys/drawing/queue.rs b/module/move/plot_interface/src/plot/sys/drawing/queue.rs new file mode 100644 index 0000000000..6b9ba83b3c --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing/queue.rs @@ -0,0 +1,30 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; +// use crate::drawing_changer::*; +// +// /// Queue of draw commands. +// #[ derive( Debug ) ] +// pub struct Queue +// { +// /// Container to store commands. +// pub container : Vec< Box< dyn DrawCommandInterface > >, +// } +// +// impl Queue +// { +// /// Constructor. +// pub fn new() -> Self +// { +// let container = Vec::new(); +// Self { container } +// } +// } + +} + +crate::mod_interface! +{ + // exposed use Queue; +} diff --git a/module/move/plot_interface/src/plot/sys/drawing/rect_change_new.rs b/module/move/plot_interface/src/plot/sys/drawing/rect_change_new.rs new file mode 100644 index 0000000000..f3ce04bca6 --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing/rect_change_new.rs @@ -0,0 +1,35 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// Command to draw rectangle. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct RectChangeNew + { + /// Id. + pub( crate ) id : Id, + } + + impl RectChangeNew + { + + /// Constructor + pub fn new( id : Id ) -> Self + { + Self{ id } + } + + } + + impl ChangeInterface for RectChangeNew + { + } + +} + +crate::mod_interface! +{ + exposed use RectChangeNew; +} diff --git a/module/move/plot_interface/src/plot/sys/drawing/rect_change_region.rs b/module/move/plot_interface/src/plot/sys/drawing/rect_change_region.rs new file mode 100644 index 0000000000..163a8309ea --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing/rect_change_region.rs @@ -0,0 +1,49 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// Command to draw rectangle. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct RectChangeRegion + { + /// Id. + pub( crate ) id : Id, + /// Left-top corner. + pub( crate ) left_top : X2< f32 >, + /// Right-bottom corner. + pub( crate ) right_bottom : X2< f32 >, + } + + impl RectChangeRegion + { + + /// Constructor + pub fn new( id : Id ) -> Self + { + let left_top = X2::make( -1.0, -1.0 ); + let right_bottom = X2::make( 1.0, 1.0 ); + Self{ left_top, right_bottom, id } + } + + /// Constructor + pub fn region( mut self, left_top : X2< f32 >, right_bottom : X2< f32 > ) -> Self + { + self.left_top = left_top; + self.right_bottom = right_bottom; + self + } + + } + + impl ChangeInterface for RectChangeRegion + { + } + +} + +crate::mod_interface! +{ + exposed use RectChangeRegion; +} diff --git a/module/move/plot_interface/src/plot/sys/drawing/rect_changer.rs b/module/move/plot_interface/src/plot/sys/drawing/rect_changer.rs new file mode 100644 index 0000000000..3550c4153c --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/drawing/rect_changer.rs @@ -0,0 +1,93 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// Command to draw rectangle. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct RectChanger + { + /// Id. + pub( crate ) id : Id, + /// Draw changer. + pub( crate ) draw : DrawChanger, + } + + impl RectChanger + { + + /// Constructor. + #[ inline ] + pub fn _new( draw : DrawChanger ) -> Self + { + let id = Id::new::< Self >(); + let change = RectChangeNew::new( id ); + let mut result = Self{ id, draw }; + change.add_to( &mut result ); + result + } + + /// ChangeInterface region. + #[ inline ] + pub fn region( mut self, left_top : X2< f32 >, right_bottom : X2< f32 > ) -> Self + { + let change = RectChangeRegion::new( self.id() ).region( left_top, right_bottom ); + self.change_add( change ); + self + } + + /// Get back to draw. + #[ inline ] + pub fn draw( self ) -> DrawChanger + { + self.draw + } + + /// Get back to context. + #[ inline ] + pub fn context( self ) -> ContextChanger + { + self.draw.context_changer + } + + } + + impl ChangerInterface for RectChanger + { + + type Parent = DrawChanger; + type Root = ContextChanger; + + fn context( self ) -> Self::Root + { + self.draw.context_changer + } + + fn parent( &mut self ) -> &mut Self::Parent + { + &mut self.draw + } + + fn end( self ) -> Self::Parent + { + self.draw + } + + } + + impl HasIdInterface for RectChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.draw.id() + } + } + +} + +crate::mod_interface! +{ + exposed use RectChanger; +} \ No newline at end of file diff --git a/module/move/plot_interface/src/plot/sys/mod.rs b/module/move/plot_interface/src/plot/sys/mod.rs new file mode 100644 index 0000000000..d55e986c5b --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/mod.rs @@ -0,0 +1,18 @@ +crate::mod_interface! +{ + + /// Main aggregating object. + layer context; + /// Context changer. + layer context_changer; + + /// Draw changer. + layer drawing; + /// Brush stroke. + layer stroke_brush; + /// Target to draw. + layer target; + + // exposed use Drawing; + +} diff --git a/module/move/plot_interface/src/plot/sys/stroke_brush.rs b/module/move/plot_interface/src/plot/sys/stroke_brush.rs new file mode 100644 index 0000000000..28a88e7aee --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/stroke_brush.rs @@ -0,0 +1,79 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// StrokeBrush. + #[ derive( Debug, Clone ) ] + pub struct StrokeBrush + { + pub( crate ) id : Id, + pub( crate ) color : Rgba, + pub( crate ) width : f32, + } + + impl Default for StrokeBrush + { + fn default() -> Self + { + let id = Id::new::< Self >(); + let color = Default::default(); + let width = 1.0; + Self { id, color, width } + } + } + + impl StrokeBrush + { + + /// Constructor. + pub fn new() -> Self + { + Default::default() + } + + /// ChangeInterface color. + #[ inline ] + pub fn color< Color >( mut self, val : Color ) -> Self + where + Color : RgbaInterface< f32 >, + { + self.color = val.into_rgba(); + self + } + + /// ChangeInterface color. + #[ inline ] + pub fn width( mut self, val : f32 ) -> Self + { + self.width = val; + self + } + + } + + impl HasIdInterface for StrokeBrush + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +crate::mod_interface! +{ + exposed use StrokeBrush; + + /// ChangerInterface of brush stroke. + layer changer; + /// ChangeInterface of brush stroke constructor. + layer change_new; + /// ChangeInterface of brush stroke to change color. + layer change_color; + /// ChangeInterface of brush stroke to change width. + layer change_width; + +} diff --git a/module/move/plot_interface/src/plot/sys/stroke_brush/change_color.rs b/module/move/plot_interface/src/plot/sys/stroke_brush/change_color.rs new file mode 100644 index 0000000000..98d55ffbaa --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/stroke_brush/change_color.rs @@ -0,0 +1,35 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct StrokeBrushChangeColor + { + pub( crate ) id : Id, + pub( crate ) val : Rgba< f32 >, + } + + impl StrokeBrushChangeColor + { + /// Constructor. + pub fn new< Color >( id : Id, val : Color ) -> Self + where + Color : RgbaInterface< f32 >, + { + Self{ id, val : val.into_rgba() } + } + } + + impl ChangeInterface for StrokeBrushChangeColor + { + } + +} + +crate::mod_interface! +{ + exposed use StrokeBrushChangeColor; +} diff --git a/module/move/plot_interface/src/plot/sys/stroke_brush/change_new.rs b/module/move/plot_interface/src/plot/sys/stroke_brush/change_new.rs new file mode 100644 index 0000000000..86f5ae3914 --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/stroke_brush/change_new.rs @@ -0,0 +1,32 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct StrokeBrushChangeNew + { + pub( crate ) id : Id, + } + + impl StrokeBrushChangeNew + { + /// Constructor. + pub fn new( id : Id ) -> Self + { + Self{ id } + } + } + + impl ChangeInterface for StrokeBrushChangeNew + { + } + +} + +crate::mod_interface! +{ + exposed use StrokeBrushChangeNew; +} diff --git a/module/move/plot_interface/src/plot/sys/stroke_brush/change_width.rs b/module/move/plot_interface/src/plot/sys/stroke_brush/change_width.rs new file mode 100644 index 0000000000..41c86c90e3 --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/stroke_brush/change_width.rs @@ -0,0 +1,33 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct StrokeBrushChangeWidth + { + pub( crate ) id : Id, + pub( crate ) val : f32, + } + + impl StrokeBrushChangeWidth + { + /// Constructor. + pub fn new( id : Id, val : f32 ) -> Self + { + Self { id, val } + } + } + + impl ChangeInterface for StrokeBrushChangeWidth + { + } + +} + +crate::mod_interface! +{ + exposed use StrokeBrushChangeWidth; +} diff --git a/module/move/plot_interface/src/plot/sys/stroke_brush/changer.rs b/module/move/plot_interface/src/plot/sys/stroke_brush/changer.rs new file mode 100644 index 0000000000..c18ebbd4f7 --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/stroke_brush/changer.rs @@ -0,0 +1,104 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct StrokeBrushChanger + { + pub( crate ) id : Id, + pub( crate ) context_changer : ContextChanger, + } + + impl StrokeBrushChanger + { + + /// Constructor. + #[ inline ] + pub( crate ) fn _new( mut context_changer : ContextChanger ) -> Self + { + let id = &mut context_changer.stroke; + if id.is_none() + { + *id = Some( Id::new::< StrokeBrush >() ); + StrokeBrushChangeNew::new( context_changer.stroke.unwrap() ).add_to( &mut context_changer ); + } + let id = context_changer.stroke.unwrap(); + Self + { + id, + context_changer, + } + } + + // /// Get back to context. + // #[ inline ] + // pub fn context( self ) -> ContextChanger + // { + // self.context_changer + // } + + /// ChangeInterface color. + #[ inline ] + pub fn color< Color >( mut self, color : Color ) -> Self + where + Color : RgbaInterface< f32 >, + { + let id = self.id; + let change = StrokeBrushChangeColor::new( id, color.into_rgba() ); + self.change_add( change ); + self + } + + /// Width. + #[ inline ] + pub fn width( mut self, val : f32 ) -> Self + { + let id = self.id; + let change = StrokeBrushChangeWidth::new( id, val ); + self.change_add( change ); + self + } + + } + + impl ChangerInterface for StrokeBrushChanger + { + + type Parent = ContextChanger; + type Root = ContextChanger; + + fn context( self ) -> Self::Root + { + self.context_changer + } + + fn parent( &mut self ) -> &mut Self::Parent + { + &mut self.context_changer + } + + fn end( self ) -> Self::Parent + { + self.context_changer + } + + } + + impl HasIdInterface for StrokeBrushChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +crate::mod_interface! +{ + exposed use StrokeBrushChanger; +} diff --git a/module/move/plot_interface/src/plot/sys/target.rs b/module/move/plot_interface/src/plot/sys/target.rs new file mode 100644 index 0000000000..0f7d04edff --- /dev/null +++ b/module/move/plot_interface/src/plot/sys/target.rs @@ -0,0 +1,13 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::prelude::*; + + + +} + +crate::mod_interface! +{ + // exposed use StrokeBrush; +} diff --git a/module/move/plot_interface/src/plot/wplot_lib.rs b/module/move/plot_interface/src/plot/wplot_lib.rs new file mode 100644 index 0000000000..13e61e7dfd --- /dev/null +++ b/module/move/plot_interface/src/plot/wplot_lib.rs @@ -0,0 +1,48 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wplot/latest/wplot/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] + +//! +//! Plot interface. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// pub use ::wmath as math; +// use ::wtools::prelude::*; +use ::wtools::mod_interface; + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::image; + pub use ::open; + pub use ::wmath; + pub use ::rgb; +} + +crate::mod_interface! +{ + + /// Describe colors. + #[ cfg( not( feature = "no_std" ) ) ] + layer color; + /// Abstraction. + #[ cfg( not( feature = "no_std" ) ) ] + layer abs; + /// Concrete system. + #[ cfg( not( feature = "no_std" ) ) ] + layer sys; + + use super::math; + protected use ::wmath as math; + protected( crate ) use ::wtools::prelude::*; + +} diff --git a/module/move/plot_interface/tests/plot/inc.rs b/module/move/plot_interface/tests/plot/inc.rs new file mode 100644 index 0000000000..7ca3cf7dd6 --- /dev/null +++ b/module/move/plot_interface/tests/plot/inc.rs @@ -0,0 +1,5 @@ + +#[ allow( unused_imports ) ] +use super::*; +#[ cfg( not( feature = "no_std" ) ) ] +mod basic_test; diff --git a/module/move/plot_interface/tests/plot/inc/basic_test.rs b/module/move/plot_interface/tests/plot/inc/basic_test.rs new file mode 100644 index 0000000000..5bb2663c97 --- /dev/null +++ b/module/move/plot_interface/tests/plot/inc/basic_test.rs @@ -0,0 +1,91 @@ +use super::*; + +// zzz : remove +// pub use wmath::X2; +// pub use wmath::X2BasicInterface; + +// + +tests_impls! +{ + + #[ignore] + fn without() + { + use the_module::math::X2; + use the_module::prelude::*; + + let file_name = "./test.png"; + let dims = X2::make( 32, 32 ); + let mut imgbuf = the_module::dependency::image::ImageBuffer::new( dims.0, dims.1 ); + + for x in 0 ..= 30 + { + let y = 0; + *imgbuf.get_pixel_mut( x, y ) = the_module::dependency::image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + for x in 1 ..= 31 + { + let y = 31; + *imgbuf.get_pixel_mut( x, y ) = the_module::dependency::image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + for y in 0 ..= 30 + { + let x = 31; + *imgbuf.get_pixel_mut( x, y ) = the_module::dependency::image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + for y in 1 ..= 31 + { + let x = 0; + *imgbuf.get_pixel_mut( x, y ) = the_module::dependency::image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + imgbuf.save( file_name ).unwrap(); + // open::that( file_name ).unwrap(); + + } + + // + + // #[ignore] +// fn basic() +// { +// use the_module::math::X2; +// use the_module::prelude::*; + +// // let c = the_module::context::make(); +// let mut c = the_module::context(); +// // let c = the_module::context().new(); + +// // c.canvas.size( from!( 32, 32 ) ); +// let c = c +// // .stroke().color( [ 1.0, 0.0, 1.0 ] ).end() +// .stroke().width( 2.0 ).color( [ 1.0, 0.0, 1.0 ] ).context() +// // c.draw().begin(); +// // c.draw().name( "drawing1" ); +// .draw().rect().context() +// // c.draw().rect().region( from!( 0.0, 0.0 ), from!( 1.0, 1.0 ) ).context(); +// // c.draw().end(); +// // c.draw().now(); +// ; + +// // // c.canvas().storing_to_file_path( file_name ); +// // // c.canvas().showing_file( true ); +// // c.canvas().store_to_file(); + +// println!( "{:?}", c ); + +// } + +} + +// + +tests_index! +{ + without, + //basic, +} diff --git a/module/move/plot_interface/tests/plot/plot_interface_tests.rs b/module/move/plot_interface/tests/plot/plot_interface_tests.rs new file mode 100644 index 0000000000..38cfac27df --- /dev/null +++ b/module/move/plot_interface/tests/plot/plot_interface_tests.rs @@ -0,0 +1,7 @@ + +#[ allow( unused_imports ) ] +use plot_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/move/plot_interface/tests/plot/wplot_tests.rs b/module/move/plot_interface/tests/plot/wplot_tests.rs new file mode 100644 index 0000000000..aa6bf266fa --- /dev/null +++ b/module/move/plot_interface/tests/plot/wplot_tests.rs @@ -0,0 +1,7 @@ + +#[ allow( unused_imports ) ] +use wplot as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/move/plot_interface/tests/smoke_test.rs b/module/move/plot_interface/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/move/plot_interface/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/refiner/Cargo.toml b/module/move/refiner/Cargo.toml new file mode 100644 index 0000000000..07a2ece076 --- /dev/null +++ b/module/move/refiner/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "refiner" +version = "0.1.1" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/refiner" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/refiner" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/refiner" +description = """ +Utility to operate files from a command line. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [] + +[dependencies] +# wtools = { workspace = true } +error_tools ={ workspace = true, features = [ "full" ] } +meta_tools = { workspace = true, features = [ "full" ] } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/move/refiner/License b/module/move/refiner/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/refiner/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/refiner/Readme.md b/module/move/refiner/Readme.md new file mode 100644 index 0000000000..e6455c5205 --- /dev/null +++ b/module/move/refiner/Readme.md @@ -0,0 +1,20 @@ + + +# Module :: refiner + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_refiner_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_refiner_push.yml) [![docs.rs](https://img.shields.io/docsrs/refiner?color=e3e8f0&logo=docs.rs)](https://docs.rs/refiner) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Utility to operate files from a command line. + + diff --git a/module/move/refiner/src/instruction.rs b/module/move/refiner/src/instruction.rs new file mode 100644 index 0000000000..70e62cabf5 --- /dev/null +++ b/module/move/refiner/src/instruction.rs @@ -0,0 +1,226 @@ +/// Private namespace of the module. +pub( crate ) mod private +{ + use std::collections::HashMap; + + // use wtools::error::{ BasicError, err }; + use error_tools::error::{ BasicError, err }; + // use error_tools::BasicError; + // use error_tools::err; + + /// + /// Instruction. + /// + + #[ derive( Debug, PartialEq, Eq ) ] + pub struct Instruction + { + /// Error of parsing an instruction. + pub err : Option< BasicError >, + /// Command name. + pub command_name : Box< str >, + /// Subject of command. + pub subject : Vec< Box< str > >, + /// Properties of command. + pub properties_map : HashMap< Box< str >, Box< str > >, + } + + impl Instruction + { + fn new() -> Self + { + Self + { + err : None, + command_name : Default::default(), + subject : Default::default(), + properties_map : Default::default(), + + } + } + } + + // + + /// + /// Adapter for instruction. + /// + + pub trait InstructionParseParamsAdapter + { + + /// Print info about command format. + fn about_command_format( &self ) -> &'static str + { + r#"Command should start from a dot `.`. + Command can have a subject and properties. + Property is pair delimited by colon `:`. + For example: `.struct1 subject key1:val key2:val2`."# + } + + /// Check that command begins with dot. + fn instruction_split_is_command< Src : AsRef< str > >( &self, src : Src ) -> bool + { + src.as_ref().starts_with( '.' ) + } + + /// Normalize command name. + fn command_name_normalize< Src : AsRef< str > >( &self, src : Src ) -> Box< str > + { + let splits : Vec< &str > = src.as_ref() + .split_whitespace() + .flat_map( | e | e.split( '.' ) ) + .filter( | e | e != &"" ) + .collect(); + ( ".".to_string() + &splits.join( "." ) ).into_boxed_str() + } + + /// Make properties map. + fn split_belong_to_properties< Src : AsRef< str > >( &self, src : Src ) -> i32 + { + let src = src.as_ref(); + if !src.contains( ':' ) + { + return 0; + } + let splits : Vec< &str > = src + .split_ascii_whitespace() + .flat_map( | e | e.split( ':' ) ) + .filter( | e | e != &"" ) + .collect(); + let index = splits.iter().position( | e | *e == ":" ).unwrap(); + if index == 0 + { + return 2; + } + 1 + } + + /// Parse instruction from splits. + /* zzz : make it accept also vector */ + fn parse_from_splits< I >( &self, mut splits : I ) -> Instruction + where + < I as Iterator >::Item : core::fmt::Display, + < I as Iterator >::Item : AsRef< str >, + I : core::iter::Iterator, + { + let mut result = Instruction::new(); + + // splits.for_each( | arg | println!( "{}", arg ) ); + + let command_name = splits.next(); + + if command_name.is_none() + { + result.err = Some( err!( "Lack of arguments" ) ); + return result; + } + + let command_name = command_name.unwrap(); + + if !self.instruction_split_is_command( &command_name ) + { + result.err = Some( err!( "{}\nDoes not start as command\n{}", command_name, self.about_command_format() ) ); + return result; + } + + result.command_name = self.command_name_normalize( command_name ); + + // let params_splits; + + while let Some( split ) = splits.next() + { + let split_unwrap = split.as_ref(); + let belong = self.split_belong_to_properties( split_unwrap ); + if belong > 0 + { + // if belong == 1 + { + let props_splits = std::iter::once( split ).chain( splits ); + result.properties_map = crate::props::parse_from_splits( props_splits ); + } + break; + } + result.subject.push( split_unwrap.to_string().into_boxed_str() ); + // params_splits.chain(); + } + + // dbg!( ); + + // super::params::parse_from_splits( ); + + result + } + + // // + // + // fn str_structure_parse() + // { + // + // } + + } + + /// + /// Parameters of instruction. + /// + + #[ derive( Debug, PartialEq, Eq ) ] + pub struct InstructionParseParams + { + } + + impl InstructionParseParams + { + /// Create new instruction parameters. + pub fn new() -> Self + { + Self + { + } + } + } + + impl InstructionParseParamsAdapter for InstructionParseParams + { + } + + // + + /// + /// Parse input as instruction from splits. + /// + + pub fn parse_from_splits< I >( splits : I ) -> Instruction + where + < I as Iterator >::Item : core::fmt::Display, + < I as Iterator >::Item : AsRef< str >, + I : core::iter::Iterator, + { + let params = InstructionParseParams::new(); + params.parse_from_splits( splits ) + } + + // + + // var command = commandIdentitySet.command = Object.create( null ); + // command.subjectHint = 'A name of identity.'; + // command.hint = 'Modify an existed identity.'; + // command.longHint = 'Much longer description.'; + // command.properties = + // { + // 'login' : 'An identity login ( user name ) that is used for all identity scripts if no specifique login defined.', + // 'email' : 'An email that is used for all identity scripts if no specifique email defined.', + // }; +} + +// + +::meta_tools::mod_interface! +{ + // qqq : for Dima : bad : list all elements, don't use * for private /* aaa : Dmytro : expanded */ + prelude use Instruction; + prelude use InstructionParseParamsAdapter; + prelude use InstructionParseParams; + prelude use parse_from_splits; +} diff --git a/module/move/refiner/src/lib.rs b/module/move/refiner/src/lib.rs new file mode 100644 index 0000000000..342f675a6b --- /dev/null +++ b/module/move/refiner/src/lib.rs @@ -0,0 +1,15 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wcensor/latest/wcensor/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +::meta_tools::mod_interface! +{ + /// Result of parsing. + #[ cfg( not( feature = "no_std" ) ) ] + layer instruction; + /// Properties parsing. + #[ cfg( not( feature = "no_std" ) ) ] + layer props; +} diff --git a/module/move/refiner/src/main.rs b/module/move/refiner/src/main.rs new file mode 100644 index 0000000000..eefd07ad53 --- /dev/null +++ b/module/move/refiner/src/main.rs @@ -0,0 +1,26 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/refiner/latest/refiner/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +use std::env; +#[ allow( unused_imports ) ] +use ::refiner::*; + +fn main() +{ + + let instruction = instruction::parse_from_splits( env::args().skip( 1 ) ); + println!( "{:?}", instruction ); + + // let splits : Vec< &str > = "23cd23def".split( &[ "23", "e" ][ .. ] ).collect(); + // dbg!( &splits ); + + // let splits : Vec< &str > = ".ab . cd efg" + // .split_whitespace() + // .flat_map( | e | e.split( "." ) ) + // .filter( | e | e != &"" ) + // .collect(); + // dbg!( &splits ); + +} diff --git a/module/move/refiner/src/props.rs b/module/move/refiner/src/props.rs new file mode 100644 index 0000000000..7df207057f --- /dev/null +++ b/module/move/refiner/src/props.rs @@ -0,0 +1,73 @@ +/// Private namespace of the module. +pub( crate ) mod private +{ + use std::collections::HashMap; + + /// + /// Parse properties. + /// + + pub trait PropsParseOptionsAdapter + { + /// Parse from splits. + fn parse_from_splits< I >( &self, mut _splits : I ) -> HashMap< Box< str >, Box< str > > + where + I : core::iter::Iterator, + < I as Iterator >::Item : core::fmt::Display, + < I as Iterator >::Item : AsRef< str >, + { + let result : HashMap< Box< str >, Box< str > > = HashMap::new(); + result + } + } + + /// + /// Properties parsing options. + /// + + #[ derive( Debug, PartialEq, Eq ) ] + pub struct PropsParseOptions + { + // result : HashMap< Box< str >, Box< str > >, + } + + impl PropsParseOptions + { + /// Create new parsing properties. + pub fn new() -> Self + { + Self + { + } + } + } + + impl PropsParseOptionsAdapter for PropsParseOptions + { + } + + // + + /// + /// Parse properties from splits. + /// + + pub fn parse_from_splits< I >( splits : I ) -> HashMap< Box< str >, Box< str > > + where + < I as Iterator >::Item : core::fmt::Display, + < I as Iterator >::Item : AsRef< str >, + I : core::iter::Iterator, + { + let options = PropsParseOptions::new(); + options.parse_from_splits( splits ) + } +} + +// + +::meta_tools::mod_interface! +{ + prelude use PropsParseOptionsAdapter; + prelude use PropsParseOptions; + prelude use parse_from_splits; +} diff --git a/module/move/refiner/tests/censor/censor_tests.rs b/module/move/refiner/tests/censor/censor_tests.rs new file mode 100644 index 0000000000..0db84ec759 --- /dev/null +++ b/module/move/refiner/tests/censor/censor_tests.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use wcensor as the_module; + +mod inc; diff --git a/module/move/refiner/tests/censor/inc.rs b/module/move/refiner/tests/censor/inc.rs new file mode 100644 index 0000000000..c028657b5d --- /dev/null +++ b/module/move/refiner/tests/censor/inc.rs @@ -0,0 +1,7 @@ +#[ allow( unused_imports ) ] +use super::*; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( not( feature = "no_std" ) ) ] +mod censor_test; diff --git a/module/move/refiner/tests/censor/inc/censor_test.rs b/module/move/refiner/tests/censor/inc/censor_test.rs new file mode 100644 index 0000000000..d6ac819551 --- /dev/null +++ b/module/move/refiner/tests/censor/inc/censor_test.rs @@ -0,0 +1,57 @@ +use super::*; + +// + +fn vec_as_ref< T >( src : &Vec< T > ) -> Vec< &str > +where + T : AsRef< str >, +{ + src.iter().map( | e | e.as_ref() ).collect::< Vec< &str > >() +} + +tests_impls! +{ + #[ test ] + fn instruction_parse_from_splits_basic() + { + // test.case( "command and several subjects" ); + let args = vec![ ".struct1", "subject1", "subject2" ]; + let instruction = the_module::instruction::parse_from_splits( args.iter() ); + a_id!( instruction.command_name.as_ref(), ".struct1" ); + a_id!( vec_as_ref( &instruction.subject ), vec![ "subject1", "subject2" ] ); + a_id!( instruction.properties_map, std::collections::HashMap::new() ); + + // // test.case( "basic comand, subject map" ); + // let args = vec![ ".struct1", "subject1", "k1:v1" ]; + // let instruction = the_module::instruction::parse_from_splits( args.iter() ); + // a_id!( instruction.command_name.as_ref(), ".struct1" ); + // a_id!( vec_as_ref( &instruction.subject ), vec![ "subject1" ] ); + // a_id!( instruction.properties_map, std::collections::HashMap::new() ); + } + + // + + // fn _string_split() + // { + // + // // test.case( "basic" ); + // // let src = "ab ef"; + // // let iter = the_module::string::split_default( src ); + // // a_id!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "ab", " ", "ef" ] ); + // + // // test.case( "delimeter : "x" ); + // let src = "ab ef"; + // // let iter = the_module::string::split().delimeter( "b" ).src( src ).form(); + // let iter = the_module::string::split().delimeter( "b" ).src( src ).form(); + // a_id!( iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(), vec![ "a", "b", " ef" ] ); + // + // } +} + +// + +tests_index! +{ + instruction_parse_from_splits_basic, + // string_split, +} diff --git a/module/move/refiner/tests/smoke_test.rs b/module/move/refiner/tests/smoke_test.rs new file mode 100644 index 0000000000..7853994b3a --- /dev/null +++ b/module/move/refiner/tests/smoke_test.rs @@ -0,0 +1,15 @@ + +// #[ cfg( feature = "default" ) ] +#[ ignore ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/sqlx_query/Cargo.toml b/module/move/sqlx_query/Cargo.toml new file mode 100644 index 0000000000..08a3ff8a98 --- /dev/null +++ b/module/move/sqlx_query/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "sqlx_query" +version = "0.2.1" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Viktor Dudnik ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/sqlx_query" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/sqlx_query" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/move/sqlx_query" +description = """ +Expands to either sqlx function `query` or macro `query!` call depending on `sqlx_compiletime_checks` has been enabled during the build. +""" + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } \ No newline at end of file diff --git a/module/move/sqlx_query/License b/module/move/sqlx_query/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/sqlx_query/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/sqlx_query/Readme.md b/module/move/sqlx_query/Readme.md new file mode 100644 index 0000000000..d576a121fa --- /dev/null +++ b/module/move/sqlx_query/Readme.md @@ -0,0 +1,63 @@ + + +# Module :: sqlx_query + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_sqlx_query_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_sqlx_query_push.yml) [![docs.rs](https://img.shields.io/docsrs/sqlx_query?color=e3e8f0&logo=docs.rs)](https://docs.rs/sqlx_query) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +The tool to make CLI ( commands user interface ). It is able to aggregate external binary applications, as well as functions, which are written in your language. + +## Sample + + + +```rust +use sqlx_query::*; + +let user : User = query_as!( User, "SELECT * FROM users LIMIT 1" ) + .fetch_one( executor ) + .await?; + +query!( "DELETE FROM users WHERE id = $1", user.id ) + .execute( executor ) + .await?; +} + +// Expands to + +let user : User = + { + #[ cfg( feature = "sqlx_compiletime_checks" ) ] + let q = ::sqlx::query_as::< _, User >( "SELECT * FROM users LIMIT 1" ); + #[ cfg( not( feature = "sqlx_compiletime_checks" ) ) ] + let q = ::sqlx::query_as!( User, "SELECT * FROM users LIMIT 1" ); + q + } + .fetch_one( executor ) + .await?; +{ + #[ cfg( feature = "sqlx_compiletime_checks" ) ] + let q = ::sqlx::query( "DELETE FROM users WHERE id = $1" ).bind( user.id ); + #[ cfg( not( feature = "sqlx_compiletime_checks" ) ) ] + let q = ::sqlx::query!( "DELETE FROM users WHERE id = $1", user.id ); + q +} + .execute( executor ) + .await?; +``` + +### To add to your project + +```sh +cargo add sqlx_query +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd sample/rust/sqlx_query_trivial +cargo run +``` + diff --git a/module/move/sqlx_query/src/lib.rs b/module/move/sqlx_query/src/lib.rs new file mode 100644 index 0000000000..1285b5a3de --- /dev/null +++ b/module/move/sqlx_query/src/lib.rs @@ -0,0 +1,134 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/sqlx_query/latest/sqlx_query/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] +// #![ allow( unused_macros ) ] +// #![ allow( unused_imports ) ] + +// #![ feature( type_name_of_val ) ] + +//! +//! Expands to either sqlx function `query` or macro `query!` call +//! depending on `sqlx_compiletime_checks` has been enabled during the build. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/../../../", "Readme.md" ) ) ] + +/// Internal namespace. +#[ cfg( feature = "enabled" ) ] +pub( crate ) mod private +{ + + #[ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/../../../", "Readme.md" ) ) ] + #[ macro_export ] + macro_rules! query + { + ( + $sql : literal + ) => + { + { + #[ cfg( feature = "sqlx_compiletime_checks" ) ] + let q = ::sqlx::query( $sql ); + #[ cfg( not( feature = "sqlx_compiletime_checks" ) ) ] + let q = ::sqlx::query!( $sql ); + q + } + }; + ( + $sql : literal, $( $binds : expr ),+ + ) => + { + { + #[ cfg( feature = "sqlx_compiletime_checks" ) ] + let q = ::sqlx::query($sql)$(.bind($binds))+; + #[ cfg( not( feature = "sqlx_compiletime_checks" ) ) ] + let q = ::sqlx::query!( $sql, $( $binds )+ ); + q + } + }; + } + + /// + /// + /// + #[ macro_export ] + macro_rules! query_as + { + ( + $as : ident, $sql : literal + ) => + { + { + #[ cfg( feature = "sqlx_compiletime_checks" ) ] + let q = ::sqlx::query_as::< _, $as >( $sql ); + #[ cfg( not( feature = "sqlx_compiletime_checks" ) ) ] + let q = ::sqlx::query_as!( $as, $sql ); + q + } + }; + ( + $as : ident, $sql : literal, $( $binds : expr ),+ + ) => + { + { + #[ cfg( feature = "sqlx_compiletime_checks" ) ] + let q = ::sqlx::query_as::< _, $as >( $sql )$( .bind( $binds ) )+; + #[ cfg( not( feature = "sqlx_compiletime_checks" ) ) ] + let q = ::sqlx::query_as!( $as, $sql, $( $binds )+ ); + q + } + }; + } + + #[ allow( unused_imports ) ] + pub use query; + +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::query; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::query_as; +} \ No newline at end of file diff --git a/module/move/sqlx_query/tests/smoke_test.rs b/module/move/sqlx_query/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/move/sqlx_query/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/unitore/Cargo.toml b/module/move/unitore/Cargo.toml new file mode 100644 index 0000000000..8f98fba818 --- /dev/null +++ b/module/move/unitore/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "unitore" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen " +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/unitore" +description = """ +Feed reader with the ability to set updates frequency. +""" +categories = [ "development-tools" ] +keywords = [ "rss-feed", "atom-feed" ] +repository = "https://github.com/Wandalen/wTools/tree/alpha/module/move/unitore" + +# [lints] +# workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] + +[features] +default = [ + "enabled", +] +full = [ + "enabled", +] +enabled = [] + +[dependencies] +error_tools = { workspace = true, features = [ "default" ] } +proper_path_tools = { workspace = true, features = [ "default" ] } +tokio = { version = "1.36.0", features = [ "rt", "rt-multi-thread", "io-std", "macros" ] } +hyper = { version = "1.1.0", features = [ "client" ] } +hyper-tls = "0.6.0" +hyper-util = { version = "0.1", features = [ "client", "http2", "http1" ] } +http-body-util = "0.1" +feed-rs = "1.4.0" +toml = "0.8.10" +serde = "1.0.196" +url = { version = "2.0", features = ["serde"] } +humantime-serde = "1.1.1" +gluesql = "0.15.0" +async-trait = "0.1.41" +wca = { workspace = true } +mockall = "0.12.1" +cli-table = "0.4.7" +textwrap = "0.16.1" + +[dev-dependencies] +test_tools = { workspace = true } + diff --git a/module/move/unitore/Readme.md b/module/move/unitore/Readme.md new file mode 100644 index 0000000000..e631beb82b --- /dev/null +++ b/module/move/unitore/Readme.md @@ -0,0 +1,74 @@ + +# Module :: unitore + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_unitore_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_unitore_push.yml) [![docs.rs](https://img.shields.io/docsrs/unitore?color=e3e8f0&logo=docs.rs)](https://docs.rs/unitore) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Feed reader with the ability to set updates frequency. + +### Basic use-case + +To start using unitore, create configuration toml file with list of feed information - its link and update period. + +- `update_period` : update frequency for feed. Example values: `12h`, `1h 20min`, `2days 5h`; +- `link` : URL for feed source; +Example: + + +```toml +[[config]] +update_period = "1min" +link = "https://feeds.bbci.co.uk/news/world/rss.xml" + +[[config]] +update_period = "1min" +link = "https://rss.nytimes.com/services/xml/rss/nyt/World.xml" + +``` +Add created config file to unitore storage using command `.config.add` with path to config file. +You can add more than one file, by executing `.config.add` for every file. Example: +```bash +cargo run .config.add ./config/feeds.toml +``` +To download feeds from sources specified in config file into storage use command `.frames.download`. +Every time this command is run, feeds from all sources listed in all config files will be updated. +By default, unitore will store downloaded frames at `_data` folder, you can change that by setting +environment variable `UNITORE_STORAGE_PATH` to path to desired storage location. +```bash +cargo run .frames.download +``` +To get all frames that are currently in storage run: +```bash +cargo run .frames.list +``` +To get all feeds that are currently in storage run: +```bash +cargo run .feeds.list +``` +To get custom information about feeds or frames run SQL query to storage database using command `.query.execute` with query string: +```bash +cargo run .query.execute 'SELECT title, links, MIN(published) FROM frame' +``` +To remove config file from storage use command `.config.delete` with path to config file: +```bash +cargo run .config.delete ./config/feeds.toml +``` +To see all config files with feed sources: +```bash +cargo run .config.list +``` + + +### To add to your project + +```bash +cargo add unitore +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --package unitore +``` diff --git a/module/move/unitore/config/feeds.toml b/module/move/unitore/config/feeds.toml new file mode 100644 index 0000000000..fb6f43abe3 --- /dev/null +++ b/module/move/unitore/config/feeds.toml @@ -0,0 +1,7 @@ +[[config]] +update_period = "1min" +link = "https://feeds.bbci.co.uk/news/world/rss.xml" + +[[config]] +update_period = "1min" +link = "https://rss.nytimes.com/services/xml/rss/nyt/World.xml" diff --git a/module/move/unitore/src/Readme.md b/module/move/unitore/src/Readme.md new file mode 100644 index 0000000000..be6a15dfc1 --- /dev/null +++ b/module/move/unitore/src/Readme.md @@ -0,0 +1,6 @@ +## File structure + +- `command` - Contains commands for unitore cli. +- `action` - Contains functions that are executed when command are performed. +- `entity` - Contains entities that are used in commands execution. +- `tool` - Additional functions for convenient use of application. \ No newline at end of file diff --git a/module/move/unitore/src/action/config.rs b/module/move/unitore/src/action/config.rs new file mode 100644 index 0000000000..fae3bcf67d --- /dev/null +++ b/module/move/unitore/src/action/config.rs @@ -0,0 +1,150 @@ +//! Actions and report for config files. + +use std::path::PathBuf; + +use crate::*; +use error_tools::{ for_app::Context, Result }; +use sled_adapter::FeedStorage; +use entity:: +{ + feed::{ FeedStore, Feed }, + config::{ ConfigStore, Config }, +}; +use action::Report; +use gluesql::{ prelude::Payload, sled_storage::SledStorage }; + +/// Add configuration file with subscriptions to storage. +pub async fn config_add( mut storage : FeedStorage< SledStorage >, path : &PathBuf ) -> Result< impl Report > +{ + let path = proper_path_tools::path::normalize( path ); + + let mut err_str = format!( "Invalid path for config file {:?}", path ); + + let start = path.components().next(); + if let Some( start ) = start + { + let abs_path : &std::path::Path = start.as_ref(); + let abs_path = abs_path.canonicalize(); + if let Ok( mut abs_path ) = abs_path + { + for component in path.components().skip( 1 ) + { + abs_path.push( component ); + } + err_str = format!( "Invalid path for config file {:?}", abs_path ); + } + } + + if !path.exists() + { + return Err( error_tools::for_app::Error::msg( err_str ) ); + } + + let abs_path = path.canonicalize()?; + let config = Config::new( abs_path.to_string_lossy().to_string() ); + + let config_report = storage + .config_add( &config ) + .await + .context( "Added 0 config files.\n Failed to add config file to storage." )? + ; + + let feeds = feed_config::read( config.path() )? + .into_iter() + .map( | feed | Feed::new( feed.link, feed.update_period, config.path() ) ) + .collect::< Vec< _ > >() + ; + + let new_feeds = storage.feeds_save( feeds ).await?; + + Ok( ConfigReport{ payload : config_report, new_feeds : Some( new_feeds ) } ) +} + +/// Remove configuration file from storage. +pub async fn config_delete( mut storage : FeedStorage< SledStorage >, path : &PathBuf ) -> Result< impl Report > +{ + let path = proper_path_tools::path::normalize( path ); + let path = path.canonicalize().context( format!( "Invalid path for config file {:?}", path ) )?; + let config = Config::new( path.to_string_lossy().to_string() ); + + Ok( ConfigReport::new( + storage + .config_delete( &config ) + .await + .context( "Failed to remove config from storage." )? + ) ) +} + +/// List all files with subscriptions that are currently in storage. +pub async fn config_list( mut storage : FeedStorage< SledStorage >, _args : &wca::Args ) -> Result< impl Report > +{ + Ok( ConfigReport::new( storage.config_list().await? ) ) +} + +/// Information about result of command for subscription config. +#[ derive( Debug ) ] +pub struct ConfigReport +{ + payload : Payload, + new_feeds : Option< Payload >, +} + +impl ConfigReport +{ + /// Create new report for config report with provided payload. + pub fn new( payload : Payload ) -> Self + { + Self { payload, new_feeds : None } + } +} + +impl std::fmt::Display for ConfigReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + const EMPTY_CELL : &'static str = ""; + + match &self.payload + { + Payload::Insert( number ) => + { + writeln!( f, "Added {} config file(s)", number )?; + writeln!( + f, + "Added {} feed(s)", + self.new_feeds + .as_ref() + .and_then( | payload | + match payload + { + Payload::Insert( number ) => Some( *number ), + _ => None, + } + ) + .unwrap_or_default(), + )?; + }, + Payload::Delete( number ) => writeln!( f, "Deleted {} config file", number )?, + Payload::Select { labels: _label_vec, rows: rows_vec } => + { + writeln!( f, "Selected configs:" )?; + let mut rows = Vec::new(); + for row in rows_vec + { + rows.push( vec![ EMPTY_CELL.to_owned(), String::from( row[ 0 ].clone() ) ] ); + } + + let table = tool::table_display::plain_table( rows ); + if let Some( table ) = table + { + write!( f, "{}", table )?; + } + }, + _ => {}, + }; + + Ok( () ) + } +} + +impl Report for ConfigReport {} diff --git a/module/move/unitore/src/action/feed.rs b/module/move/unitore/src/action/feed.rs new file mode 100644 index 0000000000..70063de854 --- /dev/null +++ b/module/move/unitore/src/action/feed.rs @@ -0,0 +1,62 @@ +//! Feed actions and reports. + +use crate::*; +use action::{ Report, frame::SelectedEntries }; +use sled_adapter::FeedStorage; +use entity::feed::FeedStore; +use error_tools::Result; + +/// List all feeds from storage. +pub async fn feeds_list( mut storage : FeedStorage< gluesql::sled_storage::SledStorage > ) -> Result< impl Report > +{ + storage.feeds_list().await +} + +const EMPTY_CELL : &'static str = ""; + +/// Information about result of execution of command for feed. +#[ derive( Debug ) ] +pub struct FeedsReport( pub SelectedEntries ); + +impl FeedsReport +{ + /// Create new empty report for feeds command. + pub fn new() -> Self + { + Self ( SelectedEntries::new() ) + } +} + +impl std::fmt::Display for FeedsReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + writeln!( f, "Selected feeds:" )?; + if !self.0.selected_rows.is_empty() + { + let mut rows = Vec::new(); + for row in &self.0.selected_rows + { + let mut new_row = vec![ EMPTY_CELL.to_owned() ]; + new_row.extend( row.iter().map( | cell | String::from( cell ) ) ); + rows.push( new_row ); + } + let mut headers = vec![ EMPTY_CELL.to_owned() ]; + headers.extend( self.0.selected_columns.iter().map( | str | str.to_owned() ) ); + + let table = tool::table_display::table_with_headers( headers, rows ); + if let Some( table ) = table + { + write!( f, "{}", table )?; + } + } + else + { + writeln!( f, "No items currently in storage!" )?; + } + + Ok( () ) + } +} + +impl Report for FeedsReport {} diff --git a/module/move/unitore/src/action/frame.rs b/module/move/unitore/src/action/frame.rs new file mode 100644 index 0000000000..2acb4cd168 --- /dev/null +++ b/module/move/unitore/src/action/frame.rs @@ -0,0 +1,271 @@ +//! Frames actions and reports. + +use crate::*; +use sled_adapter::FeedStorage; +use entity:: +{ + feed::FeedStore, + config::ConfigStore, + frame::{ FrameStore, CellValue } +}; +use gluesql::prelude::{ Payload, Value, SledStorage }; +use feed_config; +use error_tools::{ err, Result }; +use action::Report; + +// qqq : review the whole project and make sure all names are consitant: actions, commands, its tests + +/// List all frames. +pub async fn frames_list( mut storage : FeedStorage< SledStorage > ) -> Result< impl Report > +{ + storage.frames_list().await +} + +/// Update all frames from config files saved in storage. +pub async fn frames_download +( + mut storage : FeedStorage< SledStorage > +) -> Result< impl Report > +{ + let payload = storage.config_list().await?; + let configs = match &payload + { + Payload::Select { labels: _, rows: rows_vec } => + { + rows_vec.into_iter().filter_map( | val | + { + match &val[ 0 ] + { + Value::Str( path ) => Some( path.to_owned() ), + _ => None, + } + } ).collect::< Vec< _ > >() + }, + _ => Vec::new(), + }; + + let mut subscriptions = Vec::new(); + for config in &configs + { + let sub_vec = feed_config::read( config.to_owned() )?; + subscriptions.extend( sub_vec ); + } + + if subscriptions.is_empty() + { + return Err( err!( format! + ( + "Failed to download frames.\n Config file(s) {} contain no feed subscriptions!", + configs.join( ", " ) + ) ) ) + } + + let mut feeds = Vec::new(); + let client = retriever::FeedClient; + for subscription in subscriptions + { + let feed = client.fetch( subscription.link.clone() ).await?; + feeds.push( ( feed, subscription.update_period.clone(), subscription.link ) ); + } + storage.feeds_process( feeds ).await + +} + +const EMPTY_CELL : &'static str = ""; +const INDENT_CELL : &'static str = " "; + +/// Information about result of execution of command for frames. +#[ derive( Debug ) ] +pub struct FramesReport +{ + /// Link of the feed which contains the frames. + pub feed_link : String, + /// Number of frames from the feed that were updated. + pub updated_frames : usize, + /// Number of new frames from the feed that were downloaded. + pub new_frames : usize, + /// Selected frames for commands that list frames. + pub selected_frames : SelectedEntries, + /// Number of frames that were in storage before update. + pub existing_frames : usize, + /// True if feed is downloaded for the first time. + pub is_new_feed : bool, +} + +impl FramesReport +{ + /// Create new report. + pub fn new( feed_link : String ) -> Self + { + Self + { + feed_link, + updated_frames : 0, + new_frames : 0, + selected_frames : SelectedEntries::new(), + existing_frames : 0, + is_new_feed : false, + } + } +} + +impl std::fmt::Display for FramesReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + let initial = vec![ vec![ format!( "Feed title: {}", self.feed_link ) ] ]; + let table = tool::table_display::table_with_headers( initial[ 0 ].clone(), Vec::new() ); + if let Some( table ) = table + { + write!( f, "{}", table )?; + } + + let mut rows = vec! + [ + vec![ EMPTY_CELL.to_owned(), format!( "Updated frames: {}", self.updated_frames ) ], + vec![ EMPTY_CELL.to_owned(), format!( "Inserted frames: {}", self.new_frames ) ], + vec![ EMPTY_CELL.to_owned(), format!( "Number of frames in storage: {}", self.existing_frames + self.new_frames ) ], + ]; + + if !self.selected_frames.selected_columns.is_empty() + { + rows.push( vec![ EMPTY_CELL.to_owned(), format!( "Selected frames:" ) ] ); + } + + let table = tool::table_display::plain_table( rows ); + if let Some( table ) = table + { + write!( f, "{}", table )?; + } + + for frame in &self.selected_frames.selected_rows + { + let first_row = vec! + [ + INDENT_CELL.to_owned(), + self.selected_frames.selected_columns[ 0 ].clone(), + textwrap::fill( &String::from( frame[ 0 ].clone() ), 120 ), + ]; + let mut rows = Vec::new(); + for i in 1..self.selected_frames.selected_columns.len() + { + let inner_row = vec! + [ + INDENT_CELL.to_owned(), + self.selected_frames.selected_columns[ i ].clone(), + textwrap::fill( &String::from( frame[ i ].clone() ), 120 ), + ]; + rows.push( inner_row ); + } + + let table = tool::table_display::table_with_headers( first_row, rows ); + if let Some( table ) = table + { + writeln!( f, "{}", table )?; + } + } + + Ok( () ) + } +} + +impl Report for FramesReport {} + +/// Items retrieved by select queries from storage. +#[ derive( Debug ) ] +pub struct SelectedEntries +{ + /// Labels of selected columns. + pub selected_columns : Vec< String >, + /// Selected rows with data. + pub selected_rows : Vec< Vec< Value > >, +} + +impl SelectedEntries +{ + /// Create new empty selected entries struct. + pub fn new() -> Self + { + SelectedEntries { selected_columns : Vec::new(), selected_rows : Vec::new() } + } +} + +impl std::fmt::Display for SelectedEntries +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + if !self.selected_columns.is_empty() + { + for row in &self.selected_rows + { + for i in 0..self.selected_columns.len() + { + write!( f, "{} : {}, ", self.selected_columns[ i ], CellValue( &row[ i ] ) )?; + } + writeln!( f, "" )?; + } + } + + Ok( () ) + } +} + +/// Report for downloading and updating frames. +#[ derive( Debug ) ] +pub struct UpdateReport( pub Vec< FramesReport > ); + +impl std::fmt::Display for UpdateReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + for report in &self.0 + { + writeln!( f, "{}", report )?; + } + writeln!( f, "Total new feeds dowloaded : {}", self.0.iter().filter( | fr_report | fr_report.is_new_feed ).count() )?; + writeln! + ( + f, + "Total feeds with updated or new frames : {}", + self.0.iter().filter( | fr_report | fr_report.updated_frames + fr_report.new_frames > 0 ).count() + )?; + writeln!( f, "Total new frames : {}", self.0.iter().fold( 0, | acc, fr_report | acc + fr_report.new_frames ) )?; + writeln!( f, "Total updated frames : {}", self.0.iter().fold( 0, | acc, fr_report | acc + fr_report.updated_frames ) )?; + + Ok( () ) + } +} + +impl Report for UpdateReport {} + +/// Report for listing frames. +#[ derive( Debug ) ] +pub struct ListReport( pub Vec< FramesReport > ); + +impl std::fmt::Display for ListReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + for report in &self.0 + { + write!( f, "{}", report )?; + } + writeln! + ( + f, + "Total feeds in storage: {}", + self.0.len() + )?; + writeln! + ( + f, + "Total frames in storage: {}", + self.0.iter().fold( 0, | acc, fr_report | acc + fr_report.selected_frames.selected_rows.len() ) + )?; + writeln!( f, "" )?; + + Ok( () ) + } +} + +impl Report for ListReport {} diff --git a/module/move/unitore/src/action/mod.rs b/module/move/unitore/src/action/mod.rs new file mode 100644 index 0000000000..5f958526f9 --- /dev/null +++ b/module/move/unitore/src/action/mod.rs @@ -0,0 +1,29 @@ +//! Actions for command execution. + +// qqq : reogranize files structure +// there must be folders +// +// action - with all actions +// command - with all commands +// entity - with all entities +// tool - with something not directly related to the problem, but convenient to have as a separate function/structure + +// aaa: added folders + +pub mod frame; +pub mod feed; +pub mod config; +pub mod query; +pub mod table; + +// qqq : what is it for? purpose? +// aaa : added explanation +/// General report trait for commands return type. +pub trait Report : std::fmt::Display + std::fmt::Debug +{ + /// Print report of executed command. + fn report( &self ) + { + println!( "{self}" ); + } +} diff --git a/module/move/unitore/src/action/query.rs b/module/move/unitore/src/action/query.rs new file mode 100644 index 0000000000..d9f4180384 --- /dev/null +++ b/module/move/unitore/src/action/query.rs @@ -0,0 +1,87 @@ +//! Query actions and report. + +// qqq : don't use both +// aaa : fixed +use crate::*; +use gluesql::core::executor::Payload; +use sled_adapter::Store; +use action::Report; +use error_tools::Result; + +/// Execute query specified in query string. +pub async fn query_execute +( + mut storage : impl Store, + query_str : String, +) -> Result< impl Report > +{ + storage.query_execute( query_str ).await +} + +const EMPTY_CELL : &'static str = ""; + +/// Information about result of execution of custom query. +#[ derive( Debug ) ] +pub struct QueryReport( pub Vec< gluesql::prelude::Payload > ); + +impl std::fmt::Display for QueryReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter<'_> ) -> std::fmt::Result + { + for payload in &self.0 + { + match payload + { + Payload::ShowColumns( columns ) => + { + writeln!( f, "Show columns:" )?; + for column in columns + { + writeln!( f, "{} : {}", column.0, column.1 )?; + } + }, + Payload::Create => writeln!( f, "Table created" )?, + Payload::Insert( number ) => writeln!( f, "Inserted {} rows", number )?, + Payload::Delete( number ) => writeln!( f, "Deleted {} rows", number )?, + Payload::Update( number ) => writeln!( f, "Updated {} rows", number )?, + Payload::DropTable => writeln!( f, "Table dropped" )?, + Payload::Select { labels: label_vec, rows: rows_vec } => + { + writeln!( f, "Selected entries:" )?; + for row in rows_vec + { + let mut rows = Vec::new(); + for i in 0..label_vec.len() + { + let new_row = vec! + [ + EMPTY_CELL.to_owned(), + label_vec[ i ].clone(), + textwrap::fill( &String::from( row[ i ].clone() ), 120 ), + ]; + rows.push( new_row ); + } + let table = tool::table_display::plain_table( rows ); + if let Some( table ) = table + { + writeln!( f, "{}", table )?; + } + } + }, + Payload::AlterTable => writeln!( f, "Table altered" )?, + Payload::StartTransaction => writeln!( f, "Transaction started" )?, + Payload::Commit => writeln!( f, "Transaction commited" )?, + Payload::Rollback => writeln!( f, "Transaction rolled back" )?, + _ => {}, + }; + } + + Ok( () ) + } +} + +impl Report for QueryReport {} + +// qqq : good tests for query action +// all tables should be touched by these tests +// aaa : added in https://github.com/Wandalen/wTools/pull/1284 diff --git a/module/move/unitore/src/action/table.rs b/module/move/unitore/src/action/table.rs new file mode 100644 index 0000000000..ce9a4e756f --- /dev/null +++ b/module/move/unitore/src/action/table.rs @@ -0,0 +1,418 @@ +//! Tables metadata actions and reports. + +use crate::*; +use gluesql::prelude::Payload; +use std::collections::HashMap; +use action::Report; +use sled_adapter::FeedStorage; +use entity::table::TableStore; +use error_tools::Result; + +/// Get labels of column for specified table. +pub async fn table_list +( + mut storage : FeedStorage< gluesql::sled_storage::SledStorage >, + table_name : Option< String >, +) -> Result< impl Report > +{ + let mut table_names = Vec::new(); + if let Some( name ) = table_name + { + table_names.push( name ); + } + else + { + let tables = storage.tables_list().await?; + + let names = tables.0.keys().map( | k | k.clone() ).collect::< Vec< _ > >(); + table_names.extend( names.into_iter() ); + } + + let mut reports = Vec::new(); + for table_name in table_names + { + let result = storage.table_list( table_name.clone() ).await?; + + let mut table_description = String::new(); + let mut columns = HashMap::new(); + if let Payload::Select { labels: _label_vec, rows: rows_vec } = &result[ 0 ] + { + for row in rows_vec + { + let table = String::from( row[ 0 ].clone() ); + columns.entry( table ) + .and_modify( | vec : &mut Vec< String > | vec.push( String::from( row[ 1 ].clone() ) ) ) + .or_insert( vec![ String::from( row[ 1 ].clone() ) ] ) + ; + } + } + let mut columns_desc = HashMap::new(); + match table_name.as_str() + { + "feed" => + { + table_description = String::from( "Contains feed items." ); + + for label in columns.get( "feed" ).unwrap() + { + match label.as_str() + { + "link" => { columns_desc.insert + ( + label.clone(), + String::from( "Link to feed source, unique identifier for the feed" ), + ); } + "title" => { columns_desc.insert( label.clone(), String::from( "The title of the feed" ) ); } + "updated" => + { + columns_desc.insert( label.clone(), String::from + ( + "The time at which the feed was last modified. If not provided in the source, or invalid, is Null." + ) ); + }, + "type" => { columns_desc.insert( label.clone(), String::from( "Type of this feed (e.g. RSS2, Atom etc)" ) ); } + "authors" => { columns_desc.insert + ( + label.clone(), + String::from( "Collection of authors defined at the feed level" ) + ); } + "description" => { columns_desc.insert( label.clone(), String::from( "Description of the feed" ) ); } + "published" => { columns_desc.insert + ( + label.clone(), + String::from( "The publication date for the content in the channel" ), + ); } + "update_period" => { columns_desc.insert( label.clone(), String::from( "How often this feed must be updated" ) ); } + _ => { columns_desc.insert( label.clone(), String::from( "Desciption for this column hasn't been added yet!" ) ); } + } + } + }, + "frame" => + { + table_description = String::from( "Contains frame items." ); + for label in columns.get( "frame" ).unwrap() + { + match label.as_str() + { + "id" => + { + columns_desc.insert + ( + label.clone(), + String::from( "A unique identifier for this frame in the feed. " ), + ); + }, + "title" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Title of the frame" ), + ); + }, + "updated" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Time at which this item was fetched from source." ), + ); + }, + "authors" => + { + columns_desc.insert + ( + label.clone(), + String::from( "List of authors of the frame, optional." ) + ); + }, + "content" => + { + columns_desc.insert + ( + label.clone(), + String::from( "The content of the frame in html or plain text, optional." ), + ); + }, + "links" => + { + columns_desc.insert + ( + label.clone(), + String::from( "List of links associated with this item of related Web page and attachments." ), + ); + }, + "summary" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Short summary, abstract, or excerpt of the frame item, optional." ), + ); + }, + "categories" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Specifies a list of categories that the item belongs to." ), + ); + }, + "published" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Time at which this item was first published or updated." ), + ); + }, + "source" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Specifies the source feed if the frame was copied from one feed into another feed, optional." ), + ); + }, + "rights" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Conveys information about copyrights over the feed, optional." ), + ); + }, + "media" => + { + columns_desc.insert + ( + label.clone(), + String::from( "List of media oblects, encountered in the frame, optional." ), + ); + }, + "language" => + { + columns_desc.insert + ( + label.clone(), + String::from( "The language specified on the item, optional." ), + ); + }, + "feed_link" => + { + columns_desc.insert + ( + label.clone(), + String::from( "Link of feed that contains this frame." ), + ); + }, + _ => { columns_desc.insert( label.clone(), String::from( "Desciption for this column hasn't been added yet!" ) ); } + } + } + } + "config" => + { + table_description = String::from( "Contains paths to feed config files." ); + for label in columns.get( "config" ).unwrap() + { + match label.as_str() + { + "path" => { columns_desc.insert( label.clone(), String::from( "Path to configuration file" ) ); } + _ => { columns_desc.insert( label.clone(), String::from( "Desciption for this column hasn't been added yet!" ) ); } + } + } + }, + _ => {}, + } + + reports.push( ColumnsReport::new( table_name, table_description, columns_desc ) ); + } + + Ok( TablesColumnsReport( reports ) ) +} + +/// Get information about tables in storage. +pub async fn tables_list( mut storage : FeedStorage< gluesql::sled_storage::SledStorage > ) -> Result< impl Report > +{ + storage.tables_list().await +} + +const EMPTY_CELL : &'static str = ""; + +/// Information about execution of table columns commands. +#[ derive( Debug ) ] +pub struct TablesColumnsReport( pub Vec< ColumnsReport > ); + +impl std::fmt::Display for TablesColumnsReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + for report in &self.0 + { + writeln!( f, "{}", report )?; + } + + Ok( () ) + } +} + +impl Report for TablesColumnsReport {} + +/// Information about execution of columns listing action. +#[ derive( Debug ) ] +pub struct ColumnsReport +{ + table_name : String, + table_description : String, + columns : std::collections::HashMap< String, String > +} + +impl ColumnsReport +{ + /// Create new table columns report. + pub fn new( table_name : String, table_description : String, columns : HashMap< String, String > ) -> Self + { + Self + { + table_name, + table_description, + columns, + } + } +} + +impl std::fmt::Display for ColumnsReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + writeln!( f, "Table name: {}", self.table_name )?; + writeln!( f, "Description: {}", self.table_description )?; + + if !self.columns.is_empty() + { + writeln!( f, "Columns:" )?; + let mut rows = Vec::new(); + for ( label, desc ) in &self.columns + { + rows.push + ( + vec! + [ + EMPTY_CELL.to_owned(), + label.clone(), + desc.clone(), + ] + ); + } + let table = tool::table_display::table_with_headers + ( + vec! + [ + EMPTY_CELL.to_owned(), + "label".to_owned(), + "description".to_owned(), + ], + rows, + ); + + if let Some( table ) = table + { + writeln!( f, "{}", table )?; + } + } + else + { + writeln!( f, "No columns" )?; + } + + Ok( () ) + } +} + +impl Report for ColumnsReport {} + +/// Information about execution of tables commands. +/// Contains tables name, description and list of columns. +#[ derive( Debug ) ] +pub struct TablesReport( pub HashMap< String, ( String, Vec< String > ) > ); + +impl TablesReport +{ + /// Create new report from payload. + pub fn new( payload : Vec< Payload > ) -> Self + { + let mut result = std::collections::HashMap::new(); + if let Payload::Select { labels: _label_vec, rows: rows_vec } = &payload[ 0 ] + { + { + for row in rows_vec + { + let table = String::from( row[ 0 ].clone() ); + let table_description = match table.as_str() + { + "feed" => String::from( "Contains feed items." ), + "frame" => String::from( "Contains frame items." ), + "config" => String::from( "Contains paths to feed config files." ), + _ => String::new(), + }; + result.entry( table ) + .and_modify( | ( _, vec ) : &mut ( String, Vec< String > ) | vec.push( String::from( row[ 1 ].clone() ) ) ) + .or_insert( ( table_description, vec![ String::from( row[ 1 ].clone() ) ] ) ) + ; + } + } + } + TablesReport( result ) + } +} + +impl std::fmt::Display for TablesReport +{ + fn fmt( &self, f : &mut std::fmt::Formatter<'_> ) -> std::fmt::Result + { + writeln!( f, "Storage tables:" )?; + let mut rows = Vec::new(); + for ( table_name, ( desc, columns ) ) in &self.0 + { + let columns_str = if !columns.is_empty() + { + format!( "{};", columns.join( ", " ) ) + } + else + { + String::from( "No columns" ) + }; + + rows.push + ( + vec! + [ + EMPTY_CELL.to_owned(), + table_name.to_owned(), + textwrap::fill( desc, 80 ), + textwrap::fill( &columns_str, 80 ), + ] + ); + } + + let table = tool::table_display::table_with_headers + ( + vec! + [ + EMPTY_CELL.to_owned(), + "name".to_owned(), + "description".to_owned(), + "columns".to_owned(), + ], + rows, + ); + if let Some( table ) = table + { + writeln!( f, "{}", table )?; + } + + Ok( () ) + } +} + +impl Report for TablesReport {} diff --git a/module/move/unitore/src/command/config.rs b/module/move/unitore/src/command/config.rs new file mode 100644 index 0000000000..72eb063007 --- /dev/null +++ b/module/move/unitore/src/command/config.rs @@ -0,0 +1,165 @@ +//! Config files commands. + +use std::path::PathBuf; + +use crate::*; +use gluesql::sled_storage::sled::Config; +use wca::{ Command, Type, VerifiedCommand }; +use sled_adapter::FeedStorage; +use action::{ Report, config::{ config_add, config_delete, config_list } }; +use error_tools::Result; + +/// Struct that provides commands for config files. +#[ derive( Debug ) ] +pub struct ConfigCommand; + +impl ConfigCommand +{ + /// Create command for adding config. + pub fn add() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok + ( + Command::former() + .phrase( "config.add" ) + .long_hint( concat! + ( + "Add file with feeds configurations. Subject: path to config file.\n", + " Example: .config.add ./config/feeds.toml\n", + " The file should contain config entities with fields:\n", + " - `update_period` : update frequency for feed. Example values: `12h`, `1h 20min`, `2days 5h`;\n", + " - `link` : URL for feed source;\n\n", + " Example:\n", + " [[config]]\n", + " update_period = \"1min\"\n", + " link = \"https://feeds.bbci.co.uk/news/world/rss.xml\"\n", + )) + .subject().hint( "Path" ).kind( Type::Path ).optional( false ).end() + .routine( move | o : VerifiedCommand | + { + let path_arg = o.args + .get_owned::< wca::Value >( 0 ); + + if let Some( path ) = path_arg + { + let path : PathBuf = path.into(); + + let res = rt.block_on + ( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + config_add( feed_storage, &path ).await + } + ); + + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + } + }) + .end() + ) + } + + /// Create command for deleting config. + pub fn delete() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok( + Command::former() + .phrase( "config.delete" ) + .long_hint( concat! + ( + "Delete file with feeds configuraiton. Subject: path to config file.\n", + " Example: .config.delete ./config/feeds.toml", + )) + .subject().hint( "Path" ).kind( Type::Path ).optional( false ).end() + .routine( move | o : VerifiedCommand | + { + let path_arg = o.args + .get_owned::< wca::Value >( 0 ); + + if let Some( path ) = path_arg + { + let path : PathBuf = path.into(); + + let res = rt.block_on + ( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + config_delete( feed_storage, &path ).await + } + ); + + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + } + }) + .end() + ) + } + + /// Create command for listing all config files in storage. + pub fn list() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok + ( + Command::former() + .phrase( "config.list" ) + .long_hint( concat! + ( + "List all config files saved in storage.\n", + " Example: .config.list", + )) + .routine( move | o : VerifiedCommand | + { + let res = rt.block_on( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + config_list( feed_storage, &o.args ).await + }); + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + + }) + .end() + ) + } +} diff --git a/module/move/unitore/src/command/feed.rs b/module/move/unitore/src/command/feed.rs new file mode 100644 index 0000000000..148d404952 --- /dev/null +++ b/module/move/unitore/src/command/feed.rs @@ -0,0 +1,55 @@ +//! Feed command. + +use crate::*; +use gluesql::sled_storage::sled::Config; +use wca::{ Command, VerifiedCommand }; +use sled_adapter::FeedStorage; +use action::{ Report, feed::feeds_list }; +use error_tools::Result; + +/// Struct that provides commands for feed. +#[ derive( Debug ) ] +pub struct FeedCommand; + +impl FeedCommand +{ + /// Create command that lists all feeds in storage. + pub fn list() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok + ( + Command::former() + .phrase( "feeds.list" ) + .long_hint( concat! + ( + "List all feeds from storage.\n", + " Example: .feeds.list", + )) + .routine( move | _o : VerifiedCommand | + { + let res = rt.block_on( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + feeds_list( feed_storage ).await + }); + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + + }) + .end() + ) + } +} \ No newline at end of file diff --git a/module/move/unitore/src/command/frame.rs b/module/move/unitore/src/command/frame.rs new file mode 100644 index 0000000000..8a4f18a756 --- /dev/null +++ b/module/move/unitore/src/command/frame.rs @@ -0,0 +1,93 @@ +//! Frame commands. + +use crate::*; +use gluesql::sled_storage::sled::Config; +use wca::{ Command, VerifiedCommand }; +use sled_adapter::FeedStorage; +use action::{ Report, frame::{ frames_list, frames_download } }; +use error_tools::Result; + +/// Struct that provides commands for frames. +#[ derive( Debug ) ] +pub struct FrameCommand; + +impl FrameCommand +{ + /// Create command that lists all frames in storage. + pub fn list() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok + ( + Command::former() + .phrase( "frames.list" ) + .long_hint( concat! + ( + "List all frames saved in storage.\n", + " Example: .frames.list", + )) + .routine( move | _o : VerifiedCommand | + { + let res = rt.block_on( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + frames_list( feed_storage ).await + }); + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + + }) + .end() + ) + } + + /// Creates command that downloads frames from feeds specified in config files. + pub fn download() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok( + Command::former() + .phrase( "frames.download" ) + .hint( "Download frames from feed sources provided in config files." ) + .long_hint(concat! + ( + "Download frames from feed sources provided in config files.\n", + " Example: .frames.download", + )) + .routine( move | _o : VerifiedCommand | + { + let res = rt.block_on( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + frames_download( feed_storage ).await + }); + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + }) + .end() ) + } +} \ No newline at end of file diff --git a/module/move/unitore/src/command/mod.rs b/module/move/unitore/src/command/mod.rs new file mode 100644 index 0000000000..5548eb2f17 --- /dev/null +++ b/module/move/unitore/src/command/mod.rs @@ -0,0 +1,7 @@ +//! Commands for unitore executor. + +pub mod table; +pub mod frame; +pub mod feed; +pub mod query; +pub mod config; \ No newline at end of file diff --git a/module/move/unitore/src/command/query.rs b/module/move/unitore/src/command/query.rs new file mode 100644 index 0000000000..24519e1a86 --- /dev/null +++ b/module/move/unitore/src/command/query.rs @@ -0,0 +1,71 @@ +//! Query command. + +use crate::*; +use gluesql::sled_storage::sled::Config; +use wca::{ Command, Type, VerifiedCommand }; +use sled_adapter::FeedStorage; +use action::{ Report, query::query_execute }; +use error_tools::Result; + +/// Struct that provides commands for queries. +#[ derive( Debug ) ] +pub struct QueryCommand; + +impl QueryCommand +{ + /// Creates command for custom query execution. + pub fn execute() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok + ( + Command::former() + .phrase( "query.execute" ) + .long_hint( concat! + ( + "Execute custom query. Subject: query string.\n", + " Example query:\n", + " - select all frames:\n", + r#" .query.execute 'SELECT * FROM frame'"#, + "\n", + " - select title and link to the most recent frame:\n", + r#" .query.execute 'SELECT title, links, MIN( published ) FROM frame'"#, + "\n\n", + )) + .subject().hint( "Query" ).kind( Type::String ).optional( false ).end() + .routine( move | o : VerifiedCommand | + { + let query_arg = o.args + .get_owned::< String >( 0 ) + ; + + if let Some( query_str ) = query_arg + { + let res = rt.block_on + ( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + query_execute( feed_storage, query_str ).await + } + ); + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + } + + }) + .end() + ) + } +} \ No newline at end of file diff --git a/module/move/unitore/src/command/table.rs b/module/move/unitore/src/command/table.rs new file mode 100644 index 0000000000..67c82f23a0 --- /dev/null +++ b/module/move/unitore/src/command/table.rs @@ -0,0 +1,105 @@ +//! Table and columns commands. + +use crate::*; +use gluesql::sled_storage::sled::Config; +use wca::{ Command, Type, VerifiedCommand }; +use sled_adapter::FeedStorage; +use action::{ Report, table::{ table_list, tables_list } }; +use error_tools::Result; + +/// Struct that provides commands for table information. +#[ derive( Debug ) ] +pub struct TableCommand; + +impl TableCommand +{ + /// Creates command to list info about tables in storage. + pub fn list() -> Result< Command > + { + let rt = tokio::runtime::Runtime::new()?; + + Ok + ( + Command::former() + .phrase( "table.list" ) + .long_hint( concat! + ( + "Delete file with feeds configuraiton. Subject: path to config file.\n", + " Example: .config.delete ./config/feeds.toml", + )) + .subject().hint( "Path" ).kind( Type::Path ).optional( false ).end() + .routine( move | o : VerifiedCommand | + { + let table_name_arg = o.args.get_owned::< String >( 0 ); + + let res = rt.block_on( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + table_list( feed_storage, table_name_arg ).await + } ); + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + }) + .end() + ) + } +} + +/// Struct that provides commands for table columns information. +#[ derive( Debug ) ] +pub struct TablesCommand; + +impl TablesCommand +{ + /// Creates command to list info about table columns in storage. + pub fn list() -> Result< Command > + { + + let rt = tokio::runtime::Runtime::new()?; + + Ok + ( + Command::former() + .phrase( "tables.list" ) + .long_hint( concat! + ( + "Delete file with feeds configuraiton. Subject: path to config file.\n", + " Example: .config.delete ./config/feeds.toml", + )) + .subject().hint( "Path" ).kind( Type::Path ).optional( false ).end() + .routine( move | _o : VerifiedCommand | + { + let res = rt.block_on( async move + { + let path_to_storage = std::env::var( "UNITORE_STORAGE_PATH" ) + .unwrap_or( String::from( "./_data" ) ) + ; + + let config = Config::default() + .path( path_to_storage ) + ; + + let feed_storage = FeedStorage::init_storage( &config ).await?; + tables_list( feed_storage ).await + } ); + match res + { + Ok( report ) => report.report(), + Err( err ) => println!( "{:?}", err ), + } + }) + .end() + ) + } +} \ No newline at end of file diff --git a/module/move/unitore/src/entity/config.rs b/module/move/unitore/src/entity/config.rs new file mode 100644 index 0000000000..b28a90a1dc --- /dev/null +++ b/module/move/unitore/src/entity/config.rs @@ -0,0 +1,56 @@ +//! Functionality for storing and retrieving config files. + +use error_tools::Result; +use gluesql::core::executor::Payload; + +/// Config file path. +#[ derive( Debug ) ] +pub struct Config( pub String ); + +impl Config +{ + /// Create new config with provided path. + pub fn new( path : String ) -> Self + { + Self( path ) + } + + /// Get path of config file. + pub fn path( &self ) -> String + { + self.0.clone() + } +} + +/// Functionality of config storing. +#[ async_trait::async_trait( ?Send ) ] +pub trait ConfigStore +{ + /// Add subscription. + async fn config_add( &mut self, config : &Config ) -> Result< Payload >; + + /// Remove subscription. + async fn config_delete( &mut self, config : &Config ) -> Result< Payload >; + + /// List subscriptions. + async fn config_list( &mut self ) -> Result< Payload >; +} + +// qqq : port and adapters should not be in the same file +// Ideally, they should be in different crates, but you should at least put them in different folders +// there should be a `sled_adapter`` folder +// aaa : moved to separate folder + + +// qqq : use AbsolutePath newtype from `path_tools` +// qqq : normalize all paths with `path_tools::path::normalize` +// https://docs.rs/proper_path_tools/latest/proper_path_tools/path/fn.normalize.html +// added path normalization + +// unitore .query.execute \'SELECT \* FROM feed\' +// qqq : something is broken in this table. also lack of association with config files +// aaa : added association with config + +// unitore .query.execute \'SELECT \* FROM x\' +// qqq : it is not obvious where one record ends and another begins +// aaa : added id highlight diff --git a/module/move/unitore/src/entity/feed.rs b/module/move/unitore/src/entity/feed.rs new file mode 100644 index 0000000000..7084e841dd --- /dev/null +++ b/module/move/unitore/src/entity/feed.rs @@ -0,0 +1,106 @@ +//! Feed storage entity and storage functions. + +use crate::*; +use std::time::Duration; +use error_tools::Result; +use gluesql::core:: +{ + ast_builder::{ null, text, timestamp, ExprNode }, + executor::Payload, + chrono::{ Utc, DateTime, SecondsFormat }, +}; + +use action:: +{ + feed::FeedsReport, + frame::UpdateReport, +}; + +/// Feed item. +#[ derive( Debug ) ] +pub struct Feed +{ + /// Link to feed source. + pub link : url::Url, + /// Title of feed. + pub title : Option< String >, + /// Last time the feed was fetched. + pub updated : Option< DateTime< Utc > >, + /// Authors of feed. + pub authors : Option< String >, + /// Short description of feed content. + pub description : Option< String >, + /// Date and time when feed was published. + pub published : Option< DateTime< Utc > >, + /// How often the feed frames must be fetched. + pub update_period : Duration, + /// Path to config file, from which this feed was saved. + pub config_file : String, +} + +impl Feed +{ + /// Create new feed item from source url and update period. + pub fn new( link : url::Url, update_period : Duration, config: String ) -> Self + { + Self + { + link, + title : None, + updated : None, + authors : None, + description : None, + published : None, + update_period, + config_file : config, + } + } +} + +/// Functionality of feed storage. +#[ mockall::automock ] +#[ async_trait::async_trait( ?Send ) ] +pub trait FeedStore +{ + /// Save new feeds to storage. + /// New feeds from config files that doesn't exist in storage will be inserted into `feed` table. + async fn feeds_save( &mut self, feeds : Vec< Feed > ) -> Result< Payload >; + + /// Update existing feeds in storage with new information. + /// Feed is updated one time during first fetch. + async fn feeds_update( &mut self, feed : Vec< Feed > ) -> Result< () >; + + /// Process new fetched feeds and frames. + /// Frames from recent fetch will be sorted into three categories: + /// - new items that will be inserted into `frame` table; + /// - modified items that will be updated; + /// - unchanged frames saved from previous fetches will be ignored. + async fn feeds_process( &mut self, feeds : Vec< ( feed_rs::model::Feed, Duration, url::Url ) > ) -> Result< UpdateReport >; + + /// Get existing feeds from storage. + /// Retrieves all feeds from `feed` table in storage. + async fn feeds_list( &mut self ) -> Result< FeedsReport >; +} +// qqq : poor description and probably naming. improve, please +// aaa : updated description + + +/// Get convenient format of frame item for using with GlueSQL expression builder. +/// Converts from Feed struct into vec of GlueSQL expression nodes. +impl From< Feed > for Vec< ExprNode< 'static > > +{ + fn from( value : Feed ) -> Self + { + vec! + [ + text( value.link.to_string() ), + value.title.map( text ).unwrap_or( null() ), + value.updated.map( | d | timestamp( d.to_rfc3339_opts( SecondsFormat::Millis, true ) ) ).unwrap_or( null() ), + value.authors.map( text ).unwrap_or( null() ), + value.description.map( text ).unwrap_or( null() ), + value.published.map( | d | timestamp( d.to_rfc3339_opts( SecondsFormat::Millis, true ) ) ).unwrap_or( null() ), + text( value.update_period.as_secs().to_string() ), + text( value.config_file ), + ] + } +} diff --git a/module/move/unitore/src/entity/frame.rs b/module/move/unitore/src/entity/frame.rs new file mode 100644 index 0000000000..8fb522ad58 --- /dev/null +++ b/module/move/unitore/src/entity/frame.rs @@ -0,0 +1,280 @@ +//! Frame storing and retrieving functionality. + +use crate::*; +use error_tools::Result; +use gluesql::core:: +{ + ast_builder::{ null, text, timestamp, ExprNode }, chrono::{ DateTime, SecondsFormat, Utc }, executor::Payload +}; +use action::frame::ListReport; + +/// Frame entity. +#[ derive( Debug ) ] +pub struct Frame +{ + /// Frame id. + pub id : String, + /// Frame title. + pub title : Option< String >, + /// Time at which this item was fetched from source. + pub stored_time : Option< DateTime< Utc > >, + /// List of authors of the frame. + pub authors : Option< Vec< String > >, + /// The content of the frame in html or plain text. + pub content : Option< String >, + /// List of links associated with this item of related Web page and attachments. + pub links : Option< Vec< String > >, + /// Short summary, abstract, or excerpt of the frame item. + pub summary : Option< String >, + /// A list of categories that the item belongs to. + pub categories : Option< Vec< String > >, + /// Time at which this item was first published or updated. + pub published : Option< DateTime< Utc > >, + /// Specifies the source feed if the frame was copied from one feed into another feed. + pub source : Option< String >, + /// Information about copyrights over the feed. + pub rights : Option< String >, + /// List of media oblects, encountered in the frame. + pub media : Option< Vec< String > >, + /// The language of the frame. + pub language : Option< String >, + /// Link to feed that contains this frame. + pub feed_link : String, +} + +// qqq : not obvious +// aaa : added explanation +/// Convert from feed_rs feed entry and feed link to Frame struct for convenient use and storage. +impl From< ( feed_rs::model::Entry, String ) > for Frame +{ + fn from( ( entry, feed_link ) : ( feed_rs::model::Entry, String ) ) -> Self + { + let authors = entry.authors + .iter() + .map( | p | p.name.clone() ) + .collect::< Vec< _ > >() + ; + + let content = entry.content + .map( | c | c.body.unwrap_or( c.src.map( | link | link.href ).unwrap_or_default() ) ) + .filter( | s | !s.is_empty() ) + .clone() + ; + + let links = entry.links + .iter() + .map( | link | link.href.clone() ) + .collect::< Vec< _ > >() + .clone() + ; + + let categories = entry.categories + .iter() + .map( | cat | cat.term.clone() ) + .collect::< Vec< _ > >() + ; + + let media = entry.media + .iter() + .flat_map( | m | m.content.clone() ) + .filter_map( | m | m.url.map( | url | url.to_string() ) ) + .collect::< Vec< _ > >() + ; + + Frame + { + id : entry.id, + title : entry.title.map( | title | title.content ).clone(), + stored_time : entry.updated, + authors: ( !authors.is_empty() ).then( || authors ), + // qqq : why join? + // aaa : fixed, saved as list + content, + links: ( !links.is_empty() ).then( || links ), + // qqq : why join? + // aaa : fixed, saved as list + summary : entry.summary.map( | c | c.content ).clone(), + categories: ( !categories.is_empty() ).then( || categories ), + // qqq : why join? + // aaa : fixed, saved as list + published : entry.published.clone(), + source : entry.source.clone(), + rights : entry.rights.map( | r | r.content ).clone(), + media: ( !media.is_empty() ).then( || media ), + // qqq : why join? + // aaa : fixed, saved as list + language : entry.language.clone(), + feed_link, + } + } +} + +/// Frames storing and retrieving. +#[ async_trait::async_trait( ?Send ) ] +pub trait FrameStore +{ + /// Save new frames to storage. + /// New frames will be inserted into `frame` table. + async fn frames_save( &mut self, feed : Vec< Frame > ) -> Result< Payload >; + + /// Update existing frames in storage with new changes. + /// If frames in storage were modified in feed source, they will be changed to match new version. + async fn frames_update( &mut self, feed : Vec< Frame > ) -> Result< () >; + + /// Get all feed frames from storage. + async fn frames_list( &mut self ) -> Result< ListReport >; +} +// qqq : what is update? what update? don't use word update without noun and explanation what deos it mean +// aaa : fixed comments + + +// qqq : what is it for and why? +// aaa : added explanation + +/// Get convenient frame format for using with GlueSQL expression builder. +/// Converts from Frame struct into vec of GlueSQL expression nodes. +impl From< Frame > for Vec< ExprNode< 'static > > +{ + fn from( entry : Frame ) -> Self + { + let title = entry.title + .map( | title | text( title ) ) + .unwrap_or( null() ) + ; + + let stored_time = entry.stored_time + .map( | d | timestamp( d.to_rfc3339_opts( SecondsFormat::Millis, true ) ) ) + .unwrap_or( null() ) + ; + + let authors = entry.authors + .map( | authors | + text + ( + format!( "[{}]", authors.into_iter().map( | a | format!( "\"{}\"", a ) ).collect::< Vec< _ > >().join( ", " ) ) + ) + ) + .unwrap_or( null() ) + ; + + let content = entry.content + .map( | content | text( content ) ) + .unwrap_or( null() ) + ; + + let links = entry.links + .map( | links | + text + ( + format!( "[{}]", links.into_iter().map( | link | format!( "\"{}\"", link ) ).collect::< Vec< _ > >().join( ", " ) ) + ) + ) + .unwrap_or( null() ) + ; + + let summary = entry.summary + .map( | summary | text( summary ) ) + .unwrap_or( null() ) + ; + + let categories = entry.categories + .map( | categories | + text + ( + format! + ( + "[{}]", + categories.into_iter().map( | category | format!( "\"{}\"", category ) ).collect::< Vec< _ > >().join( ", " ), + ) + ) + ) + .unwrap_or( null() ) + ; + + let published = entry.published + .map( | d | timestamp( d.to_rfc3339_opts( SecondsFormat::Millis, true ) ) ) + .unwrap_or( null() ) + ; + + let source = entry.source.map( | s | text( s ) ).unwrap_or( null() ); + let rights = entry.rights.map( | r | text( r ) ).unwrap_or( null() ); + let media = entry.media + .map( | media | + text + ( + format!( "[{}]", media.into_iter().map( | media | format!( "\"{}\"", media ) ).collect::< Vec< _ > >().join( ", " ) ) + ) + ) + .unwrap_or( null() ) + ; + + let language = entry.language.clone().map( text ).unwrap_or( null() ); + + vec! + [ + text( entry.id ), + title, + stored_time, + authors, + content, + links, + summary, + categories, + published, + source, + rights, + media, + language, + text( entry.feed_link ) + ] + } +} + +// qqq : RowValue or CellValue? +// aaa : fixed name +/// GlueSQL Value wrapper for display. +#[ derive( Debug ) ] +pub struct CellValue< 'a >( pub &'a gluesql::prelude::Value ); + +impl std::fmt::Display for CellValue< '_ > +{ + fn fmt( &self, f : &mut std::fmt::Formatter<'_> ) -> std::fmt::Result + { + use gluesql::prelude::Value::*; + match &self.0 + { + Bool( val ) => write!( f, "{}", val )?, + I8( val ) => write!( f, "{}", val )?, + I16( val ) => write!( f, "{}", val )?, + I32( val ) => write!( f, "{}", val )?, + I64( val ) => write!( f, "{}", val )?, + I128( val ) => write!( f, "{}", val )?, + U8( val ) => write!( f, "{}", val )?, + U16( val ) => write!( f, "{}", val )?, + U32( val ) => write!( f, "{}", val )?, + U64( val ) => write!( f, "{}", val )?, + U128( val ) => write!( f, "{}", val )?, + F32( val ) => write!( f, "{}", val )?, + F64( val ) => write!( f, "{}", val )?, + Str( val ) => write!( f, "{}", val )?, + Null => write!( f, "Null" )?, + Timestamp( val ) => write!( f, "{}", val )?, + _ => write!( f, "" )?, + } + + Ok( () ) + } +} + +impl From< CellValue< '_ > > for String +{ + fn from( value : CellValue< '_ > ) -> Self + { + use gluesql::core::data::Value::*; + match &value.0 + { + Str( val ) => val.clone(), + _ => String::new(), + } + } +} diff --git a/module/move/unitore/src/entity/mod.rs b/module/move/unitore/src/entity/mod.rs new file mode 100644 index 0000000000..94a95a552b --- /dev/null +++ b/module/move/unitore/src/entity/mod.rs @@ -0,0 +1,7 @@ +//! Entities of application. + +pub mod config; +pub mod frame; +pub mod table; +pub mod feed; + diff --git a/module/move/unitore/src/entity/table.rs b/module/move/unitore/src/entity/table.rs new file mode 100644 index 0000000000..b177c3c934 --- /dev/null +++ b/module/move/unitore/src/entity/table.rs @@ -0,0 +1,18 @@ +//! Functionality for storage tables information. + +use crate::*; +use error_tools::Result; +use gluesql::prelude::Payload; + +use action::table::TablesReport; + +/// Functions for tables informantion. +#[ async_trait::async_trait( ?Send ) ] +pub trait TableStore +{ + /// List tables in storage. + async fn tables_list( &mut self ) -> Result< TablesReport >; + + /// List columns of table. + async fn table_list( &mut self, table_name : String ) -> Result< Vec< Payload > >; +} diff --git a/module/move/unitore/src/executor.rs b/module/move/unitore/src/executor.rs new file mode 100644 index 0000000000..8010dbd9cc --- /dev/null +++ b/module/move/unitore/src/executor.rs @@ -0,0 +1,64 @@ +//! Execute plan. + +use crate::*; +use wca::{ Dictionary, Executor, Parser, Verifier }; +use error_tools::Result; + +/// Run feed updates. +pub fn execute() -> Result< (), Box< dyn std::error::Error + Send + Sync > > +{ + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + command::config::ConfigCommand::add()? + ) + .command + ( + command::config::ConfigCommand::delete()? + ) + .command + ( + command::config::ConfigCommand::list()? + ) + .command + ( + command::frame::FrameCommand::list()? + ) + .command + ( + command::frame::FrameCommand::download()? + ) + .command + ( + command::feed::FeedCommand::list()? + ) + .command + ( + command::table::TablesCommand::list()? + ) + .command + ( + command::table::TableCommand::list()? + ) + .command + ( + command::query::QueryCommand::execute()? + ) + .form(); + let verifier = Verifier; + + // init executor + let executor = Executor::former().form(); + + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + let raw_program = parser.parse( args ).unwrap(); + let grammar_program = verifier.to_program( dictionary, raw_program ).unwrap(); + + executor.program( dictionary, grammar_program )?; + + Ok( () ) +} diff --git a/module/move/unitore/src/feed_config.rs b/module/move/unitore/src/feed_config.rs new file mode 100644 index 0000000000..88b5f8a791 --- /dev/null +++ b/module/move/unitore/src/feed_config.rs @@ -0,0 +1,52 @@ +//! Reading and parsing of subscription configuration file. + +use std::{ fs::OpenOptions, io::{ BufReader, Read } }; +use error_tools::{ for_app::Context, Result }; +use serde::Deserialize; + +/// Configuration for subscription to feed resource. +#[ derive( Debug, Clone, Deserialize ) ] +pub struct SubscriptionConfig +{ + /// Update period. + #[serde(with = "humantime_serde")] + pub update_period : std::time::Duration, + /// Resource link. + pub link : url::Url, +} + +/// All subscriptions read from config file. +#[ derive( Debug, Deserialize ) ] +pub struct Subscriptions +{ + /// List of subscriptions configurations. + pub config : Vec< SubscriptionConfig > +} + +/// Get list of feed subscriptions from provided configuration file. +/// +/// # Arguments +/// +/// * `file_path` - Path to the configuration file. +/// +/// # Returns +/// +/// Result with list of feed subscriptions serialized as SubscriptionConfig. +pub fn read( file_path : String ) -> Result< Vec< SubscriptionConfig > > +{ + let read_file = OpenOptions::new() + .read( true ) + .open( &file_path ) + .context( format!( "Problem reading config file {}", file_path ) )? + ; + + let mut reader = BufReader::new( read_file ); + let mut buffer: Vec< u8 > = Vec::new(); + reader.read_to_end( &mut buffer ).context( format!( "Problem reading config file {}", file_path ) )?; + + let feeds : Subscriptions = toml::from_str( &String::from_utf8( buffer )? ) + .context( format!( "Problem parsing config file {}", file_path ) )? + ; + + Ok( feeds.config ) +} diff --git a/module/move/unitore/src/lib.rs b/module/move/unitore/src/lib.rs new file mode 100644 index 0000000000..f6e0df9632 --- /dev/null +++ b/module/move/unitore/src/lib.rs @@ -0,0 +1,12 @@ +//! Feed client +pub mod retriever; +pub mod feed_config; +pub mod executor; +pub mod tool; +pub mod command; +pub mod action; +pub mod entity; +pub mod sled_adapter; + +// qqq : src/Readmу.md with file structure please +// aaa : added Readme.md diff --git a/module/move/unitore/src/main.rs b/module/move/unitore/src/main.rs new file mode 100644 index 0000000000..49e83d2564 --- /dev/null +++ b/module/move/unitore/src/main.rs @@ -0,0 +1,9 @@ +//! Runs unitore command executor. +//! qqq : ? aaa: added documantation. + +pub use unitore::executor; + +fn main() -> Result< (), Box< dyn std::error::Error + Send + Sync > > +{ + executor::execute() +} diff --git a/module/move/unitore/src/retriever.rs b/module/move/unitore/src/retriever.rs new file mode 100644 index 0000000000..ac4e94be11 --- /dev/null +++ b/module/move/unitore/src/retriever.rs @@ -0,0 +1,57 @@ +//! Client that fetches feeds entries. + +use hyper_tls::HttpsConnector; +use hyper_util:: +{ + client::legacy::Client, + rt::TokioExecutor, +}; +use http_body_util::{ Empty, BodyExt }; +use hyper::body::Bytes; +use feed_rs::parser as feed_parser; +use error_tools::{ Result, for_app::Context }; + +// qqq : purpose of trait if any? +// aaa : removed unnecessary trait + +/// Feed client for fetching feed. +#[ derive( Debug ) ] +pub struct FeedClient; + +impl FeedClient +{ + /// Fetch feed frames from provided url source. + /// + /// # Arguments + /// + /// * `source` - The link to feed source. + /// + /// # Returns + /// + /// Result with fetched feed as feed_rs Feed struct. + pub async fn fetch( &self, source : url::Url ) -> Result< feed_rs::model::Feed > + { + let https = HttpsConnector::new(); + let client = Client::builder( TokioExecutor::new() ).build::< _, Empty< Bytes > >( https ); + let link = source.to_string().parse().context( format!( "Failed to parse source link {}", source ) )?; + let mut res = client + .get( link ) + .await + .context( format!( "Failed to fetch frames from source {}", source ) )? + ; + + let mut feed = Vec::new(); + while let Some( next ) = res.frame().await + { + let frame = next?; + if let Some( chunk ) = frame.data_ref() + { + feed.extend( chunk.to_vec() ); + } + } + + let feed = feed_parser::parse( feed.as_slice() ).context( "Failed to parse retrieved feeds." )?; + + Ok( feed ) + } +} diff --git a/module/move/unitore/src/sled_adapter/config.rs b/module/move/unitore/src/sled_adapter/config.rs new file mode 100644 index 0000000000..a3b0cc73d8 --- /dev/null +++ b/module/move/unitore/src/sled_adapter/config.rs @@ -0,0 +1,56 @@ +//! Config file operation with Sled storage. + +use crate::*; +use error_tools::{ err, Result }; +use gluesql:: +{ + core:: + { + ast_builder::{ col, table, text, Execute, }, + executor::Payload, + }, + sled_storage::SledStorage, +}; +use entity::config::{ Config, ConfigStore }; +use sled_adapter::FeedStorage; + +#[ async_trait::async_trait( ?Send ) ] +impl ConfigStore for FeedStorage< SledStorage > +{ + async fn config_add( &mut self, config : &Config ) -> Result< Payload > + { + let res = table( "config" ) + .insert() + .columns + ( + "path", + ) + .values( vec![ vec![ text( config.path() ) ] ] ) + .execute( &mut *self.0.lock().await ) + .await; + + Ok( res? ) + } + + async fn config_delete( &mut self, config : &Config ) -> Result< Payload > + { + let res = table( "config" ) + .delete() + .filter( col( "path" ).eq( format!( "'{}'", config.path() ) ) ) + .execute( &mut *self.0.lock().await ) + .await?; + + if res == Payload::Delete( 0 ) + { + return Err( err!( format!( "Config file with path {} not found in storage", config.path() ) ) ) + } + + Ok( res ) + } + + async fn config_list( &mut self ) -> Result< Payload > + { + let res = table( "config" ).select().execute( &mut *self.0.lock().await ).await?; + Ok( res ) + } +} diff --git a/module/move/unitore/src/sled_adapter/feed.rs b/module/move/unitore/src/sled_adapter/feed.rs new file mode 100644 index 0000000000..fb38e02075 --- /dev/null +++ b/module/move/unitore/src/sled_adapter/feed.rs @@ -0,0 +1,197 @@ +//! Feed operation with Sled storage. + +use crate::*; +use std::time::Duration; +use error_tools::{ Result, for_app::Context }; +use gluesql:: +{ + core:: + { + ast_builder::{ col, null, table, text, Execute, timestamp, ExprNode }, + executor::Payload, + data::Value, + chrono::SecondsFormat, + }, + sled_storage::SledStorage, +}; +use entity:: +{ + feed::{ Feed, FeedStore }, + frame::FrameStore, +}; +use action:: +{ + feed::FeedsReport, + frame::{ UpdateReport, SelectedEntries, FramesReport }, +}; +use sled_adapter::FeedStorage; +use wca::wtools::Itertools; + +#[ async_trait::async_trait( ?Send ) ] +impl FeedStore for FeedStorage< SledStorage > +{ + async fn feeds_list( &mut self ) -> Result< FeedsReport > + { + let res = table( "feed" ) + .select() + .project( "title, link, update_period, config_file" ) + .execute( &mut *self.0.lock().await ) + .await? + ; + + let mut report = FeedsReport::new(); + match res + { + Payload::Select { labels: label_vec, rows: rows_vec } => + { + report.0 = SelectedEntries + { + selected_rows : rows_vec, + selected_columns : label_vec, + } + }, + _ => {}, + } + + Ok( report ) + } + + async fn feeds_update( &mut self, feed : Vec< Feed > ) -> Result< () > + { + for feed in feed + { + let _update = table( "feed" ) + .update() + .set( "title", feed.title.map( text ).unwrap_or( null() ) ) + .set( + "updated", + feed.updated.map( | d | timestamp( d.to_rfc3339_opts( SecondsFormat::Millis, true ) ) ).unwrap_or( null() ), + ) + .set( "authors", feed.authors.map( text ).unwrap_or( null() ) ) + .set( "description", feed.description.map( text ).unwrap_or( null() ) ) + .set( + "published", + feed.published.map( | d | timestamp( d.to_rfc3339_opts( SecondsFormat::Millis, true ) ) ).unwrap_or( null() ), + ) + .filter( col( "link" ).eq( feed.link.to_string() ) ) + .execute( &mut *self.0.lock().await ) + .await + .context( "Failed to insert feed" )? + ; + } + + Ok( () ) + } + + async fn feeds_process + ( + &mut self, + feeds : Vec< ( feed_rs::model::Feed, Duration, url::Url ) >, + ) -> Result< UpdateReport > + { + let mut new_entries = Vec::new(); + let mut modified_entries = Vec::new(); + let mut reports = Vec::new(); + + for feed in &feeds + { + let mut frames_report = FramesReport::new( feed.0.title.clone().unwrap().content ); + + let existing_frames = table( "frame" ) + .select() + .filter( col( "feed_link" ).eq( text( feed.2.to_string() ) ) ) + .project( "id, published" ) + .execute( &mut *self.0.lock().await ) + .await + .context( "Failed to get existing frames while saving new frames" )? + ; + + if let Some( rows ) = existing_frames.select() + { + let rows = rows.collect::< Vec< _ > >(); + frames_report.existing_frames = rows.len(); + let existing_entries = rows.iter() + .map( | r | ( r.get( "id" ).map( | &val | val.clone() ), r.get( "published" ).map( | &val | val.clone() ) ) ) + .flat_map( | ( id, published ) | + id.map( | id | + ( + id, + published.map( | date | + { + match date + { + Value::Timestamp( date_time ) => Some( date_time ), + _ => None, + } + } ) + .flatten() + ) + ) + ) + .flat_map( | ( id, published ) | match id { Value::Str( id ) => Some( ( id, published ) ), _ => None } ) + .collect_vec() + ; + + let existing_ids = existing_entries.iter().map( | ( id, _ ) | id ).collect_vec(); + for entry in &feed.0.entries + { + // if extry with same id is already in db, check if it is updated + if let Some( position ) = existing_ids.iter().position( | &id | id == &entry.id ) + { + if let Some( date ) = existing_entries[ position ].1 + { + if date.and_utc() != entry.published.unwrap() + { + frames_report.updated_frames += 1; + modified_entries.push( ( entry.clone(), feed.2.to_string() ).into() ); + } + } + } + else + { + frames_report.new_frames += 1; + new_entries.push( ( entry.clone(), feed.2.to_string() ).into() ); + } + } + } + reports.push( frames_report ); + } + + if !new_entries.is_empty() + { + let _saved_report = self.frames_save( new_entries ).await?; + } + if !modified_entries.is_empty() + { + let _updated_report = self.frames_update( modified_entries ).await?; + } + + Ok( UpdateReport( reports ) ) + } + + async fn feeds_save( &mut self, feed : Vec< Feed > ) -> Result< Payload > + { + let feeds_rows : Vec< Vec< ExprNode< 'static > > > = feed.into_iter().map( | feed | feed.into() ).collect_vec(); + + let insert = table( "feed" ) + .insert() + .columns + ( + "link, + title, + updated, + authors, + description, + published, + update_period, + config_file", + ) + .values( feeds_rows ) + .execute( &mut *self.0.lock().await ) + .await + .context( "Failed to insert feeds" )? + ; + + Ok( insert ) + } +} diff --git a/module/move/unitore/src/sled_adapter/frame.rs b/module/move/unitore/src/sled_adapter/frame.rs new file mode 100644 index 0000000000..84d4687bf4 --- /dev/null +++ b/module/move/unitore/src/sled_adapter/frame.rs @@ -0,0 +1,124 @@ +//! Frames operation with Sled storage. + +use crate::*; +use std::collections::HashMap; +use error_tools::{ Result, for_app::Context }; +use gluesql:: +{ + core:: + { + ast_builder::{ col, table, Execute, ExprNode }, + executor::Payload, + data::Value, + }, + sled_storage::SledStorage, +}; +use entity::frame::{ FrameStore, Frame }; +use action::frame::{ SelectedEntries, FramesReport, ListReport }; +use sled_adapter::FeedStorage; +use wca::wtools::Itertools; + +#[ async_trait::async_trait( ?Send ) ] +impl FrameStore for FeedStorage< SledStorage > +{ + async fn frames_list( &mut self ) -> Result< ListReport > + { + let res = table( "frame" ).select().execute( &mut *self.0.lock().await ).await?; + + let mut reports = Vec::new(); + let all_frames = + if let Payload::Select { labels: label_vec, rows: rows_vec } = res + { + SelectedEntries + { + selected_rows : rows_vec, + selected_columns : label_vec, + } + } + else + { + SelectedEntries::new() + }; + + let mut feeds_map = HashMap::new(); + + for row in all_frames.selected_rows + { + let title_val = row.last().unwrap().clone(); + let title = String::from( title_val ); + feeds_map.entry( title ) + .and_modify( | vec : &mut Vec< Vec< Value > > | vec.push( row.clone() ) ) + .or_insert( vec![ row ] ) + ; + } + + for ( title, frames ) in feeds_map + { + let mut report = FramesReport::new( title ); + report.existing_frames = frames.len(); + report.selected_frames = SelectedEntries + { + selected_rows : frames, + selected_columns : all_frames.selected_columns.clone(), + }; + reports.push( report ); + } + + Ok( ListReport( reports ) ) + } + + async fn frames_save( &mut self, frames : Vec< Frame > ) -> Result< Payload > + { + let entries_rows : Vec< Vec< ExprNode< 'static > > > = frames.into_iter().map( | entry | entry.into() ).collect_vec(); + + let insert = table( "frame" ) + .insert() + .columns + ( + "id, + title, + stored_time, + authors, + content, + links, + summary, + categories, + published, + source, + rights, + media, + language, + feed_link" + ) + .values( entries_rows ) + .execute( &mut *self.0.lock().await ) + .await + .context( "Failed to insert frames" )? + ; + + Ok( insert ) + } + + async fn frames_update( &mut self, feed : Vec< Frame > ) -> Result< () > + { + let entries_rows : Vec< Vec< ExprNode< 'static > > > = feed.into_iter().map( | entry | entry.into() ).collect_vec(); + + for entry in entries_rows + { + let _update = table( "frame" ) + .update() + .set( "title", entry[ 1 ].to_owned() ) + .set( "content", entry[ 4 ].to_owned() ) + .set( "links", entry[ 5 ].to_owned() ) + .set( "summary", entry[ 6 ].to_owned() ) + .set( "published", entry[ 8 ].to_owned() ) + .set( "media", entry[ 9 ].to_owned() ) + .filter( col( "id" ).eq( entry[ 0 ].to_owned() ) ) + .execute( &mut *self.0.lock().await ) + .await + .context( "Failed to update frames" )? + ; + } + Ok( () ) + } +} diff --git a/module/move/unitore/src/sled_adapter/mod.rs b/module/move/unitore/src/sled_adapter/mod.rs new file mode 100644 index 0000000000..ac4780a6f1 --- /dev/null +++ b/module/move/unitore/src/sled_adapter/mod.rs @@ -0,0 +1,117 @@ +//! Storage for frames, feeds and config files. + +use crate::*; +use std::sync::Arc; +use error_tools::{ for_app::Context, Result }; +use tokio::sync::Mutex; +use gluesql:: +{ + core:: + { + ast_builder::{ table, Build, Execute }, + store::{ GStore, GStoreMut }, + }, + prelude::Glue, + sled_storage::{ sled::Config, SledStorage }, +}; +use action::query::QueryReport; + +mod frame; +mod table; +mod feed; +mod config; + +/// Storage for feed frames. +#[ derive( Clone ) ] +pub struct FeedStorage< S : GStore + GStoreMut + Send >( Arc< Mutex< Glue< S > > > ); + +impl< S : GStore + GStoreMut + Send > std::fmt::Debug for FeedStorage< S > +{ + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + writeln!( f, "GlueSQL storage" ) + } +} + +impl FeedStorage< SledStorage > +{ + /// Initialize new storage from configuration, create feed table. + pub async fn init_storage( config : &Config ) -> Result< Self > + { + let storage = SledStorage::try_from( config.clone() ) + .context( format!( "Failed to initialize storage with config {:?}", config ) )? + ; + + let mut glue = Glue::new( storage ); + + let config_table = table( "config" ) + .create_table_if_not_exists() + .add_column( "path TEXT PRIMARY KEY" ) + .build()? + ; + + config_table.execute( &mut glue ).await?; + + let feed_table = table( "feed" ) + .create_table_if_not_exists() + .add_column( "link TEXT PRIMARY KEY" ) + .add_column( "type TEXT" ) + .add_column( "title TEXT" ) + .add_column( "updated TIMESTAMP" ) + .add_column( "authors TEXT" ) + .add_column( "description TEXT" ) + .add_column( "published TIMESTAMP" ) + .add_column( "update_period TEXT" ) + .add_column( "config_file TEXT FOREIGN KEY REFERENCES config(path)" ) + .build()? + ; + + feed_table.execute( &mut glue ).await?; + + let frame_table = table( "frame" ) + .create_table_if_not_exists() + .add_column( "id TEXT PRIMARY KEY" ) + .add_column( "title TEXT" ) + .add_column( "stored_time TIMESTAMP" ) + .add_column( "authors LIST" ) + .add_column( "content TEXT" ) + .add_column( "links LIST" ) + .add_column( "summary TEXT" ) + .add_column( "categories LIST" ) + .add_column( "published TIMESTAMP" ) + .add_column( "source TEXT" ) + .add_column( "rights TEXT" ) + .add_column( "media LIST" ) + .add_column( "language TEXT" ) + .add_column( "feed_link TEXT FOREIGN KEY REFERENCES feed(link)" ) + .build()? + ; + + frame_table.execute( &mut glue ).await?; + + Ok( Self( Arc::new( Mutex::new( glue ) ) ) ) + } +} + +/// Functionality of feed storage. +#[ mockall::automock ] +#[ async_trait::async_trait( ?Send ) ] +pub trait Store +{ + /// Execute custom query passed as String. + async fn query_execute( &mut self, query : String ) -> Result< QueryReport >; +} + +#[ async_trait::async_trait( ?Send ) ] +impl< S : GStore + GStoreMut + Send > Store for FeedStorage< S > +{ + async fn query_execute( &mut self, query : String ) -> Result< QueryReport > + { + let glue = &mut *self.0.lock().await; + let payloads = glue.execute( &query ).await.context( "Failed to execute query" )?; + + let report = QueryReport ( payloads ); + + Ok( report ) + } +} diff --git a/module/move/unitore/src/sled_adapter/table.rs b/module/move/unitore/src/sled_adapter/table.rs new file mode 100644 index 0000000000..71763918ee --- /dev/null +++ b/module/move/unitore/src/sled_adapter/table.rs @@ -0,0 +1,35 @@ +//! Table and columns info operations from Sled storage. + +use crate::*; +use error_tools::Result; +use gluesql:: +{ + core::executor::Payload, + sled_storage::SledStorage, +}; +use entity::table::TableStore; +use action::table::TablesReport; +use sled_adapter::FeedStorage; + +#[ async_trait::async_trait( ?Send ) ] +impl TableStore for FeedStorage< SledStorage > +{ + async fn tables_list( &mut self ) -> Result< TablesReport > + { + let glue = &mut *self.0.lock().await; + let payloads = glue.execute( "SELECT * FROM GLUE_TABLE_COLUMNS" ).await?; + + let report = TablesReport::new( payloads ); + + Ok( report ) + } + + async fn table_list( &mut self, table_name : String ) -> Result< Vec< Payload > > + { + let glue = &mut *self.0.lock().await; + let query_str = format!( "SELECT * FROM GLUE_TABLE_COLUMNS WHERE TABLE_NAME='{}'", table_name ); + let payloads = glue.execute( &query_str ).await?; + + Ok( payloads ) + } +} \ No newline at end of file diff --git a/module/move/unitore/src/tool/mod.rs b/module/move/unitore/src/tool/mod.rs new file mode 100644 index 0000000000..749ba59a0e --- /dev/null +++ b/module/move/unitore/src/tool/mod.rs @@ -0,0 +1,3 @@ +//! Tools for additional functionality. + +pub mod table_display; \ No newline at end of file diff --git a/module/move/unitore/src/tool/table_display.rs b/module/move/unitore/src/tool/table_display.rs new file mode 100644 index 0000000000..4b5f35475a --- /dev/null +++ b/module/move/unitore/src/tool/table_display.rs @@ -0,0 +1,88 @@ +//! Wrapper for command report representation. +//! Separates usage of cli-table library behind facade for convenient changes in future. + +use cli_table:: +{ + format::{ Border, HorizontalLine, Separator }, Cell, Style, Table, TableDisplay +}; + +// qqq : purpose well defined should be always be in documentation +// aaa : added explanation + +/// Wrapper struct for cli-table table with implementation of Display. +/// Separates usage of cli-table library behind facade for convenient changes in future. +pub struct ReportTable( TableDisplay ); + +impl std::fmt::Display for ReportTable +{ + fn fmt( &self, f : &mut std::fmt::Formatter<'_> ) -> std::fmt::Result + { + write!( f, "{}", self.0 ) + } +} + +impl std::fmt::Debug for ReportTable +{ + fn fmt( &self, f : &mut std::fmt::Formatter<'_> ) -> std::fmt::Result + { + write!( f, "{}", self.0 ) + } +} + +/// Transform 2-dimensional vec of String data into displayable table with plain rows. +pub fn plain_table( rows : Vec< Vec< String > > ) -> Option< ReportTable > +{ + let rows = rows + .into_iter() + .map( | row | row.into_iter().map( | cell_val | cell_val.cell() ).collect::< Vec< _ > >() ) + .collect::< Vec< _ > >() + ; + + let table_struct = rows.table() + .border( Border::builder().build() ) + .separator( Separator::builder().build() ) + ; + + table_struct.display().map( | table | ReportTable( table ) ).ok() +} + +/// Create displayable table with header from headers vec and 2-dimensional vec of String data. +pub fn table_with_headers( headers : Vec< String >, rows : Vec< Vec< String > > ) -> Option< ReportTable > +{ + let rows = rows + .into_iter() + .map( | row | row.into_iter().map( | cell_val | cell_val.cell() ).collect::< Vec< _ > >() ) + .collect::< Vec< _ > >() + ; + + let headers = headers + .into_iter() + .map( | cell_val | cell_val.cell().bold( true ) ) + .collect::< Vec< _ > >() + ; + + let table_struct = rows.table() + .title( headers ) + .border( Border::builder().build() ) + .separator( Separator::builder().build() ) + ; + + table_struct.display().map( | table | ReportTable( table ) ).ok() +} + +/// Transform 2-dimensional vec of String data into displayable table with plain rows and bottom border. +pub fn plain_with_border( rows : Vec< Vec< String > > ) -> Option< ReportTable > +{ + let rows = rows + .into_iter() + .map( | row | row.into_iter().map( | cell_val | cell_val.cell() ).collect::< Vec< _ > >() ) + .collect::< Vec< _ > >() + ; + + let table_struct = rows.table() + .border( Border::builder().bottom(HorizontalLine::default()).build() ) + .separator( Separator::builder().build() ) + ; + + table_struct.display().map( | table | ReportTable( table ) ).ok() +} \ No newline at end of file diff --git a/module/move/unitore/tests/basic.rs b/module/move/unitore/tests/basic.rs new file mode 100644 index 0000000000..6e5df1ad4d --- /dev/null +++ b/module/move/unitore/tests/basic.rs @@ -0,0 +1,13 @@ +use feed_rs::parser as feed_parser; +use error_tools::Result; + +#[ tokio::test ] +async fn frame() -> Result< () > +{ + let feed = feed_parser::parse( include_str!( "./fixtures/plain_feed.xml" ).as_bytes() )?; + let frame = unitore::entity::frame::Frame::from( ( feed.entries[ 0 ].clone(), String::new() ) ); + + assert!( frame.id == feed.entries[ 0 ].id ); + + Ok( () ) +} diff --git a/module/move/unitore/tests/config_add.rs b/module/move/unitore/tests/config_add.rs new file mode 100644 index 0000000000..455a77dbd4 --- /dev/null +++ b/module/move/unitore/tests/config_add.rs @@ -0,0 +1,37 @@ +use std::path::PathBuf; +use gluesql::sled_storage::sled::Config; +use unitore:: +{ + sled_adapter::FeedStorage, + entity::feed::FeedStore, + action::config, +}; +use error_tools::Result; + +#[ tokio::test ] +async fn config_add() -> Result< () > +{ + let path = PathBuf::from( "./tests/fixtures/test_config.toml" ); + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + config::config_add( feed_storage.clone(), &path ).await?; + + let res = feed_storage.feeds_list().await?; + + let feeds_links = res.0.selected_rows + .iter() + .map( | feed | String::from( feed[ 1 ].clone() ) ) + .collect::< Vec< _ > >() + ; + + assert!( feeds_links.len() == 1 ); + assert!( feeds_links.contains( &format!( "https://www.nasa.gov/feed/" ) ) ); + + Ok( () ) +} diff --git a/module/move/unitore/tests/config_delete.rs b/module/move/unitore/tests/config_delete.rs new file mode 100644 index 0000000000..63a792725e --- /dev/null +++ b/module/move/unitore/tests/config_delete.rs @@ -0,0 +1,43 @@ +use gluesql:: +{ + sled_storage::sled::Config, + prelude::Payload::Select, +}; +use unitore:: +{ + sled_adapter::FeedStorage, + entity::config::ConfigStore, + action::config, +}; +use error_tools::Result; + +#[ tokio::test ] +async fn config_delete() -> Result< () > +{ + + let path = std::path::PathBuf::from( "./tests/fixtures/test_config.toml" ); + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + config::config_add( feed_storage.clone(), &path ).await?; + + config::config_delete( feed_storage.clone(), &path ).await?; + + let list = feed_storage.config_list().await?; + + if let Select{ labels : _, rows } = list + { + assert!( rows.len() == 0 ) + } + else + { + assert!( false ); + } + + Ok( () ) +} diff --git a/module/move/unitore/tests/fixtures/plain_feed.xml b/module/move/unitore/tests/fixtures/plain_feed.xml new file mode 100644 index 0000000000..7048caabd0 --- /dev/null +++ b/module/move/unitore/tests/fixtures/plain_feed.xml @@ -0,0 +1,1747 @@ + + + + NASA + + https://www.nasa.gov + Official National Aeronautics and Space Administration Website + Thu, 14 Mar 2024 14:27:52 +0000 + en-US + + hourly + + 1 + https://wordpress.org/?v=6.3.3 + + Icing Cloud Characterization Engineer Emily Timko + https://www.nasa.gov/image-article/icing-cloud-characterization-engineer-emily-timko/ + + + Thu, 14 Mar 2024 14:27:52 +0000 + https://www.nasa.gov/?post_type=image-article&p=631537 + + +
    A woman with long brown hair and dark brown eyes stands against metal stairs, smiling. She holds a railing with her left arm and her right arm down at her side. She's wearing a light beige blazer over a white shirt, blue jeans, and a brown belt.
    + + +

    “If I knew that I was going to get to where I’m at [today], I would have gone through it all over again. I would have went through changing my major. I would have gone through the divorce. I would have went through the heartbreak of thinking, ‘I’m not going to be what I wanted to be when I grow up.’ That’s OK.

    + + + +

    “Back then, when I realized that I wasn’t going to be an on-air meteorologist, it was heartbreaking. But now, I’m all right with that. It’s been a bumpy ride for me, but in the end, it’s been the greatest thing.

    + + + +

    “…I love to share the messy ride. It’s OK that you have bumps. It’s OK if there’s obstacles. You have your goals, but it’s OK if there’s hiccups. You can still be a mess and be successful.â€

    + + + +

    – Emily Timko, Icing Cloud Characterization Engineer, NASA’s Glenn Research Center

    + + + +

    Image Credit: NASA/Quentin Schwinn
    Interviewer: NASA/Thalia Patrinos

    + + + +
    +]]> + + + + + + Hubble Tracks Jupiter’s Stormy Weather + https://science.nasa.gov/missions/hubble/hubble-tracks-jupiters-stormy-weather/ + + + Thu, 14 Mar 2024 14:00:21 +0000 + + + + + + + + + + + https://science.nasa.gov/missions/hubble/hubble-tracks-jupiters-stormy-weather/ + + + +
    +
    +

    3 min read

    +

    Hubble Tracks Jupiter’s Stormy Weather

    +
    +
    + +
    +
    +
    +
    A side-by-side image showing both faces of Jupiter on the black background of space. At the top, left corner of the left-hand image is the label Jupiter. Centered at the bottom is the label
    +
    NASA’s Hubble Space Telescope imaged both sides of the giant planet, Jupiter, on January 5-6, 2024.
    +
    NASA, ESA, STScI, Amy Simon (NASA-GSFC)
    +
    +
    +
    + + + +

    The giant planet Jupiter, in all its banded glory, is revisited by NASA’s Hubble Space Telescope in these latest images, taken on January 5-6, 2024, capturing both sides of the planet. Hubble monitors Jupiter and the other outer solar system planets every year under the Outer Planet Atmospheres Legacy program (OPAL). This is because these large worlds are shrouded in clouds and hazes stirred up by violent winds, causing a kaleidoscope of ever-changing weather patterns.

    +

    [left image] – Big enough to swallow Earth, the classic Great Red Spot stands out prominently in Jupiter’s atmosphere. To its lower right, at a more southerly latitude, is a feature sometimes dubbed Red Spot Jr. This anticyclone was the result of storms merging in 1998 and 2000, and it first appeared red in 2006 before returning to a pale beige in subsequent years. This year it is somewhat redder again. The source of the red coloration is unknown but may involve a range of chemical compounds: sulfur, phosphorus, or organic material. Staying in their lanes, but moving in opposite directions, Red Spot Jr. passes the Great Red Spot about every two years. Another small red anticyclone appears in the far north.

    +

    [right image] – Storm activity also appears in the opposite hemisphere. A pair of storms, a deep red cyclone and a reddish anticyclone, appear next to each other at right of center. They look so red that at first glance, it looks like Jupiter skinned a knee. These storms are rotating in opposite directions, indicating an alternating pattern of high- and low-pressure systems. For the cyclone, there’s an upwelling on the edges with clouds descending in the middle, causing a clearing in the atmospheric haze.

    +
    +
    + +
    Credit: NASA’s Goddard Space Flight Center, Lead Producer: Paul Morris
    + +

    The storms are expected to bounce past each other because their opposing clockwise and counterclockwise rotation makes them repel each other. “The many large storms and small white clouds are a hallmark of a lot of activity going on in Jupiter’s atmosphere right now,†said OPAL project lead Amy Simon of NASA’s Goddard Space Flight Center in Greenbelt, Maryland.

    +

    Toward the left edge of the image is the innermost Galilean moon, Io – the most volcanically active body in the Solar System, despite its small size (only slightly larger than Earth’s moon). Hubble resolves volcanic outflow deposits on the surface. Hubble’s sensitivity to blue and violet wavelengths clearly reveals interesting surface features. In 1979 NASA’s Voyager 1 spacecraft discovered Io’s pizza-like appearance and volcanism, to the surprise of planetary scientists because it is such a small moon. Hubble picked up where Voyager left off by keeping an eye on restless Io year by year.

    +
    +
    +
    + +
    +

    +
    +
    +
    +
    The Hubble Space Telescope images used in this animated science visualization present a full rotation of the giant planet Jupiter. This is not a real-time movie. Instead, Hubble snapshots of the colorful planet, taken January 5-6, 2024, have been photo-mapped onto a sphere, and the model is then rotated in animation. The planet’s real rotation rate is nearly 10 hours, which is easily plotted by watching the Great Red Spot come and go with each completed rotation. Hubble monitors Jupiter and the other outer Solar System planets every year under the Outer Planet Atmospheres Legacy program (OPAL). Credit: NASA, ESA, Amy Simon (NASA-GSFC)
    +

    +

    +

    +

    + +

    The Hubble Space Telescope has been operating for over three decades and continues to make ground-breaking discoveries that shape our fundamental understanding of the universe. Hubble is a project of international cooperation between NASA and ESA. NASA’s Goddard Space Flight Center in Greenbelt, Maryland, manages the telescope. Goddard also conducts mission operations with Lockheed Martin Space in Denver, Colorado. The Space Telescope Science Institute (STScI) in Baltimore, Maryland, conducts Hubble and Webb science operations for NASA.

    +

    Learn More

    + + + + + + +
    +
    +
    +
    +
    +
    +

    Share

    +

    +
    +
    +

    +

    +
    +
    +
    +

    Details

    +

    +
    +
    +
    Last Updated
    +

    +
    Mar 14, 2024
    +

    +
    +
    +
    Editor
    +
    +
    Andrea Gianopoulos
    +
    +
    +
    +
    Location
    +
    +
    Goddard Space Flight Center
    +
    +

    +
    +
    + +]]>
    + + + +
    + + Compact Robot Takes Flight to Support CERISS Initiative + https://science.nasa.gov/science-research/biological-physical-sciences/compact-robot-takes-flight-to-support-ceriss-initiative/ + + + Thu, 14 Mar 2024 13:00:00 +0000 + + + + + https://science.nasa.gov/science-research/biological-physical-sciences/compact-robot-takes-flight-to-support-ceriss-initiative/ + + + +
    +
    +

    3 min read

    +

    Compact Robot Takes Flight to Support CERISS Initiative

    +
    +
    + +

    NASA’s TechFlights 2023 Selections Advance Space Science in Collaboration with Industry

    +

    A new robot will be taking flight soon to test its ability to support biological and physical science experiments in microgravity.  As one of NASA’s 2023 TechFlights selections, this compact robot will have a chance to fly on a commercial suborbital flight to see just how well it can perform in a space environment.

    +

    Managed by NASA’s Flight Opportunities program, the TechFlights 2023 solicitation included a call for technologies to support the agency’s Commercially Enabled Rapid Space Science (CERISS) initiative. CERISS, administered by NASA’s Biological and Physical Sciences Division, uses the spaceflight environment to study phenomena in ways that cannot be done on Earth.

    +

    One of the 11 TechFlights selections that will undergo flight testing is a compact robot designed to prepare samples for science experiments in microgravity, improve in-flight sample preparation capabilities and potentially reduce astronauts’ time tending to such research while on the International Space Station or future commercial destinations in low Earth orbit.  Led by principal investigator Phil Putman, manager of advanced projects at Sierra Lobo, Inc, in Fremont, Ohio, the tests will leverage parabolic flights from Zero Gravity Corporation to evaluate the technology’s performance in microgravity.

    +

    “We need transformative capabilities to conduct research in space as NASA continues its exploration mission,†said BPS division director Lisa Carnell. “The commercial testing supported by Flight Opportunities will help CERISS advance a key research spaceflight innovation with the goal of improving in-flight sample analysis and advancing our study of biological and physical systems in space.â€

    +

    CERISS aims to advance biological and physical research capabilities with the commercial space industry, including sample preparation and analysis technologies for use in microgravity. The project’s long-term goals include conducting scientist astronaut missions on commercial space stations as well as developing automated hardware for experiments beyond low Earth orbit, such as on the lunar surface. Benefits include an increase in the pace of research for a wide range of research leading to an increased demand for research and development in low Earth orbit, facilitating growth of the commercial space industry.

    +

    Learn More

    +

    Commercially Enabled Rapid Space Science Initiative (CERISS)

    +

    TechFlights 2023 Selections

    +

    About Flight Opportunities

    +

    Commercial Destinations in Low Earth Orbit

    +

    About BPS

    +

    NASA’s Biological and Physical Sciences Division pioneers’ scientific discovery and enables exploration by using space environments to conduct investigations not possible on Earth. Studying biological and physical phenomenon under extreme conditions allows researchers to advance the fundamental scientific knowledge required to go farther and stay longer in space, while also benefitting life on Earth.

    +
    +
    +
    +
    +
    +
    +

    Share

    +

    +
    +
    +

    +

    +
    +
    +
    +

    Details

    +

    +
    +
    +
    Last Updated
    +

    +
    Mar 13, 2024
    +

    +

    +

    +
    +
    +]]>
    + + + +
    + + The Marshall Star for March 13, 2024 + https://www.nasa.gov/centers-and-facilities/marshall/the-marshall-star-for-march-13-2024/ + + + Wed, 13 Mar 2024 21:34:13 +0000 + + https://www.nasa.gov/?p=631504 + + +
    +
    +
    +
    +
    +
    25 Min Read
    +

    + The Marshall Star for March 13, 2024

    +
    +
    +
    +
    +
    Students from middle and high schools in the Montgomery area visit a series of exhibits featuring many NASA programs managed at Marshall. The displays were part of Alabama Space Day, celebrated March 5 at the state Capitol in Montgomery.
    +
    +
    +
    +
    +
    +
    + + + +

    Marshall Celebrates Alabama Space Day in Montgomery

    + + + +

    By Jessica Barnett

    + + + +

    Team members from NASA’s Marshall Space Flight Center joined Montgomery-area students, the U.S. Space & Rocket Center, NASA’s aerospace partners, and elected officials in celebrating the aerospace industry’s impact in Alabama on March 5.

    + + + +

    This year’s event kicked off at the state Capitol in Montgomery with a proclamation from Alabama Gov. Kay Ivey declaring March 5 as Alabama Space Day. Students from the Montgomery area were then invited to take part in various STEM (science, technology, engineering, and mathematics) activities, chat with an astronaut, hear what it takes to become a NASA intern or work at Marshall, and check out exhibits highlighting NASA’s many programs, including the Space Launch System, Human Landing System, and Centennial Challenges.

    + + +
    Joseph Pelfrey, director of NASA’s Marshall Space Flight Center, speaks inside the House Chamber of the Alabama State House during Alabama Space Day in Montgomery on March 5.
    Joseph Pelfrey, director of NASA’s Marshall Space Flight Center, speaks inside the House Chamber of the Alabama State House during Alabama Space Day in Montgomery on March 5.
    Dionne Whetstone
    + + +

    NASA astronaut Raja Chari attended the event and spoke to students about his experience serving as flight engineer of Expedition 66 and 67 aboard the International Space Station for 177 days. 

    + + + +

    Ivey said she felt honored to host the annual event, which aims to highlight Alabama’s contributions to space exploration as well as encourage the next generation of scientists and engineers by pursuing degrees and careers in aerospace.

    + + +
    Students from middle and high schools in the Montgomery area visit a series of exhibits featuring many NASA programs managed at Marshall. The displays were part of Alabama Space Day, celebrated March 5 at the state Capitol in Montgomery.
    Students from middle and high schools in the Montgomery area visit a series of exhibits featuring many NASA programs managed at Marshall. The displays were part of Alabama Space Day, celebrated March 5 at the state Capitol in Montgomery.
    NASA/Christopher Blair
    + + +

    “We are blessed to have such a world-class space and technology presence in our state,†Ivey said. “Alabama is very proud of its historic contributions to the American space program, which go back well over 60 years.â€

    + + + +

    Marshall Center Director Joseph Pelfrey echoed the sentiment, calling it “a great day to celebrate space in Alabama.â€

    + + + +

    “Alabama Space Day was a huge success, thanks to the workforce at Marshall, as well as our aerospace partners and sponsors,†Pelfrey said. “We truly appreciate the bipartisan support we receive across the state and enjoy highlighting these partnerships through events like this. I especially valued speaking on panels today with my colleagues and engaging with local high school and college students, who will be the first generation to travel to Mars.â€

    + + +
    Alabama Gov. Kay Ivey, right, greets Pelfrey during Alabama Space Day as NASA astronaut Raja Chari, center, looks on. The governor issued a proclamation declaring the state holiday in honor of the aerospace industry’s impact on Alabama.
    Alabama Gov. Kay Ivey, right, greets Pelfrey during Alabama Space Day as NASA astronaut Raja Chari, center, looks on. The governor issued a proclamation declaring the state holiday in honor of the aerospace industry’s impact on Alabama.
    Hal Yeager
    + + +

    Barnett, a Media Fusion employee, supports the Marshall Office of Communications.

    + + + +

    › Back to Top

    + + + +

    President’s NASA Fiscal Year 2025 Funding Supports US Space, Climate Leadership

    + + + +

    The Biden-Harris Administration on March 11 released the President’s Budget for Fiscal Year 2025, which includes funding to invest in America and the American people and will allow NASA to continue advancing our understanding of Earth and space while inspiring the world through discovery.

    + + + +

    “As history has proven, as the present has shown, and as the future will continue to demonstrate, an investment in NASA is an investment in America for the benefit of humanity,†said NASA Administrator Bill Nelson. “President Biden’s budget will fund our nation’s abilities and leadership for the future of space exploration, scientific discovery, cutting-edge technology, climate data, the next generation of aeronautics, and inspiring our future leaders – the Artemis Generation.â€

    + + +
    A graphic of the NASA "meatball" insignia, a blue circle crossed by a red V-shaped swoosh, against a black background.
    + + +

    The budget allows NASA to launch the Artemis II mission, which will send astronauts around the Moon for the first time in more than 50 years, research Earth’s changing climate, grow commercial markets to serve America’s interests in space, and inspire the Artemis Generation of science, technology, engineering, and math professionals.

    + + + +

    “This budget shows NASA’s value in contributing to the global leadership of the United States,†said Nelson. “Every dollar supports our ability to continue exploring new cosmic shores and making the impossible possible, all while creating competitive and good-paying jobs in all 50 states.â€

    + + + +

    At NASA, the budget request would:

    + + + +
      +
    • Invest in the U.S.-led Artemis campaign of lunar exploration: The budget includes $7.8 billion for the Artemis campaign, which will bring astronauts – including the first woman, first person of color, and first international astronaut – to the lunar surface starting this decade as part of a long-term journey of science and exploration.
    • + + + +
    • Enhance climate science and information: The budget invests $2.4 billion in the Earth science program for missions and activities that advance Earth systems science and increase access to information to mitigate natural hazards, support climate action, and manage natural resources.
    • + + + +
    • Advance U.S. space industry technology development: The budget provides $1.2 billion for NASA’s space technology portfolio to foster innovative technology research and development to meet the needs of NASA, support the expanding U.S. space industry, which is creating a growing number of good jobs, and keep America ahead of competitors at the forefront of space innovation.
    • + + + +
    • Support highly efficient and greener commercial airliners: The budget invests $966 million in NASA’s aeronautics program, which will develop hybrid-electric jet engines, lightweight aircraft structures, and a major new flight demonstrator to pave the way for new commercial airliners that would be cheaper to operate and produce less pollution.
    • + + + +
    • Continue the transition to commercial space stations:The budget funds continued operation of the International Space Station, a vehicle to safely de-orbit the space station after it is retired in 2030, and the commercial space stations that NASA will use as soon as they become available.
    • + + + +
    • Increase STEM opportunities at minority-serving institutions: The budget provides $46 million to the Minority University Research and Education Project, to increase competitive awards to Historically Black Colleges and Universities, tribal colleges and universities, and other minority-serving institutions, and recruit and retain underrepresented and underserved students in STEM fields.
    • +
    + + + +

    Find more information on NASA’s fiscal year 2025 budget request at nasa.gov.

    + + + +
    + +
    + + + +

    › Back to Top

    + + + +

    Jason Adam Named Deputy Manager of Marshall’s Science and Technology Office

    + + + +

    Jason Adam has been named as deputy manager of the Science and Technology Office at NASA’s Marshall Space Flight Center.

    + + + +

    Adam will assist in leading the organization responsible for projects and programs in support of the Science Mission Directorate and Space Technology Mission Directorate. This includes the Planetary Missions Program Office, the Technology Demonstration Missions Program Office, deep space and planetary exploration, fundamental research in heliophysics, astrophysics, and Earth science, and technology development, including Centennial Challenges and Technology Transfer.

    + + +
    Jason Adam
    Jason Adam has been named as deputy manager of the Science and Technology Office at NASA’s Marshall Space Flight Center.
    NASA
    + + +

    He has been the Cryogenic Fluid Management Portfolio Project manager since the project office’s inception in February 2021. From February 2020 to 2021, Adam worked an executive-level detail as a senior technical assistant in the center director’s office.

    + + + +

    From 2017 to 2021, he was the manager of the Exploration and Systems Development Office in the Science and Technology Office. Adam managed technology and flight projects in support of NASA’s science and human exploration missions from 2008 to 2017.

    + + + +

    In 2014, he was selected as a member of the NASA Mid-level Leadership Program. During that time, Adam completed a detail at NASA Headquarters working for the agency’s associate administrator on the Technical Capability Assessments team.

    + + + +

    He joined Marshall in 2008 to work on the Constellation rocket Ares I. Adam began his NASA career at Stennis Space Center in 2003, focusing on propulsion testing of the space shuttle main engines. He completed a program management detail in 2007, supporting the Space Shuttle Program as a technical assistant.

    + + + +

    A federally certified senior/expert project manager, Adam is a graduate of the Office of Personnel Management Federal Executive Institute’s Leadership for a Democratic Society. He is the recipient of NASA’s Outstanding Leadership Medal.

    + + + +

    An engineering graduate from North Dakota State University in Fargo, North Dakota, Adam and his wife, Jessica, live in Huntsville. They have three children.

    + + + +

    › Back to Top

    + + + +

    NASA Expanding Lunar Exploration with Upgraded SLS Mega Rocket Design

    + + + +

    By Martin Burkey

    + + + +

    As NASA prepares for its first crewed Artemis missions, the agency is making preparations to build, test, and assemble the next evolution of its SLS (Space Launch System) rocket. The larger and power powerful version of SLS, known as Block 1B, can send a crew and large pieces of hardware to the Moon in a single launch and is set to debut for the Artemis IV mission.

    + + + +

    “From the beginning, NASA’s Space Launch System was designed to evolve into more powerful crew and cargo configurations to provide a flexible platform as we seek to explore more of our solar system,†said John Honeycutt, SLS Program manager. “Each of the evolutionary changes made to the SLS engines, boosters, and upper stage of the SLS rocket are built on the successes of the Block 1 design that flew first with Artemis I in November 2022 and will, again, for the first crewed missions for Artemis II and III.â€

    + + +
    Expanded view of the next configuration of NASA's Space Launch System rocket
    This graphic shows an expanded view of the larger and power powerful version of SLS, known as Block 1B. It can send a crew and large pieces of hardware to the Moon in a single launch and is set to debut for the Artemis IV mission.
    NASA
    + + +

    Early manufacturing is already underway at NASA’s Michoud Assembly Facility, while preparations for the green run test series for its upgraded upper stage are in progress at nearby Stennis Space Center. NASA’s Marshall Space Flight Center manages the SLS Program and Michoud.

    + + + +

    While using the same basic core stage and solid rocket booster design, and related components as the Block 1, Block 1B features two big evolutionary changes that will make NASA’s workhorse rocket even more capable for future missions to the Moon and beyond. A more powerful second stage and an adapter for large cargos will expand the possibilities for future Artemis missions.

    + + + +

    “The Space Launch System Block 1B rocket will be the primary transportation for astronauts to the Moon for years to come,†said James Burnum, deputy manager of the NASA Block 1B Development Office. “We are building on the SLS Block 1 design, testing, and flight experience to develop safe, reliable transportation that will send bigger and heavier hardware to the Moon in a single launch than existing rockets.â€

    + + +
    Space Launch System Exploration Upper Stage infographic.
    This graphic shows some of the benefits of the exploration upper stage, which will replace the interim cryogenic propulsion stage on the SLS Block 1B rocket.
    NASA
    + + +

    The in-space stage used to send the first three Artemis missions to the Moon, called the interim cryogenic propulsion stage, uses a single engine and will be replaced by a larger, more powerful four-engine stage called the exploration upper stage. A different battery is among the many changes that will allow the exploration upper stage to support the first eight hours of the mission following launch compared to the current interim cryogenic propulsion stage two hours. All new hardware and software will be designed and tested to meet the different performance and environmental requirements.

    + + + +

    The other configuration change is a universal stage adapter that connects the rocket to the Orion spacecraft. It also offers more than 10,000 cubic feet of space to carry large components, such as modules for NASA’s future Gateway outpost that will be in lunar orbit to support crew between surface missions and unique opportunities for science at the Moon.

    + + + +

    Together, those upgrades will increase the payload capability for SLS from 59,000 pounds to approximately 84,000 pounds. The four RL10 engines that will be used during the exploration upper stage green run test series at Stennis are complete, and work on the Artemis IV core stage is in progress at nearby Michoud.

    + + +
    : Technicians at NASA’s Michoud Assembly Facility in New Orleans on Feb. 22 prepare elements that will form part of the midbody for the exploration upper stage. The midbody struts, or V-struts, will create the cage-like outer structure of the midbody that will connect the upper stage’s large liquid hydrogen tank to the smaller liquid oxygen tank. Manufacturing flight and test hardware for the future upper stage is a collaborative effort between NASA and Boeing, the lead contractor for EUS and the SLS core stage.
    Technicians at NASA’s Michoud Assembly Facility on Feb. 22 prepare elements that will form part of the midbody for the exploration upper stage. The midbody struts, or V-struts, will create the cage-like outer structure of the midbody that will connect the upper stage’s large liquid hydrogen tank to the smaller liquid oxygen tank.
    NASA
    + + +

    The evolved design also gives astronaut explorers more launch opportunities on a path to intercept the Moon. With four times the engines and almost four times the propellant and thrust of interim cryogenic propulsion stage, the exploration upper stage also enables two daily launch opportunities compared to Block 1’s more limited lunar launch availability.

    + + + +

    Among other capabilities, both astronauts and ground teams will be able to communicate with the in-space stage and safely control it while using Orion’s docking system to extract components destined for Gateway from the stage adapter.

    + + + +

    NASA is working to land the first woman, first person of color, and its first international partner astronaut on the Moon under Artemis. SLS is part of NASA’s backbone for deep space exploration, along with Orion and the Gateway in orbit around the Moon and commercial human landing systems, next-generation spacesuits, and rovers on the lunar surface. SLS is the only rocket that can send Orion, astronauts, and supplies to the Moon in a single launch.

    + + + +

    Burkey, a Media Fusion employee, is a technical writer supporting the SLS Program.

    + + + +

    › Back to Top

    + + + +

    NASA Continues Artemis Moon Rocket Engine Test Series

    + + + +

    NASA conducted a full-duration RS-25 engine hot fire March 6, continuing a final round of certification testing for production of new engines to help power the SLS (Space Launch System) rocket on future Artemis missions to the Moon and beyond.

    + + + +

    The full-duration test on the Fred Haise Test Stand at NASA’s Stennis Space Center, marked the ninth in a scheduled 12-test series. NASA astronauts and Artemis II crew members Reid Wiseman, commander, and Christina Koch, mission specialist, attended the test.

    + + +
    full-duration RS-25 engine hot fire is seen in the background
    NASA conducts a full-duration RS-25 engine hot fire March 6 at the agency’s Stennis Space Center.
    NASA/Danny Nowlin
    + + +

    Engineers are collecting test data to certify an updated engine production process, using innovative manufacturing techniques, for lead engines contractor Aerojet Rocketdyne, an L3Harris Technologies company.

    + + + +

    During the March 6 test, operators fired the certification engine for 10 minutes (600 seconds), longer than the amount of time needed to help launch the SLS rocket and send astronauts aboard the Orion spacecraft into orbit. The test team also fired the engine at power levels between 80% and 113% to test performance in multiple scenarios. Four RS-25 engines, along with a pair of solid rocket boosters, launch NASA’s powerful SLS rocket, producing more than 8.8 million pounds of thrust at liftoff for Artemis missions.

    + + + +
    + +
    While clear skies were over Stennis Space Center on March 6, two special guests experienced a brief “rain shower†from water vapor produced during the RS-25 hot fire test on the Fred Haise Test Stand. NASA astronauts Reid Wiseman and Christina Koch – both of whom will fly around the Moon as Artemis II crew members – were hosted by Acting Center Director John Bailey and Engineering & Test Directorate Director Joe Schuyler to view the test and meet the test team. (NASA)
    + + + +

    NASA is working to land the first woman, first person of color, and its first international partner astronaut on the Moon under Artemis. SLS is part of NASA’s backbone for deep space exploration, along with the Orion spacecraft and Gateway in orbit around the Moon and commercial human landing systems, next-generational spacesuits, and rovers on the lunar surface. SLS is the only rocket that can send Orion, astronauts, and supplies to the Moon in a single launch.

    + + + +

    NASA’s Marshall Space Flight Center manages the SLS and human landing system programs.

    + + + +

    RS-25 tests at NASA Stennis are conducted by a diverse team of operators from NASA, Aerojet Rocketdyne, and Syncom Space Services, prime contractor for site facilities and operations.

    + + + +

    › Back to Top

    + + + +

    Splashdown! NASA’s SpaceX Crew-7 Finishes Mission, Returns to Earth

    + + + +

    NASA’s SpaceX Crew-7 completed the agency’s seventh commercial crew rotation mission to the International Space Station on March 12 after splashing down safely in a Dragon spacecraft off the coast of Pensacola, Florida. The international crew of four spent 199 days in orbit.

    + + + +

    NASA astronaut Jasmin Moghbeli, ESA (European Space Agency) astronaut Andreas Mogensen, JAXA (Japan Aerospace Exploration Agency) astronaut Satoshi Furukawa, and Roscosmos cosmonaut Konstantin Borisov returned to Earth splashing down at 4:47 a.m. CDT. Teams aboard SpaceX recovery vessels retrieved the spacecraft and its crew. After returning to shore, the crew was flown to NASA’s Johnson Space Center.

    + + +
    Roscosmos cosmonaut Konstantin Borisov, left, European Space Agency astronaut Andreas Mogensen, NASA astronaut Jasmin Moghbeli, and Japan Aerospace Exploration Agency astronaut Satoshi Furukawa are seen inside the SpaceX Dragon Endurance spacecraft onboard the SpaceX recovery ship MEGAN shortly after having landed in the Gulf of Mexico off the coast of Pensacola, Florida, March 12. Moghbeli, Mogensen, Furukawa, and Borisov are returning after nearly six months in space as part of Expedition 70 aboard the International Space Station.
    NASA/Joel Kowsky
    + + +

    “After more than six months aboard the International Space Station, NASA’s SpaceX Crew-7 has safely returned home,†said NASA Administrator Bill Nelson. “This international crew showed that space unites us all. It’s clear that we can do more – we can learn more – when we work together. The science experiments conducted during their time in space will help prepare for NASA’s bold missions at the Moon, Mars, and beyond, all while benefitting humanity here on Earth.â€

    + + + +

    The Crew-7 mission lifted off at 2:27 a.m. Aug. 26, 2023, on a Falcon 9 rocket from NASA’s Kennedy Space Center. About 30 hours later, Dragon docked to the Harmony module’s space-facing port. Crew-7 undocked at 10:20 a.m. March 11 to begin the trip home.

    + + + +

    Moghbeli, Mogensen, Furukawa, and Borisov traveled 84,434,094 miles during their mission, spent 197 days aboard the space station, and completed 3,184 orbits around Earth. The Crew-7 mission was the first spaceflight for Moghbeli and Borisov. Mogensen has logged 209 days in space over his two flights, and Furukawa has logged 366 days in space over his two flights.

    + + + +

    Throughout their mission, the Crew-7 members contributed to a host of science and maintenance activities and technology demonstrations. Moghbeli conducted one spacewalk, joined by NASA astronaut Loral O’Hara, replacing one of the 12 trundle bearing assemblies on the port solar alpha rotary joint, which allows the arrays to track the Sun and generate electricity to power the station.

    + + + +

    The crew contributed to hundreds of experiments and technology demonstrations, including the first study of human response to different spaceflight durations, and an experiment growing food on the space station.

    + + + +

    This was the third flight of the Dragon spacecraft, named Endurance. It also previously supported the Crew-3 and Crew-5 missions. The spacecraft will return to Florida for inspection and processing at SpaceX’s refurbishing facility at Cape Canaveral Space Force Station, where teams will inspect the Dragon, analyze data on its performance, and process it for its next flight.

    + + + +

    The Crew-7 flight is part of NASA’s Commercial Crew Program and its return to Earth follows on the heels of NASA’s SpaceX Crew-8 launch, which docked to the station March 5, beginning another science expedition.

    + + + +

    The goal of NASA’s Commercial Crew Program is safe, reliable, and cost-effective transportation to and from the space station and low Earth orbit. This already is providing additional research time and has increased the opportunity for discovery aboard humanity’s microgravity testbed for exploration, including helping NASA prepare for human exploration of the Moon and Mars.

    + + + +

    The HOSC (Huntsville Operations Support Center) at NASA’s Marshall Space Flight Center provides engineering and mission operations support for the space station, the Commercial Crew Program, and Artemis missions, as well as science and technology demonstration missions. The Payload Operations Integration Center within the HOSC operates, plans, and coordinates the science experiments onboard the space station 365 days a year, 24 hours a day.

    + + + +

    › Back to Top

    + + + +

    Webb, Hubble Telescopes Affirm Universe’s Expansion Rate, Puzzle Persists

    + + + +

    When you are trying to solve one of the biggest conundrums in cosmology, you should triple check your homework. The puzzle, called the “Hubble Tension,” is that the current rate of the expansion of the universe is faster than what astronomers expect it to be, based on the universe’s initial conditions and our present understanding of the universe’s evolution.

    + + + +

    Scientists using NASA’s Hubble Space Telescope and many other telescopes consistently find a number that does not match predictions based on observations from ESA’s (European Space Agency’s) Planck mission. Does resolving this discrepancy require new physics? Or is it a result of measurement errors between the two different methods used to determine the rate of expansion of space?

    + + +
    This image of NGC 5468, a galaxy located about 130 million light-years from Earth, combines data from the Hubble and James Webb space telescopes. This is the farthest galaxy in which Hubble has identified Cepheid variable stars. These are important milepost markers for measuring the expansion rate of the universe. The distance calculated from Cepheids has been cross-correlated with a type Ia supernova in the galaxy. Type Ia supernovae are so bright they are used to measure cosmic distances far beyond the range of the Cepheids, extending measurements of the universe's expansion rate deeper into space.
    This image of NGC 5468, a galaxy located about 130 million light-years from Earth, combines data from the Hubble and James Webb space telescopes. This is the farthest galaxy in which Hubble has identified Cepheid variable stars. These are important milepost markers for measuring the expansion rate of the universe. The distance calculated from Cepheids has been cross-correlated with a type Ia supernova in the galaxy. Type Ia supernovae are so bright they are used to measure cosmic distances far beyond the range of the Cepheids, extending measurements of the universe’s expansion rate deeper into space.
    NASA
    + + +

    Hubble has been measuring the current rate of the universe’s expansion for 30 years, and astronomers want to eliminate any lingering doubt about its accuracy. Now, Hubble and NASA’s James Webb Space Telescope have tag-teamed to produce definitive measurements, furthering the case that something else – not measurement errors – is influencing the expansion rate.

    + + + +

    “With measurement errors negated, what remains is the real and exciting possibility we have misunderstood the universe,†said Adam Riess, a physicist at Johns Hopkins University in Baltimore. Riess holds a Nobel Prize for co-discovering the fact that the universe’s expansion is accelerating, due to a mysterious phenomenon now called “dark energy.â€

    + + + +

    As a crosscheck, an initial Webb observation in 2023 confirmed that Hubble measurements of the expanding universe were accurate. However, hoping to relieve the Hubble Tension, some scientists speculated that unseen errors in the measurement may grow and become visible as we look deeper into the universe. Stellar crowding could affect brightness measurements of more distant stars in a systematic way.

    + + + +

    The Supernova H0 for the Equation of State of Dark Energy (SH0ES) team, led by Riess, obtained additional observations with Webb of objects that are critical cosmic milepost markers, known as Cepheid variable stars, which now can be correlated with the Hubble data.

    + + + +

    “We’ve now spanned the whole range of what Hubble observed, and we can rule out a measurement error as the cause of the Hubble Tension with very high confidence,†Riess said.

    + + + +

    The team’s first few Webb observations in 2023 were successful in showing Hubble was on the right track in firmly establishing the fidelity of the first rungs of the so-called cosmic distance ladder.

    + + + +

    Astronomers use various methods to measure relative distances in the universe, depending upon the object being observed. Collectively these techniques are known as the cosmic distance ladder – each rung or measurement technique relies upon the previous step for calibration.

    + + + +

    But some astronomers suggested that, moving outward along the “second rung,†the cosmic distance ladder might get shaky if the Cepheid measurements become less accurate with distance. Such inaccuracies could occur because the light of a Cepheid could blend with that of an adjacent star – an effect that could become more pronounced with distance as stars crowd together and become harder to distinguish from one another.

    + + +
    At the center of these side-by-side images is a special class of star used as a milepost marker for measuring the universe’s rate of expansion – a Cepheid variable star. The two images are very pixelated because they are a very zoomed-in view of a distant galaxy. Each of the pixels represents one or more stars. The image from the James Webb Space Telescope is significantly sharper at near-infrared wavelengths than Hubble, which is primarily a visible-ultraviolet light telescope. By reducing the clutter with Webb’s crisper vision, the Cepheid stands out more clearly, eliminating any potential confusion.
    At the center of these side-by-side images is a special class of star used as a milepost marker for measuring the universe’s rate of expansion – a Cepheid variable star. The two images are very pixelated because they are a very zoomed-in view of a distant galaxy. Each of the pixels represents one or more stars. The image from the James Webb Space Telescope is significantly sharper at near-infrared wavelengths than Hubble, which is primarily a visible-ultraviolet light telescope. By reducing the clutter with Webb’s crisper vision, the Cepheid stands out more clearly, eliminating any potential confusion.
    NASA, ESA, CSA, STScI, Adam G. Riess (JHU, STScI
    + + +

    The observational challenge is that past Hubble images of these more distant Cepheid variables look more huddled and overlapping with neighboring stars at ever farther distances between us and their host galaxies, requiring careful accounting for this effect. Intervening dust further complicates the certainty of the measurements in visible light. Webb slices though the dust and naturally isolates the Cepheids from neighboring stars because its vision is sharper than Hubble’s at infrared wavelengths.

    + + + +

    “Combining Webb and Hubble gives us the best of both worlds. We find that the Hubble measurements remain reliable as we climb farther along the cosmic distance ladder,†Riess said.

    + + + +

    The new Webb observations include five host galaxies of eight Type Ia supernovae containing a total of 1,000 Cepheids and reach out to the farthest galaxy where Cepheids have been well measured – NGC 5468 – at a distance of 130 million light-years. “This spans the full range where we made measurements with Hubble. So, we’ve gone to the end of the second rung of the cosmic distance ladder,†said co-author Gagandeep Anand of the Space Telescope Science Institute in Baltimore, which operates the Webb and Hubble telescopes for NASA.

    + + + +

    Hubble and Webb’s further confirmation of the Hubble Tension sets up other observatories to possibly settle the mystery. NASA’s upcoming Nancy Grace Roman Space Telescope will do wide celestial surveys to study the influence of dark energy, the mysterious energy that is causing the expansion of the universe to accelerate. ESA’s Euclid observatory, with NASA contributions, is pursuing a similar task.

    + + + +

    At present it’s as though the distance ladder observed by Hubble and Webb has firmly set an anchor point on one shoreline of a river, and the afterglow of the big bang observed by Planck’s measurement from the beginning of the universe is set firmly on the other side. How the universe’s expansion was changing in the billions of years between these two endpoints has yet to be directly observed. “We need to find out if we are missing something on how to connect the beginning of the universe and the present day,†Riess said.

    + + + +

    These finding were published in the Feb. 6, 2024, issue of The Astrophysical Journal Letters.

    + + + +

    The Hubble Space Telescope has been operating for over three decades and continues to make ground-breaking discoveries that shape our fundamental understanding of the universe. Hubble is a project of international cooperation between NASA and ESA. NASA’s Goddard Space Flight Center manages the telescope. Goddard also conducts mission operations with Lockheed Martin Space in Denver, Colorado. The Space Telescope Science Institute (STScI) in Baltimore, Maryland, conducts Hubble and Webb science operations for NASA. The agency’s Marshall Space Flight Center was the lead field center for the design, development, and construction of the space telescope.

    + + + +

    The James Webb Space Telescope is the world’s premier space science observatory. Webb is solving mysteries in our solar system, looking beyond to distant worlds around other stars, and probing the mysterious structures and origins of our universe and our place in it. Webb is an international program led by NASA with its partners, ESA (European Space Agency) and the Canadian Space Agency. Several NASA centers contributed to Webb’s development, including Marshall.

    + + + +

    › Back to Top

    + + + +

    NASA Unveils Design for Message Heading to Jupiter’s Moon Europa

    + + + +

    Following in NASA’s storied tradition of sending inspirational messages into space, the agency has special plans for Europa Clipper, which later this year will launch toward Jupiter’s moon Europa. The moon shows strong evidence of an ocean under its icy crust, with more than twice the amount of water of all of Earth’s oceans combined. A triangular metal plate on the spacecraft will honor that connection to Earth in several ways.

    + + + +

    At the heart of the artifact is an engraving of U.S. Poet Laureate Ada Limón’s handwritten “In Praise of Mystery: A Poem for Europa,†along with a silicon microchip stenciled with more than 2.6 million names submitted by the public. The microchip will be the centerpiece of an illustration of a bottle amid the Jovian system – a reference to NASA’s “Message in a Bottle†campaign, which invited the public to send their names with the spacecraft.

    + + +
    This side of a commemorative plate mounted on NASA’s Europa Clipper spacecraft features U.S. Poet Laureate Ada Limón’s handwritten “In Praise of Mystery: A Poem for Europa.†It will be affixed with a silicon microchip stenciled with names submitted by the public.
    This side of a commemorative plate mounted on NASA’s Europa Clipper spacecraft features U.S. Poet Laureate Ada Limón’s handwritten “In Praise of Mystery: A Poem for Europa.†It will be affixed with a silicon microchip stenciled with names submitted by the public.
    NASA/JPL-Caltech
    + + +

    Made of the metal tantalum and about 7 by 11 inches, the plate features graphic elements on both sides. The outward-facing panel features art that highlights Earth’s connection to Europa. Linguists collected recordings of the word “water†spoken in 103 languages, from families of languages around the world. The audio files were converted into waveforms (visual representations of sound waves) and etched into the plate. The waveforms radiate out from a symbol representing the American Sign Language sign for “water.â€

    + + + +

    To hear audio of the spoken languages and see the sign, go to: go.nasa.gov/MakeWaves.

    + + + +

    In the spirit of the Voyager spacecraft’s Golden Record, which carries sounds and images to convey the richness and diversity of life on Earth, the layered message on Europa Clipper aims to spark the imagination and offer a unifying vision.

    + + + +

    “The content and design of Europa Clipper’s vault plate are swimming with meaning,†said Lori Glaze, director of the Planetary Science Division at NASA Headquarters. “The plate combines the best humanity has to offer across the universe – science, technology, education, art, and math. The message of connection through water, essential for all forms of life as we know it, perfectly illustrates Earth’s tie to this mysterious ocean world we are setting out to explore.â€

    + + + +

    In 2030, after a 1.6-billion-mile journey, Europa Clipper will begin orbiting Jupiter, making 49 close flybys of Europa. To determine if there are conditions that could support life, the spacecraft’s powerful suite of science instruments will gather data about the moon’s subsurface ocean, icy crust, thin atmosphere, and space environment. The electronics for those instruments are housed in a massive metal vault designed to protect them from Jupiter’s punishing radiation. The commemorative plate will seal an opening in the vault.

    + + +
    The art on this side of the plate, which will seal an opening of the vault on NASA’s Europa Clipper, features waveforms that are visual representations of the sound waves formed by the word “water†in 103 languages. At center is a symbol representing the American Sign Language sign for “water.â€
    NASA/JPL-Caltech
    + + +

    Because searching for habitable conditions is central to the mission, the Drake Equation is etched onto the plate as well – on the inward-facing side. Astronomer Frank Drake developed the mathematical formulation in 1961 to estimate the possibility of finding advanced civilizations beyond Earth. The equation has inspired and guided research in astrobiology and related fields ever since.

    + + + +

    In addition, artwork on the inward-facing side of the plate will include a reference to the radio frequencies considered plausible for interstellar communication, symbolizing how humanity uses this radio band to listen for messages from the cosmos. These frequencies match the radio waves emitted in space by the components of water and are known by astronomers as the “water hole.†On the plate, they are depicted as radio emission lines.

    + + + +

    Finally, the plate includes a portrait of one of the founders of planetary science, Ron Greeley, whose early efforts to develop a Europa mission two decades ago laid the foundation for Europa Clipper.

    + + + +

    “We’ve packed a lot of thought and inspiration into this plate design, as we have into this mission itself,†said project scientist Robert Pappalardo of NASA’s Jet Propulsion Laboratory (JPL). “It’s been a decades-long journey, and we can’t wait to see what Europa Clipper shows us at this water world.â€

    + + + +
    + +
    Learn more about how Europa Clipper’s vault plate engravings were designed and the inspiration for the plate’s multilayered message. (NASA/JPL-Caltech)
    + + + +

    Once assembly of Europa Clipper has been completed at JPL, the spacecraft will be shipped to NASA’s Kennedy Space Center in preparation for its October launch.

    + + + +

    Europa Clipper’s main science goal is to determine whether there are places below Jupiter’s icy moon, Europa, that could support life. The mission’s three main science objectives are to determine the thickness of the moon’s icy shell and its surface interactions with the ocean below, to investigate its composition, and to characterize its geology. The mission’s detailed exploration of Europa will help scientists better understand the astrobiological potential for habitable worlds beyond our planet.

    + + + +

    Managed by Caltech in Pasadena, California, JPL leads the development of the Europa Clipper mission in partnership with the Johns Hopkins Applied Physics Laboratory (APL) in Laurel, Maryland, for NASA’s Science Mission Directorate. APL designed the main spacecraft body in collaboration with JPL and NASA’s Goddard Space Flight Center. The Planetary Missions Program Office at NASA’s Marshall Space Flight Center executes program management of the Europa Clipper mission.

    + + + +

    › Back to Top

    +]]>
    + + + + + + NASA’s Design for Message Heading to Jupiter’s Moon Europa + + + nonadult + +
    + + Apollo 9 Crew Comes Home + https://www.nasa.gov/image-article/apollo-9-crew-comes-home/ + + + Wed, 13 Mar 2024 18:45:27 +0000 + + + + + + https://www.nasa.gov/?post_type=image-article&p=631278 + + +
    A recovery helicopter with "Navy" and "54" stenciled on it hovers above the water, the wind from its blades creating rings of circles below. Directly below the helicopter is an orange and white parachute. At bottom right is the Apollo 9 command module, where the astronauts await recovery.
    NASA
    + + +

    Fifty-five years ago today, NASA astronauts James A. McDivitt, David R. Scott, and Russell L. Schweickart splashed down 4.5 nautical miles from the USS Guadalcanal, concluding a successful 10-day Earth-orbital mission in space. In this image from March 13, 1969, a recovery helicopter hovers above the Apollo 9 spacecraft; the astronauts were still inside the command module.

    + + + +

    Apollo 9 was the first crewed flight of the command/service module along with the lunar module. The mission’s three-person crew tested several aspects critical to landing on the Moon including the lunar module’s engines, backpack life support systems, navigation systems, and docking maneuvers.

    + + + +

    See more photos from Apollo 9.

    + + + +

    Image Credit: NASA

    +]]>
    + + + +
    + + NASA’s Space Tech Prize Bolsters Diversity, Inclusivity Champions  + https://www.nasa.gov/news-release/nasas-space-tech-prize-bolsters-diversity-inclusivity-champions/ + + + Wed, 13 Mar 2024 18:33:04 +0000 + + + + + + https://www.nasa.gov/?post_type=press-release&p=631366 + + +
    A graphic of the NASA "meatball" insignia, a blue circle crossed by a red V-shaped swoosh, against a black background.
    Credits: NASA
    + + +

    NASA selected the first winners of the agency’s Space Tech Catalyst prize to expand engagement with underrepresented and diverse individuals in the space technology sector as part of the agency’s broader commitment to inclusivity and collaboration. The winners are receiving $25,000 each to create more inclusive space technology ecosystems.

    + + + +

    “As NASA continues to explore the unknown, making the impossible possible, we are committed to engaging talents from all backgrounds to advance exploration,†said Shahra Lambert, NASA senior advisor for engagement. “By providing funding to this space technology community, NASA is ensuring the Artemis Generation will have the necessary tools to expand humanity’s reach.â€

    + + + +

    Winning individuals and organizations demonstrate the best collaboration practices with diverse researchers, technologists, and entrepreneurs. The champions also bring effective strategies that contribute to NASA’s ongoing efforts to develop a representative space technology landscape, while enhancing its ability to find creative solutions to technical challenges.

    + + + +

    The winners are:

    + + + +
      +
    • Caitlin O’Brien, SciAccess, Inc.
    • + + + +
    • Zainab Abbas, SciTech@U
    • + + + +
    • Bahiy Watson, The 1881 Institute
    • + + + +
    • Amber Imai-Hong, Mahina Aerospace
    • + + + +
    • Marta Miletic, San Diego State University
    • + + + +
    • Felecia Brown, NorthStar of GIS
    • + + + +
    • Diego Sandoval, Cyncrocity
    • + + + +
    • Arif Rahman, Hawaii Pacific University
    • + + + +
    • Sierra Brown
    • + + + +
    • Denise Thorsen, University of Alaska Fairbanks
    • + + + +
    • Joshua Neubert, Institute of Competition Sciences
    • + + + +
    • Madison Feehan, Space Copy, Inc.
    • + + + +
    • Johnie Turnage, Black Tech Saturdays
    • + + + +
    • Athip Thirupathi Raj, University of Arizona SpaceTREx Lab
    • + + + +
    • Janeya Griffin, Equity Space Alliance, Inc.
    • + + + +
    • Annika Rollock, Aurelia Institute
    • + + + +
    • M. von Nkosi, Institute for Local Innovations, Inc.
    • + + + +
    • Joseph Grant, New Generation Solutions SST
    • + + + +
    • Sambit Bhattacharya, Fayetteville State University
    • + + + +
    • Dalia David, Honest Eating, LLC
    • +
    + + + +

    Each winner was selected for proving their ability to engage and develop underrepresented groups in space technology development, broaden NASA’s outreach efforts to diverse sources of developers, and build a community of emerging innovators equipped to compete for the agency’s technology development opportunities.

    + + + +

    “We are proud to recognize and celebrate the accomplishments of these exceptional individuals and organizations leading the way in building an inclusive community in space technology for the benefit of humanity,” said Denna Lambert, inclusive innovation team lead, Space Technology Mission Directorate (STMD) at NASA Headquarters in Washington. “Their dedication and success in engaging underrepresented groups will undoubtedly inspire others to join us in advancing the frontiers of space exploration and innovation.”

    + + + +

    To increase collaboration between NASA and its community partners, each winner will attend an in-person event at NASA’s Goddard Space Flight Center in Greenbelt, Maryland. Representatives from NASA and the winning organizations will participate in community-building activities to emphasize knowledge sharing, increase awareness of NASA’s competitive research and development environment, and expand the agency’s reach into diverse innovator communities.

    + + + +

    The Space Tech Catalyst Prize, funded by STMD, is part of a commitment to expand NASA’s network of competitive proposers and enhance engagement approaches.

    + + + +

    For more information, visit: 

    + + + +

    https://www.spacetechcatalystprize.org/

    + + + +

    -end-

    + + + +

    Jimi Russell
    Headquarters, Washington
    202-358-1600
    james.j.russell@nasa.gov

    + + + +

    Gerelle Dodson
    Headquarters, Washington
    202-358-1600
    gerelle.q.dodson@nasa.gov

    + + +
    +
    +
    +
    +
    +
    +

    Share

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    Last Updated
    +
    +
    Mar 13, 2024
    +
    +
    +
    + +
    +
    +
    ]]>
    + + + +
    + + NASA Awards Grants for Lunar Instrumentation + https://science.nasa.gov/directorates/smd/nasa-awards-grants-for-lunar-instrumentation/ + + + Wed, 13 Mar 2024 18:25:10 +0000 + + + + + https://science.nasa.gov/directorates/smd/nasa-awards-grants-for-lunar-instrumentation/ + + + +
    +
    +

    5 min read

    +

    NASA Awards Grants for Lunar Instrumentation

    +
    +
    + +

    NASA has awarded five scientists and engineers Development and Advancement of Lunar Instrumentation (DALI) grants to support the development of instruments for potential use in future lunar missions, including the agency’s Commercial Lunar Payload Services and Artemis campaign. 

    +

    The awardees were recognized during NASA’s Technology Development Plan plenary session at the 55th Lunar and Planetary Science Conference (LPSC) March 13, in The Woodlands, Texas. 

    +

    “Supporting innovation and research in science and technology is a central part of NASA’s overall mission,†said Joel Kearns, deputy associate administrator for exploration in NASA’s Science Mission Directorate in Washington. “These tools must demonstrate new technologies that significantly improve instrument measurement capabilities for addressing high-priority lunar science questions.â€Â 

    +

    The goal of DALI is to develop and demonstrate instruments that show promise for use in future NASA flight opportunities. In addition, the instruments are intended to be ready for flight hardware build after the three-year project duration. Each of the selected scientists is granted approximately $1 million per year to develop their instrument. 

    +

    The grantees are based at institutions across the country:

    +
    +
    +
    +
    DALI Grantees
    +
    DALI grantees: Stuart George, Jason Kriesel, David Stillman, Jeffrey Gillis-Davis, Hao Cao
    +
    +
    +
    +

    DALI grantees: Stuart George, Jason Kriesel, David Stillman, Jeffrey Gillis-Davis, Hao Cao

    +

    Stuart George, NASA’s Johnson Space Center in Houston

    +

    In this project, Dr. George will develop the Compact Electron Proton Spectrometer (CEPS), a miniaturized space weather and radiation measurement instrument. CEPS will provide long-term, science-quality space environment monitoring specifically targeted at real time forecasting of solar energetic particle events on the lunar surface, as well as radiation monitoring data for crew health and protection. A particular focus of the CEPS instrument is saturation-free measurement of the largest and most extreme solar particle events and high quality discrimination of proton and electron signals.

    +

    Jason Kriesel, Opto- Knowledge Systems, Inc (OKSI) in Torrance, California

    +

    Jason Kriesel, of OKSI, is teaming with Honeybee Robotics and NASA’s Goddard Space Flight Center in Greenbelt, Maryland, to produce a prototype instrument to measure lunar water and other volatiles on the Moon. The instrument will be designed to help answer important specific questions related to the origin, history, and future of water on the Moon, as well as help better understand planetary processes in general. The project will push forward a novel measurement approach using a hollow fiber optic gas cell, called a capillary absorption spectrometer (CAS). The CAS will be paired with a sample handling system optimized for analysis on the Moon. The resulting Lunar CAS (LuCAS) prototype will prove the technology on Earth, paving the way for its use on the Moon.   

    +

    David Stillman, Southwest Research Institute (SwRI) in Boulder, Colorado

    +

    The focus of Dr. Stillman’s project is the Synthetic Pulse Artemis Radar for Crustal Imaging (SPARCI; pronounced “sparkyâ€), a novel ground penetrating radar (GPR). SPARCI uses two stationary transmitting antennas and a mobile receiver. This geometry was pioneered by the Apollo 17 Surface Electrical Properties (SEP) experiment. As a robotic or crewed rover traverses away from the transmitter, images of subsurface interfaces or discontinuities are built up. SPARCI uses a much wider bandwidth than the SEP, enabling both deeper and higher-resolution imaging, and its coded signals provide higher signal-to-noise. SPARCI will determine the thickness and density of the regolith (~10 meters), the structure of the upper megaregolith (100s m to kms), and the depth to the lower megaregolith (several km). SPARCI is therefore designed to advance our understanding of impact processes and crustal stratigraphy at the Artemis landing site(s), and eventually elsewhere on the Moon or other planets. 

    +

    Jeffrey Gillis-Davis, Washington University in St. Louis, Missouri

    +

    Dr. Gillis-Davis will lead the effort to develop an instrument to measure the chemistry of lunar materials using Laser-Induced Breakdown Spectroscopy (LIBS). Compositional information acquired by LIBS will help identify major lunar rock types as well as determine major element ice compositions, which relate to volatile sources. Knowledge about the chemical composition of these materials is of fundamental importance in lunar science. For instance, determining the proportions of different lunar rock types at exploration sites satisfies key goals of NASA and the lunar community. Further, measurements by this instrument are essential for figuring out how much water or other resources are present in a particular location on the Moon and could provide a necessary step toward better understanding water delivery to the Earth-Moon system. This LIBS system would incorporate cutting-edge technologies while reducing size, weight, and power relative to other LIBS systems. 

    +

    Hao Cao, University of California, Los Angeles

    +

    In this project, Dr. Cao and team will be developing a miniaturized, low-power, ultra-stable fluxgate magnetometer system for prolonged, uninterrupted operation on the lunar surface. The system incorporates a low-power, magnetically-clean thermal solution to achieve a temperature stability of 0.2 degrees Celsius at two distinct set-point temperatures, one for the lunar day and the other for the lunar night, to minimize fluxgate sensor offset drifts. This instrument will facilitate high-precision monitoring of the lunar magnetic fields across different timescales, enabling survey of the lunar surface magnetic environment and low-frequency electromagnetic sounding of the lunar deep interior. These measurements will provide invaluable insights into the bulk water content of the lunar mantle, characteristics of the partial melt layer above the lunar core, and the physical properties of the iron core of the Moon; thus, placing critical constraints on the formation and evolution of the Earth-Moon system.

    +

    The deadline for NASA’s DALI24 Step-1 submissions is April 12, 2024.  

    +

    DALI is part of NASA’s Lunar Discovery and Exploration Program (LDEP), which is managed by Science Mission Directorate’s Exploration Science Strategy and Integration Office (ESSIO). ESSIO ensures science is infused into all aspects of lunar exploration and leads lunar science integration within the Science Mission Directorate, with other NASA mission directorates, other government agencies, international partners, and commercial communities.

    +

    For more information about NASA’s Exploration Science Strategy Integration Office (ESSIO), visit:

    +

    https://science.nasa.gov/lunar-science/

    + + + +]]>
    + + + +
    + + NASA Armstrong Updates 1960s Concept to Study Giant Planets + https://www.nasa.gov/centers-and-facilities/armstrong/nasa-armstrong-updates-1960s-concept-to-study-giant-planets/ + + + Wed, 13 Mar 2024 18:21:18 +0000 + + + + + + + https://www.nasa.gov/?p=630902 + + +

    3 min read

    Preparations for Next Moonwalk Simulations Underway (and Underwater)

    + +
    A man holds a model aircraft model, and two more are on the table in front of him.
    John Bodylski holds a balsa wood model of his proposed aircraft that could be an atmospheric probe. Directly in front of him is a fully assembled version of the aircraft and a large section of a second prototype at NASA’s Armstrong Flight Research Center in Edwards, California.
    NASA/Steve Freeman
    + + +

    NASA researchers are looking at the possibility of using a wingless, unpowered aircraft design from the 1960s to gather atmospheric data on other planets – doing the same work as small satellites but potentially better and more economically.

    + + + +

    John Bodylski, a principal investigator at NASA’s Armstrong Flight Research Center in Edwards, California, hypothesized a lifting body aircraft design NASA tested decades ago could meet the requirements for an atmospheric probe that can collect measurements of giant planets, like Uranus. The design relies on the aircraft’s shape for lift, rather than wings.

    + + +
    Three aircraft are in a row on a dry lakebed.
    The lifting body aircraft on Rogers Dry Lake, near what is now NASA’s Armstrong Flight Research Center in Edwards, California, include, from left, the X-24A, the M2-F3, and the HL-10.
    NASA
    + + +

    Bodylski submitted his idea and earned a NASA Armstrong Center Innovation Fund award to write a technical paper explaining the concept and design. The award also supports construction of models to help people conceptualize his atmospheric probe. Enter the NASA Armstrong Dale Reed Subscale Flight Research Laboratory.

    + + + +

    Robert “Red†Jensen and Justin Hall, two of the lab’s designers, technicians, and pilots, brought Bodylski’s designs to life. Jensen and Hall created a mold, then layered in carbon-fiber and foam that cured for eight hours under vacuum. The parts were removed from the molds, refined, and later joined together.

    + + +
    Two men layer composite material on an aircraft model mold.
    Justin Hall, left, and Robert “Red†Jensen, at NASA’s Armstrong Flight Research Center in Edwards, California, add layers of carbon fiber and foam in a mold. Another few layers will be added and then it will be cured about eight hours under vacuum. The parts were later removed from molds, refined, and joined for an aircraft that is designed to be an atmospheric probe.
    NASA/Steve Freeman
    + +
    Two men work to seal an aircraft model mold to cure for eight hours.
    Justin Hall, left, and Robert “Red†Jensen work to eliminate the air around an aircraft mold where it will cure for eight hours. The subscale aircraft development at NASA’s Armstrong Flight Research Center in Edwards, California, may result in an atmospheric probe.
    NASA/Steve Freeman
    + + +

    The first of the two lifting body aircraft, both of which are 27 1/2 inches long, and 24 inches wide, is complete and offers a first look at the concept. The second aircraft is almost ready and includes hinged flight control surfaces. Flight controls systems connected to those surfaces will be mounted inside the structure before the model’s final assembly.

    + + + +

    Together, the two models can test Bodylski’s ideas and provide flight data for creating better computer models. In the future, those computer models could help researchers built atmospheric probes based on those designs. Bodylski’s concept called for sending the aircraft on missions attached to satellites. Once in the orbit of a planet, the probe aircraft – about the same size as the models – would separate from the satellite through pyrotechnic bolts, deploying in the atmosphere to collect data for study.

    + + +
    Two men take a major section of an aircraft model out of a mold.
    Robert “Red†Jensen removes a major component from an aircraft mold for assembly of a prototype of an atmospheric probe as Justin Hall watches at NASA’s Armstrong Flight Research Center in Edwards, California.
    NASA/Steve Freeman
    + + +

    Current atmospheric probes, small satellites known as CubeSats, gather and transmit data for about 40 minutes and can take in approximately 10 data points before their parent satellite is out of range. Bodylski’s design could descend more rapidly and at a steeper angle, collecting the same information in 10 minutes, plus additional data for another 30 minutes from much deeper in a thick atmosphere.

    + + + +

    Following a series of technical briefings and flight readiness reviews, the aircraft is expected to fly in March 2024. It will fly as a glider air-launched from a cradle attached to rotorcraft often used by the lab. Future tests could include powered flight depending on what data researchers determine they need.

    + + + +

    “We are looking to take an idea to flight and show that a lifting body aircraft can fly as a probe at this scale – that it can be stable, that components can be integrated into the probe, and that the aircraft can achieve some amount of lift,†Bodylski said.

    + + +
    +
    +
    +
    +
    +
    +

    Share

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    Last Updated
    +
    +
    Mar 13, 2024
    +
    +
    Editor
    Dede Dinius
    Contact
    +
    + +
    +
    +
    + + + +]]>
    + + + +
    + + Evolved Adapter for Future NASA SLS Flights Readied for Testing + https://www.nasa.gov/image-article/evolved-adapter-for-future-nasa-sls-flights-readied-for-testing/ + + + Wed, 13 Mar 2024 17:30:55 +0000 + + + + + + https://www.nasa.gov/?post_type=image-article&p=631307 + + +
    A test version of the universal stage adapter for the SLS (Space Launch System) rocket for Artemis 4 is seen inside Marshall Space Flight Center’s facility in Huntsville, Alabama. The adapter sits on a yellow piece of hardware. There is an American flag hanging on the wall to the right and the word “Leidos†is painted black on the white adapter.
    NASA/Sam Lott
    + + +

    A test version of the universal stage adapter for NASA’s more powerful version of its SLS (Space Launch System) rocket arrived to Building 4619 at NASA’s Marshall Space Flight Center in Huntsville, Alabama, Feb. 22 from Leidos in Decatur, Alabama. The universal stage adapter will connect the rocket’s upgraded in-space propulsion stage, called the exploration upper stage, to NASA’s Orion spacecraft as part of the evolved Block 1B configuration of the SLS rocket. It will also serve as a compartment capable of accommodating large payloads, such as modules or other exploration spacecraft. The SLS Block 1B variant will debut on Artemis IV and will increase SLS’s payload capability to send more than 84,000 pounds to the Moon in a single launch.

    + + + +

    In Building 4619’s Load Test Annex High Bay at Marshall, the development test article will first undergo modal testing that will shake the hardware to validate dynamic models. Later, during ultimate load testing, force will be applied vertically and to the sides of the hardware. Unlike the flight hardware, the development test article has flaws intentionally included in its design, which will help engineers verify that the adapter can withstand the extreme forces it will face during launch and flight. The test article joins an already-rich history of rocket hardware that has undergone high-and-low pressure, acoustic, and extreme temperature testing in the multipurpose, high-bay test facility; it will be tested in the same location that once bent, compressed, and torqued the core stage intertank test article for SLS rocket’s Block 1 configuration. Leidos, the prime contractor for the universal stage adapter, manufactured the full-scale prototype at its Aerospace Structures Complex in Decatur.

    + + + +

    NASA is working to land the first woman, first person of color, and its first international partner astronaut on the Moon under Artemis. SLS is part of NASA’s backbone for deep space exploration, along with the Orion spacecraft and Gateway in orbit around the Moon and commercial human landing systems, next-generational spacesuits, and rovers on the lunar surface. SLS is the only rocket that can send Orion, astronauts, and supplies to the Moon in a single launch.

    + + + +

    News Media Contact

    + + + +

    Corinne Beckinger
    Marshall Space Flight Center, Huntsville, Ala.
    256.544.0034
    corinne.m.beckinger@nasa.gov

    +]]>
    + + + +
    + + 8 Must-Have NASA Resources for Science Teachers in 2024 + https://science.nasa.gov/learning-resources/science-activation/8-must-have-nasa-resources-for-science-teachers-in-2024/ + + + Wed, 13 Mar 2024 16:31:23 +0000 + + + https://science.nasa.gov/learning-resources/science-activation/8-must-have-nasa-resources-for-science-teachers-in-2024/ + + + +
    +
    +

    3 min read

    +

    8 Must-Have NASA Resources for Science Teachers in 2024

    +
    +
    + +

    No one can bring the excitement of Earth and space science to the classroom like NASA! 

    +

    Launch your lessons to the next level with these eight essential resources for K-12 teachers:

    +
    +
    +
    +
    A classroom photo with seated children focused on their teacher standing at the front of the room. The walls are filled with colorful projects, artwork and decorations.
    +
    +
    +
    +

    Experience the Total Solar Eclipse 

    +

    Whether you’re on or off the path of totality (find out here!), we’ve put together this guide to help you explore live and virtual opportunities from NASA’s Science Activation Program for safely enjoying the eclipse and even contributing as a volunteer to do NASA Eclipse science.

    +

    An Out-of-this-world Biology Project

    +

    Growing Beyond Earth® (GBE) is a classroom-based citizen science project for middle and high school students about growing plants in space. Curricular materials and resources help you introduce your students to space plant biology and prepare them to participate in the program, through which students have the opportunity to present their findings to NASA Researchers. Materials in English and Spanish.

    +

    Interact with Real Cosmic Data and Imagery

    +

    Data Stories are interactives for high school students that showcase new science imagery and data for a variety of out of this world topics. Ideas for exploration and scientific highlights are included with every story through accompanying video and text.

    +

    Adaptive Learning and Creative Tools from Infiniscope

    +

    Empowering educators to develop next-generation, digital, adaptive learning experiences, Infiniscope provides free content and creative tools to educators who want to personalize learning for their middle and high school students. Join their network and get started here.  

    +

    STEM Literacy through the Lens of NASA 

    +

    NASA eClips provides educators with standards-based videos, educator guides, engineering design packets, and student opportunities for students in grades 3 to 12. Offerings cover a wide variety of topics that include energy, the Moon, clouds, sound, and more!

    +

    All Learners can be Scientists and Engineers

    +

    NASA missions are a perfect way to bring together science and engineering. In PLANETS units, learners in grades 3-8 engineer technologies like optical filters and use them to answer scientific questions like “Where was water on Mars?†Activities emphasize NASA planetary science and engineering and are designed to empower all learners and show that they can be scientists and engineers. 

    +

    Standards-Aligned Digital Resources for Grades K-12

    +

    Engage K–12 students with phenomena and science practices with this collection of supplementary digital media resources from GBH aligned with key NGSS Earth, space, and physical science disciplinary core ideas. To ensure that science content is accessible for all students, supports are included for students with disabilities or who are English learners.

    +

    Kids Explore Earth and Space with NASA!

    +

    NASA’s Space Place helps upper-elementary-aged kids learn space and Earth science through fun games, hands-on activities, art challenges, informative articles, and engaging short videos. With material in both English and Spanish and resources for teachers and parents, NASA Space Place has something for everyone. 

    +

    Didn’t find what you were looking for? Want to explore even more resources? NASA’s Science Activation (SciAct) program offers Learning and Educational Activities and Resources from NASA Science that invite learners of all ages to participate!

    +]]>
    + + + +
    + + diff --git a/module/move/unitore/tests/fixtures/test_config.toml b/module/move/unitore/tests/fixtures/test_config.toml new file mode 100644 index 0000000000..586e2f3787 --- /dev/null +++ b/module/move/unitore/tests/fixtures/test_config.toml @@ -0,0 +1,3 @@ +[[config]] +update_period = "1min" +link = "https://www.nasa.gov/feed/" diff --git a/module/move/unitore/tests/fixtures/updated_one_frame.xml b/module/move/unitore/tests/fixtures/updated_one_frame.xml new file mode 100644 index 0000000000..a31fbc080c --- /dev/null +++ b/module/move/unitore/tests/fixtures/updated_one_frame.xml @@ -0,0 +1,1747 @@ + + + + NASA + + https://www.nasa.gov + UPDATED!!! Official National Aeronautics and Space Administration Website + Thu, 14 Mar 2024 19:27:52 +0000 + en-US + + hourly + + 1 + https://wordpress.org/?v=6.3.3 + + Icing Cloud Characterization Engineer Emily Timko + https://www.nasa.gov/image-article/icing-cloud-characterization-engineer-emily-timko/ + + + Thu, 14 Mar 2024 14:27:52 +0000 + https://www.nasa.gov/?post_type=image-article&p=631537 + + +
    A woman with long brown hair and dark brown eyes stands against metal stairs, smiling. She holds a railing with her left arm and her right arm down at her side. She's wearing a light beige blazer over a white shirt, blue jeans, and a brown belt.
    + + +

    “If I knew that I was going to get to where I’m at [today], I would have gone through it all over again. I would have went through changing my major. I would have gone through the divorce. I would have went through the heartbreak of thinking, ‘I’m not going to be what I wanted to be when I grow up.’ That’s OK.

    + + + +

    “Back then, when I realized that I wasn’t going to be an on-air meteorologist, it was heartbreaking. But now, I’m all right with that. It’s been a bumpy ride for me, but in the end, it’s been the greatest thing.

    + + + +

    “…I love to share the messy ride. It’s OK that you have bumps. It’s OK if there’s obstacles. You have your goals, but it’s OK if there’s hiccups. You can still be a mess and be successful.â€

    + + + +

    – Emily Timko, Icing Cloud Characterization Engineer, NASA’s Glenn Research Center

    + + + +

    Image Credit: NASA/Quentin Schwinn
    Interviewer: NASA/Thalia Patrinos

    + + + +

    Check out some of our other Faces of NASA. 

    +]]>
    + + + +
    + + Hubble Tracks Jupiter’s Stormy Weather + https://science.nasa.gov/missions/hubble/hubble-tracks-jupiters-stormy-weather/ + + + Thu, 14 Mar 2024 14:00:21 +0000 + + + + + + + + + + + https://science.nasa.gov/missions/hubble/hubble-tracks-jupiters-stormy-weather/ + + + +
    +
    +

    3 min read

    +

    Hubble Tracks Jupiter’s Stormy Weather

    +
    +
    + +
    +
    +
    +
    A side-by-side image showing both faces of Jupiter on the black background of space. At the top, left corner of the left-hand image is the label Jupiter. Centered at the bottom is the label
    +
    NASA’s Hubble Space Telescope imaged both sides of the giant planet, Jupiter, on January 5-6, 2024.
    +
    NASA, ESA, STScI, Amy Simon (NASA-GSFC)
    +
    +
    +
    + + + +

    The giant planet Jupiter, in all its banded glory, is revisited by NASA’s Hubble Space Telescope in these latest images, taken on January 5-6, 2024, capturing both sides of the planet. Hubble monitors Jupiter and the other outer solar system planets every year under the Outer Planet Atmospheres Legacy program (OPAL). This is because these large worlds are shrouded in clouds and hazes stirred up by violent winds, causing a kaleidoscope of ever-changing weather patterns.

    +

    [left image] – Big enough to swallow Earth, the classic Great Red Spot stands out prominently in Jupiter’s atmosphere. To its lower right, at a more southerly latitude, is a feature sometimes dubbed Red Spot Jr. This anticyclone was the result of storms merging in 1998 and 2000, and it first appeared red in 2006 before returning to a pale beige in subsequent years. This year it is somewhat redder again. The source of the red coloration is unknown but may involve a range of chemical compounds: sulfur, phosphorus, or organic material. Staying in their lanes, but moving in opposite directions, Red Spot Jr. passes the Great Red Spot about every two years. Another small red anticyclone appears in the far north.

    +

    [right image] – Storm activity also appears in the opposite hemisphere. A pair of storms, a deep red cyclone and a reddish anticyclone, appear next to each other at right of center. They look so red that at first glance, it looks like Jupiter skinned a knee. These storms are rotating in opposite directions, indicating an alternating pattern of high- and low-pressure systems. For the cyclone, there’s an upwelling on the edges with clouds descending in the middle, causing a clearing in the atmospheric haze.

    +
    +
    + +
    Credit: NASA’s Goddard Space Flight Center, Lead Producer: Paul Morris
    + +

    The storms are expected to bounce past each other because their opposing clockwise and counterclockwise rotation makes them repel each other. “The many large storms and small white clouds are a hallmark of a lot of activity going on in Jupiter’s atmosphere right now,†said OPAL project lead Amy Simon of NASA’s Goddard Space Flight Center in Greenbelt, Maryland.

    +

    Toward the left edge of the image is the innermost Galilean moon, Io – the most volcanically active body in the Solar System, despite its small size (only slightly larger than Earth’s moon). Hubble resolves volcanic outflow deposits on the surface. Hubble’s sensitivity to blue and violet wavelengths clearly reveals interesting surface features. In 1979 NASA’s Voyager 1 spacecraft discovered Io’s pizza-like appearance and volcanism, to the surprise of planetary scientists because it is such a small moon. Hubble picked up where Voyager left off by keeping an eye on restless Io year by year.

    +
    +
    +
    + +
    +

    +
    +
    +
    +
    The Hubble Space Telescope images used in this animated science visualization present a full rotation of the giant planet Jupiter. This is not a real-time movie. Instead, Hubble snapshots of the colorful planet, taken January 5-6, 2024, have been photo-mapped onto a sphere, and the model is then rotated in animation. The planet’s real rotation rate is nearly 10 hours, which is easily plotted by watching the Great Red Spot come and go with each completed rotation. Hubble monitors Jupiter and the other outer Solar System planets every year under the Outer Planet Atmospheres Legacy program (OPAL). Credit: NASA, ESA, Amy Simon (NASA-GSFC)
    +

    +

    +

    +

    + +

    The Hubble Space Telescope has been operating for over three decades and continues to make ground-breaking discoveries that shape our fundamental understanding of the universe. Hubble is a project of international cooperation between NASA and ESA. NASA’s Goddard Space Flight Center in Greenbelt, Maryland, manages the telescope. Goddard also conducts mission operations with Lockheed Martin Space in Denver, Colorado. The Space Telescope Science Institute (STScI) in Baltimore, Maryland, conducts Hubble and Webb science operations for NASA.

    +

    Learn More

    + + + + + + +
    +
    +
    +
    +
    +
    +

    Share

    +

    +
    +
    +

    +

    +
    +
    +
    +

    Details

    +

    +
    +
    +
    Last Updated
    +

    +
    Mar 14, 2024
    +

    +
    +
    +
    Editor
    +
    +
    Andrea Gianopoulos
    +
    +
    +
    +
    Location
    +
    +
    Goddard Space Flight Center
    +
    +

    +
    +
    + +]]>
    + + + +
    + + Compact Robot Takes Flight to Support CERISS Initiative + https://science.nasa.gov/science-research/biological-physical-sciences/compact-robot-takes-flight-to-support-ceriss-initiative/ + + + Thu, 14 Mar 2024 13:00:00 +0000 + + + + + https://science.nasa.gov/science-research/biological-physical-sciences/compact-robot-takes-flight-to-support-ceriss-initiative/ + + + +
    +
    +

    3 min read

    +

    Compact Robot Takes Flight to Support CERISS Initiative

    +
    +
    + +

    NASA’s TechFlights 2023 Selections Advance Space Science in Collaboration with Industry

    +

    A new robot will be taking flight soon to test its ability to support biological and physical science experiments in microgravity.  As one of NASA’s 2023 TechFlights selections, this compact robot will have a chance to fly on a commercial suborbital flight to see just how well it can perform in a space environment.

    +

    Managed by NASA’s Flight Opportunities program, the TechFlights 2023 solicitation included a call for technologies to support the agency’s Commercially Enabled Rapid Space Science (CERISS) initiative. CERISS, administered by NASA’s Biological and Physical Sciences Division, uses the spaceflight environment to study phenomena in ways that cannot be done on Earth.

    +

    One of the 11 TechFlights selections that will undergo flight testing is a compact robot designed to prepare samples for science experiments in microgravity, improve in-flight sample preparation capabilities and potentially reduce astronauts’ time tending to such research while on the International Space Station or future commercial destinations in low Earth orbit.  Led by principal investigator Phil Putman, manager of advanced projects at Sierra Lobo, Inc, in Fremont, Ohio, the tests will leverage parabolic flights from Zero Gravity Corporation to evaluate the technology’s performance in microgravity.

    +

    “We need transformative capabilities to conduct research in space as NASA continues its exploration mission,†said BPS division director Lisa Carnell. “The commercial testing supported by Flight Opportunities will help CERISS advance a key research spaceflight innovation with the goal of improving in-flight sample analysis and advancing our study of biological and physical systems in space.â€

    +

    CERISS aims to advance biological and physical research capabilities with the commercial space industry, including sample preparation and analysis technologies for use in microgravity. The project’s long-term goals include conducting scientist astronaut missions on commercial space stations as well as developing automated hardware for experiments beyond low Earth orbit, such as on the lunar surface. Benefits include an increase in the pace of research for a wide range of research leading to an increased demand for research and development in low Earth orbit, facilitating growth of the commercial space industry.

    +

    Learn More

    +

    Commercially Enabled Rapid Space Science Initiative (CERISS)

    +

    TechFlights 2023 Selections

    +

    About Flight Opportunities

    +

    Commercial Destinations in Low Earth Orbit

    +

    About BPS

    +

    NASA’s Biological and Physical Sciences Division pioneers’ scientific discovery and enables exploration by using space environments to conduct investigations not possible on Earth. Studying biological and physical phenomenon under extreme conditions allows researchers to advance the fundamental scientific knowledge required to go farther and stay longer in space, while also benefitting life on Earth.

    +
    +
    +
    +
    +
    +
    +

    Share

    +

    +
    +
    +

    +

    +
    +
    +
    +

    Details

    +

    +
    +
    +
    Last Updated
    +

    +
    Mar 13, 2024
    +

    +

    +

    +
    +
    +]]>
    + + + +
    + + The Marshall Star for March 13, 2024 + https://www.nasa.gov/centers-and-facilities/marshall/the-marshall-star-for-march-13-2024/ + + + Wed, 13 Mar 2024 21:34:13 +0000 + + https://www.nasa.gov/?p=631504 + + +
    +
    +
    +
    +
    +
    25 Min Read
    +

    + The Marshall Star for March 13, 2024

    +
    +
    +
    +
    +
    Students from middle and high schools in the Montgomery area visit a series of exhibits featuring many NASA programs managed at Marshall. The displays were part of Alabama Space Day, celebrated March 5 at the state Capitol in Montgomery.
    +
    +
    +
    +
    +
    +
    + + + +

    Marshall Celebrates Alabama Space Day in Montgomery

    + + + +

    By Jessica Barnett

    + + + +

    Team members from NASA’s Marshall Space Flight Center joined Montgomery-area students, the U.S. Space & Rocket Center, NASA’s aerospace partners, and elected officials in celebrating the aerospace industry’s impact in Alabama on March 5.

    + + + +

    This year’s event kicked off at the state Capitol in Montgomery with a proclamation from Alabama Gov. Kay Ivey declaring March 5 as Alabama Space Day. Students from the Montgomery area were then invited to take part in various STEM (science, technology, engineering, and mathematics) activities, chat with an astronaut, hear what it takes to become a NASA intern or work at Marshall, and check out exhibits highlighting NASA’s many programs, including the Space Launch System, Human Landing System, and Centennial Challenges.

    + + +
    Joseph Pelfrey, director of NASA’s Marshall Space Flight Center, speaks inside the House Chamber of the Alabama State House during Alabama Space Day in Montgomery on March 5.
    Joseph Pelfrey, director of NASA’s Marshall Space Flight Center, speaks inside the House Chamber of the Alabama State House during Alabama Space Day in Montgomery on March 5.
    Dionne Whetstone
    + + +

    NASA astronaut Raja Chari attended the event and spoke to students about his experience serving as flight engineer of Expedition 66 and 67 aboard the International Space Station for 177 days. 

    + + + +

    Ivey said she felt honored to host the annual event, which aims to highlight Alabama’s contributions to space exploration as well as encourage the next generation of scientists and engineers by pursuing degrees and careers in aerospace.

    + + +
    Students from middle and high schools in the Montgomery area visit a series of exhibits featuring many NASA programs managed at Marshall. The displays were part of Alabama Space Day, celebrated March 5 at the state Capitol in Montgomery.
    Students from middle and high schools in the Montgomery area visit a series of exhibits featuring many NASA programs managed at Marshall. The displays were part of Alabama Space Day, celebrated March 5 at the state Capitol in Montgomery.
    NASA/Christopher Blair
    + + +

    “We are blessed to have such a world-class space and technology presence in our state,†Ivey said. “Alabama is very proud of its historic contributions to the American space program, which go back well over 60 years.â€

    + + + +

    Marshall Center Director Joseph Pelfrey echoed the sentiment, calling it “a great day to celebrate space in Alabama.â€

    + + + +

    “Alabama Space Day was a huge success, thanks to the workforce at Marshall, as well as our aerospace partners and sponsors,†Pelfrey said. “We truly appreciate the bipartisan support we receive across the state and enjoy highlighting these partnerships through events like this. I especially valued speaking on panels today with my colleagues and engaging with local high school and college students, who will be the first generation to travel to Mars.â€

    + + +
    Alabama Gov. Kay Ivey, right, greets Pelfrey during Alabama Space Day as NASA astronaut Raja Chari, center, looks on. The governor issued a proclamation declaring the state holiday in honor of the aerospace industry’s impact on Alabama.
    Alabama Gov. Kay Ivey, right, greets Pelfrey during Alabama Space Day as NASA astronaut Raja Chari, center, looks on. The governor issued a proclamation declaring the state holiday in honor of the aerospace industry’s impact on Alabama.
    Hal Yeager
    + + +

    Barnett, a Media Fusion employee, supports the Marshall Office of Communications.

    + + + +

    › Back to Top

    + + + +

    President’s NASA Fiscal Year 2025 Funding Supports US Space, Climate Leadership

    + + + +

    The Biden-Harris Administration on March 11 released the President’s Budget for Fiscal Year 2025, which includes funding to invest in America and the American people and will allow NASA to continue advancing our understanding of Earth and space while inspiring the world through discovery.

    + + + +

    “As history has proven, as the present has shown, and as the future will continue to demonstrate, an investment in NASA is an investment in America for the benefit of humanity,†said NASA Administrator Bill Nelson. “President Biden’s budget will fund our nation’s abilities and leadership for the future of space exploration, scientific discovery, cutting-edge technology, climate data, the next generation of aeronautics, and inspiring our future leaders – the Artemis Generation.â€

    + + +
    A graphic of the NASA "meatball" insignia, a blue circle crossed by a red V-shaped swoosh, against a black background.
    + + +

    The budget allows NASA to launch the Artemis II mission, which will send astronauts around the Moon for the first time in more than 50 years, research Earth’s changing climate, grow commercial markets to serve America’s interests in space, and inspire the Artemis Generation of science, technology, engineering, and math professionals.

    + + + +

    “This budget shows NASA’s value in contributing to the global leadership of the United States,†said Nelson. “Every dollar supports our ability to continue exploring new cosmic shores and making the impossible possible, all while creating competitive and good-paying jobs in all 50 states.â€

    + + + +

    At NASA, the budget request would:

    + + + +
      +
    • Invest in the U.S.-led Artemis campaign of lunar exploration: The budget includes $7.8 billion for the Artemis campaign, which will bring astronauts – including the first woman, first person of color, and first international astronaut – to the lunar surface starting this decade as part of a long-term journey of science and exploration.
    • + + + +
    • Enhance climate science and information: The budget invests $2.4 billion in the Earth science program for missions and activities that advance Earth systems science and increase access to information to mitigate natural hazards, support climate action, and manage natural resources.
    • + + + +
    • Advance U.S. space industry technology development: The budget provides $1.2 billion for NASA’s space technology portfolio to foster innovative technology research and development to meet the needs of NASA, support the expanding U.S. space industry, which is creating a growing number of good jobs, and keep America ahead of competitors at the forefront of space innovation.
    • + + + +
    • Support highly efficient and greener commercial airliners: The budget invests $966 million in NASA’s aeronautics program, which will develop hybrid-electric jet engines, lightweight aircraft structures, and a major new flight demonstrator to pave the way for new commercial airliners that would be cheaper to operate and produce less pollution.
    • + + + +
    • Continue the transition to commercial space stations:The budget funds continued operation of the International Space Station, a vehicle to safely de-orbit the space station after it is retired in 2030, and the commercial space stations that NASA will use as soon as they become available.
    • + + + +
    • Increase STEM opportunities at minority-serving institutions: The budget provides $46 million to the Minority University Research and Education Project, to increase competitive awards to Historically Black Colleges and Universities, tribal colleges and universities, and other minority-serving institutions, and recruit and retain underrepresented and underserved students in STEM fields.
    • +
    + + + +

    Find more information on NASA’s fiscal year 2025 budget request at nasa.gov.

    + + + +
    + +
    + + + +

    › Back to Top

    + + + +

    Jason Adam Named Deputy Manager of Marshall’s Science and Technology Office

    + + + +

    Jason Adam has been named as deputy manager of the Science and Technology Office at NASA’s Marshall Space Flight Center.

    + + + +

    Adam will assist in leading the organization responsible for projects and programs in support of the Science Mission Directorate and Space Technology Mission Directorate. This includes the Planetary Missions Program Office, the Technology Demonstration Missions Program Office, deep space and planetary exploration, fundamental research in heliophysics, astrophysics, and Earth science, and technology development, including Centennial Challenges and Technology Transfer.

    + + +
    Jason Adam
    Jason Adam has been named as deputy manager of the Science and Technology Office at NASA’s Marshall Space Flight Center.
    NASA
    + + +

    He has been the Cryogenic Fluid Management Portfolio Project manager since the project office’s inception in February 2021. From February 2020 to 2021, Adam worked an executive-level detail as a senior technical assistant in the center director’s office.

    + + + +

    From 2017 to 2021, he was the manager of the Exploration and Systems Development Office in the Science and Technology Office. Adam managed technology and flight projects in support of NASA’s science and human exploration missions from 2008 to 2017.

    + + + +

    In 2014, he was selected as a member of the NASA Mid-level Leadership Program. During that time, Adam completed a detail at NASA Headquarters working for the agency’s associate administrator on the Technical Capability Assessments team.

    + + + +

    He joined Marshall in 2008 to work on the Constellation rocket Ares I. Adam began his NASA career at Stennis Space Center in 2003, focusing on propulsion testing of the space shuttle main engines. He completed a program management detail in 2007, supporting the Space Shuttle Program as a technical assistant.

    + + + +

    A federally certified senior/expert project manager, Adam is a graduate of the Office of Personnel Management Federal Executive Institute’s Leadership for a Democratic Society. He is the recipient of NASA’s Outstanding Leadership Medal.

    + + + +

    An engineering graduate from North Dakota State University in Fargo, North Dakota, Adam and his wife, Jessica, live in Huntsville. They have three children.

    + + + +

    › Back to Top

    + + + +

    NASA Expanding Lunar Exploration with Upgraded SLS Mega Rocket Design

    + + + +

    By Martin Burkey

    + + + +

    As NASA prepares for its first crewed Artemis missions, the agency is making preparations to build, test, and assemble the next evolution of its SLS (Space Launch System) rocket. The larger and power powerful version of SLS, known as Block 1B, can send a crew and large pieces of hardware to the Moon in a single launch and is set to debut for the Artemis IV mission.

    + + + +

    “From the beginning, NASA’s Space Launch System was designed to evolve into more powerful crew and cargo configurations to provide a flexible platform as we seek to explore more of our solar system,†said John Honeycutt, SLS Program manager. “Each of the evolutionary changes made to the SLS engines, boosters, and upper stage of the SLS rocket are built on the successes of the Block 1 design that flew first with Artemis I in November 2022 and will, again, for the first crewed missions for Artemis II and III.â€

    + + +
    Expanded view of the next configuration of NASA's Space Launch System rocket
    This graphic shows an expanded view of the larger and power powerful version of SLS, known as Block 1B. It can send a crew and large pieces of hardware to the Moon in a single launch and is set to debut for the Artemis IV mission.
    NASA
    + + +

    Early manufacturing is already underway at NASA’s Michoud Assembly Facility, while preparations for the green run test series for its upgraded upper stage are in progress at nearby Stennis Space Center. NASA’s Marshall Space Flight Center manages the SLS Program and Michoud.

    + + + +

    While using the same basic core stage and solid rocket booster design, and related components as the Block 1, Block 1B features two big evolutionary changes that will make NASA’s workhorse rocket even more capable for future missions to the Moon and beyond. A more powerful second stage and an adapter for large cargos will expand the possibilities for future Artemis missions.

    + + + +

    “The Space Launch System Block 1B rocket will be the primary transportation for astronauts to the Moon for years to come,†said James Burnum, deputy manager of the NASA Block 1B Development Office. “We are building on the SLS Block 1 design, testing, and flight experience to develop safe, reliable transportation that will send bigger and heavier hardware to the Moon in a single launch than existing rockets.â€

    + + +
    Space Launch System Exploration Upper Stage infographic.
    This graphic shows some of the benefits of the exploration upper stage, which will replace the interim cryogenic propulsion stage on the SLS Block 1B rocket.
    NASA
    + + +

    The in-space stage used to send the first three Artemis missions to the Moon, called the interim cryogenic propulsion stage, uses a single engine and will be replaced by a larger, more powerful four-engine stage called the exploration upper stage. A different battery is among the many changes that will allow the exploration upper stage to support the first eight hours of the mission following launch compared to the current interim cryogenic propulsion stage two hours. All new hardware and software will be designed and tested to meet the different performance and environmental requirements.

    + + + +

    The other configuration change is a universal stage adapter that connects the rocket to the Orion spacecraft. It also offers more than 10,000 cubic feet of space to carry large components, such as modules for NASA’s future Gateway outpost that will be in lunar orbit to support crew between surface missions and unique opportunities for science at the Moon.

    + + + +

    Together, those upgrades will increase the payload capability for SLS from 59,000 pounds to approximately 84,000 pounds. The four RL10 engines that will be used during the exploration upper stage green run test series at Stennis are complete, and work on the Artemis IV core stage is in progress at nearby Michoud.

    + + +
    : Technicians at NASA’s Michoud Assembly Facility in New Orleans on Feb. 22 prepare elements that will form part of the midbody for the exploration upper stage. The midbody struts, or V-struts, will create the cage-like outer structure of the midbody that will connect the upper stage’s large liquid hydrogen tank to the smaller liquid oxygen tank. Manufacturing flight and test hardware for the future upper stage is a collaborative effort between NASA and Boeing, the lead contractor for EUS and the SLS core stage.
    Technicians at NASA’s Michoud Assembly Facility on Feb. 22 prepare elements that will form part of the midbody for the exploration upper stage. The midbody struts, or V-struts, will create the cage-like outer structure of the midbody that will connect the upper stage’s large liquid hydrogen tank to the smaller liquid oxygen tank.
    NASA
    + + +

    The evolved design also gives astronaut explorers more launch opportunities on a path to intercept the Moon. With four times the engines and almost four times the propellant and thrust of interim cryogenic propulsion stage, the exploration upper stage also enables two daily launch opportunities compared to Block 1’s more limited lunar launch availability.

    + + + +

    Among other capabilities, both astronauts and ground teams will be able to communicate with the in-space stage and safely control it while using Orion’s docking system to extract components destined for Gateway from the stage adapter.

    + + + +

    NASA is working to land the first woman, first person of color, and its first international partner astronaut on the Moon under Artemis. SLS is part of NASA’s backbone for deep space exploration, along with Orion and the Gateway in orbit around the Moon and commercial human landing systems, next-generation spacesuits, and rovers on the lunar surface. SLS is the only rocket that can send Orion, astronauts, and supplies to the Moon in a single launch.

    + + + +

    Burkey, a Media Fusion employee, is a technical writer supporting the SLS Program.

    + + + +

    › Back to Top

    + + + +

    NASA Continues Artemis Moon Rocket Engine Test Series

    + + + +

    NASA conducted a full-duration RS-25 engine hot fire March 6, continuing a final round of certification testing for production of new engines to help power the SLS (Space Launch System) rocket on future Artemis missions to the Moon and beyond.

    + + + +

    The full-duration test on the Fred Haise Test Stand at NASA’s Stennis Space Center, marked the ninth in a scheduled 12-test series. NASA astronauts and Artemis II crew members Reid Wiseman, commander, and Christina Koch, mission specialist, attended the test.

    + + +
    full-duration RS-25 engine hot fire is seen in the background
    NASA conducts a full-duration RS-25 engine hot fire March 6 at the agency’s Stennis Space Center.
    NASA/Danny Nowlin
    + + +

    Engineers are collecting test data to certify an updated engine production process, using innovative manufacturing techniques, for lead engines contractor Aerojet Rocketdyne, an L3Harris Technologies company.

    + + + +

    During the March 6 test, operators fired the certification engine for 10 minutes (600 seconds), longer than the amount of time needed to help launch the SLS rocket and send astronauts aboard the Orion spacecraft into orbit. The test team also fired the engine at power levels between 80% and 113% to test performance in multiple scenarios. Four RS-25 engines, along with a pair of solid rocket boosters, launch NASA’s powerful SLS rocket, producing more than 8.8 million pounds of thrust at liftoff for Artemis missions.

    + + + +
    + +
    While clear skies were over Stennis Space Center on March 6, two special guests experienced a brief “rain shower†from water vapor produced during the RS-25 hot fire test on the Fred Haise Test Stand. NASA astronauts Reid Wiseman and Christina Koch – both of whom will fly around the Moon as Artemis II crew members – were hosted by Acting Center Director John Bailey and Engineering & Test Directorate Director Joe Schuyler to view the test and meet the test team. (NASA)
    + + + +

    NASA is working to land the first woman, first person of color, and its first international partner astronaut on the Moon under Artemis. SLS is part of NASA’s backbone for deep space exploration, along with the Orion spacecraft and Gateway in orbit around the Moon and commercial human landing systems, next-generational spacesuits, and rovers on the lunar surface. SLS is the only rocket that can send Orion, astronauts, and supplies to the Moon in a single launch.

    + + + +

    NASA’s Marshall Space Flight Center manages the SLS and human landing system programs.

    + + + +

    RS-25 tests at NASA Stennis are conducted by a diverse team of operators from NASA, Aerojet Rocketdyne, and Syncom Space Services, prime contractor for site facilities and operations.

    + + + +

    › Back to Top

    + + + +

    Splashdown! NASA’s SpaceX Crew-7 Finishes Mission, Returns to Earth

    + + + +

    NASA’s SpaceX Crew-7 completed the agency’s seventh commercial crew rotation mission to the International Space Station on March 12 after splashing down safely in a Dragon spacecraft off the coast of Pensacola, Florida. The international crew of four spent 199 days in orbit.

    + + + +

    NASA astronaut Jasmin Moghbeli, ESA (European Space Agency) astronaut Andreas Mogensen, JAXA (Japan Aerospace Exploration Agency) astronaut Satoshi Furukawa, and Roscosmos cosmonaut Konstantin Borisov returned to Earth splashing down at 4:47 a.m. CDT. Teams aboard SpaceX recovery vessels retrieved the spacecraft and its crew. After returning to shore, the crew was flown to NASA’s Johnson Space Center.

    + + +
    Roscosmos cosmonaut Konstantin Borisov, left, European Space Agency astronaut Andreas Mogensen, NASA astronaut Jasmin Moghbeli, and Japan Aerospace Exploration Agency astronaut Satoshi Furukawa are seen inside the SpaceX Dragon Endurance spacecraft onboard the SpaceX recovery ship MEGAN shortly after having landed in the Gulf of Mexico off the coast of Pensacola, Florida, March 12. Moghbeli, Mogensen, Furukawa, and Borisov are returning after nearly six months in space as part of Expedition 70 aboard the International Space Station.
    NASA/Joel Kowsky
    + + +

    “After more than six months aboard the International Space Station, NASA’s SpaceX Crew-7 has safely returned home,†said NASA Administrator Bill Nelson. “This international crew showed that space unites us all. It’s clear that we can do more – we can learn more – when we work together. The science experiments conducted during their time in space will help prepare for NASA’s bold missions at the Moon, Mars, and beyond, all while benefitting humanity here on Earth.â€

    + + + +

    The Crew-7 mission lifted off at 2:27 a.m. Aug. 26, 2023, on a Falcon 9 rocket from NASA’s Kennedy Space Center. About 30 hours later, Dragon docked to the Harmony module’s space-facing port. Crew-7 undocked at 10:20 a.m. March 11 to begin the trip home.

    + + + +

    Moghbeli, Mogensen, Furukawa, and Borisov traveled 84,434,094 miles during their mission, spent 197 days aboard the space station, and completed 3,184 orbits around Earth. The Crew-7 mission was the first spaceflight for Moghbeli and Borisov. Mogensen has logged 209 days in space over his two flights, and Furukawa has logged 366 days in space over his two flights.

    + + + +

    Throughout their mission, the Crew-7 members contributed to a host of science and maintenance activities and technology demonstrations. Moghbeli conducted one spacewalk, joined by NASA astronaut Loral O’Hara, replacing one of the 12 trundle bearing assemblies on the port solar alpha rotary joint, which allows the arrays to track the Sun and generate electricity to power the station.

    + + + +

    The crew contributed to hundreds of experiments and technology demonstrations, including the first study of human response to different spaceflight durations, and an experiment growing food on the space station.

    + + + +

    This was the third flight of the Dragon spacecraft, named Endurance. It also previously supported the Crew-3 and Crew-5 missions. The spacecraft will return to Florida for inspection and processing at SpaceX’s refurbishing facility at Cape Canaveral Space Force Station, where teams will inspect the Dragon, analyze data on its performance, and process it for its next flight.

    + + + +

    The Crew-7 flight is part of NASA’s Commercial Crew Program and its return to Earth follows on the heels of NASA’s SpaceX Crew-8 launch, which docked to the station March 5, beginning another science expedition.

    + + + +

    The goal of NASA’s Commercial Crew Program is safe, reliable, and cost-effective transportation to and from the space station and low Earth orbit. This already is providing additional research time and has increased the opportunity for discovery aboard humanity’s microgravity testbed for exploration, including helping NASA prepare for human exploration of the Moon and Mars.

    + + + +

    The HOSC (Huntsville Operations Support Center) at NASA’s Marshall Space Flight Center provides engineering and mission operations support for the space station, the Commercial Crew Program, and Artemis missions, as well as science and technology demonstration missions. The Payload Operations Integration Center within the HOSC operates, plans, and coordinates the science experiments onboard the space station 365 days a year, 24 hours a day.

    + + + +

    › Back to Top

    + + + +

    Webb, Hubble Telescopes Affirm Universe’s Expansion Rate, Puzzle Persists

    + + + +

    When you are trying to solve one of the biggest conundrums in cosmology, you should triple check your homework. The puzzle, called the “Hubble Tension,” is that the current rate of the expansion of the universe is faster than what astronomers expect it to be, based on the universe’s initial conditions and our present understanding of the universe’s evolution.

    + + + +

    Scientists using NASA’s Hubble Space Telescope and many other telescopes consistently find a number that does not match predictions based on observations from ESA’s (European Space Agency’s) Planck mission. Does resolving this discrepancy require new physics? Or is it a result of measurement errors between the two different methods used to determine the rate of expansion of space?

    + + +
    This image of NGC 5468, a galaxy located about 130 million light-years from Earth, combines data from the Hubble and James Webb space telescopes. This is the farthest galaxy in which Hubble has identified Cepheid variable stars. These are important milepost markers for measuring the expansion rate of the universe. The distance calculated from Cepheids has been cross-correlated with a type Ia supernova in the galaxy. Type Ia supernovae are so bright they are used to measure cosmic distances far beyond the range of the Cepheids, extending measurements of the universe's expansion rate deeper into space.
    This image of NGC 5468, a galaxy located about 130 million light-years from Earth, combines data from the Hubble and James Webb space telescopes. This is the farthest galaxy in which Hubble has identified Cepheid variable stars. These are important milepost markers for measuring the expansion rate of the universe. The distance calculated from Cepheids has been cross-correlated with a type Ia supernova in the galaxy. Type Ia supernovae are so bright they are used to measure cosmic distances far beyond the range of the Cepheids, extending measurements of the universe’s expansion rate deeper into space.
    NASA
    + + +

    Hubble has been measuring the current rate of the universe’s expansion for 30 years, and astronomers want to eliminate any lingering doubt about its accuracy. Now, Hubble and NASA’s James Webb Space Telescope have tag-teamed to produce definitive measurements, furthering the case that something else – not measurement errors – is influencing the expansion rate.

    + + + +

    “With measurement errors negated, what remains is the real and exciting possibility we have misunderstood the universe,†said Adam Riess, a physicist at Johns Hopkins University in Baltimore. Riess holds a Nobel Prize for co-discovering the fact that the universe’s expansion is accelerating, due to a mysterious phenomenon now called “dark energy.â€

    + + + +

    As a crosscheck, an initial Webb observation in 2023 confirmed that Hubble measurements of the expanding universe were accurate. However, hoping to relieve the Hubble Tension, some scientists speculated that unseen errors in the measurement may grow and become visible as we look deeper into the universe. Stellar crowding could affect brightness measurements of more distant stars in a systematic way.

    + + + +

    The Supernova H0 for the Equation of State of Dark Energy (SH0ES) team, led by Riess, obtained additional observations with Webb of objects that are critical cosmic milepost markers, known as Cepheid variable stars, which now can be correlated with the Hubble data.

    + + + +

    “We’ve now spanned the whole range of what Hubble observed, and we can rule out a measurement error as the cause of the Hubble Tension with very high confidence,†Riess said.

    + + + +

    The team’s first few Webb observations in 2023 were successful in showing Hubble was on the right track in firmly establishing the fidelity of the first rungs of the so-called cosmic distance ladder.

    + + + +

    Astronomers use various methods to measure relative distances in the universe, depending upon the object being observed. Collectively these techniques are known as the cosmic distance ladder – each rung or measurement technique relies upon the previous step for calibration.

    + + + +

    But some astronomers suggested that, moving outward along the “second rung,†the cosmic distance ladder might get shaky if the Cepheid measurements become less accurate with distance. Such inaccuracies could occur because the light of a Cepheid could blend with that of an adjacent star – an effect that could become more pronounced with distance as stars crowd together and become harder to distinguish from one another.

    + + +
    At the center of these side-by-side images is a special class of star used as a milepost marker for measuring the universe’s rate of expansion – a Cepheid variable star. The two images are very pixelated because they are a very zoomed-in view of a distant galaxy. Each of the pixels represents one or more stars. The image from the James Webb Space Telescope is significantly sharper at near-infrared wavelengths than Hubble, which is primarily a visible-ultraviolet light telescope. By reducing the clutter with Webb’s crisper vision, the Cepheid stands out more clearly, eliminating any potential confusion.
    At the center of these side-by-side images is a special class of star used as a milepost marker for measuring the universe’s rate of expansion – a Cepheid variable star. The two images are very pixelated because they are a very zoomed-in view of a distant galaxy. Each of the pixels represents one or more stars. The image from the James Webb Space Telescope is significantly sharper at near-infrared wavelengths than Hubble, which is primarily a visible-ultraviolet light telescope. By reducing the clutter with Webb’s crisper vision, the Cepheid stands out more clearly, eliminating any potential confusion.
    NASA, ESA, CSA, STScI, Adam G. Riess (JHU, STScI
    + + +

    The observational challenge is that past Hubble images of these more distant Cepheid variables look more huddled and overlapping with neighboring stars at ever farther distances between us and their host galaxies, requiring careful accounting for this effect. Intervening dust further complicates the certainty of the measurements in visible light. Webb slices though the dust and naturally isolates the Cepheids from neighboring stars because its vision is sharper than Hubble’s at infrared wavelengths.

    + + + +

    “Combining Webb and Hubble gives us the best of both worlds. We find that the Hubble measurements remain reliable as we climb farther along the cosmic distance ladder,†Riess said.

    + + + +

    The new Webb observations include five host galaxies of eight Type Ia supernovae containing a total of 1,000 Cepheids and reach out to the farthest galaxy where Cepheids have been well measured – NGC 5468 – at a distance of 130 million light-years. “This spans the full range where we made measurements with Hubble. So, we’ve gone to the end of the second rung of the cosmic distance ladder,†said co-author Gagandeep Anand of the Space Telescope Science Institute in Baltimore, which operates the Webb and Hubble telescopes for NASA.

    + + + +

    Hubble and Webb’s further confirmation of the Hubble Tension sets up other observatories to possibly settle the mystery. NASA’s upcoming Nancy Grace Roman Space Telescope will do wide celestial surveys to study the influence of dark energy, the mysterious energy that is causing the expansion of the universe to accelerate. ESA’s Euclid observatory, with NASA contributions, is pursuing a similar task.

    + + + +

    At present it’s as though the distance ladder observed by Hubble and Webb has firmly set an anchor point on one shoreline of a river, and the afterglow of the big bang observed by Planck’s measurement from the beginning of the universe is set firmly on the other side. How the universe’s expansion was changing in the billions of years between these two endpoints has yet to be directly observed. “We need to find out if we are missing something on how to connect the beginning of the universe and the present day,†Riess said.

    + + + +

    These finding were published in the Feb. 6, 2024, issue of The Astrophysical Journal Letters.

    + + + +

    The Hubble Space Telescope has been operating for over three decades and continues to make ground-breaking discoveries that shape our fundamental understanding of the universe. Hubble is a project of international cooperation between NASA and ESA. NASA’s Goddard Space Flight Center manages the telescope. Goddard also conducts mission operations with Lockheed Martin Space in Denver, Colorado. The Space Telescope Science Institute (STScI) in Baltimore, Maryland, conducts Hubble and Webb science operations for NASA. The agency’s Marshall Space Flight Center was the lead field center for the design, development, and construction of the space telescope.

    + + + +

    The James Webb Space Telescope is the world’s premier space science observatory. Webb is solving mysteries in our solar system, looking beyond to distant worlds around other stars, and probing the mysterious structures and origins of our universe and our place in it. Webb is an international program led by NASA with its partners, ESA (European Space Agency) and the Canadian Space Agency. Several NASA centers contributed to Webb’s development, including Marshall.

    + + + +

    › Back to Top

    + + + +

    NASA Unveils Design for Message Heading to Jupiter’s Moon Europa

    + + + +

    Following in NASA’s storied tradition of sending inspirational messages into space, the agency has special plans for Europa Clipper, which later this year will launch toward Jupiter’s moon Europa. The moon shows strong evidence of an ocean under its icy crust, with more than twice the amount of water of all of Earth’s oceans combined. A triangular metal plate on the spacecraft will honor that connection to Earth in several ways.

    + + + +

    At the heart of the artifact is an engraving of U.S. Poet Laureate Ada Limón’s handwritten “In Praise of Mystery: A Poem for Europa,†along with a silicon microchip stenciled with more than 2.6 million names submitted by the public. The microchip will be the centerpiece of an illustration of a bottle amid the Jovian system – a reference to NASA’s “Message in a Bottle†campaign, which invited the public to send their names with the spacecraft.

    + + +
    This side of a commemorative plate mounted on NASA’s Europa Clipper spacecraft features U.S. Poet Laureate Ada Limón’s handwritten “In Praise of Mystery: A Poem for Europa.†It will be affixed with a silicon microchip stenciled with names submitted by the public.
    This side of a commemorative plate mounted on NASA’s Europa Clipper spacecraft features U.S. Poet Laureate Ada Limón’s handwritten “In Praise of Mystery: A Poem for Europa.†It will be affixed with a silicon microchip stenciled with names submitted by the public.
    NASA/JPL-Caltech
    + + +

    Made of the metal tantalum and about 7 by 11 inches, the plate features graphic elements on both sides. The outward-facing panel features art that highlights Earth’s connection to Europa. Linguists collected recordings of the word “water†spoken in 103 languages, from families of languages around the world. The audio files were converted into waveforms (visual representations of sound waves) and etched into the plate. The waveforms radiate out from a symbol representing the American Sign Language sign for “water.â€

    + + + +

    To hear audio of the spoken languages and see the sign, go to: go.nasa.gov/MakeWaves.

    + + + +

    In the spirit of the Voyager spacecraft’s Golden Record, which carries sounds and images to convey the richness and diversity of life on Earth, the layered message on Europa Clipper aims to spark the imagination and offer a unifying vision.

    + + + +

    “The content and design of Europa Clipper’s vault plate are swimming with meaning,†said Lori Glaze, director of the Planetary Science Division at NASA Headquarters. “The plate combines the best humanity has to offer across the universe – science, technology, education, art, and math. The message of connection through water, essential for all forms of life as we know it, perfectly illustrates Earth’s tie to this mysterious ocean world we are setting out to explore.â€

    + + + +

    In 2030, after a 1.6-billion-mile journey, Europa Clipper will begin orbiting Jupiter, making 49 close flybys of Europa. To determine if there are conditions that could support life, the spacecraft’s powerful suite of science instruments will gather data about the moon’s subsurface ocean, icy crust, thin atmosphere, and space environment. The electronics for those instruments are housed in a massive metal vault designed to protect them from Jupiter’s punishing radiation. The commemorative plate will seal an opening in the vault.

    + + +
    The art on this side of the plate, which will seal an opening of the vault on NASA’s Europa Clipper, features waveforms that are visual representations of the sound waves formed by the word “water†in 103 languages. At center is a symbol representing the American Sign Language sign for “water.â€
    NASA/JPL-Caltech
    + + +

    Because searching for habitable conditions is central to the mission, the Drake Equation is etched onto the plate as well – on the inward-facing side. Astronomer Frank Drake developed the mathematical formulation in 1961 to estimate the possibility of finding advanced civilizations beyond Earth. The equation has inspired and guided research in astrobiology and related fields ever since.

    + + + +

    In addition, artwork on the inward-facing side of the plate will include a reference to the radio frequencies considered plausible for interstellar communication, symbolizing how humanity uses this radio band to listen for messages from the cosmos. These frequencies match the radio waves emitted in space by the components of water and are known by astronomers as the “water hole.†On the plate, they are depicted as radio emission lines.

    + + + +

    Finally, the plate includes a portrait of one of the founders of planetary science, Ron Greeley, whose early efforts to develop a Europa mission two decades ago laid the foundation for Europa Clipper.

    + + + +

    “We’ve packed a lot of thought and inspiration into this plate design, as we have into this mission itself,†said project scientist Robert Pappalardo of NASA’s Jet Propulsion Laboratory (JPL). “It’s been a decades-long journey, and we can’t wait to see what Europa Clipper shows us at this water world.â€

    + + + +
    + +
    Learn more about how Europa Clipper’s vault plate engravings were designed and the inspiration for the plate’s multilayered message. (NASA/JPL-Caltech)
    + + + +

    Once assembly of Europa Clipper has been completed at JPL, the spacecraft will be shipped to NASA’s Kennedy Space Center in preparation for its October launch.

    + + + +

    Europa Clipper’s main science goal is to determine whether there are places below Jupiter’s icy moon, Europa, that could support life. The mission’s three main science objectives are to determine the thickness of the moon’s icy shell and its surface interactions with the ocean below, to investigate its composition, and to characterize its geology. The mission’s detailed exploration of Europa will help scientists better understand the astrobiological potential for habitable worlds beyond our planet.

    + + + +

    Managed by Caltech in Pasadena, California, JPL leads the development of the Europa Clipper mission in partnership with the Johns Hopkins Applied Physics Laboratory (APL) in Laurel, Maryland, for NASA’s Science Mission Directorate. APL designed the main spacecraft body in collaboration with JPL and NASA’s Goddard Space Flight Center. The Planetary Missions Program Office at NASA’s Marshall Space Flight Center executes program management of the Europa Clipper mission.

    + + + +

    › Back to Top

    +]]>
    + + + + + + NASA’s Design for Message Heading to Jupiter’s Moon Europa + + + nonadult + +
    + + Apollo 9 Crew Comes Home + https://www.nasa.gov/image-article/apollo-9-crew-comes-home/ + + + Wed, 13 Mar 2024 18:45:27 +0000 + + + + + + https://www.nasa.gov/?post_type=image-article&p=631278 + + +
    A recovery helicopter with "Navy" and "54" stenciled on it hovers above the water, the wind from its blades creating rings of circles below. Directly below the helicopter is an orange and white parachute. At bottom right is the Apollo 9 command module, where the astronauts await recovery.
    NASA
    + + +

    Fifty-five years ago today, NASA astronauts James A. McDivitt, David R. Scott, and Russell L. Schweickart splashed down 4.5 nautical miles from the USS Guadalcanal, concluding a successful 10-day Earth-orbital mission in space. In this image from March 13, 1969, a recovery helicopter hovers above the Apollo 9 spacecraft; the astronauts were still inside the command module.

    + + + +

    Apollo 9 was the first crewed flight of the command/service module along with the lunar module. The mission’s three-person crew tested several aspects critical to landing on the Moon including the lunar module’s engines, backpack life support systems, navigation systems, and docking maneuvers.

    + + + +

    See more photos from Apollo 9.

    + + + +

    Image Credit: NASA

    +]]>
    + + + +
    + + NASA’s Space Tech Prize Bolsters Diversity, Inclusivity Champions  + https://www.nasa.gov/news-release/nasas-space-tech-prize-bolsters-diversity-inclusivity-champions/ + + + Wed, 13 Mar 2024 18:33:04 +0000 + + + + + + https://www.nasa.gov/?post_type=press-release&p=631366 + + +
    A graphic of the NASA "meatball" insignia, a blue circle crossed by a red V-shaped swoosh, against a black background.
    Credits: NASA
    + + +

    NASA selected the first winners of the agency’s Space Tech Catalyst prize to expand engagement with underrepresented and diverse individuals in the space technology sector as part of the agency’s broader commitment to inclusivity and collaboration. The winners are receiving $25,000 each to create more inclusive space technology ecosystems.

    + + + +

    “As NASA continues to explore the unknown, making the impossible possible, we are committed to engaging talents from all backgrounds to advance exploration,†said Shahra Lambert, NASA senior advisor for engagement. “By providing funding to this space technology community, NASA is ensuring the Artemis Generation will have the necessary tools to expand humanity’s reach.â€

    + + + +

    Winning individuals and organizations demonstrate the best collaboration practices with diverse researchers, technologists, and entrepreneurs. The champions also bring effective strategies that contribute to NASA’s ongoing efforts to develop a representative space technology landscape, while enhancing its ability to find creative solutions to technical challenges.

    + + + +

    The winners are:

    + + + +
      +
    • Caitlin O’Brien, SciAccess, Inc.
    • + + + +
    • Zainab Abbas, SciTech@U
    • + + + +
    • Bahiy Watson, The 1881 Institute
    • + + + +
    • Amber Imai-Hong, Mahina Aerospace
    • + + + +
    • Marta Miletic, San Diego State University
    • + + + +
    • Felecia Brown, NorthStar of GIS
    • + + + +
    • Diego Sandoval, Cyncrocity
    • + + + +
    • Arif Rahman, Hawaii Pacific University
    • + + + +
    • Sierra Brown
    • + + + +
    • Denise Thorsen, University of Alaska Fairbanks
    • + + + +
    • Joshua Neubert, Institute of Competition Sciences
    • + + + +
    • Madison Feehan, Space Copy, Inc.
    • + + + +
    • Johnie Turnage, Black Tech Saturdays
    • + + + +
    • Athip Thirupathi Raj, University of Arizona SpaceTREx Lab
    • + + + +
    • Janeya Griffin, Equity Space Alliance, Inc.
    • + + + +
    • Annika Rollock, Aurelia Institute
    • + + + +
    • M. von Nkosi, Institute for Local Innovations, Inc.
    • + + + +
    • Joseph Grant, New Generation Solutions SST
    • + + + +
    • Sambit Bhattacharya, Fayetteville State University
    • + + + +
    • Dalia David, Honest Eating, LLC
    • +
    + + + +

    Each winner was selected for proving their ability to engage and develop underrepresented groups in space technology development, broaden NASA’s outreach efforts to diverse sources of developers, and build a community of emerging innovators equipped to compete for the agency’s technology development opportunities.

    + + + +

    “We are proud to recognize and celebrate the accomplishments of these exceptional individuals and organizations leading the way in building an inclusive community in space technology for the benefit of humanity,” said Denna Lambert, inclusive innovation team lead, Space Technology Mission Directorate (STMD) at NASA Headquarters in Washington. “Their dedication and success in engaging underrepresented groups will undoubtedly inspire others to join us in advancing the frontiers of space exploration and innovation.”

    + + + +

    To increase collaboration between NASA and its community partners, each winner will attend an in-person event at NASA’s Goddard Space Flight Center in Greenbelt, Maryland. Representatives from NASA and the winning organizations will participate in community-building activities to emphasize knowledge sharing, increase awareness of NASA’s competitive research and development environment, and expand the agency’s reach into diverse innovator communities.

    + + + +

    The Space Tech Catalyst Prize, funded by STMD, is part of a commitment to expand NASA’s network of competitive proposers and enhance engagement approaches.

    + + + +

    For more information, visit: 

    + + + +

    https://www.spacetechcatalystprize.org/

    + + + +

    -end-

    + + + +

    Jimi Russell
    Headquarters, Washington
    202-358-1600
    james.j.russell@nasa.gov

    + + + +

    Gerelle Dodson
    Headquarters, Washington
    202-358-1600
    gerelle.q.dodson@nasa.gov

    + + +
    +
    +
    +
    +
    +
    +

    Share

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    Last Updated
    +
    +
    Mar 13, 2024
    +
    +
    +
    + +
    +
    +
    ]]>
    + + + +
    + + NASA Awards Grants for Lunar Instrumentation + https://science.nasa.gov/directorates/smd/nasa-awards-grants-for-lunar-instrumentation/ + + + Wed, 13 Mar 2024 18:25:10 +0000 + + + + + https://science.nasa.gov/directorates/smd/nasa-awards-grants-for-lunar-instrumentation/ + + + +
    +
    +

    5 min read

    +

    NASA Awards Grants for Lunar Instrumentation

    +
    +
    + +

    NASA has awarded five scientists and engineers Development and Advancement of Lunar Instrumentation (DALI) grants to support the development of instruments for potential use in future lunar missions, including the agency’s Commercial Lunar Payload Services and Artemis campaign. 

    +

    The awardees were recognized during NASA’s Technology Development Plan plenary session at the 55th Lunar and Planetary Science Conference (LPSC) March 13, in The Woodlands, Texas. 

    +

    “Supporting innovation and research in science and technology is a central part of NASA’s overall mission,†said Joel Kearns, deputy associate administrator for exploration in NASA’s Science Mission Directorate in Washington. “These tools must demonstrate new technologies that significantly improve instrument measurement capabilities for addressing high-priority lunar science questions.â€Â 

    +

    The goal of DALI is to develop and demonstrate instruments that show promise for use in future NASA flight opportunities. In addition, the instruments are intended to be ready for flight hardware build after the three-year project duration. Each of the selected scientists is granted approximately $1 million per year to develop their instrument. 

    +

    The grantees are based at institutions across the country:

    +
    +
    +
    +
    DALI Grantees
    +
    DALI grantees: Stuart George, Jason Kriesel, David Stillman, Jeffrey Gillis-Davis, Hao Cao
    +
    +
    +
    +

    DALI grantees: Stuart George, Jason Kriesel, David Stillman, Jeffrey Gillis-Davis, Hao Cao

    +

    Stuart George, NASA’s Johnson Space Center in Houston

    +

    In this project, Dr. George will develop the Compact Electron Proton Spectrometer (CEPS), a miniaturized space weather and radiation measurement instrument. CEPS will provide long-term, science-quality space environment monitoring specifically targeted at real time forecasting of solar energetic particle events on the lunar surface, as well as radiation monitoring data for crew health and protection. A particular focus of the CEPS instrument is saturation-free measurement of the largest and most extreme solar particle events and high quality discrimination of proton and electron signals.

    +

    Jason Kriesel, Opto- Knowledge Systems, Inc (OKSI) in Torrance, California

    +

    Jason Kriesel, of OKSI, is teaming with Honeybee Robotics and NASA’s Goddard Space Flight Center in Greenbelt, Maryland, to produce a prototype instrument to measure lunar water and other volatiles on the Moon. The instrument will be designed to help answer important specific questions related to the origin, history, and future of water on the Moon, as well as help better understand planetary processes in general. The project will push forward a novel measurement approach using a hollow fiber optic gas cell, called a capillary absorption spectrometer (CAS). The CAS will be paired with a sample handling system optimized for analysis on the Moon. The resulting Lunar CAS (LuCAS) prototype will prove the technology on Earth, paving the way for its use on the Moon.   

    +

    David Stillman, Southwest Research Institute (SwRI) in Boulder, Colorado

    +

    The focus of Dr. Stillman’s project is the Synthetic Pulse Artemis Radar for Crustal Imaging (SPARCI; pronounced “sparkyâ€), a novel ground penetrating radar (GPR). SPARCI uses two stationary transmitting antennas and a mobile receiver. This geometry was pioneered by the Apollo 17 Surface Electrical Properties (SEP) experiment. As a robotic or crewed rover traverses away from the transmitter, images of subsurface interfaces or discontinuities are built up. SPARCI uses a much wider bandwidth than the SEP, enabling both deeper and higher-resolution imaging, and its coded signals provide higher signal-to-noise. SPARCI will determine the thickness and density of the regolith (~10 meters), the structure of the upper megaregolith (100s m to kms), and the depth to the lower megaregolith (several km). SPARCI is therefore designed to advance our understanding of impact processes and crustal stratigraphy at the Artemis landing site(s), and eventually elsewhere on the Moon or other planets. 

    +

    Jeffrey Gillis-Davis, Washington University in St. Louis, Missouri

    +

    Dr. Gillis-Davis will lead the effort to develop an instrument to measure the chemistry of lunar materials using Laser-Induced Breakdown Spectroscopy (LIBS). Compositional information acquired by LIBS will help identify major lunar rock types as well as determine major element ice compositions, which relate to volatile sources. Knowledge about the chemical composition of these materials is of fundamental importance in lunar science. For instance, determining the proportions of different lunar rock types at exploration sites satisfies key goals of NASA and the lunar community. Further, measurements by this instrument are essential for figuring out how much water or other resources are present in a particular location on the Moon and could provide a necessary step toward better understanding water delivery to the Earth-Moon system. This LIBS system would incorporate cutting-edge technologies while reducing size, weight, and power relative to other LIBS systems. 

    +

    Hao Cao, University of California, Los Angeles

    +

    In this project, Dr. Cao and team will be developing a miniaturized, low-power, ultra-stable fluxgate magnetometer system for prolonged, uninterrupted operation on the lunar surface. The system incorporates a low-power, magnetically-clean thermal solution to achieve a temperature stability of 0.2 degrees Celsius at two distinct set-point temperatures, one for the lunar day and the other for the lunar night, to minimize fluxgate sensor offset drifts. This instrument will facilitate high-precision monitoring of the lunar magnetic fields across different timescales, enabling survey of the lunar surface magnetic environment and low-frequency electromagnetic sounding of the lunar deep interior. These measurements will provide invaluable insights into the bulk water content of the lunar mantle, characteristics of the partial melt layer above the lunar core, and the physical properties of the iron core of the Moon; thus, placing critical constraints on the formation and evolution of the Earth-Moon system.

    +

    The deadline for NASA’s DALI24 Step-1 submissions is April 12, 2024.  

    +

    DALI is part of NASA’s Lunar Discovery and Exploration Program (LDEP), which is managed by Science Mission Directorate’s Exploration Science Strategy and Integration Office (ESSIO). ESSIO ensures science is infused into all aspects of lunar exploration and leads lunar science integration within the Science Mission Directorate, with other NASA mission directorates, other government agencies, international partners, and commercial communities.

    +

    For more information about NASA’s Exploration Science Strategy Integration Office (ESSIO), visit:

    +

    https://science.nasa.gov/lunar-science/

    + + + +]]>
    + + + +
    + + NASA Armstrong Updates 1960s Concept to Study Giant Planets + https://www.nasa.gov/centers-and-facilities/armstrong/nasa-armstrong-updates-1960s-concept-to-study-giant-planets/ + + + Wed, 13 Mar 2024 18:21:18 +0000 + + + + + + + https://www.nasa.gov/?p=630902 + + +

    3 min read

    Preparations for Next Moonwalk Simulations Underway (and Underwater)

    + +
    A man holds a model aircraft model, and two more are on the table in front of him.
    John Bodylski holds a balsa wood model of his proposed aircraft that could be an atmospheric probe. Directly in front of him is a fully assembled version of the aircraft and a large section of a second prototype at NASA’s Armstrong Flight Research Center in Edwards, California.
    NASA/Steve Freeman
    + + +

    NASA researchers are looking at the possibility of using a wingless, unpowered aircraft design from the 1960s to gather atmospheric data on other planets – doing the same work as small satellites but potentially better and more economically.

    + + + +

    John Bodylski, a principal investigator at NASA’s Armstrong Flight Research Center in Edwards, California, hypothesized a lifting body aircraft design NASA tested decades ago could meet the requirements for an atmospheric probe that can collect measurements of giant planets, like Uranus. The design relies on the aircraft’s shape for lift, rather than wings.

    + + +
    Three aircraft are in a row on a dry lakebed.
    The lifting body aircraft on Rogers Dry Lake, near what is now NASA’s Armstrong Flight Research Center in Edwards, California, include, from left, the X-24A, the M2-F3, and the HL-10.
    NASA
    + + +

    Bodylski submitted his idea and earned a NASA Armstrong Center Innovation Fund award to write a technical paper explaining the concept and design. The award also supports construction of models to help people conceptualize his atmospheric probe. Enter the NASA Armstrong Dale Reed Subscale Flight Research Laboratory.

    + + + +

    Robert “Red†Jensen and Justin Hall, two of the lab’s designers, technicians, and pilots, brought Bodylski’s designs to life. Jensen and Hall created a mold, then layered in carbon-fiber and foam that cured for eight hours under vacuum. The parts were removed from the molds, refined, and later joined together.

    + + +
    Two men layer composite material on an aircraft model mold.
    Justin Hall, left, and Robert “Red†Jensen, at NASA’s Armstrong Flight Research Center in Edwards, California, add layers of carbon fiber and foam in a mold. Another few layers will be added and then it will be cured about eight hours under vacuum. The parts were later removed from molds, refined, and joined for an aircraft that is designed to be an atmospheric probe.
    NASA/Steve Freeman
    + +
    Two men work to seal an aircraft model mold to cure for eight hours.
    Justin Hall, left, and Robert “Red†Jensen work to eliminate the air around an aircraft mold where it will cure for eight hours. The subscale aircraft development at NASA’s Armstrong Flight Research Center in Edwards, California, may result in an atmospheric probe.
    NASA/Steve Freeman
    + + +

    The first of the two lifting body aircraft, both of which are 27 1/2 inches long, and 24 inches wide, is complete and offers a first look at the concept. The second aircraft is almost ready and includes hinged flight control surfaces. Flight controls systems connected to those surfaces will be mounted inside the structure before the model’s final assembly.

    + + + +

    Together, the two models can test Bodylski’s ideas and provide flight data for creating better computer models. In the future, those computer models could help researchers built atmospheric probes based on those designs. Bodylski’s concept called for sending the aircraft on missions attached to satellites. Once in the orbit of a planet, the probe aircraft – about the same size as the models – would separate from the satellite through pyrotechnic bolts, deploying in the atmosphere to collect data for study.

    + + +
    Two men take a major section of an aircraft model out of a mold.
    Robert “Red†Jensen removes a major component from an aircraft mold for assembly of a prototype of an atmospheric probe as Justin Hall watches at NASA’s Armstrong Flight Research Center in Edwards, California.
    NASA/Steve Freeman
    + + +

    Current atmospheric probes, small satellites known as CubeSats, gather and transmit data for about 40 minutes and can take in approximately 10 data points before their parent satellite is out of range. Bodylski’s design could descend more rapidly and at a steeper angle, collecting the same information in 10 minutes, plus additional data for another 30 minutes from much deeper in a thick atmosphere.

    + + + +

    Following a series of technical briefings and flight readiness reviews, the aircraft is expected to fly in March 2024. It will fly as a glider air-launched from a cradle attached to rotorcraft often used by the lab. Future tests could include powered flight depending on what data researchers determine they need.

    + + + +

    “We are looking to take an idea to flight and show that a lifting body aircraft can fly as a probe at this scale – that it can be stable, that components can be integrated into the probe, and that the aircraft can achieve some amount of lift,†Bodylski said.

    + + +
    +
    +
    +
    +
    +
    +

    Share

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    Last Updated
    +
    +
    Mar 13, 2024
    +
    +
    Editor
    Dede Dinius
    Contact
    +
    + +
    +
    +
    + + + +]]>
    + + + +
    + + Evolved Adapter for Future NASA SLS Flights Readied for Testing + https://www.nasa.gov/image-article/evolved-adapter-for-future-nasa-sls-flights-readied-for-testing/ + + + Wed, 13 Mar 2024 17:30:55 +0000 + + + + + + https://www.nasa.gov/?post_type=image-article&p=631307 + + +
    A test version of the universal stage adapter for the SLS (Space Launch System) rocket for Artemis 4 is seen inside Marshall Space Flight Center’s facility in Huntsville, Alabama. The adapter sits on a yellow piece of hardware. There is an American flag hanging on the wall to the right and the word “Leidos†is painted black on the white adapter.
    NASA/Sam Lott
    + + +

    A test version of the universal stage adapter for NASA’s more powerful version of its SLS (Space Launch System) rocket arrived to Building 4619 at NASA’s Marshall Space Flight Center in Huntsville, Alabama, Feb. 22 from Leidos in Decatur, Alabama. The universal stage adapter will connect the rocket’s upgraded in-space propulsion stage, called the exploration upper stage, to NASA’s Orion spacecraft as part of the evolved Block 1B configuration of the SLS rocket. It will also serve as a compartment capable of accommodating large payloads, such as modules or other exploration spacecraft. The SLS Block 1B variant will debut on Artemis IV and will increase SLS’s payload capability to send more than 84,000 pounds to the Moon in a single launch.

    + + + +

    In Building 4619’s Load Test Annex High Bay at Marshall, the development test article will first undergo modal testing that will shake the hardware to validate dynamic models. Later, during ultimate load testing, force will be applied vertically and to the sides of the hardware. Unlike the flight hardware, the development test article has flaws intentionally included in its design, which will help engineers verify that the adapter can withstand the extreme forces it will face during launch and flight. The test article joins an already-rich history of rocket hardware that has undergone high-and-low pressure, acoustic, and extreme temperature testing in the multipurpose, high-bay test facility; it will be tested in the same location that once bent, compressed, and torqued the core stage intertank test article for SLS rocket’s Block 1 configuration. Leidos, the prime contractor for the universal stage adapter, manufactured the full-scale prototype at its Aerospace Structures Complex in Decatur.

    + + + +

    NASA is working to land the first woman, first person of color, and its first international partner astronaut on the Moon under Artemis. SLS is part of NASA’s backbone for deep space exploration, along with the Orion spacecraft and Gateway in orbit around the Moon and commercial human landing systems, next-generational spacesuits, and rovers on the lunar surface. SLS is the only rocket that can send Orion, astronauts, and supplies to the Moon in a single launch.

    + + + +

    News Media Contact

    + + + +

    Corinne Beckinger
    Marshall Space Flight Center, Huntsville, Ala.
    256.544.0034
    corinne.m.beckinger@nasa.gov

    +]]>
    + + + +
    + + 8 Must-Have NASA Resources for Science Teachers in 2024 + https://science.nasa.gov/learning-resources/science-activation/8-must-have-nasa-resources-for-science-teachers-in-2024/ + + + Wed, 13 Mar 2024 16:31:23 +0000 + + + https://science.nasa.gov/learning-resources/science-activation/8-must-have-nasa-resources-for-science-teachers-in-2024/ + + + +
    +
    +

    3 min read

    +

    8 Must-Have NASA Resources for Science Teachers in 2024

    +
    +
    + +

    No one can bring the excitement of Earth and space science to the classroom like NASA! 

    +

    Launch your lessons to the next level with these eight essential resources for K-12 teachers:

    +
    +
    +
    +
    A classroom photo with seated children focused on their teacher standing at the front of the room. The walls are filled with colorful projects, artwork and decorations.
    +
    +
    +
    +

    Experience the Total Solar Eclipse 

    +

    Whether you’re on or off the path of totality (find out here!), we’ve put together this guide to help you explore live and virtual opportunities from NASA’s Science Activation Program for safely enjoying the eclipse and even contributing as a volunteer to do NASA Eclipse science.

    +

    An Out-of-this-world Biology Project

    +

    Growing Beyond Earth® (GBE) is a classroom-based citizen science project for middle and high school students about growing plants in space. Curricular materials and resources help you introduce your students to space plant biology and prepare them to participate in the program, through which students have the opportunity to present their findings to NASA Researchers. Materials in English and Spanish.

    +

    Interact with Real Cosmic Data and Imagery

    +

    Data Stories are interactives for high school students that showcase new science imagery and data for a variety of out of this world topics. Ideas for exploration and scientific highlights are included with every story through accompanying video and text.

    +

    Adaptive Learning and Creative Tools from Infiniscope

    +

    Empowering educators to develop next-generation, digital, adaptive learning experiences, Infiniscope provides free content and creative tools to educators who want to personalize learning for their middle and high school students. Join their network and get started here.  

    +

    STEM Literacy through the Lens of NASA 

    +

    NASA eClips provides educators with standards-based videos, educator guides, engineering design packets, and student opportunities for students in grades 3 to 12. Offerings cover a wide variety of topics that include energy, the Moon, clouds, sound, and more!

    +

    All Learners can be Scientists and Engineers

    +

    NASA missions are a perfect way to bring together science and engineering. In PLANETS units, learners in grades 3-8 engineer technologies like optical filters and use them to answer scientific questions like “Where was water on Mars?†Activities emphasize NASA planetary science and engineering and are designed to empower all learners and show that they can be scientists and engineers. 

    +

    Standards-Aligned Digital Resources for Grades K-12

    +

    Engage K–12 students with phenomena and science practices with this collection of supplementary digital media resources from GBH aligned with key NGSS Earth, space, and physical science disciplinary core ideas. To ensure that science content is accessible for all students, supports are included for students with disabilities or who are English learners.

    +

    Kids Explore Earth and Space with NASA!

    +

    NASA’s Space Place helps upper-elementary-aged kids learn space and Earth science through fun games, hands-on activities, art challenges, informative articles, and engaging short videos. With material in both English and Spanish and resources for teachers and parents, NASA Space Place has something for everyone. 

    +

    Didn’t find what you were looking for? Want to explore even more resources? NASA’s Science Activation (SciAct) program offers Learning and Educational Activities and Resources from NASA Science that invite learners of all ages to participate!

    +]]>
    + + + +
    +
    +
    diff --git a/module/move/unitore/tests/frames_download.rs b/module/move/unitore/tests/frames_download.rs new file mode 100644 index 0000000000..ae8119a71d --- /dev/null +++ b/module/move/unitore/tests/frames_download.rs @@ -0,0 +1,121 @@ +use feed_rs::parser as feed_parser; +use gluesql:: +{ + core:: + { + chrono::{ DateTime, Utc }, + data::Value + }, + sled_storage::sled::Config, +}; +use wca::wtools::Itertools; +use unitore:: +{ + feed_config::SubscriptionConfig, + sled_adapter::FeedStorage, + entity::{ frame::FrameStore, feed::FeedStore }, +}; +use error_tools::Result; + +#[ tokio::test ] +async fn test_save() -> Result< () > +{ + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + + let feed_config = SubscriptionConfig + { + update_period : std::time::Duration::from_secs( 1000 ), + link : url::Url::parse( "https://www.nasa.gov/feed/" )?, + }; + + let mut feeds = Vec::new(); + + let feed = feed_parser::parse( include_str!("./fixtures/plain_feed.xml").as_bytes() )?; + feeds.push( ( feed, feed_config.update_period.clone(), feed_config.link.clone() ) ); + feed_storage.feeds_process( feeds ).await?; + + let entries = feed_storage.frames_list().await?; + + let number_of_frames = entries.0[ 0 ].selected_frames.selected_rows.len(); + assert_eq!( number_of_frames, 10 ); + + Ok( () ) +} + +#[ tokio::test ] +async fn test_update() -> Result< () > +{ + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + + let feed_config = SubscriptionConfig + { + update_period : std::time::Duration::from_secs( 1000 ), + link : url::Url::parse( "https://www.nasa.gov/feed/" )?, + }; + + // initial fetch + let feed = feed_parser::parse( include_str!("./fixtures/plain_feed.xml").as_bytes() )?; + let feeds = vec![ ( feed, feed_config.update_period.clone(), feed_config.link.clone() ) ]; + feed_storage.feeds_process( feeds ).await?; + + // updated fetch + let feed = feed_parser::parse( include_str!("./fixtures/updated_one_frame.xml").as_bytes() )?; + + let feeds = vec![ ( feed, feed_config.update_period.clone(), feed_config.link.clone() ) ]; + feed_storage.feeds_process( feeds ).await?; + + // check + let payload = feed_storage.frames_list().await?; + + let entries = payload.0 + .iter() + .map( | val | val.selected_frames.selected_rows.clone() ) + .flatten() + .collect::< Vec< _ > >() + ; + + let entries = entries.iter().map( | entry | + { + let id = match &entry[ 0 ] + { + Value::Str( s ) => s.to_owned(), + _ => String::new(), + }; + + let published = match &entry[ 8 ] + { + Value::Timestamp( date_time ) => date_time.and_utc(), + _ => DateTime::< Utc >::default(), + }; + ( id, published ) + } + ) + .collect_vec() + ; + + // no duplicates + assert_eq!( entries.len(), 10 ); + + // check date + let updated = entries.iter().find + ( + | ( id, _published ) | id == "https://www.nasa.gov/?post_type=image-article&p=631537" + ); + assert!( updated.is_some() ); + let _updated = updated.unwrap(); + Ok( () ) +} diff --git a/module/move/unitore/tests/query_execute.rs b/module/move/unitore/tests/query_execute.rs new file mode 100644 index 0000000000..7741575322 --- /dev/null +++ b/module/move/unitore/tests/query_execute.rs @@ -0,0 +1,187 @@ +use feed_rs::parser as feed_parser; +use unitore:: +{ + feed_config::SubscriptionConfig, + sled_adapter::{ FeedStorage, Store, MockStore }, + entity::{ config::ConfigStore, feed::FeedStore }, + action::{ query::{ self, QueryReport }, config }, + command::query::QueryCommand, +}; +use gluesql:: +{ + prelude::{ Payload::{ self, Select }, Value::{ Str, Timestamp } }, + core::chrono::NaiveDateTime, + sled_storage::sled, +}; +use wca::{ VerifiedCommand, CommandsAggregator, Type, Parser, Dictionary, Verifier, Executor }; +use error_tools::Result; +use mockall::predicate; +use std::path::PathBuf; + +#[ test ] +fn query_execute() -> Result< () > +{ + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command( QueryCommand::execute()? ) + .form() + ; + let verifier = Verifier; + + // init executor + let executor = Executor::former().form(); + let args = vec![ ".query.execute".to_string(), "SELECT title FROM frame".into() ]; + let raw_program = parser.parse( args ).unwrap(); + let grammar_program = verifier.to_program( dictionary, raw_program ).unwrap(); + + let res = executor.program( dictionary, grammar_program ); + assert!( res.is_ok() ); + + // test action + let rt = tokio::runtime::Runtime::new()?; + let ca = CommandsAggregator::former() + .command( "query.execute" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .subject().hint( "SQL query" ).kind( Type::String ).optional( false ).end() + .routine( move | o : VerifiedCommand | + { + let mut f_store = MockStore::new(); + f_store + .expect_query_execute() + .with( predicate::eq( "SELECT title FROM frame".to_string() ) ) + .times( 1 ) + .returning( | _ | Ok( QueryReport + ( + vec! + [ + Select { labels : vec![ Str( "title".to_string() ).into() ], rows : Vec::new() } + ] + ) + ) ) + ; + _ = rt.block_on( async move + { + let query_arg = o.args + .get_owned::< String >( 0 ) + ; + + let query_str = query_arg.unwrap(); + query::query_execute( f_store, query_str ).await + } ); + } ) + .end() + .perform(); + let entries = ca.perform( vec![ ".query.execute".to_string(), "SELECT title FROM frame".into() ] ); + assert!( entries.is_ok() ); + Ok( () ) +} + +#[ tokio::test ] +async fn query_feeds() -> Result< () > +{ + let path = PathBuf::from( "./tests/fixtures/test_config.toml" ); + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = sled::Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + config::config_add( feed_storage.clone(), &path ).await?; + + let entries = feed_storage.query_execute( "SELECT link FROM feed".to_string() ).await?; + + assert!( !entries.0.is_empty() ); + if let Select { labels, rows } = &entries.0[ 0 ] + { + assert_eq!( labels.len(), 1 ); + assert_eq!( labels[ 0 ], "link" ); + assert_eq!( rows.len(), 1 ); + } + else + { + assert!( false ) + } + + Ok( () ) +} + +#[ tokio::test ] +async fn query_frames() -> Result< () > +{ + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = sled::Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + let feed_config = SubscriptionConfig + { + update_period : std::time::Duration::from_secs( 1000 ), + link : url::Url::parse( "https://www.nasa.gov/feed/" )?, + }; + let mut feeds = Vec::new(); + + let feed = feed_parser::parse( include_str!("./fixtures/plain_feed.xml").as_bytes() )?; + feeds.push( ( feed, feed_config.update_period.clone(), feed_config.link.clone() ) ); + feed_storage.feeds_process( feeds ).await?; + + let entries = feed_storage.query_execute( "SELECT title, published FROM frame ORDER BY published".to_string() ).await?; + + assert!( !entries.0.is_empty() ); + + if let Select { labels, rows } = &entries.0[ 0 ] + { + assert_eq!( labels.len(), 2 ); + assert!( labels.contains( &String::from( "title" ) ) ); + assert!( labels.contains( &String::from( "published" ) ) ); + assert_eq!( rows.len(), 10 ); + assert_eq!( rows[ 0 ][ 0 ], Str( "8 Must-Have NASA Resources for Science Teachers in 2024".to_string() ) ); + assert_eq!( rows[ 0 ][ 1 ], Timestamp( NaiveDateTime::parse_from_str( "13 Mar 2024 16:31:23", "%d %b %Y %H:%M:%S" )? ) ); + assert_eq!( rows[ 9 ][ 0 ], Str( "Icing Cloud Characterization Engineer Emily Timko".to_string() ) ); + assert_eq!( rows[ 9 ][ 1 ], Timestamp( NaiveDateTime::parse_from_str( "14 Mar 2024 14:27:52", "%d %b %Y %H:%M:%S" )? ) ); + } + else + { + assert!( false ) + } + + Ok( () ) +} + +#[ tokio::test ] +async fn query_configs() -> Result< () > +{ + let path = PathBuf::from( "./tests/fixtures/test_config.toml" ); + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = sled::Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + let _res = feed_storage.query_execute( format!( "INSERT INTO config VALUES ('{}') ", path.to_string_lossy().to_string() ) ).await?; + let res = feed_storage.config_list().await?; + + if let Payload::Select{ labels, rows } = &res + { + assert_eq!( labels.len(), 1 ); + assert!( labels.contains( &String::from( "path" ) ) ); + assert_eq!( rows.len(), 1 ); + assert_eq!( rows[ 0 ][ 0 ], Str( path.to_string_lossy().to_string() ) ); + } + else + { + assert!( false ); + } + + Ok( () ) +} diff --git a/module/move/unitore/tests/table_list.rs b/module/move/unitore/tests/table_list.rs new file mode 100644 index 0000000000..188d1a3131 --- /dev/null +++ b/module/move/unitore/tests/table_list.rs @@ -0,0 +1,47 @@ +use gluesql:: +{ + sled_storage::sled::Config, + prelude::{ Payload, Value::Str }, +}; +use unitore:: +{ + sled_adapter::FeedStorage, + entity::table::TableStore, +}; +use error_tools::Result; + +#[ tokio::test ] +async fn table_list() -> Result< () > +{ + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + let res = feed_storage.table_list( String::from( "feed" ) ).await?; + + if let Payload::Select { labels: _, rows } = &res[ 0 ] + { + let column_names = rows + .iter() + .map( | row | row[ 1 ].clone() ) + .collect::< Vec< _ > >() + ; + + assert_eq!( column_names.len(), 9 ); + assert!( column_names.contains( &Str( String::from( "published") ) ) ); + assert!( column_names.contains( &Str( String::from( "authors") ) ) ); + assert!( column_names.contains( &Str( String::from( "description") ) ) ); + assert!( column_names.contains( &Str( String::from( "type") ) ) ); + assert!( column_names.contains( &Str( String::from( "title") ) ) ); + assert!( column_names.contains( &Str( String::from( "updated") ) ) ); + assert!( column_names.contains( &Str( String::from( "link") ) ) ); + assert!( column_names.contains( &Str( String::from( "update_period" ) ) ) ); + assert!( column_names.contains( &Str( String::from( "config_file" ) ) ) ); + } + + Ok( () ) +} diff --git a/module/move/unitore/tests/tables_list.rs b/module/move/unitore/tests/tables_list.rs new file mode 100644 index 0000000000..0972041704 --- /dev/null +++ b/module/move/unitore/tests/tables_list.rs @@ -0,0 +1,34 @@ +use gluesql::sled_storage::sled::Config; +use unitore:: +{ + sled_adapter::FeedStorage, + entity::table::TableStore, +}; +use error_tools::Result; + +#[ tokio::test ] +async fn tables_list() -> Result< () > +{ + let temp_path = proper_path_tools::path::unique_folder_name().unwrap(); + + let config = Config::default() + .path( format!( "./{}", temp_path ) ) + .temporary( true ) + ; + + let mut feed_storage = FeedStorage::init_storage( &config ).await?; + let res = feed_storage.tables_list().await?; + + let table_names = res.0 + .iter() + .map( | ( table_name, _info ) | table_name ) + .collect::< Vec< _ > >() + ; + + assert_eq!( table_names.len(), 3 ); + assert!( table_names.contains( &&String::from( "config") ) ); + assert!( table_names.contains( &&String::from( "feed" ) ) ); + assert!( table_names.contains( &&String::from( "frame" ) ) ); + + Ok( () ) +} diff --git a/module/move/wca/Cargo.toml b/module/move/wca/Cargo.toml new file mode 100644 index 0000000000..7489b66fbb --- /dev/null +++ b/module/move/wca/Cargo.toml @@ -0,0 +1,58 @@ +[package] +name = "wca" +version = "0.18.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", + "Bogdan Balushkin ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wca" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/wca" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/move/wca/Readme.md" +description = """ +The tool to make CLI ( commands user interface ). It is able to aggregate external binary applications, as well as functions, which are written in your language. +""" +categories = [ "command-line-interface", "command-line-utilities" ] +keywords = [ "wtools", "CLI", "CUI", "user-interface" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full", "error_tools/enabled", "strs_tools/enabled", "mod_interface/enabled", "iter_tools/enabled", "former/enabled" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled", "on_unknown_suggest" ] +enabled = [] + +# This configuration suggests an action to be done when the command is unknown. In this case, when an unknown command is encountered, the system might suggest alternatives +on_unknown_suggest = [ "dep:textdistance" ] + +[[bench]] +name = "bench" +harness = false + +[dependencies] + +## internal +error_tools = { workspace = true, features = [ "default" ] } +strs_tools = { workspace = true, features = [ "default" ] } +mod_interface = { workspace = true, features = [ "default" ] } +iter_tools = { workspace = true, features = [ "default" ] } +former = { workspace = true, features = [ "default" ] } + +## external +log = "0.4" +#closure = "0.3" +textdistance = { version = "1.0", optional = true } # fuzzy commands search +indexmap = "2.2.6" + +[dev-dependencies] +test_tools = { workspace = true } +assert_fs = "1.0" +criterion = "0.5" diff --git a/module/move/wca/License b/module/move/wca/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/wca/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/wca/Readme.md b/module/move/wca/Readme.md new file mode 100644 index 0000000000..b808fce2bc --- /dev/null +++ b/module/move/wca/Readme.md @@ -0,0 +1,60 @@ + + +# Module :: wca + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml) [![docs.rs](https://img.shields.io/docsrs/wca?color=e3e8f0&logo=docs.rs)](https://docs.rs/wca) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fwca%2Fexamples%2Fwca_trivial.rs,RUN_POSTFIX=--example%20wca_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +The tool to make CLI ( commands user interface ). It is able to aggregate external binary applications, as well as functions, which are written in your language. + +## Sample + + + +```rust +#[ cfg( not( feature = "no_std" ) ) ] +{ + use wca::{ VerifiedCommand, Context, Type }; + + fn main() + { + + let ca = wca::CommandsAggregator::former() + .command( "echo" ) + .hint( "prints all subjects and properties" ) + .subject().hint( "Subject" ).kind( Type::String ).optional( true ).end() + .property( "property" ).hint( "simple property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!( "= Args\n{:?}\n\n= Properties\n{:?}\n", o.args, o.props ) } ) + .end() + .command( "error" ) + .hint( "prints all subjects and properties" ) + .subject().hint( "Error message" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!( "Returns an error" ); Err( format!( "{}", o.args.get_owned::< String >( 0 ).unwrap_or_default() ) ) } ) + .end() + .command( "exit" ) + .hint( "just exit" ) + .routine( || { println!( "exit" ); std::process::exit( 0 ) } ) + .end() + .perform(); + + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + ca.perform( args ).unwrap(); + + } +} +``` + +### To add to your project + +```sh +cargo add wca +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/wca_trivial +cargo run +``` diff --git a/module/move/wca/benches/bench.rs b/module/move/wca/benches/bench.rs new file mode 100644 index 0000000000..a1dfbf1b0e --- /dev/null +++ b/module/move/wca/benches/bench.rs @@ -0,0 +1,116 @@ +#![ allow( missing_debug_implementations ) ] +#![ allow( missing_docs ) ] + +use std::collections::HashMap; +use criterion::{ criterion_group, criterion_main, Criterion }; +use wca::{ CommandsAggregator, Routine, Type }; + +fn init( count : usize, command : wca::Command ) -> CommandsAggregator +{ + let mut commands = Vec::with_capacity( count ); + let mut routines = HashMap::with_capacity( count ); + for i in 0 .. count + { + let name = format!( "command_{i}" ); + + let mut command = command.clone(); + command.phrase = name.clone(); + + commands.push( command ); + routines.insert + ( + name, Routine::new( | _ | { assert_eq!( 1 + 1, 2 ); Ok( () ) } ), + ); + } + + assert_eq!( count, commands.len() ); + assert_eq!( count, routines.len() ); + + CommandsAggregator::former() + .grammar( commands ) + .executor( routines ) + .perform() +} + +fn initialize_commands_without_args( count : usize ) -> CommandsAggregator +{ + init + ( + count, + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "{placeholder}" ) + .form(), + ) +} + +fn initialize_commands_with_subjects( count : usize ) -> CommandsAggregator { + init + ( + count, + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "{placeholder}" ) + .subject( "hint", Type::String, true ) + .subject( "hint", Type::String, true ) + .form(), + ) +} + +fn initialize_commands_with_properties( count : usize ) -> CommandsAggregator { + init + ( + count, + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "{placeholder}" ) + .property( "prop", "hint", Type::String, true ) + .property( "prop2", "hint", Type::String, true ) + .form(), + ) +} + +fn run_commands< S : AsRef< str > >( ca : CommandsAggregator, command : S ) { + ca.perform( command.as_ref() ).unwrap() +} + +fn benchmark_initialize_thousand_commands( c : &mut Criterion ) +{ + const COUNT : usize = 1_000; + + c.bench_function( "initialize_thousand_commands_without_args", | b | b.iter( || initialize_commands_without_args( COUNT ) ) ); + c.bench_function( "initialize_thousand_commands_with_subjects", | b | b.iter( || initialize_commands_with_subjects( COUNT ) ) ); + c.bench_function( "initialize_thousand_commands_with_properties", | b | b.iter( || initialize_commands_with_properties( COUNT ) ) ); +} + +fn benchmark_initialize_and_run_thousand_commands( c : &mut Criterion ) +{ + const COUNT : usize = 1_000; + + c.bench_function( "initialize_and_run_thousand_commands_without_args", | b | b.iter( || + { + let ca = initialize_commands_without_args( COUNT ); + run_commands( ca, ".command_999" ); + } ) ); + c.bench_function( "initialize_and_run_thousand_commands_with_subjects", | b | b.iter( || + { + let ca = initialize_commands_with_subjects( COUNT ); + run_commands( ca, ".command_999" ); + } ) ); + c.bench_function( "initialize_and_run_thousand_commands_with_properties", | b | b.iter( || + { + let ca = initialize_commands_with_properties( COUNT ); + run_commands( ca, ".command_999" ); + } ) ); +} + +criterion_group! +( + benches, + benchmark_initialize_thousand_commands, + benchmark_initialize_and_run_thousand_commands +); +criterion_main!( benches ); diff --git a/module/move/wca/doc/WCA.png b/module/move/wca/doc/WCA.png new file mode 100644 index 0000000000000000000000000000000000000000..3359c444da25024160b3eecd007715f98dc4fe4b GIT binary patch literal 206374 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 I`;0m+~OB1v)v1EGI@^W$u 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 U6!l~EIN(2NDTOQ95_j(ZKNvjE6#xJL literal 0 HcmV?d00001 diff --git a/module/move/wca/doc/wca.md b/module/move/wca/doc/wca.md new file mode 100644 index 0000000000..222573f2e0 --- /dev/null +++ b/module/move/wca/doc/wca.md @@ -0,0 +1,30 @@ +# Diagrams + +## Class diagram + +- `Parser` +> This component takes in raw strings of text and converts them into `ParsedCommand` objects. These objects contain all of the information needed to represent a command, but they haven't been validated or processed in any way yet. + +- `Grammar` +> Contains available commands configured by the user. +> +> Once the `ParsedCommand` objects have been generated, the `Grammar` component steps in. This component takes in the `ParsedCommand`-s and converts them into `VerifiedCommand` objects, which contain subject and property values that have been validated against a set of pre-defined grammar. This ensures that the user's input is structured correctly and can be understood by the system. + +- `Executor` +> Contains available routines configured by the user. +> +> Once the `VerifiedCommand` objects have been generated, the `Executor` component takes over. This component converts the `GrammarCommands` into `ExecutableCommand_` objects, which contain the actual routines that will be executed at runtime. This is where the system takes action based on the user's input. + +- `CommandsAggregator` +> Finally, the `CommandsAggregator` component brings everything together. This component is responsible for configuring the `Parser`, `Grammar`, and `Executor` components based on the user's needs. It also manages the entire pipeline of processing, from parsing the raw text input to executing the final command(parse -> validate -> execute). + + +

    + +
    + +## Sequence diagram + +
    + +
    diff --git a/module/move/wca/examples/wca_fluent.rs b/module/move/wca/examples/wca_fluent.rs new file mode 100644 index 0000000000..cf60d4000c --- /dev/null +++ b/module/move/wca/examples/wca_fluent.rs @@ -0,0 +1,48 @@ +//! +//! # Fluent interface example +//! +//! This module introduces a fluent interface implemented via the `wca::CommandsAggregator`, which provides an intuitive method chaining mechanism for creating a command-line interface. +//! +//! The fluent interface and function chaining make it easy to add, update, or modify commands without breaking the application's flow. This design allows for extensibility while keeping the methods structured and clear, making it a good fit for complex CLI applications' needs. +//! + + +use wca::{ Context, Type, VerifiedCommand }; +use std::sync::{ Arc, Mutex }; + +fn main() +{ + + let ca = wca::CommandsAggregator::former() + .with_context( Mutex::new( 0 ) ) + .command( "echo" ) + .hint( "prints all subjects and properties" ) + .subject().kind( Type::String ).optional( true ).end() + .property( "property" ).hint( "simple property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!( "= Args\n{:?}\n\n= Properties\n{:?}\n", o.args, o.props ) } ) + .end() + .command( "inc" ) + .hint( "This command increments a state number each time it is called consecutively. (E.g. `.inc .inc`)" ) + .routine( | ctx : Context | + { + let i : Arc< Mutex< i32 > > = ctx.get().unwrap(); + let mut i = i.lock().unwrap(); + println!( "i = {}", i ); + *i += 1; + } ) + .end() + .command( "error" ) + .hint( "prints all subjects and properties" ) + .subject().kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!( "Returns an error" ); Err( format!( "{}", o.args.get_owned::< String >( 0 ).unwrap_or_default() ) ) } ) + .end() + .command( "exit" ) + .hint( "just exit" ) + .routine( || { println!( "exit" ); std::process::exit( 0 ) } ) + .end() + .perform(); + + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + ca.perform( args ).unwrap(); + +} diff --git a/module/move/wca/examples/wca_shortcut.rs b/module/move/wca/examples/wca_shortcut.rs new file mode 100644 index 0000000000..7c93f8e4b1 --- /dev/null +++ b/module/move/wca/examples/wca_shortcut.rs @@ -0,0 +1,31 @@ +//! +//! Shortcut to minimize boilerplate. +//! +//! ```shell +//! cargo run --example wca_shortcut .echo a:1 b:2 +//! ``` +//! + +// use wca::CommandExt; +// +// /// Example of a command. +// fn echo( () : (), args : wca::Args, _props : wca::Props ) -> Result< (), () > +// { +// let mut args = args.0.into_iter(); +// wca::parse_args!( args, value: String ); +// +// println!( "{value}" ); +// +// Ok( () ) +// } + +/// Entry point. +fn main() +{ + // let args = std::env::args().skip( 1 ).collect::< Vec< _ > >().join( " " ); + // let aggregator = wca::cui( () ) + // .command( echo.arg( "string", wca::Type::String ) ) + // .build() + // ; + // aggregator.perform( args ).unwrap(); +} diff --git a/module/move/wca/examples/wca_suggest.rs b/module/move/wca/examples/wca_suggest.rs new file mode 100644 index 0000000000..2bb73fa111 --- /dev/null +++ b/module/move/wca/examples/wca_suggest.rs @@ -0,0 +1,47 @@ +//! Using this feature, when calling a command with an invalid name, the error text will contain +//! a sentence with a correction, e.g. if you type: +//! +//! ```shell +//! cargo run --features on_unknown_suggest --example wca_suggest .echoooo +//! ``` +//! +//! you will see the message: +//! +//! ```text +//! Validation error. Can not identify a command. +//! Details: Command not found. Maybe you mean `.echo`? +//! ``` +//! +//! Otherwise +//! +//! ```text +//! Validation error. Can not identify a command. +//! Details: Command not found. Please use `.` command to see the list of available commands. +//! ``` +//! + +use wca::{ CommandsAggregator, Type, VerifiedCommand }; + +fn main() +{ + + let ca = CommandsAggregator::former() + .command( "echo" ) + .hint( "prints all subjects and properties" ) + .subject().kind( Type::String ).optional( true ).end() + .property( "property" ).hint( "simple property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | + { + println!( "= Args\n{:?}\n\n= Properties\n{:?}\n", o.args, o.props ); + }) + .end() + .perform(); + + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + match ca.perform( args.join( " " ) ) + { + Ok( _ ) => {} + Err( err ) => println!( "{err}" ), + }; + +} diff --git a/module/move/wca/examples/wca_trivial.rs b/module/move/wca/examples/wca_trivial.rs new file mode 100644 index 0000000000..c228e6e20a --- /dev/null +++ b/module/move/wca/examples/wca_trivial.rs @@ -0,0 +1,55 @@ +//! +//! A trivial example. +//! + +use wca::{ CommandsAggregator, Order, Type, VerifiedCommand }; + +fn f1( o : VerifiedCommand ) +{ + println!( "= Args\n{:?}\n\n= Properties\n{:?}\n", o.args, o.props ); +} + +fn exit() +{ + println!( "just exit" ); + + std::process::exit( 0 ) +} + +fn main() +{ + let ca = CommandsAggregator::former() + .command( "exit" ) + .hint( "just exit" ) + .routine( || exit() ) + .end() + .command( "echo" ) + .hint( "prints all subjects and properties" ) + .subject().hint( "Subject" ).kind( Type::String ).optional( true ).end() + .property( "property" ).hint( "simple property" ).kind( Type::String ).optional( true ).end() + .routine( f1 ) + .end() + .order( Order::Lexicography ) + .perform() + ; + + // aaa : qqq2 : for Bohdan : that should work + // let ca = wca::CommandsAggregator::former() + // .command( "echo" ) + // .hint( "prints all subjects and properties" ) + // .subject( "Subject", wca::Type::String, true ) + // .property( "property", "simple property", wca::Type::String, true ) + // .routine( f1 ) + // .end() + // .command( "exit" ) + // .hint( "just exit" ) + // .routine( || exit() ) + // .end() + // .perform() + // ; + // ca.execute( input ).unwrap(); + //aaa: works + + let input = std::env::args().skip( 1 ).collect::< Vec< String > >(); + ca.perform( input ).unwrap(); +} diff --git a/module/move/wca/src/ca/aggregator.rs b/module/move/wca/src/ca/aggregator.rs new file mode 100644 index 0000000000..1d81a4e945 --- /dev/null +++ b/module/move/wca/src/ca/aggregator.rs @@ -0,0 +1,296 @@ +pub( crate ) mod private +{ + use crate::*; + use ca:: + { + Verifier, + Executor, + grammar::command::private:: + { + CommandFormer, + CommandAsSubformer, + CommandAsSubformerEnd, + CommandFormerStorage + }, + help::{ HelpGeneratorFn, HelpGeneratorOptions, HelpVariants }, + }; + + use std::collections::HashSet; + use std::fmt; + use former::StoragePreform; + use wtools::thiserror; + use wtools::error:: + { + Result, + for_app::Error as wError, + for_lib::*, + }; + use wtools::Itertools; + + /// Order of commands and properties. + #[ derive( Debug, Default, Clone, Copy, Eq, PartialOrd, PartialEq ) ] + pub enum Order + { + /// Natures order. + #[ default ] + Nature, + /// Lexicography order. + Lexicography, + } + + /// Validation errors that can occur in application. + #[ derive( Error, Debug ) ] + pub enum ValidationError + { + /// This variant is used to represent parser errors. + /// It carries a `String` payload that provides additional information about the error. + #[ error( "The following input is not recognized: `{input}`.\nDetails: {error}" ) ] + Parser + { + /// source of the program + input : String, + /// original error + error : wError, + }, + /// This variant represents errors that occur during grammar conversion. + #[ error( "Can not identify a command.\nDetails: {0}" ) ] + Verifier( wError ), + /// This variant is used to represent errors that occur during executor conversion. + #[ error( "Can not find a routine for a command.\nDetails: {0}" ) ] + ExecutorConverter( wError ), + } + + /// Errors that can occur in application. + #[ derive( Error, Debug ) ] + pub enum Error + { + /// This variant is used to represent validation errors. + /// It carries a `ValidationError` payload that provides additional information about the error. + #[ error( "Validation error. {0}" ) ] + Validation( ValidationError ), + /// This variant represents execution errors. + #[ error( "Execution failed. {0:?}" ) ] + Execution( wError ), + } + + // xxx : qqq : qqq2 : for Bohdan : one level is obviously redundant + // Program< Namespace< ExecutableCommand_ > > -> Program< ExecutableCommand_ > + // aaa : done. The concept of `Namespace` has been removed + struct CommandsAggregatorCallback( Box< dyn Fn( &str, &Program< VerifiedCommand > ) > ); + + impl fmt::Debug for CommandsAggregatorCallback + { + fn fmt( &self, f : &mut fmt::Formatter< '_ > ) -> fmt::Result + { + f.debug_struct( "CommandsAggregatorCallback" ).finish_non_exhaustive() + } + } + + /// The `CommandsAggregator` struct is responsible for aggregating all commands that the user defines, + /// and for parsing and executing them. It is the main entry point of the library. + /// + /// CommandsAggregator component brings everything together. This component is responsible for configuring the `Parser`, `Grammar`, and `Executor` components based on the user’s needs. It also manages the entire pipeline of processing, from parsing the raw text input to executing the final command(parse -> validate -> execute). + /// + /// # Example: + /// + /// ``` + /// use wca::{ CommandsAggregator, VerifiedCommand, Type }; + /// + /// # fn main() -> Result< (), Box< dyn std::error::Error > > { + /// let ca = CommandsAggregator::former() + /// .command( "echo" ) + /// .hint( "prints all subjects and properties" ) + /// .subject().hint( "argument" ).kind( Type::String ).optional( false ).end() + /// .property( "property" ).hint( "simple property" ).kind( Type::String ).optional( false ).end() + /// .routine( | o : VerifiedCommand | println!( "= Args\n{:?}\n\n= Properties\n{:?}\n", o.args, o.props ) ) + /// .end() + /// .perform(); + /// + /// ca.perform( ".echo something" )?; + /// # Ok( () ) } + /// ``` + #[ derive( Debug ) ] + #[ derive( former::Former ) ] + #[ storage_fields( help_generator : HelpGeneratorFn, help_variants : HashSet< HelpVariants >, order : Order ) ] + #[ mutator( custom ) ] + // #[ debug ] + pub struct CommandsAggregator + { + #[ former( default = Dictionary::default() ) ] + dictionary : Dictionary, + + #[ former( default = Parser ) ] + parser : Parser, + + #[ scalar( setter = false ) ] + #[ former( default = Executor::former().form() ) ] + executor : Executor, + + #[ former( default = Verifier ) ] + verifier : Verifier, + + callback_fn : Option< CommandsAggregatorCallback >, + } + + impl< Context, Formed > former::FormerMutator for CommandsAggregatorFormerDefinitionTypes< Context, Formed > + { + fn form_mutation( storage : &mut Self::Storage, _context : &mut Option< Self::Context > ) + { + let ca = storage; + let dictionary = ca.dictionary.get_or_insert_with( Dictionary::default ); + dictionary.order = ca.order.unwrap_or_default(); + + let help_generator = std::mem::take( &mut ca.help_generator ).unwrap_or_default(); + let help_variants = std::mem::take( &mut ca.help_variants ).unwrap_or_else( || HashSet::from([ HelpVariants::All ]) ); + + if help_variants.contains( &HelpVariants::All ) + { + HelpVariants::All.generate( &help_generator, dictionary, ca.order.unwrap_or_default() ); + } + else + { + for help in help_variants.iter().sorted() + { + help.generate( &help_generator, dictionary, ca.order.unwrap_or_default() ); + } + } + } + } + + impl< Definition > CommandsAggregatorFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < CommandsAggregator as former::EntityToStorage >::Storage >, + { + /// Creates a command in the command chain. + /// + /// # Arguments + /// + /// * `name` - The name of the command. + pub fn command< IntoName >( self, name : IntoName ) -> CommandAsSubformer< Self, impl CommandAsSubformerEnd< Self > > + where + IntoName : Into< String >, + { + let name = name.into(); + let on_end = | command : CommandFormerStorage, super_former : Option< Self > | -> Self + { + let mut super_former = super_former.unwrap(); + let mut dictionary = super_former.storage.dictionary.unwrap_or_default(); + + dictionary.register( command.preform() ); + + super_former.storage.dictionary = Some( dictionary ); + + super_former + }; + let former = CommandFormer::begin( None, Some( self ), on_end ); + former.phrase( name ) + } + } + + impl CommandsAggregatorFormer + { + /// Adds a context to the executor. + /// + /// # Arguments + /// + /// * `value` - The value to be used as the context. + /// + /// # Returns + /// + /// The modified instance of `Self`. + // `'static` means that the value must be owned or live at least as a `Context' + pub fn with_context< T >( mut self, value : T ) -> Self + where + T : Sync + Send + 'static, + { + let mut executor = self.storage.executor.unwrap_or_else( || Executor::former().form() ); + + executor.context = Context::new( value ); + + self.storage.executor = Some( executor ); + + self + } + + /// Setter for help content generator + /// + /// ``` + /// use wca::CommandsAggregator; + /// + /// # fn main() -> Result< (), Box< dyn std::error::Error > > { + /// let ca = CommandsAggregator::former() + /// // ... + /// .help( | grammar, command | format!( "Replaced help content" ) ) + /// .perform(); + /// + /// ca.perform( ".help" )?; + /// # Ok( () ) } + /// ``` + pub fn help< HelpFunction >( mut self, func : HelpFunction ) -> Self + where + HelpFunction : Fn( &Dictionary, HelpGeneratorOptions< '_ > ) -> String + 'static + { + self.storage.help_generator = Some( HelpGeneratorFn::new( func ) ); + self + } + // aaa : it is good access method, but formed structure should not have help_generator anymore + // aaa : mutator used + + /// Set callback function that will be executed after validation state + /// + /// ``` + /// use wca::CommandsAggregator; + /// + /// # fn main() -> Result< (), Box< dyn std::error::Error > > { + /// let ca = CommandsAggregator::former() + /// // ... + /// .callback( | _input, _program | println!( "Program is valid" ) ) + /// .perform(); + /// + /// // prints the "Program is valid" and after executes the program + /// ca.perform( ".help" )?; + /// # Ok( () ) } + /// ``` + pub fn callback< Callback >( mut self, callback : Callback ) -> Self + where + Callback : Fn( &str, &Program< VerifiedCommand > ) + 'static, + { + self.storage.callback_fn = Some( CommandsAggregatorCallback( Box::new( callback ) ) ); + self + } + } + + impl CommandsAggregator + { + /// Parse, converts and executes a program + /// + /// Takes a string with program and executes it + pub fn perform< S >( &self, program : S ) -> Result< (), Error > + where + S : IntoInput + { + let Input( ref program ) = program.into_input(); + + let raw_program = self.parser.parse( program ).map_err( | e | Error::Validation( ValidationError::Parser { input : format!( "{:?}", program ), error : e } ) )?; + let grammar_program = self.verifier.to_program( &self.dictionary, raw_program ).map_err( | e | Error::Validation( ValidationError::Verifier( e ) ) )?; + + if let Some( callback ) = &self.callback_fn + { + callback.0( &program.join( " " ), &grammar_program ) + } + + self.executor.program( &self.dictionary, grammar_program ).map_err( | e | Error::Execution( e ) ) + } + } +} + +// + +crate::mod_interface! +{ + exposed use CommandsAggregator; + exposed use CommandsAggregatorFormer; + exposed use Error; + exposed use ValidationError; + exposed use Order; +} diff --git a/module/move/wca/src/ca/executor/context.rs b/module/move/wca/src/ca/executor/context.rs new file mode 100644 index 0000000000..4a338039d6 --- /dev/null +++ b/module/move/wca/src/ca/executor/context.rs @@ -0,0 +1,95 @@ +pub( crate ) mod private +{ + use std::sync::Arc; + + /// Container for contexts values + /// + /// # Examples: + /// + /// ``` + /// # use wca::{ Routine, Handler, Context, Value, Args, Props, VerifiedCommand }; + /// # use std::sync::{ Arc, Mutex }; + /// let routine = Routine::from( Handler::from + /// ( + /// | ctx : Context, o : VerifiedCommand | + /// { + /// let first_arg : i32 = o.args.get_owned( 0 ).unwrap_or_default(); + /// let ctx_value : Arc< Mutex< i32 > > = ctx.get().unwrap(); + /// + /// *ctx_value.lock().unwrap() += first_arg; + /// } + /// ) ); + /// let ctx = Context::new( Mutex::new( 0 ) ); + /// if let Routine::WithContext( callback ) = routine + /// { + /// let w_command = VerifiedCommand + /// { + /// phrase : "command".into(), + /// internal_command : false, + /// args : Args( vec![ Value::Number( 1.0 ) ] ), + /// props : Props( Default::default() ), + /// }; + /// callback( ctx.clone(), w_command ).unwrap(); + /// } + /// assert_eq!( 1, *ctx.get::< Mutex< i32 > >().unwrap().lock().unwrap() ); + /// ``` + // qqq : ? + #[ derive( Debug, Clone ) ] + pub struct Context + { + inner : Arc< dyn std::any::Any + Send + Sync >, + } + + impl Default for Context + { + fn default() -> Self + { + Self::new( () ) + } + } + + impl Context + { + /// Creates a new `Context` object with the given value. + /// + /// # Arguments + /// + /// * `value` - The value to be stored in the `Context`. The value must implement the `Send` and `Sync` traits. + /// ``` + // `'static` means that the object must be owned or live at least as a `Context' + pub fn new< T : Send + Sync + 'static >( value : T ) -> Self + { + Self { inner : Arc::new( value ) } + } + } + + impl Context + { + /// This method retrieves a shared reference to an object of type `T` from the context. + /// + /// # Arguments + /// + /// * `&self` - The context object. + /// + /// # Type Parameters + /// + /// * `T` - The type of the object to retrieve. + /// + /// # Returns + /// + /// An `Option` containing a reference-counted smart pointer (`Arc`) to the object of type `T` if it exists in the context. + /// `None` is returned if the object does not exist or if it cannot be downcasted to type `T`. + // `'static` means that the object must be owned or live at least as a `Context' + pub fn get< T : Send + Sync + 'static >( &self ) -> Option< Arc< T > > + { + self.inner.clone().downcast::< T >().ok() + } + } +} + +// + +crate::mod_interface! +{ + exposed use Context; +} diff --git a/module/move/wca/src/ca/executor/executor.rs b/module/move/wca/src/ca/executor/executor.rs new file mode 100644 index 0000000000..1ba7ce66a4 --- /dev/null +++ b/module/move/wca/src/ca/executor/executor.rs @@ -0,0 +1,161 @@ +pub( crate ) mod private +{ + use crate::*; + + use wtools::error::Result; + use error_tools::return_err; + use ca::help::private::{ HelpGeneratorOptions, LevelOfDetail, generate_help_content }; + + // aaa : for Bohdan : how is it useful? where is it used? + // aaa : `ExecutorType` has been removed + + + /// Executor that is responsible for executing the program's commands. + /// It uses the given `Context` to store and retrieve values during runtime. + #[ derive( Debug, former::Former ) ] + pub struct Executor + { + /// The default context for the executor + #[ former( default = Context::default() ) ] + pub context : Context, + } + + impl Executor + { + /// Executes a program + /// + /// Iterates over the commands in the program and executes each command using the provided dictionary. + /// This method returns a `Result` indicating whether the execution was successful or not. + /// + /// # Arguments + /// + /// * `dictionary` - A reference to the dictionary used to look up the command routine. + /// * `program` - The program to be executed, which is a `Program` object consisting of a list of commands. + /// + /// # Returns + /// + /// A `Result` with `Ok(())` if the execution was successful, or an `Err` containing an error message if an error occurred. + /// + pub fn program( &self, dictionary : &Dictionary, program : Program< VerifiedCommand > ) -> Result< () > + { + for command in program.commands + { + self.command( dictionary, command )?; + } + + Ok( () ) + } + + /// Executes a given command using a provided dictionary and command. + /// + /// Calls the command callback with the given context if it is necessary. + /// + /// # Arguments + /// + /// * `dictionary` - A reference to the dictionary used to look up the command routine. + /// * `command` - The verified command that needs to be executed. + /// + /// # Returns + /// + /// Returns a Result indicating success or failure. If successful, returns `Ok(())`, otherwise returns an error. + pub fn command( &self, dictionary : &Dictionary, command : VerifiedCommand ) -> Result< () > + { + if command.internal_command + { + _exec_internal_command( dictionary, command ) + } + else + { + let routine = dictionary.command( &command.phrase ).unwrap().routine.clone(); + _exec_command( command, routine, self.context.clone() ) + } + } + + // aaa : for Bohdan : probably redundant + // aaa : removed `parallel_execution_loop` + } + + fn _exec_command( command : VerifiedCommand, routine : Routine, ctx : Context ) -> Result< () > + { + match routine + { + Routine::WithoutContext( routine ) => routine( command ), + Routine::WithContext( routine ) => routine( ctx, command ), + } + } + + fn _exec_internal_command( dictionary : &Dictionary, command : VerifiedCommand ) -> Result< () > + { + match command.phrase.as_str() + { + "." => + { + let generator_args = HelpGeneratorOptions::former() + .command_prefix( "." ) + .form(); + + let content = generate_help_content( dictionary, generator_args ); + println!( "{content}" ); + } + ".?" => + { + let generator_args = HelpGeneratorOptions::former() + .description_detailing( LevelOfDetail::Simple ) + .subject_detailing( LevelOfDetail::Simple ) + .property_detailing( LevelOfDetail::Simple ) + .form(); + + let content = generate_help_content( dictionary, generator_args ); + println!( "{content}" ); + } + name if name.ends_with( '.' ) => + { + let name = name.strip_suffix( '.' ).unwrap(); + let commands = dictionary.search( name.strip_prefix( '.' ).unwrap_or( name ) ); + if commands.is_empty() + { + return_err!( "Not found command that starts with `.{}`.", name ); + } + let generator_args = HelpGeneratorOptions::former() + .command_prefix( "." ) + .for_commands( commands ) + .form(); + + let content = generate_help_content( dictionary, generator_args ); + println!( "{content}" ); + } + name if name.ends_with( ".?" ) => + { + let name = name.strip_suffix( ".?" ).unwrap(); + let command = dictionary.command( &name.strip_prefix( '.' ).unwrap_or( name ).to_string() ); + if let Some( command ) = command + { + let generator_args = HelpGeneratorOptions::former() + .for_commands([ command ]) + .description_detailing( LevelOfDetail::Detailed ) + .subject_detailing( LevelOfDetail::Simple ) + .property_detailing( LevelOfDetail::Simple ) + .with_footer( true ) + .form(); + + let content = generate_help_content( dictionary, generator_args ); + println!( "{content}" ); + } + else + { + return_err!( "Not found command that starts with `.{}`.", name ); + } + } + unexpected => return_err!( "Encountered an unrecognized internal command: `.{}`.", unexpected ), + } + + Ok( () ) + } +} + +// + +crate::mod_interface! +{ + prelude use Executor; +} diff --git a/module/move/wca/src/ca/executor/mod.rs b/module/move/wca/src/ca/executor/mod.rs new file mode 100644 index 0000000000..77789544d0 --- /dev/null +++ b/module/move/wca/src/ca/executor/mod.rs @@ -0,0 +1,11 @@ +crate::mod_interface! +{ + + /// Container for contexts values + layer context; + /// Executor that is responsible for executing the program’s commands + layer executor; + /// Command callback representation + layer routine; + +} diff --git a/module/move/wca/src/ca/executor/routine.rs b/module/move/wca/src/ca/executor/routine.rs new file mode 100644 index 0000000000..9165c4486a --- /dev/null +++ b/module/move/wca/src/ca/executor/routine.rs @@ -0,0 +1,339 @@ +pub( crate ) mod private +{ + use crate::*; + + use std::collections::HashMap; + use wtools::error::Result; + + use std::{ fmt::Formatter, rc::Rc }; + use wtools::anyhow::anyhow; + + /// Command Args + /// + /// Used to contain subjects of a command and allow the user to retrieve them in comfortable way. + /// + /// # Example: + /// + /// ``` + /// use wca::{ Args, Value }; + /// + /// let args = Args( vec![ Value::String( "Hello, World!".to_string() ) ] ); + /// + /// let first_arg : &str = args.get_owned( 0 ).unwrap(); + /// assert_eq!( "Hello, World!", first_arg ); + /// + /// let first_arg : &str = args[ 0 ].clone().into(); + /// assert_eq!( "Hello, World!", first_arg ); + /// ``` + /// + /// ## Use case + /// ``` + /// # use wca::{ Routine, Handler, VerifiedCommand }; + /// let routine = Routine::from( Handler::from + /// ( + /// | o : VerifiedCommand | + /// { + /// let first_arg : i32 = o.args.get_owned( 0 ).unwrap(); + /// } + /// ) ); + /// ``` + #[ derive( Debug, Clone ) ] + pub struct Args( pub Vec< Value > ); + + impl Args + { + /// Returns owned casted value by its index + /// + /// ``` + /// # use wca::{ Args, Value }; + /// + /// let args = Args( vec![ Value::String( "Hello, World!".to_string() ) ] ); + /// + /// let first_arg : &str = args.get_owned( 0 ).unwrap(); + /// assert_eq!( "Hello, World!", first_arg ); + /// + /// let first_arg : &str = args[ 0 ].clone().into(); + /// assert_eq!( "Hello, World!", first_arg ); + /// ``` + pub fn get_owned< T : From< Value > >( &self, index : usize ) -> Option< T > + { + self.0.get( index ).map( | arg | arg.to_owned().into() ) + } + } + + impl core::ops::Deref for Args + { + type Target = Vec< Value >; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + /// Command Properties + /// + /// Used to contain properties of a command and allow the user to retrieve them in comfortable way. + /// + /// # Example: + /// + /// ``` + /// use wca::{ Props, Value }; + /// + /// let props = Props( [ ( "hello".to_string(), Value::String( "World!".to_string() ) ) ].into() ); + /// let hello_prop : &str = props.get_owned( "hello" ).unwrap(); + /// + /// assert_eq!( "World!", hello_prop ); + /// ``` + /// + /// ## Use case + /// ``` + /// # use wca::{ Routine, Handler, Props, VerifiedCommand }; + /// let routine = Routine::from( Handler::from + /// ( + /// | o : VerifiedCommand | + /// { + /// let key_option : i32 = o.props.get_owned( "key" ).unwrap(); + /// } + /// ) ); + /// ``` + #[ derive( Debug, Clone ) ] + pub struct Props( pub HashMap< String, Value > ); + + impl Props + { + /// Returns owned casted value by its key + /// + /// ``` + /// # use wca::{ Props, Value }; + /// + /// let props = Props( [ ( "hello".to_string(), Value::String( "World!".to_string() ) ) ].into() ); + /// let hello_prop : &str = props.get_owned( "hello" ).unwrap(); + /// + /// assert_eq!( "World!", hello_prop ); + /// ``` + pub fn get_owned< K : AsRef< str >, T : From< Value > >( &self, key : K ) -> Option< T > + { + self.0.get( key.as_ref() ).map( | arg | arg.to_owned().into() ) + } + } + + impl core::ops::Deref for Props + { + type Target = HashMap< String, Value > ; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + // aaa : make 0-arguments, 1-argument, 2-arguments, 3 arguments versions + // aaa : done. now it works with the following variants: + // fn(), fn(args), fn(props), fn(args, props), fn(context), fn(context, args), fn(context, props), fn(context, args, props) + + type RoutineWithoutContextFn = dyn Fn( VerifiedCommand ) -> Result< () >; + type RoutineWithContextFn = dyn Fn( Context, VerifiedCommand ) -> Result< () >; + + /// + /// Routine handle. + /// + /// ``` + /// # use wca::{ Handler, Routine }; + /// let routine = Routine::from( Handler::from + /// ( + /// || + /// { + /// // Do what you need to do + /// } + /// ) ); + /// ``` + /// + /// ``` + /// # use wca::{ Handler, Routine, VerifiedCommand }; + /// let routine = Routine::from( Handler::from + /// ( + /// | o : VerifiedCommand | + /// { + /// // Do what you need to do + /// } + /// ) ); + /// ``` + /// + /// ``` + /// # use wca::{ Handler, Routine }; + /// let routine = Routine::from( Handler::from + /// ( + /// | ctx, o | + /// { + /// // Do what you need to do + /// } + /// ) ); + + pub struct Handler< I, O >( Box< dyn Fn( I ) -> O > ); + + impl< I, O > std::fmt::Debug for Handler< I, O > + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + f.debug_struct( "Handler" ).finish_non_exhaustive() + } + } + + // without context + impl< F, R > From< F > for Handler< (), R > + where + R : IntoResult + 'static, + F : Fn() -> R + 'static, + { + fn from( value : F ) -> Self + { + Self( Box::new( move | () | value() ) ) + } + } + + impl< F, R > From< F > for Handler< VerifiedCommand, R > + where + R : IntoResult + 'static, + F : Fn( VerifiedCommand ) -> R + 'static, + { + fn from( value : F ) -> Self + { + Self( Box::new( value ) ) + } + } + + // with context + impl< F, R > From< F > for Handler< Context, R > + where + R : IntoResult + 'static, + F : Fn( Context ) -> R + 'static, + { + fn from( value : F ) -> Self + { + Self( Box::new( value ) ) + } + } + + impl< F, R > From< F > for Handler< ( Context, VerifiedCommand ), R > + where + R : IntoResult + 'static, + F : Fn( Context, VerifiedCommand ) -> R + 'static, + { + fn from( value : F ) -> Self + { + Self( Box::new( move |( ctx, a )| value( ctx, a ) ) ) + } + } + + impl< I, O > From< Handler< I, O > > for Routine + where + I : 'static, + O : IntoResult + 'static, + Routine : From< Box< dyn Fn( I ) -> Result< () > > >, + { + fn from( value : Handler< I, O > ) -> Self + { + Routine::from( Box::new( move | x | value.0( x ).into_result() ) ) + } + } + + /// Represents different types of routines. + /// + /// - `WithoutContext`: A routine that does not require any context. + /// - `WithContext`: A routine that requires a context. +// qqq : for Bohdan : instead of array of Enums, lets better have 5 different arrays of different Routine and no enum + // to use statical dispatch + #[ derive( Clone ) ] + pub enum Routine + { + /// Routine without context + WithoutContext( Rc< RoutineWithoutContextFn > ), + /// Routine with context + WithContext( Rc< RoutineWithContextFn > ), + } + + impl std::fmt::Debug for Routine + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + match self + { + Routine::WithoutContext( _ ) => f.debug_struct( "Routine::WithoutContext" ).finish_non_exhaustive(), + Routine::WithContext( _ ) => f.debug_struct( "Routine::WithContext" ).finish_non_exhaustive(), + } + } + } + + // without context + impl From< Box< dyn Fn( () ) -> Result< () > > > for Routine + { + fn from( value : Box< dyn Fn( () ) -> Result< () > > ) -> Self + { + Self::WithoutContext( Rc::new( move | _ | { value( () )?; Ok( () ) } ) ) + } + } + + impl From< Box< dyn Fn( VerifiedCommand ) -> Result< () > > > for Routine + { + fn from( value : Box< dyn Fn( VerifiedCommand ) -> Result< () > > ) -> Self + { + Self::WithoutContext( Rc::new( move | a | { value( a )?; Ok( () ) } ) ) + } + } + + // with context + impl From< Box< dyn Fn( Context ) -> Result< () > > > for Routine + { + fn from( value : Box< dyn Fn( Context ) -> Result< () > > ) -> Self + { + Self::WithContext( Rc::new( move | ctx, _ | { value( ctx )?; Ok( () ) } ) ) + } + } + + impl From< Box< dyn Fn(( Context, VerifiedCommand )) -> Result< () > > > for Routine + { + fn from( value : Box< dyn Fn(( Context, VerifiedCommand )) -> Result< () > > ) -> Self + { + Self::WithContext( Rc::new( move | ctx, a | { value(( ctx, a ))?; Ok( () ) } ) ) + } + } + + // aaa : why Rc is necessary? why not just box? + // aaa : to be able to clone Routines + + impl PartialEq for Routine + { + fn eq( &self, other : &Self ) -> bool + { + // We can't compare closures. Because every closure has a separate type, even if they're identical. + // Therefore, we check that the two Rc's point to the same closure (allocation). + #[ allow( clippy::vtable_address_comparisons ) ] + match ( self, other ) + { + ( Routine::WithContext( this ), Routine::WithContext( other ) ) => Rc::ptr_eq( this, other ), + ( Routine::WithoutContext( this ), Routine::WithoutContext( other ) ) => Rc::ptr_eq( this, other ), + _ => false + } + } + } + + impl Eq for Routine {} + + trait IntoResult + { + fn into_result( self ) -> Result< () >; + } + + impl IntoResult for std::convert::Infallible { fn into_result( self ) -> Result< () > { Ok( () ) } } + impl IntoResult for () { fn into_result( self ) -> Result< () > { Ok( () ) } } + impl< E : std::fmt::Debug > IntoResult for Result< (), E > { fn into_result( self ) -> Result< () > { self.map_err( | e | anyhow!( "{e:?}" )) } } +} + +// + +crate::mod_interface! +{ + exposed use Routine; + exposed use Handler; + exposed use Args; + exposed use Props; +} diff --git a/module/move/wca/src/ca/facade.rs b/module/move/wca/src/ca/facade.rs new file mode 100644 index 0000000000..cdc9edb599 --- /dev/null +++ b/module/move/wca/src/ca/facade.rs @@ -0,0 +1,345 @@ +pub( crate ) mod private +{ + use crate::*; + use core::fmt; + use ca::grammar; + + /// Macro for parsing WCA arguments. + /// + /// # Examples + /// ```rust + /// use wca::Value; + /// + /// let mut args = vec![ Value::Number( 42. ), Value::String( "Rust".into() ) ].into_iter(); + /// wca::parse_args!( args, n : f64, name : String ); + /// + /// assert_eq!( n, 42. ); + /// assert_eq!( name, "Rust" ); + /// ``` + #[macro_export] + macro_rules! parse_args + { + ( $args : ident, mut $b : ident : $ty : ident $( $rest : tt )* ) => + { + let mut $b : $ty = std::convert::TryFrom::try_from( $args.next().unwrap() ).unwrap(); + $crate::parse_args!( $args $( $rest )* ) + }; + ( $args : ident, $b : ident : $ty : ident $( $rest : tt )* ) => + { + let $b : $ty = std::convert::TryFrom::try_from( $args.next().unwrap() ).unwrap(); + $crate::parse_args!( $args $( $rest )* ) + }; + ( $args : ident, $b : ident $( $rest : tt )* ) => + { + let $b = $args.next().unwrap(); + $crate::parse_args!( $args $( $rest )* ) + }; + ( $args : ident, mut $b : ident $( $rest : tt )* ) => + { + let mut $b = $args.next().unwrap(); + $crate::parse_args!( $args $( $rest )* ) + }; + ( $args : ident ) => + { + assert!( $args.next().is_none() ); + }; + ( $args : ident, ) => + { + $crate::parse_args!( $args ) + }; + } + + /// Creates a command-line interface (CLI) builder with the given initial state. + /// + /// This function initializes a `CommandBuilder` with the provided `state` and + /// returns it for further configuration of the CLI. + pub fn cui< T >( state : T ) -> CommandBuilder< T > + { + CommandBuilder::with_state( state ) + } + + /// A struct representing a property. + #[ derive( Debug, Clone ) ] + pub struct Property< 'a > + { + /// The name of the property. + pub name : &'a str, + /// The hint for the property. + pub debug : &'a str, + /// The tag representing the property's type. + pub tag : Type, + } + + impl< 'a > Property< 'a > + { + /// Constructor of a property. + pub fn new( name : &'a str, hint : &'a str, tag : Type ) -> Self { Self { name, hint, tag } } + } + + /// A builder struct for constructing commands. + #[ derive( Debug ) ] + pub struct CommandBuilder< T > + { + state : T, + commands : Vec< Command >, + handlers : std::collections::HashMap< String, Routine >, + } + + impl< T > CommandBuilder< T > + { + /// Constructs a `CommandBuilder` with the given state. + pub fn with_state( state : T ) -> Self + { + Self { state, handlers : < _ >::default(), commands : vec![] } + } + } + + #[ derive( Debug ) ] + pub struct Builder< F > + { + handler : F, + command : Command, + } + + impl< F > Builder< F > + { + /// Creates a new instance of the command with the provided handler function. + /// + /// This method takes in a handler function `handler` and creates a new instance of the command. + /// The `handler` function is used to handle the execution logic associated with the command. + /// + /// # Arguments + /// + /// * `handler` - The handler function that will be invoked when the command is executed. + /// + /// # Returns + /// + /// A new instance of the command with the specified `handler`. + /// + #[ inline ] + pub fn new( handler: F ) -> Self + { + let name = + { + use wtools::Itertools as _; + + let name = std::any::type_name::< F >(); + let name = name.split("::").last().unwrap(); + name.split( '_' ).join( "." ) + }; + + Self { handler, command : Command::former().phrase( name ).form() } + } + + /// Adds an argument to the command. + /// + /// This method takes in the `hint` and `tag` parameters to create a `ValueDescription` object + /// representing an argument. The `ValueDescription` object is then appended to the command's + /// `subjects` collection. + /// + /// # Arguments + /// + /// * `hint` - The hint for the argument, represented as a string slice (`&str`). + /// * `tag` - The type of the argument, represented by a `Type` object from the `Type` module. + /// + /// # Returns + /// + /// The modified command instance with the argument added. + /// + #[ inline ] + pub fn arg( mut self, hint : &str, tag : Type ) -> Self + { + self.command.subjects.push( grammar::command::ValueDescription + { + hint : hint.into(), + kind : tag, + optional : false, + }); + + self + } + + /// Adds a property to the command. + /// + /// This method takes in the `name`, `hint`, and `kind` parameters to create a `ValueDescription` + /// object representing a property. The `ValueDescription` object is then inserted into the + /// command's properties collection using the `name` as the key. + /// + /// # Example + /// ```no_rust + /// let ca = cui(()) + /// .command(user.property("name", "Name property", Type::String)) + /// .build(); + /// ``` + /// + /// # Arguments + /// + /// * `name` - The name of the property. It should implement the `ToString` trait. + /// * `hint` - The hint for the property. It should implement the `ToString` trait. + /// * `kind` - The type of the property, represented by a `Type` object from the `Type` module. + /// + /// # Returns + /// + /// The modified command instance with the property added. + /// + #[ inline ] + pub fn property( mut self, name : impl ToString , hint : impl ToString, kind : Type ) -> Self + { + self.command.properties.insert + ( + name.to_string(), + grammar::command::ValueDescription + { + hint : hint.to_string(), + kind, + optional : false, + } + ); + + self + } + + /// Adds multiple properties to the command. + /// + /// This method takes in an array of `Property` objects and adds them to the command's properties. + /// The properties are provided in the `properties` parameter as an array of length `N`. + /// + /// ```without_std + /// let ca = cui(()) + /// .properties([ + /// Property::new("name", "Name property", Type::String), + /// Property::new("age", "Age property", Type::Integer), + /// ]).build(); + /// ``` + /// + /// # Arguments + /// + /// * `properties` - An array of `Property` objects representing the properties to be added. + /// + /// # Returns + /// + /// The modified command instance with the properties added. + /// + #[ inline ] + pub fn properties< const N: usize >( mut self, properties : [ Property< '_ >; N ] ) -> Self + { + self.command.properties.reserve( properties.len() ); + + for Property { name, hint, tag } in properties + { + self = self.property(name, hint, tag); + } + + self + } + } + + impl< T: Clone + 'static > CommandBuilder< T > + { + /// Adds a command to the `CommandBuilder`. + /// ```no_rust + /// let ca = cui( () ) // Add commands using the builder pattern + /// .command( command ) + /// .command( command2 ) + /// .command( echo.arg("string", Type::String ) ) // Customize your commands by chaining methods such as properties + /// // property, and arg to add properties and arguments. + /// .build(); + /// + /// ``` + pub fn command< F, E > + ( + mut self, + command : impl IntoBuilder< F, T >, + ) -> Self + where + F : Fn( T, Args, Props ) -> Result< (), E > + 'static + Copy, + E : fmt::Debug, + { + let Builder { handler, command } = command.into_builder(); + let state = self.state.clone(); + + let closure = closure::closure!( | ( args, props ) | + { + handler( state.clone(), args, props ) + .map_err( | report | BasicError::new( format!( "{report:?}" ) ).into() ) + }); + + let handler = Routine::new( closure ); + + self.handlers.insert( command.phrase.clone(), handler ); + self.commands.push( command ); + + self + } + + /// Builds and returns a `wca::CommandsAggregator` instance. + /// + /// This method finalizes the construction of the `CommandBuilder` by + /// creating a `wca::CommandsAggregator` instance with the accumulated + /// commands and handlers. + pub fn build( self ) -> CommandsAggregator + { + CommandsAggregator::former().grammar( self.commands ).executor( self.handlers ).perform() + } + } + + /// An extension trait for commands. + /// + /// This trait provides additional methods for enhancing commands, such as + /// adding arguments and properties. + pub trait CommandExt< T > : Sized + { + /// Adds an argument to the command. + fn arg( self, hint : &str, tag : Type ) -> Builder< Self > + { + Builder::new( self ).arg( hint, tag ) + } + + /// Adds property to the command. + fn property< const N: usize >( self, name : impl ToString , hint : impl ToString, kind : Type ) -> Builder< Self > + { + Builder::new( self ).property( name, hint, kind ) + } + + /// Adds properties to the command. + fn properties< const N: usize >( self, properties: [ Property< '_ >; N ] ) -> Builder< Self > + { + Builder::new( self ).properties( properties ) + } + } + + impl< F: Fn( T, Args, Props ) -> Result< (), E>, T, E > CommandExt< T > for F {} + + /// A trait for converting a type into a `Builder`. + pub trait IntoBuilder< F, T > : Sized + { + /// Converts the type into a `Builder` instance. + fn into_builder( self ) -> Builder< F >; + } + + impl< F, T > IntoBuilder< F, T > for Builder< F > + { + fn into_builder( self ) -> Self + { + self + } + } + + impl< F: Fn( T, Args, Props ) -> Result< (), E >, T, E > IntoBuilder< F, T > for F + { + fn into_builder( self ) -> Builder< F > + { + Builder::new( self ) + } + } + +} + +crate::mod_interface! +{ + exposed use cui; + exposed use CommandBuilder; + exposed use Property; + prelude use IntoBuilder; + prelude use CommandExt; +} diff --git a/module/move/wca/src/ca/formatter.rs b/module/move/wca/src/ca/formatter.rs new file mode 100644 index 0000000000..368ec8e88f --- /dev/null +++ b/module/move/wca/src/ca/formatter.rs @@ -0,0 +1,95 @@ +pub( crate ) mod private +{ + + use crate::*; + use wtools::Itertools; + use ca::aggregator::private::Order; + + /// - + #[ derive( Debug, Clone, PartialEq ) ] + pub enum HelpFormat + { + Markdown, + Another, + } + + pub fn md_generator( grammar : &Dictionary, order: Order ) -> String + { + let text = grammar.commands() + .into_iter() + .map( |( name, cmd )| + { + let subjects = cmd.subjects.iter().fold( String::new(), | _, _ | format!( " `[argument]`" ) ); + let properties = if cmd.properties.is_empty() { " " } else { " `[properties]` " }; + format! + ( + "[.{}{subjects}{properties}](#{}{}{})", + name, + name.replace( '.', "" ), + if cmd.subjects.is_empty() { "" } else { "-argument" }, + if cmd.properties.is_empty() { "" } else { "-properties" }, + ) + }) + .fold( String::new(), | acc, cmd | + { + format!( "{acc}\n- {cmd}" ) + }); + + let list_of_commands = format!( "## Commands\n\n{}", text ); + + let about_each_command = grammar.commands() + .into_iter() + .map( |( name, cmd )| + { + let subjects = cmd.subjects.iter().fold( String::new(), | _, _ | format!( " `[Subject]`" ) ); + let properties = if cmd.properties.is_empty() { " " } else { " `[properties]` " }; + let hint = if cmd.hint.is_empty() { &cmd.long_hint } else { &cmd.hint }; + + let heading = format!( "## .{}{subjects}{properties}\n__{}__\n", name, hint ); + + let hint = if cmd.long_hint.is_empty() { &cmd.hint } else { &cmd.long_hint }; + let full_subjects = cmd + .subjects + .iter() + .enumerate() + .map + ( + |( number, subj )| + format!( "\n- {}subject_{number} - {} `[{:?}]`", if subj.optional { "`< optional >` " } else { "" }, subj.hint, subj.kind ) + ) + .join( "\n" ); + let full_properties = cmd + .properties( order ) + .into_iter() + .map + ( + |( name, value )| + format!( "\n- {}{} - {} `[{:?}]`", if value.optional { "`< optional >` " } else { "" }, value.hint, name, value.kind ) + ) + .join( "\n" ); + // aaa : for Bohdan : toooooo log lines. 130 is max + // aaa : done. + + format! + ( + "{heading}\n{}{}\n\n{hint}\n", + if cmd.subjects.is_empty() { "".to_string() } else { format!( "\n\nSubjects:{}", &full_subjects ) }, + if cmd.properties.is_empty() { "".to_string() } else { format!( "\n\nProperties:{}",&full_properties ) }, + ) + + }) + .fold( String::new(), | acc, cmd | + { + format!( "{acc}\n\n{cmd}" ) + }); + format!( "{list_of_commands}\n{about_each_command}" ) + } + + + +} + +crate::mod_interface! +{ + +} \ No newline at end of file diff --git a/module/move/wca/src/ca/grammar/command.rs b/module/move/wca/src/ca/grammar/command.rs new file mode 100644 index 0000000000..38a02583a4 --- /dev/null +++ b/module/move/wca/src/ca/grammar/command.rs @@ -0,0 +1,256 @@ +pub( crate ) mod private +{ + use crate::*; + + use std::collections::{ HashMap }; + use indexmap::IndexMap; + use former::{ Former, StoragePreform }; + use wtools::Itertools; + + /// A description of a Value in a command. Used to specify the expected type and provide a hint for the Value. + /// + /// This struct is used to describe a command's subject or property and validate it against the expected type. It contains a hint + /// string that provides guidance to the user for entering a valid value, and a `Type` enum value that represents the expected + /// type of the value. + /// + /// # Examples: + /// + /// ``` + /// # use wca::{ Type, ca::grammar::command::ValueDescription }; + /// let value_desc = ValueDescription { kind: Type::String, hint: "Enter your name".to_string(), optional: false }; + /// ``` + #[ derive( Debug, Clone, PartialEq, Eq, Former ) ] + pub struct ValueDescription + { + /// providing guidance to the user for entering a valid value + pub hint : String, + /// expected type of a value + pub kind : Type, + /// subject optional parameter + #[ former( default = false ) ] + pub optional : bool, + } + + #[ derive( Debug, Former ) ] + pub struct PropertyDescription + { + name : String, + // qqq : how to re-use ValueDescriptionFormer without additional end? + // #[subform_scalar] + // value : ValueDescription, + /// providing guidance to the user for entering a valid value + hint : String, + /// expected type of a value + kind : Type, + /// subject optional parameter + #[ former( default = false ) ] + optional : bool, + #[ scalar( setter = false ) ] + #[ former( default = Vec::new() ) ] + properties_aliases : Vec< String >, + } + + impl< Definition > PropertyDescriptionFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < PropertyDescription as former::EntityToStorage >::Storage >, + { + pub fn alias< IntoName >( mut self, name : IntoName ) -> Self + where + IntoName : Into< String >, + { + let mut aliases = self.storage.properties_aliases.unwrap_or_default(); + aliases.push( name.into() ); + self.storage.properties_aliases = Some( aliases ); + + self + } + } + + + /// Command descriptor. + /// + /// Based on this structure, the structure( `ParsedCommand` ) obtained after parsing will be validated and converted to `VerifiedCommand`. + /// + /// # Example: + /// + /// ``` + /// # use wca::{ Command, Type }; + /// let command = Command::former() + /// .hint( "hint" ) + /// .long_hint( "long_hint" ) + /// .phrase( "command" ) + /// .subject() + /// .kind( Type::String ) + /// .end() + /// .form(); + /// ``` + + #[ derive( Debug, Clone, PartialEq, Eq ) ] + #[ derive( Former ) ] + pub struct Command + { + /// Command common hint. + pub hint : String, + /// Command full hint. + pub long_hint : String, + /// Phrase descriptor for command. + pub phrase : String, + /// Command subjects hints and types. + #[ subform_entry( setter = true ) ] + pub subjects : Vec< ValueDescription >, + /// Hints and types for command options. + pub properties : IndexMap< String, ValueDescription >, + /// Map of aliases. + // Aliased key -> Original key + pub properties_aliases : HashMap< String, String >, + // aaa : for Bohdan : routine should also be here + // aaa : here it is + // qqq : make it usable and remove default(?) + /// The type `Routine` represents the specific implementation of the routine. + #[ scalar( setter = false ) ] + #[ former( default = Routine::from( Handler::from( || { panic!( "No routine available: A handler function for the command is missing" ) } ) ) ) ] + pub routine : Routine, + } + + impl Command + { + pub( crate ) fn properties( &self, order : Order ) -> Vec< ( &String, &ValueDescription ) > + { + match order + { + Order::Nature => + { + self.properties.iter().map( | ( key, value ) | ( key, value ) ).collect() + } + Order::Lexicography => + { + self.properties.iter().map( | ( key, value ) | ( key, value ) ).sorted_by_key( | ( k, _ ) | *k ).collect() + } + } + } + } + + impl< Definition > CommandFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < Command as former::EntityToStorage >::Storage >, + { + /// Setter for separate properties aliases. + pub fn property_alias< S : Into< String > >( mut self, key : S, alias : S ) -> Self + { + let key = key.into(); + let alias = alias.into(); + let properties = self.storage.properties.unwrap_or_default(); + let mut properties_aliases = self.storage.properties_aliases.unwrap_or_default(); + debug_assert!( !properties.contains_key( &alias ), "Name `{key}` is already used for `{:?} as property name`", properties[ &alias ] ); + debug_assert!( !properties_aliases.contains_key( &alias ), "Alias `{alias}` is already used for `{}`", properties_aliases[ &alias ] ); + + properties_aliases.insert( alias, key ); + + self.storage.properties = Some( properties ); + self.storage.properties_aliases = Some( properties_aliases ); + self + } + + /// Sets the command routine. + /// + /// You can set the following types of command routines: + /// - `fn()`: A command routine without any argument or property. + /// - `fn(args)`: A command routine with arguments. + /// - `fn(props)`: A command routine with properties. + /// - `fn(args, props)`: A command routine with arguments and properties. + /// - `fn(context)`: A command routine with a context. + /// - `fn(context, args)`: A command routine with a context and arguments. + /// - `fn(context, props)`: A command routine with a context and properties. + /// - `fn(context, args, props)`: A command routine with a context, arguments, and properties. + /// + /// # Type Parameters + /// + /// * `I`: The input type for the handler function. + /// * `R`: The return type for the handler function. + /// * `F`: The function type that can be converted into a handler. + /// + /// # Parameters + /// + /// * `self`: The current `CommandFormer` instance. This instance will be consumed by this method. + /// * `f`: The function that will be set as the command routine. + /// + /// # Returns + /// + /// Returns the `CommandFormer` instance with the new command routine set. + pub fn routine< I, R, F : Into< Handler< I, R > > >( mut self, f : F ) -> Self + where + Routine: From< Handler< I, R > >, + { + let h = f.into(); + self.storage.routine = Some( h.into() ); + self + } + } + + impl< Definition > CommandFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < Command as former::EntityToStorage >::Storage >, + { + /// Implements the `subject` method for a value. + /// + /// This method allows chaining, where `subject` is the current value and `ValueDescription` is the super-former. + /// It returns a `ValueDescriptionFormer` which can be used to further build the super-former. + pub fn subject( self ) -> ValueDescriptionAsSubformer< Self, impl ValueDescriptionAsSubformerEnd< Self > > + { + self._subjects_subform_entry() + } + + /// Sets the name and other properties of the current property. + /// + /// This method takes ownership of `self` and the name of the property as input. + /// It returns a `PropertyDescriptionFormer` instance that allows chaining of different property + /// descriptions. + /// + /// # Arguments + /// + /// * `name` - The name of the property. It should implement the `Into< String >` trait. + pub fn property< IntoName >( self, name : IntoName ) -> PropertyDescriptionAsSubformer< Self, impl PropertyDescriptionAsSubformerEnd< Self > > + where + IntoName : Into< String >, + { + let on_end = | property : PropertyDescriptionFormerStorage, super_former : Option< Self > | -> Self + { + let mut super_former = super_former.unwrap(); + let mut properties = super_former.storage.properties.unwrap_or_default(); + let property = property.preform(); + + let value = ValueDescription + { + hint : property.hint, + kind : property.kind, + optional : property.optional, + }; + debug_assert!( !properties.contains_key( &property.name ), "Property name `{}` is already used for `{:?}`", property.name, properties[ &property.name ] ); + properties.insert( property.name.clone(), value ); + + let mut aliases = super_former.storage.properties_aliases.unwrap_or_default(); + debug_assert!( !aliases.contains_key( &property.name ), "Name `{}` is already used for `{}` as alias", property.name, aliases[ &property.name ] ); + + aliases.extend( property.properties_aliases.into_iter().map( | alias | ( alias, property.name.clone() ) ) ); + + super_former.storage.properties = Some( properties ); + super_former.storage.properties_aliases = Some( aliases ); + + super_former + }; + let former = PropertyDescriptionFormer::begin( None, Some( self ), on_end ); + former.name( name ) + } + } +} + +// + +crate::mod_interface! +{ + exposed use Command; + exposed use CommandFormer; + protected use ValueDescription; +} + +// qqq : use orphan instead of exposed for ALL files in the folder, dont use prelude for structs \ No newline at end of file diff --git a/module/move/wca/src/ca/grammar/dictionary.rs b/module/move/wca/src/ca/grammar/dictionary.rs new file mode 100644 index 0000000000..06c8479f8b --- /dev/null +++ b/module/move/wca/src/ca/grammar/dictionary.rs @@ -0,0 +1,113 @@ +pub( crate ) mod private +{ + use crate::*; + use former::Former; + use indexmap::IndexMap; + use wtools::Itertools; + + // qqq : `Former` does not handle this situation well + + // /// A collection of commands. + // /// + // /// This structure holds a hashmap of commands where each command is mapped to its name. + // #[ derive( Debug, Former ) ] + // pub struct Dictionary( HashMap< String, Command > ); + + /// A collection of commands. + /// + /// This structure holds a btreemap of commands where each command is mapped to its name. + #[ derive( Debug, Default, Former, Clone ) ] + pub struct Dictionary + { + #[ scalar( setter = false ) ] + pub( crate ) commands : IndexMap< String, Command >, + #[ scalar( setter = false ) ] + pub( crate ) order : Order, + } + + // qqq : IDK how to integrate it into the `CommandsAggregatorFormer` + // + impl DictionaryFormer + { + pub fn command( mut self, command : Command ) -> Self + { + let mut commands = self.storage.commands.unwrap_or_default(); + commands.insert( command.phrase.clone(), command ); + self.storage.commands = Some( commands ); + self + } + } + + impl Dictionary + { + /// Registers a command into the command list. + /// + /// # Arguments + /// + /// * `command` - The command to be registered. + pub fn register( &mut self, command : Command ) -> Option< Command > + { + self.commands.insert( command.phrase.clone(), command ) + } + + /// Retrieves the command with the specified `name` from the `commands` hashmap. + /// + /// # Arguments + /// + /// * `name` - A reference to the name of the command to retrieve. + /// + /// # Returns + /// + /// An `Option` containing a reference to the command with the specified `name`, if it exists. + /// Returns `None` if no command with the specified `name` is found. + pub fn command< Name >( &self, name : &Name ) -> Option< &Command > + where + String : std::borrow::Borrow< Name >, + Name : std::hash::Hash + Eq, + { + self.commands.get( name ) + } + + /// Find commands that match a given name part. + /// + /// This function accepts a `name_part` parameter which is of generic type `NamePart`. + /// The `NamePart` type must implement the `AsRef` trait. + /// + /// # Arguments + /// + /// * `name_part` - The name part to match against command phrases. + /// + /// # Returns + /// + /// A vector of references to `Command` that match the given `name_part`. + pub fn search< NamePart >( &self, name_part : NamePart ) -> Vec< &Command > + where + NamePart : AsRef< str >, + { + self.commands.values().filter( | command | command.phrase.starts_with( name_part.as_ref() ) ).collect() + } + + /// asd + pub fn commands( &self ) -> Vec< ( &String, &Command ) > + { + match self.order + { + Order::Nature => + { + self.commands.iter().map( | ( key, value ) | ( key, value ) ).collect() + } + Order::Lexicography => + { + self.commands.iter().map( | ( key, value ) | ( key, value ) ).sorted_by_key( | ( key, _ ) | *key ).collect() + } + } + } + } +} + +// + +crate::mod_interface! +{ + exposed use Dictionary; +} diff --git a/module/move/wca/src/ca/grammar/mod.rs b/module/move/wca/src/ca/grammar/mod.rs new file mode 100644 index 0000000000..f31e992b38 --- /dev/null +++ b/module/move/wca/src/ca/grammar/mod.rs @@ -0,0 +1,10 @@ +crate::mod_interface! +{ + /// User grammar settings. + /// By using this module, you can define a new commands and provide a detailed descriptions of them. + layer command; + /// A dictionary is a collection of commands that can be easily looked up and used. + layer dictionary; + /// Available types for arguments. + layer types; +} diff --git a/module/move/wca/src/ca/grammar/types.rs b/module/move/wca/src/ca/grammar/types.rs new file mode 100644 index 0000000000..1ee53a654e --- /dev/null +++ b/module/move/wca/src/ca/grammar/types.rs @@ -0,0 +1,211 @@ +pub( crate ) mod private +{ + use crate::*; + use std::fmt:: + { + Display, + Formatter + }; + use wtools; + use wtools::{ error::Result, err }; + use wtools::Itertools; + + /// Available types that can be converted to a `Value` + /// + /// Uses for configure subjects and properties types to validate it after parsing. + /// + /// ``` + /// # use wca::{ Type, Value, TryCast }; + /// # fn main() -> Result< (), Box< dyn std::error::Error > > { + /// let raw_value = "3".to_string(); + /// let kind = Type::Number; + /// + /// let value = kind.try_cast( raw_value )?; + /// assert_eq!( Value::Number( 3.0 ), value ); + /// # Ok( () ) } + /// ``` + /// + /// In the above example, the `Type` enum is used to represent the expected type of the value for a property. The `Number` type is chosen, and the raw value is parsed and validated to ensure it matches this type. + /// + #[ derive( Debug, Clone, PartialEq, Eq ) ] + pub enum Type + { + /// String + String, + /// Number + Number, + /// Path + Path, + /// Bool + Bool, + /// List of some type values separated a delimiter character + List( Box< Type >, char ), + } + + /// Can be implemented for something that represents a type of value + pub trait TryCast< T > + { + /// return casted value + fn try_cast( &self, value : String ) -> Result< T >; + } + + /// Container for a `Value` of a specific type + /// + /// Uses for represent of subjects and properties in Commands( E.g. `VerifiedCommand`, `ExecutableCommand_` ) + /// With `wca::Type` enum and `TryCast` you can cast raw string into specific Type. + /// You can also convert to a type that can be converted from the internal Value type. + /// + /// # Example: + /// + /// ``` + /// # use wca::{ VerifiedCommand, Value, Args, Props }; + /// # use std::collections::HashMap; + /// let command = VerifiedCommand + /// { + /// phrase : "command".to_string(), + /// internal_command : false, + /// // Here is numeric value used + /// args : Args( vec![ Value::Number( 3.14 ) ] ), + /// props : Props( HashMap::from_iter( + /// [ + /// // Here is string value used + /// ( "string_prop".to_string(), Value::String( "value".to_string() ) ), + /// ])) + /// }; + /// + /// let number : f32 = command.args.get_owned( 0 ).unwrap(); + /// assert_eq!( 3.14, number ); + /// + /// let number : i32 = command.args.get_owned( 0 ).unwrap(); + /// assert_eq!( 3, number ); + /// ``` + #[ derive( Debug, Clone, PartialEq ) ] + pub enum Value + { + /// String value + String( String ), + /// Number value(float number but can be casted to another types) + Number( f64 ), + /// Path + Path( std::path::PathBuf ), + /// Bool + Bool( bool ), + /// List + List( Vec< Value > ), + } + + impl Display for Value + { + fn fmt( &self, f : &mut Formatter< '_ >) -> std::fmt::Result + { + match self + { + Value::String( s ) => + { + write!( f , "{s}" )?; + } + Value::Number( n ) => + { + write!( f, "{n}" )?; + } + Value::Path( p ) => + { + write!( f, "{}", p.display() )?; + } + Value::Bool( b ) => + { + write!( f, "{b}" )?; + } + Value::List( list ) => + { + let list = list.iter().map( | element | element.to_string() ).join( "," ); // qqq : don't hardcode ", " find way to get original separator + write!( f, "{list}" )?; + } + } + Ok( () ) + } + } + + macro_rules! value_into_impl + { + ( $( $value_kind : path => $( $kind : ty => $cast : expr ),+ );+ ) => + { + $( $( + impl From< Value > for $kind + { + fn from( value : Value ) -> Self + { + match value + { + #[ allow( clippy::redundant_closure_call ) ] // ok because of it improve understanding what is `value` at macro call + $value_kind( value ) => ( $cast )( value ), + _ => panic!( "Unknown cast variant. Got `{value:?}` and try to cast to `{}`", stringify!( $kind ) ) + } + } + } + )+ )+ + }; + } + + // makes from Value variant an native value + value_into_impl! + { + Value::Number => + u32 => | value | value as u32, + u64 => | value | value as u64, + i32 => | value | value as i32, + i64 => | value | value as i64, + f32 => | value | value as f32, + f64 => | value | value; + Value::Bool => + bool => | value | value; + Value::String => + String => String::from, + &'static str => | value : String | Box::leak( value.into_boxed_str() ); + Value::Path => + std::path::PathBuf => | value | value + } + + impl< T : From< Value > > From< Value > for Vec< T > + { + fn from( value : Value ) -> Self + { + match value + { + Value::List( value ) => value.into_iter().map( | x | x.into() ).collect(), + _ => panic!( "Unknown cast variant. Got `{value:?}` and try to cast to `Vec<{}>`", std::any::type_name::< T >() ) + } + } + } + + impl TryCast< Value > for Type + { + fn try_cast( &self, value : String ) -> Result< Value > + { + match self + { + Self::String => Ok( Value::String( value ) ), + Self::Number => value.parse().map_err( | _ | err!( "Can not parse number from `{}`", value ) ).map( Value::Number ), + Self::Path => Ok( Value::Path( value.into() ) ), + Self::Bool => Ok( Value::Bool( match value.as_str() { "1" | "true" => true, "0" | "false" => false, _ => return Err( err!( "Can not parse bool from `{}`", value ) ) } ) ), + Self::List( kind, delimeter ) => + { + let values = value + .split( *delimeter ) + .map( | val | kind.try_cast( val.into() ) ) + .collect::< Result< Vec< Value > > >()?; + Ok( Value::List( values ) ) + }, + } + } + } +} + +// + +crate::mod_interface! +{ + exposed use Type; + exposed use Value; + exposed use TryCast; +} diff --git a/module/move/wca/src/ca/help.rs b/module/move/wca/src/ca/help.rs new file mode 100644 index 0000000000..cc8c897b70 --- /dev/null +++ b/module/move/wca/src/ca/help.rs @@ -0,0 +1,420 @@ +pub( crate ) mod private +{ + use crate::*; + use ca:: + { + Command, + Routine, + Type, + formatter::private:: + { + HelpFormat, + md_generator + }, + tool::table::format_table, + }; + + use wtools::Itertools; + use std::rc::Rc; + use error_tools::for_app::anyhow; + use former::Former; + + // qqq : for Bohdan : it should transparent mechanist which patch list of commands, not a stand-alone mechanism + + #[ derive( Debug, Default, Copy, Clone, PartialEq, Eq ) ] + pub enum LevelOfDetail + { + #[ default ] + None, + Simple, + Detailed, + } + + /// Container for arguments passed to a help generator function. + #[ derive( Debug, Former ) ] + pub struct HelpGeneratorOptions< 'a > + { + /// Prefix that will be shown before command name + #[ former( default = String::new() ) ] + pub command_prefix : String, + /// Show help for the specified commands + pub for_commands : Vec< &'a Command >, + /// Reresents how much information to display for the subjects + /// + /// - `None` - nothing + /// - `Simple` - + /// - `Detailed` - each subject with information about it. E.g. `` + pub subject_detailing : LevelOfDetail, + /// Reresents how much information to display for the properties + /// + /// - `None` - nothing + /// - `Simple` - + /// - `Detailed` - each property with information about it. E.g. `` + pub property_detailing : LevelOfDetail, + /// Reresents how much information to display for the properties + /// + /// - `None` - nothing + /// - `Simple` - short hint + /// - `Detailed` - long hint + pub description_detailing : LevelOfDetail, + /// If enabled - shows complete description of subjects and properties + pub with_footer : bool, + /// Order of property and commands. + pub order : Order, + } + + // qqq : for Barsik : make possible to change properties order + pub( crate ) fn generate_help_content( dictionary : &Dictionary, o : HelpGeneratorOptions< '_ > ) -> String + { + struct Row + { + name : String, + args : String, + hint : String, + footer : String, + } + let for_single_command = | command : &Command | + { + let name = &command.phrase; + let hint = match o.description_detailing + { + LevelOfDetail::None => "", + _ if command.hint.is_empty() && command.long_hint.is_empty() => "", + LevelOfDetail::Simple if !command.hint.is_empty() => command.hint.as_str(), + LevelOfDetail::Detailed if !command.long_hint.is_empty() => command.long_hint.as_str(), + _ if !command.long_hint.is_empty() => command.long_hint.as_str(), + _ if !command.hint.is_empty() => command.hint.as_str(), + _ => unreachable!(), + }; + let subjects = match o.subject_detailing + { + LevelOfDetail::None => "".into(), + _ if command.subjects.is_empty() => "".into(), + LevelOfDetail::Simple => "< subjects >".into(), + LevelOfDetail::Detailed => command.subjects.iter().map( | v | format!( "< {}{:?} >", if v.optional { "?" } else { "" }, v.kind ) ).collect::< Vec< _ > >().join( " " ), + }; + let properties = match o.property_detailing + { + LevelOfDetail::None => "".into(), + _ if command.subjects.is_empty() => "".into(), + LevelOfDetail::Simple => "< properties >".into(), + LevelOfDetail::Detailed => command.properties( dictionary.order ).iter().map( |( n, v )| format!( "< {}:{}{:?} >", if v.optional { "?" } else { "" }, n, v.kind ) ).collect::< Vec< _ > >().join( " " ), + }; + + let footer = if o.with_footer + { + let full_subjects = command.subjects.iter().map( | subj | format!( "- {} [{}{:?}]", subj.hint, if subj.optional { "?" } else { "" }, subj.kind ) ).join( "\n\t" ); + let full_properties = format_table( command.properties( dictionary.order ).into_iter().map( | ( name, value ) | [ name.clone(), format!( "- {} [{}{:?}]", value.hint, if value.optional { "?" } else { "" }, value.kind ) ] ) ).unwrap().replace( '\n', "\n\t" ); + + format! + ( + "{}{}", + if command.subjects.is_empty() { "".to_string() } else { format!( "\nSubjects:\n\t{}", &full_subjects ) }, + if command.properties.is_empty() { "".to_string() } else { format!( "\nProperties:\n\t{}",&full_properties ) } + ) + } else { "".into() }; + + Row + { + name : format!( "{}{name}", o.command_prefix ), + args : format!( "{subjects}{}{properties}", if !subjects.is_empty() || !properties.is_empty() { " " } else { "" } ), + hint : format!( "{}{hint}", if hint.is_empty() { "" } else { "- " } ), + footer, + } + }; + if o.for_commands.len() == 1 || !o.for_commands.is_empty() && !o.with_footer + { + o.for_commands.into_iter().map( | command | + { + let row = for_single_command( command ); + format! + ( + "{}{}{}", + format_table([[ row.name, row.args, row.hint ]]).unwrap(), + if row.footer.is_empty() { "" } else { "\n" }, + row.footer + ) + }) + .join( "\n" ) + } + else + { + let rows = dictionary.commands() + .into_iter() + .map( |( _, cmd )| cmd ) + .map( for_single_command ) + .map( | row | [ row.name, row.args, row.hint ] ); + format_table( rows ).unwrap() + } + } + + /// Available help commands variants + #[ derive( Debug, Hash, Eq, PartialEq, Ord, PartialOrd ) ] + pub enum HelpVariants + { + /// Make all available variants + All, + /// Help for whole program. E.g. `.help` + General, + /// Detailed help for one command as subject in help command. E.g. `.help command_name` + SubjectCommand, + /// Detailed help for one command as separate help command. E.g. `.help.command_name` + DotCommand, + } + + impl HelpVariants + { + /// Generates help commands + pub fn generate( &self, helper : &HelpGeneratorFn, dictionary : &mut Dictionary, order : Order ) + { + match self + { + HelpVariants::All => + { + self.general_help( helper, dictionary, order ); + self.subject_command_help( helper, dictionary ); + // self.dot_command_help( helper, dictionary ); + }, + HelpVariants::General => self.general_help( helper, dictionary, order ), + HelpVariants::SubjectCommand => self.subject_command_help( helper, dictionary ), + _ => unimplemented!() + // HelpVariants::DotCommand => self.dot_command_help( helper, dictionary ), + } + } + + // .help + fn general_help( &self, helper : &HelpGeneratorFn, dictionary : &mut Dictionary, order : Order ) + { + let phrase = "help".to_string(); + + let grammar = dictionary.clone(); + let generator = helper.clone(); + + let moved_phrase = phrase.clone(); + let routine = move | o : VerifiedCommand | + { + let subject_help = grammar.command( &moved_phrase ); + match &subject_help + { + Some( Command { routine: Routine::WithoutContext( help ), .. } ) + if !o.args.0.is_empty() => help( o )?, + _ => + { + let format_prop : String = o.props.get_owned( "format" ).unwrap_or_default(); + let format = match format_prop.as_str() + { + "md" | "markdown" => HelpFormat::Markdown, + _ => HelpFormat::Another, + }; + if format == HelpFormat::Markdown + { + println!( "Help command\n{text}", text = md_generator( &grammar, order ) ); + } + else + { + let options = HelpGeneratorOptions::former() + .command_prefix( "." ) + .description_detailing( LevelOfDetail::Simple ) + .subject_detailing( LevelOfDetail::Simple ) + .property_detailing( LevelOfDetail::Simple ); + println! + ( + "Help command\n\n{text}", + text = generator.exec + ( + &grammar, + options.form() + ) + ); + } + } + } + + Ok::< _, error_tools::for_app::Error >( () ) + }; + let help = Command::former() + .hint( "prints information about existing commands" ) + .property( "format" ) + .hint( "help generates in format witch you write" ) + .kind( Type::String ) + .optional( true ) + .end() + .phrase( &phrase ) + .routine( routine ) + .form(); + + dictionary.register( help ); + } + + // .help command_name + fn subject_command_help( &self, helper : &HelpGeneratorFn, dictionary : &mut Dictionary ) + { + let phrase = "help".to_string(); + + let grammar = dictionary.clone(); + let generator = helper.clone(); + + let moved_phrase = phrase.clone(); + let routine = move | o : VerifiedCommand | + { + let full_help = grammar.command( &moved_phrase ); + match &full_help + { + Some( Command { routine: Routine::WithoutContext( help ), .. } ) + if o.args.0.is_empty() => help( o )?, + _ => + { + let command = o.args.get_owned::< String >( 0 ).unwrap(); + let cmd = grammar.commands.get( &command ).ok_or_else( || anyhow!( "Can not found help for command `{command}`" ) )?; + + let args = HelpGeneratorOptions::former() + .command_prefix( "." ) + .for_commands([ cmd ]) + .description_detailing( LevelOfDetail::Detailed ) + .subject_detailing( LevelOfDetail::Simple ) + .property_detailing( LevelOfDetail::Simple ) + .with_footer( true ); + + let text = generator.exec( &grammar, args.form() ); + + println!( "Help command\n\n{text}" ); + } + }; + + Ok::< _, error_tools::for_app::Error >( () ) + }; + + let help = Command::former() + .hint( "prints full information about a specified command" ) + .subject().hint( "command name" ).kind( Type::String ).optional( true ).end() + .property( "format" ).hint( "help generates in format witch you write" ).kind( Type::String ).optional( true ).end() + .phrase( &phrase ) + .routine( routine ) + .form(); + + dictionary.register( help ); + } + + // .help.command_name + // fn dot_command_help( &self, helper : &HelpGeneratorFn, grammar : &mut Dictionary ) + // { + // // generate commands names + // let commands : Vec< _ > = grammar.commands.iter().map( |( name, cmd )| ( format!( "help.{name}" ), cmd.clone() ) ).collect(); + // + // // generate Commands grammar + // let grammar_helps = commands + // .iter() + // .map( |( help_name, _ )| Command::former().hint( "prints full information about a specified command" ).phrase( help_name ).form() ) + // .collect::< Vec< _ > >(); + // + // // add commands to Verifier + // for cmd in grammar_helps + // { + // let command_variants = grammar.commands.entry( cmd.phrase.to_owned() ).or_insert_with( Vec::new ); + // command_variants.push( cmd ); + // } + // + // // generate Commands routines + // let executable = commands + // .into_iter() + // .fold( vec![], | mut acc, ( help_name, cmds ) | + // { + // let generator = helper.clone(); + // // TODO: Will be static + // let grammar = grammar.clone(); + // + // let routine = Routine::new( move | _ | + // { + // let text = cmds.iter() + // .map + // ( + // | cmd | generator.exec( &grammar, Some( cmd ) ) + // ) + // .join( "\n\n" ); + // + // println!( "Help for command\n\n{text}" ); + // + // Ok( () ) + // }); + // acc.push(( help_name, routine )); + // + // acc + // }); + // + // // add commands to ExecutorConverter + // for ( phrase, routine ) in executable + // { + // executor.routines.insert( phrase, routine ); + // } + // } + } + + type HelpFunctionFn = Rc< dyn Fn( &Dictionary, HelpGeneratorOptions< '_ > ) -> String >; + + /// Container for function that generates help string for any command + /// + /// ``` + /// # use wca::ca::help::{ HelpGeneratorOptions, HelpGeneratorFn }; + /// use wca::{ Command, Dictionary }; + /// + /// fn my_help_generator( dictionary : &Dictionary, args : HelpGeneratorOptions< '_ > ) -> String + /// { + /// format!( "Help content based on grammar and command" ) + /// } + /// + /// let help_fn = HelpGeneratorFn::new( my_help_generator ); + /// # let grammar = &Dictionary::former().form(); + /// + /// help_fn.exec( grammar, HelpGeneratorOptions::former().form() ); + /// // or + /// # let cmd = Command::former().form(); + /// help_fn.exec( grammar, HelpGeneratorOptions::former().for_commands( [ &cmd ] ).form() ); + /// ``` + #[ derive( Clone ) ] + pub struct HelpGeneratorFn( HelpFunctionFn ); + + impl Default for HelpGeneratorFn + { + fn default() -> Self + { + Self( Rc::new( generate_help_content ) ) + } + } + + impl HelpGeneratorFn + { + /// Wrap a help function + pub fn new< HelpFunction >( func : HelpFunction ) -> Self + where + HelpFunction : Fn( &Dictionary, HelpGeneratorOptions< '_ > ) -> String + 'static + { + Self( Rc::new( func ) ) + } + } + + impl HelpGeneratorFn + { + /// Executes the function to generate help content + pub fn exec( &self, dictionary : &Dictionary, args : HelpGeneratorOptions< '_ > ) -> String + { + self.0( dictionary, args ) + } + } + + impl std::fmt::Debug for HelpGeneratorFn + { + fn fmt( &self, f : &mut std::fmt::Formatter< '_ > ) -> std::fmt::Result + { + f.write_str( "HelpGenerator" ) + } + } +} + +// + +crate::mod_interface! +{ + protected use HelpGeneratorFn; + protected use HelpGeneratorOptions; + prelude use HelpVariants; +} diff --git a/module/move/wca/src/ca/input.rs b/module/move/wca/src/ca/input.rs new file mode 100644 index 0000000000..c8ef39a28b --- /dev/null +++ b/module/move/wca/src/ca/input.rs @@ -0,0 +1,83 @@ +pub( crate ) mod private +{ + use std::io; + use std::io::Write; + + /// Ask use input from standard input. + pub fn ask( request : &str ) -> String + { + let mut response = String::new(); + print!( "{} : ", request ); + io::stdout().flush().ok(); + io::stdin().read_line( &mut response ).ok(); + response.trim().to_string() + } + + /// A structure representing an input with a single string value. + /// + /// This struct is designed to encapsulate a single piece of input data as a `Vec< String >`. + /// It provides a simple wrapper that can be used to convert various types of string + /// representations into a uniform `Input` struct. + #[ derive( Debug ) ] + pub struct Input( pub Vec< String > ); + + /// A trait for converting various types into `Input`. + /// + /// The `IntoInput` trait defines a method `into_input` for converting an implementing type + /// into the `Input` struct. This allows for a flexible way of handling different string + /// representations and aggregating them into a single `Input` type. + pub trait IntoInput + { + /// Converts the implementing type into an `Input` instance. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use wca::IntoInput; + /// + /// let string_input: &str = "example string"; + /// let input_struct = string_input.into_input(); + /// + /// let owned_string_input: String = "owned example".to_string(); + /// let owned_input_struct = owned_string_input.into_input(); + /// ``` + fn into_input( self ) -> Input; + } + + impl IntoInput for &str + { + + fn into_input( self ) -> Input + { + Input( self.split( ' ' ).map( ToString::to_string ).collect() ) + } + } + + impl IntoInput for String + { + fn into_input( self ) -> Input + { + Input( self.split( ' ' ).map( ToString::to_string ).collect() ) + } + } + + impl IntoInput for Vec< String > + { + fn into_input( self ) -> Input + { + Input( self ) + } + } + +} + +// + +crate::mod_interface! +{ + exposed use ask; + exposed use Input; + exposed use IntoInput; +} diff --git a/module/move/wca/src/ca/mod.rs b/module/move/wca/src/ca/mod.rs new file mode 100644 index 0000000000..9333e5ac5b --- /dev/null +++ b/module/move/wca/src/ca/mod.rs @@ -0,0 +1,31 @@ + +crate::mod_interface! +{ + + /// Performs validation and type casting on commands values + layer grammar; + /// This component is responsible for parsing the raw string into `ParsedCommand` + layer parser; + /// Verify parsed command and convert to an appropriate type. + layer verifier; + /// This component is responsible for performing + layer executor; + + /// Provides functionality for working with input data, including asking user questions and converting various string representations into a uniform `Input` struct. + layer input; + + // /// The missing batteries of WCA. + // layer facade; + /// Genera-purpose tools which might be moved out one day. + layer tool; + + /// Responsible for aggregating all commands that the user defines, and for parsing and executing them + layer aggregator; + /// This module provides functionality for generating help content for commands. + layer help; + /// Responsible for generating Markdown formatted documentation for commands + layer formatter; + // aaa : for Bohdan : write concise documentations + // aaa : Is this enough or is more needed? + +} diff --git a/module/move/wca/src/ca/parser/command.rs b/module/move/wca/src/ca/parser/command.rs new file mode 100644 index 0000000000..116142c709 --- /dev/null +++ b/module/move/wca/src/ca/parser/command.rs @@ -0,0 +1,62 @@ +pub( crate ) mod private +{ + use std::collections::HashMap; + + /// Represents a program that contains one or more namespaces, where each namespace contains a list of commands. + /// + /// A `Program` consists of one or more commannd + /// + /// The program can be executed by iterating over each commands and executing it + // aaa : xxx : for Bohdan : Commands should be here instead of Namespace + // aaa : remove concept Namespace + // aaa : introduce concept Dictionary for grammar + // aaa : done + #[ derive( Debug, Clone, PartialEq, Eq ) ] + pub struct Program< Command > + { + /// list of namespaces with commands + pub commands : Vec< Command >, + } + + /// Represents a parsed command that has been extracted from an input string by a `Parser`. + /// + /// The `ParsedCommand` struct is designed to be flexible and allow for a wide variety of commands to be parsed and represented. However, this flexibility also means that a `ParsedCommand` may contain invalid or unexpected data. + /// + /// # Example: + /// + /// ``` + /// # use wca::ParsedCommand; + /// # use std::collections::HashMap; + /// ParsedCommand + /// { + /// name : "command".to_string(), + /// subjects : vec![ "subject_value".to_string(), /* ... */ ], + /// properties : HashMap::from_iter( + /// [ + /// ( "prop_name".to_string(), "raw_prop_value".to_string() ), + /// /* ... */ + /// ]) + /// }; + /// ``` + /// + /// In the above example, a `ParsedCommand` instance is created with the name "command", a single subject "subject_value", and one property "prop_name" with a raw value of "raw_prop_value". + /// + #[ derive( Default, Debug, Clone, PartialEq, Eq ) ] + pub struct ParsedCommand + { + /// name of command without delimiter + pub name : String, + /// list of all subjects for the command + pub subjects : Vec< String >, + /// dictionary of properties. Each property has a name and a raw value + pub properties : HashMap< String, String > + } +} + +// + +crate::mod_interface! +{ + exposed use Program; + exposed use ParsedCommand; +} diff --git a/module/move/wca/src/ca/parser/mod.rs b/module/move/wca/src/ca/parser/mod.rs new file mode 100644 index 0000000000..6d21385d36 --- /dev/null +++ b/module/move/wca/src/ca/parser/mod.rs @@ -0,0 +1,13 @@ +crate::mod_interface! +{ + /// This module defines a raw representation of parsed commands, providing a foundation for further processing and + /// transformation into other formats. The raw representation captures the essential information about each command in + /// a straightforward and easy-to-work-with format, allowing for efficient manipulation and subsequent conversion to + /// other representations. + layer command; + + /// This module is responsible for processing command-line arguments and parsing them into a raw representation of a + /// program containing multiple parsed commands. The input list of arguments is transformed into a structured format, + /// allowing the program to efficiently handle and manipulate the parsed commands. + layer parser; +} diff --git a/module/move/wca/src/ca/parser/parser.rs b/module/move/wca/src/ca/parser/parser.rs new file mode 100644 index 0000000000..a952e6427e --- /dev/null +++ b/module/move/wca/src/ca/parser/parser.rs @@ -0,0 +1,166 @@ +mod private +{ + use crate::*; + + use std::collections::HashMap; + + use error_tools::{ Result, return_err }; + + /// `Parser` is a struct used for parsing data. + #[ derive( Debug ) ] + pub struct Parser; + + impl Parser + { + /// Parses a vector of command line arguments and returns a `Program` containing the parsed commands. + /// + /// # Arguments + /// + /// * `args` - A vector of strings representing the command line arguments. + /// + /// # Returns + /// + /// Returns a `Result` with a `Program` containing the parsed commands if successful, or an error if parsing fails. + pub fn parse< As, A >( &self, args : As ) -> Result< Program< ParsedCommand > > + where + As : IntoIterator< Item = A >, + A : Into< String >, + { + let args = args.into_iter().map( Into::into ).collect::< Vec< _ > >(); + let mut commands = vec![]; + let mut i = 0; + while i < args.len() + { + let ( command, relative_pos ) = Self::parse_command( &args[ i.. ] )?; + i += relative_pos; + commands.push( command ); + } + + Ok( Program { commands } ) + } + + // with dot at the beginning + fn valid_command_name( input : &str ) -> bool + { + if let Some( name ) = input.strip_prefix( '.' ) + { + name.is_empty() || name.starts_with( '?' ) || name.chars().next().is_some_and( | c | c.is_alphanumeric() ) + } + else + { + false + } + } + + // returns ParsedCommand and relative position of the last parsed item + fn parse_command( args : &[ String ] ) -> Result< ( ParsedCommand, usize ) > + { + if args.is_empty() { + return_err!( "Unexpected behaviour: Try to parse command without input" ); + } + + let mut i = 0; + + if !Self::valid_command_name( &args[ i ] ) + { + return_err!( "Unexpected input: Expected a command, found: `{}`", args[ i ] ); + } + let name = match args[ i ].strip_prefix( '.' ).unwrap() + { + "" => ".", + "?" => ".?", + other => other, + }; + i += 1; + let ( subjects, properties, relative_pos ) = Self::parse_command_args( &args[ i .. ] )?; + + i += relative_pos; + + return Ok( + ( + ParsedCommand + { + name : name.to_string(), + subjects, + properties, + }, + i, + )) + } + + // returns ( subjects, properties, relative_end_pos ) + fn parse_command_args( args : &[ String ] ) -> Result< ( Vec< String >, HashMap< String, String >, usize ) > + { + let mut i = 0; + + let mut subjects = vec![]; + let mut properties = HashMap::new(); + + let mut properties_turn = false; + while i < args.len() + { + let item = &args[ i ]; + + if Self::valid_command_name( item ) { break; } + + if item.contains( ':' ) + { + properties_turn = true; + let ( name, value ) = item.split_once( ':' ).unwrap(); + // prop:value + if !value.is_empty() + { + properties.insert( name.to_string(), value.to_string() ); + } + // prop: value + else if args.len() > i + 1 + { + properties.insert( name.to_string(), args[ i + 1 ].to_string() ); + i += 1; + } + // we can identify this as a subject, can't we? + // prop: + else + { + return_err!( "Unexpected input '{}': Detected a possible property key preceding the ':' character. However, no corresponding value was found.", item ); + } + } + // prop : value | prop :value + else if args.len() > i + 1 && args[ i + 1 ].starts_with( ':' ) + { + // :value + if args[ i + 1 ].len() > 1 + { + properties.insert( args[ i ].clone(), args[ i + 1 ].strip_prefix( ':' ).unwrap().to_string() ); + i += 1; + } + // : value + else if args.len() > i + 2 + { + properties.insert( args[ i ].clone(), args[ i + 2 ].clone() ); + i += 2; + } + // : + else + { + return_err!( "Unexpected input '{} :': Detected a possible property key preceding the ':' character. However, no corresponding value was found.", item ); + } + } + + else if !properties_turn { subjects.push( item.to_string() ); } + + else { return_err!( "Unexpected input: Expected `command` or `property`, found: `{}`", item ); } + i += 1; + } + + Ok(( subjects, properties, i )) + } + } +} + +// + +crate::mod_interface! +{ + exposed use Parser; +} diff --git a/module/move/wca/src/ca/tool/mod.rs b/module/move/wca/src/ca/tool/mod.rs new file mode 100644 index 0000000000..637dcae457 --- /dev/null +++ b/module/move/wca/src/ca/tool/mod.rs @@ -0,0 +1,7 @@ +crate::mod_interface! +{ + + /// It takes a table of data and format it into a human-readable string + layer table; + +} diff --git a/module/move/wca/src/ca/tool/table.rs b/module/move/wca/src/ca/tool/table.rs new file mode 100644 index 0000000000..7c62d76d3a --- /dev/null +++ b/module/move/wca/src/ca/tool/table.rs @@ -0,0 +1,126 @@ +mod private +{ + use crate::*; + + use wtools::error::{ Result, err }; + + /// Represents a table composed of multiple rows. + /// + /// The `Table` struct is a simple container that holds multiple `Row` objects. + #[ derive( Debug ) ] + pub struct Table( Vec< Row > ); + + impl< T, R > From< T > for Table + where + T : IntoIterator< Item = R >, + R : Into< Row >, + { + fn from( value : T ) -> Self + { + Self( value.into_iter().map( Into::into ).collect() ) + } + } + + impl Table + { + /// Validates the structure of the given `self` object. + /// + /// It checks if all the rows have the same length as the first row of the object. + /// If all the rows have the same length, it returns `true`, otherwise it returns `false`. + /// + /// # Returns + /// + /// - `true` if all the rows have the same length + /// - `false` if at least one row has a different length + pub fn validate( &self ) -> bool + { + let mut row_iter = self.0.iter(); + let Some( first_row ) = row_iter.next() else { return true }; + let first_row_length = first_row.0.len(); + for row in row_iter + { + if row.0.len() != first_row_length + { + return false; + } + } + + true + } + } + + /// Represents a row in a table. + /// + /// The `Row` struct is a container that holds multiple `String` objects representing the values in a table row. + #[ derive( Debug ) ] + pub struct Row( Vec< String > ); + + impl< R, V > From< R > for Row + where + R : IntoIterator< Item = V >, + V : Into< String >, + { + fn from( value : R ) -> Self + { + Self( value.into_iter().map( Into::into ).collect() ) + } + } + + fn max_column_lengths( table : &Table ) -> Vec< usize > + { + let num_columns = table.0.get( 0 ).map_or( 0, | row | row.0.len() ); + ( 0 .. num_columns ) + .map( | column_index | + { + table.0.iter() + .map( | row | row.0[ column_index ].len() ) + .max() + .unwrap_or( 0 ) + }) + .collect() + } + + /// Formats a table into a readable string representation. + /// + /// # Arguments + /// + /// * `table` - The table to be formatted. + /// + /// # Returns + /// + /// * `Result` - A `Result` containing the formatted table as a `String`, or an `Error` if the table is invalid. + pub fn format_table< IntoTable >( table : IntoTable ) -> Result< String > + where + IntoTable : Into< Table >, + { + let table = table.into(); + if !table.validate() + { + return Err( err!( "Invalid table" ) ); + } + + let max_lengths = max_column_lengths( &table ); + + let mut formatted_table = String::new(); + for row in table.0 + { + for ( i, cell ) in row.0.iter().enumerate() + { + formatted_table.push_str( &format!( "{:width$}", cell, width = max_lengths[ i ] ) ); + formatted_table.push( ' ' ); + } + formatted_table.pop(); // trailing space + formatted_table.push( '\n' ); + } + formatted_table.pop(); // trailing end of line + + Ok( formatted_table ) + } +} + +// + +crate::mod_interface! +{ + protected use format_table; +} diff --git a/module/move/wca/src/ca/verifier/command.rs b/module/move/wca/src/ca/verifier/command.rs new file mode 100644 index 0000000000..094ac3efac --- /dev/null +++ b/module/move/wca/src/ca/verifier/command.rs @@ -0,0 +1,49 @@ +pub( crate ) mod private +{ + use crate::*; + + /// Represents a grammatically correct command with a phrase descriptor, a list of command subjects, and a set of command options. + /// + /// # Example: + /// + /// ``` + /// # use wca::{ VerifiedCommand, Value, Args, Props }; + /// # use std::collections::HashMap; + /// VerifiedCommand + /// { + /// phrase : "command".to_string(), + /// internal_command : false, + /// args : Args( vec![ Value::String( "subject_value".to_string() ), /* ... */ ] ), + /// props : Props( HashMap::from_iter( + /// [ + /// ( "prop_name".to_string(), Value::Number( 42.0 ) ), + /// /* ... */ + /// ])) + /// }; + /// ``` + /// + /// In the above example, a `VerifiedCommand` instance is created with the name "command", a single subject "subject_value", and one property "prop_name" with a typed values. + /// + #[ derive( Debug, Clone ) ] + pub struct VerifiedCommand + { + /// Phrase descriptor for command. + pub phrase : String, + /// Flag indicating whether a command is internal or not. + pub internal_command : bool, + /// Command subjects. + pub args : Args, + /// Command options. + pub props : Props, + } + +} + +// + +crate::mod_interface! +{ + exposed use VerifiedCommand; +} + +// qqq : use orphan instead of exposed for ALL files in the folder, dont use prelude for structs \ No newline at end of file diff --git a/module/move/wca/src/ca/verifier/mod.rs b/module/move/wca/src/ca/verifier/mod.rs new file mode 100644 index 0000000000..7ed35ae7b9 --- /dev/null +++ b/module/move/wca/src/ca/verifier/mod.rs @@ -0,0 +1,7 @@ +crate::mod_interface! +{ + /// Represents a grammatically correct command with a phrase descriptor, a list of command subjects, and a set of command options.. + layer command; + /// Provides a set of tools for processing and validating input, extracting relevant information, and converting raw data into a standardized format. + layer verifier; +} diff --git a/module/move/wca/src/ca/verifier/verifier.rs b/module/move/wca/src/ca/verifier/verifier.rs new file mode 100644 index 0000000000..b443000f7d --- /dev/null +++ b/module/move/wca/src/ca/verifier/verifier.rs @@ -0,0 +1,443 @@ +pub( crate ) mod private +{ + use crate::*; + + use ca::grammar::command::ValueDescription; + // use former::Former; + use std::collections::HashMap; + use indexmap::IndexMap; + use wtools::{ error, error::Result, err }; + use ca::help::private::{ HelpGeneratorOptions, LevelOfDetail, generate_help_content }; + + /// Converts a `ParsedCommand` to a `VerifiedCommand` by performing validation and type casting on values. + /// + /// ``` + /// # use wca::{ Command, Type, Verifier, Dictionary, ParsedCommand }; + /// # use std::collections::HashMap; + /// # fn main() -> Result< (), Box< dyn std::error::Error > > + /// # { + /// # let verifier = Verifier; + /// let dictionary = Dictionary::former() + /// .command( Command::former().phrase( "command" ).form() ) + /// .form(); + /// + /// let raw_command = ParsedCommand + /// { + /// name: "command".to_string(), + /// subjects: vec![], + /// properties: HashMap::new(), + /// }; + /// + /// let grammar_command = verifier.to_command( &dictionary, raw_command )?; + /// # Ok( () ) + /// # } + /// ``` + #[ derive( Debug, Clone ) ] + pub struct Verifier; + + impl Verifier + { + /// Converts raw program to grammatically correct + /// + /// Converts all namespaces into it with `to_namespace` method. + pub fn to_program + ( + &self, + dictionary : &Dictionary, + raw_program : Program< ParsedCommand > + ) + -> Result< Program< VerifiedCommand > > + { + let commands = raw_program.commands + .into_iter() + .map( | n | self.to_command( dictionary, n ) ) + .collect::< Result< Vec< VerifiedCommand > > >()?; + + Ok( Program { commands } ) + } + + #[ cfg( feature = "on_unknown_suggest" ) ] + fn suggest_command< 'a >( dictionary : &'a Dictionary, user_input: &str ) -> Option< &'a str > + { + use textdistance::{ Algorithm, JaroWinkler }; + let jaro = JaroWinkler::default(); + let sim = dictionary + .commands + .iter() + .map( |( name, c )| ( jaro.for_str( name.as_str(), user_input ).nsim(), c ) ) + .max_by( |( s1, _ ), ( s2, _ )| s1.total_cmp( s2 ) ); + if let Some(( sim, variant )) = sim + { + if sim > 0.0 + { + let phrase = &variant.phrase; + return Some( phrase ); + } + } + + None + } + + fn get_count_from_properties + ( + properties : &IndexMap< String, ValueDescription >, + properties_aliases : &HashMap< String, String >, + raw_properties : &HashMap< String, String > + ) -> usize + { + raw_properties.iter() + .filter( |( k, _ )| !( properties.contains_key( *k ) || properties_aliases.get( *k ).map_or( false, | key | properties.contains_key( key ) ) ) ) + .count() + } + + fn is_valid_command_variant( subjects_count : usize, raw_count : usize, possible_count : usize ) -> bool + { + raw_count + possible_count <= subjects_count + } + + fn check_command< 'a >( variant : &'a Command, raw_command : &ParsedCommand ) -> Option< &'a Command > + { + let Command { subjects, properties, properties_aliases, .. } = variant; + let raw_subjects_count = raw_command.subjects.len(); + let expected_subjects_count = subjects.len(); + if raw_subjects_count > expected_subjects_count { return None; } + + let possible_subjects_count = Self::get_count_from_properties( properties, properties_aliases, &raw_command.properties ); + if Self::is_valid_command_variant( expected_subjects_count, raw_subjects_count, possible_subjects_count ) { Some( variant ) } else { None } + } + + // qqq : for Barsik : + // Problem with separating properties and subjects: + // if we pass to wca a command that has an incorrectly named property, it defines this property as part of an subject. + // You can simulate this problem by running the code from https://github.com/Wandalen/wTools/blob/alpha/module/move/wca/examples/wca_trivial.rs in this form `cargo r .echo propertyf:123` + // where the console shows that the subject is `propertyf:123` and the property is empty. + // + // I would like to get an error in this case. + // + // A real example of the problem can be seen in the `.test` command in willbe where if you don't specify the option and make a mistake in the name of the properties when running it, + // the option will be an incorrectly written property that will produce an error with unobvious output. + // log: + // kosli@kos-msi-creator MINGW64 /c/pro/rust/lib/wTools/module/move/willbe (alpha) + // $ RUST_BACKTRACE=1 cargo run .test enabled_features:enabled power:1 dry:0 + // warning: usage of an `unsafe` block + // --> module\move\wca\src\ca\executor\context.rs:88:7 + // | + // 88 | unsafe{ self.inner.as_ptr().as_ref()?.get() } + // | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // | + // = note: requested on the command line with `-W unsafe-code` + // + // warning: usage of an `unsafe` block + // --> module\move\wca\src\ca\executor\context.rs:94:7 + // | + // 94 | unsafe { self.inner.as_ptr().as_mut()?.get_mut() } + // | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // + // warning: method `deep_clone` is never used + // --> module\move\wca\src\ca\executor\context.rs:120:21 + // | + // 70 | impl Context + // | ------------ method in this implementation + // ... + // 120 | pub( crate ) fn deep_clone( &self ) -> Self + // | ^^^^^^^^^^ + // | + // = note: `#[warn(dead_code)]` on by default + // + // warning: `wca` (lib) generated 3 warnings + // Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s + // Running `C:\pro\rust\lib\wTools\target\debug\will.exe .test 'enabled_features:enabled' 'power:1' 'dry:0'` + // Error: Execution failed. The system cannot find the file specified. (os error 2) + // + // Stack backtrace: + // 0: std::backtrace_rs::backtrace::dbghelp64::trace + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\..\..\backtrace\src\backtrace\dbghelp64.rs:99 + // 1: std::backtrace_rs::backtrace::trace_unsynchronized + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66 + // 2: std::backtrace::Backtrace::create + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\backtrace.rs:331 + // 3: std::backtrace::Backtrace::capture + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\backtrace.rs:296 + // 4: anyhow::error::impl$1::from + // at C:\Users\kosli\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anyhow-1.0.81\src\error.rs:565 + // 5: core::result::impl$27::from_residual,std::io::error::Error,anyhow::Error> + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\result.rs:1964 + // 6: willbe::command::test::private::test + // at .\src\command\test.rs:50 + // 7: core::ops::function::Fn::call,anyhow::Error> > (*)(wca::ca::executor::routine::private::Args,wca::ca::executor::routine::private::Props),tuple$,anyhow::Error> > (*)(wca::ca::executor::routine::private::Args,wca::ca::executor::routine::private::Props),enum2$,anyhow::Error + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\routine.rs:218 + // 9: alloc::boxed::impl$49::call >,dyn$,enum2$,anyhow::Error> > > + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\routine.rs:275 + // 11: alloc::boxed::impl$49::call >,dyn$,anyhow::Error> >::and_then,anyhow::Error,tuple$<>,wca::ca::executor::runtime::private::impl$0::do::closure_en + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\result.rs:1321 + // 16: wca::ca::executor::runtime::private::Runtime::do + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\runtime.rs:73 + // 17: wca::ca::executor::executor::private::Executor::sequential_execution_loop + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\executor.rs:60 + // 18: wca::ca::executor::executor::private::Executor::program + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\executor.rs:37 + // 19: wca::ca::aggregator::private::CommandsAggregator::perform > + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\aggregator.rs:276 + // 20: willbe::private::run + // at .\src\lib.rs:42 + // 21: will::main + // at .\src\bin\will.rs:14 + // 22: core::ops::function::FnOnce::call_once,anyhow::Error> > (*)(),tuple$<> > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\ops\function.rs:250 + // 23: std::sys_common::backtrace::__rust_begin_short_backtrace,anyhow::Error> > (*)(),enum2$,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\sys_common\backtrace.rs:155 + // 24: std::rt::lang_start::closure$0,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\rt.rs:166 + // 25: std::rt::lang_start_internal + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\rt.rs:148 + // 26: std::rt::lang_start,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\rt.rs:165 + // 27: main + // 28: invoke_main + // at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78 + // 29: __scrt_common_main_seh + // at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 + // 30: BaseThreadInitThunk + // 31: RtlUserThreadStart + // + // Stack backtrace: + // 0: std::backtrace_rs::backtrace::dbghelp64::trace + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\..\..\backtrace\src\backtrace\dbghelp64.rs:99 + // 1: std::backtrace_rs::backtrace::trace_unsynchronized + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66 + // 2: std::backtrace::Backtrace::create + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\backtrace.rs:331 + // 3: std::backtrace::Backtrace::capture + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\backtrace.rs:296 + // 4: anyhow::Error::msg + // at C:\Users\kosli\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anyhow-1.0.81\src\error.rs:83 + // 5: anyhow::__private::format_err + // at C:\Users\kosli\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anyhow-1.0.81\src\lib.rs:691 + // 6: wca::ca::executor::routine::private::impl$28::into_result::closure$0 + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\routine.rs:450 + // 7: enum2$,anyhow::Error> >::map_err,anyhow::Error,anyhow::Error,wca::ca::executor::routine::private::impl$28::into_result::closure_env$0 > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\result.rs:829 + // 8: wca::ca::executor::routine::private::impl$28::into_result + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\routine.rs:450 + // 9: wca::ca::executor::routine::private::impl$13::from::closure$0,enum2$,anyhow::Error> > > + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\routine.rs:275 + // 10: alloc::boxed::impl$49::call >,dyn$,anyhow::Error> >::and_then,anyhow::Error,tuple$<>,wca::ca::executor::runtime::private::impl$0::do::closure_en + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\result.rs:1321 + // 15: wca::ca::executor::runtime::private::Runtime::do + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\runtime.rs:73 + // 16: wca::ca::executor::executor::private::Executor::sequential_execution_loop + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\executor.rs:60 + // 17: wca::ca::executor::executor::private::Executor::program + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\executor\executor.rs:37 + // 18: wca::ca::aggregator::private::CommandsAggregator::perform > + // at C:\pro\rust\lib\wTools\module\move\wca\src\ca\aggregator.rs:276 + // 19: willbe::private::run + // at .\src\lib.rs:42 + // 20: will::main + // at .\src\bin\will.rs:14 + // 21: core::ops::function::FnOnce::call_once,anyhow::Error> > (*)(),tuple$<> > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\ops\function.rs:250 + // 22: std::sys_common::backtrace::__rust_begin_short_backtrace,anyhow::Error> > (*)(),enum2$,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\sys_common\backtrace.rs:155 + // 23: std::rt::lang_start::closure$0,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\rt.rs:166 + // 24: std::rt::lang_start_internal + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\rt.rs:148 + // 25: std::rt::lang_start,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\rt.rs:165 + // 26: main + // 27: invoke_main + // at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78 + // 28: __scrt_common_main_seh + // at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 + // 29: BaseThreadInitThunk + // 30: RtlUserThreadStart + // + // Stack backtrace: + // 0: std::backtrace_rs::backtrace::dbghelp64::trace + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\..\..\backtrace\src\backtrace\dbghelp64.rs:99 + // 1: std::backtrace_rs::backtrace::trace_unsynchronized + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66 + // 2: std::backtrace::Backtrace::create + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\backtrace.rs:331 + // 3: std::backtrace::Backtrace::capture + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\backtrace.rs:296 + // 4: anyhow::error::impl$1::from > + // at C:\Users\kosli\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anyhow-1.0.81\src\error.rs:565 + // 5: core::result::impl$27::from_residual,enum2$,anyhow::Error> + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\result.rs:1964 + // 6: willbe::private::run + // at .\src\lib.rs:42 + // 7: will::main + // at .\src\bin\will.rs:14 + // 8: core::ops::function::FnOnce::call_once,anyhow::Error> > (*)(),tuple$<> > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\core\src\ops\function.rs:250 + // 9: std::sys_common::backtrace::__rust_begin_short_backtrace,anyhow::Error> > (*)(),enum2$,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\sys_common\backtrace.rs:155 + // 10: std::rt::lang_start::closure$0,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\rt.rs:166 + // 11: std::rt::lang_start_internal + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f/library\std\src\rt.rs:148 + // 12: std::rt::lang_start,anyhow::Error> > > + // at /rustc/3c85e56249b0b1942339a6a989a971bf6f1c9e0f\library\std\src\rt.rs:165 + // 13: main + // 14: invoke_main + // at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78 + // 15: __scrt_common_main_seh + // at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 + // 16: BaseThreadInitThunk + // 17: RtlUserThreadStart + // error: process didn't exit successfully: `C:\pro\rust\lib\wTools\target\debug\will.exe .test 'enabled_features:enabled' 'power:1' 'dry:0'` (exit code: 1) + + fn extract_subjects( command : &Command, raw_command : &ParsedCommand, used_properties : &[ &String ] ) -> Result< Vec< Value > > + { + let mut subjects = vec![]; + + let all_subjects = raw_command + .subjects.clone().into_iter() + .chain + ( + raw_command.properties.iter() + .filter( |( key, _ )| !used_properties.contains( key ) ) + .map( |( key, value )| format!( "{key}:{value}" ) ) + ) + .collect::< Vec< _ > >(); + let mut rc_subjects_iter = all_subjects.iter(); + let mut current = rc_subjects_iter.next(); + + for ValueDescription { kind, optional, .. } in &command.subjects + { + let value = match current.and_then( | v | kind.try_cast( v.clone() ).ok() ) + { + Some( v ) => v, + None if *optional => continue, + _ => return Err( err!( "Missing not optional subject" ) ), + }; + subjects.push( value ); + current = rc_subjects_iter.next(); + } + if let Some( value ) = current { return Err( err!( "Can not identify a subject: `{}`", value ) ) } + + Ok( subjects ) + } + + fn extract_properties( command: &Command, raw_command : HashMap< String, String > ) -> Result< HashMap< String, Value > > + { + raw_command.into_iter() + .filter_map + ( + |( key, value )| + // try to find a key + if command.properties.contains_key( &key ) { Some( key ) } + else if let Some( original_key ) = command.properties_aliases.get( &key ) { Some( original_key.clone() ) } + else { None } + // give a description. unwrap is safe because previous checks + .map( | key | ( command.properties.get( &key ).unwrap(), key, value ) ) + ) + .map + ( + |( value_description, key, value )| + value_description.kind.try_cast( value ).map( | v | ( key.clone(), v ) ) + ) + .collect::< Result< HashMap< _, _ > > >() + } + + fn group_properties_and_their_aliases< 'a, Ks >( aliases : &'a HashMap< String, String >, used_keys : Ks ) -> Vec< &String > + where + Ks : Iterator< Item = &'a String > + { + let reverse_aliases = + { + let mut map = HashMap::< &String, Vec< &String > >::new(); + for ( property, alias ) in aliases + { + map.entry( alias ).or_default().push( property ); + } + map + }; + + used_keys.flat_map( | key | + { + reverse_aliases.get( key ).into_iter().flatten().map( | k | *k ).chain( Some( key ) ) + }) + .collect::< Vec< _ > >() + } + + /// Converts raw command to grammatically correct + /// + /// Make sure that this command is described in the grammar and matches it(command itself and all it options too). + pub fn to_command( &self, dictionary : &Dictionary, raw_command : ParsedCommand ) -> Result< VerifiedCommand > + { + if raw_command.name.ends_with( '.' ) | raw_command.name.ends_with( ".?" ) + { + return Ok( VerifiedCommand + { + phrase : raw_command.name, + internal_command : true, + args : Args( vec![] ), + props : Props( HashMap::new() ), + }); + } + let command = dictionary.command( &raw_command.name ) + .ok_or_else::< error::for_app::Error, _ > + ( + || + { + #[ cfg( feature = "on_unknown_suggest" ) ] + if let Some( phrase ) = Self::suggest_command( dictionary, &raw_command.name ) + { return err!( "Command not found. Maybe you mean `.{}`?", phrase ) } + err!( "Command not found. Please use `.` command to see the list of available commands." ) + } + )?; + + let Some( cmd ) = Self::check_command( command, &raw_command ) else + { + error::for_app::bail! + ( + "`{}` command with specified subjects not found. Command info: `{}`", + &raw_command.name, + generate_help_content( dictionary, HelpGeneratorOptions::former().for_commands([ dictionary.command( &raw_command.name ).unwrap() ]).command_prefix( "." ).subject_detailing( LevelOfDetail::Detailed ).form() ).strip_suffix( " " ).unwrap() + ); + }; + + let properties = Self::extract_properties( cmd, raw_command.properties.clone() )?; + let used_properties_with_their_aliases = Self::group_properties_and_their_aliases( &cmd.properties_aliases, properties.keys() ); + let subjects = Self::extract_subjects( cmd, &raw_command, &used_properties_with_their_aliases )?; + + Ok( VerifiedCommand + { + phrase : cmd.phrase.to_owned(), + internal_command : false, + args : Args( subjects ), + props : Props( properties ), + }) + } + } +} + +// + +crate::mod_interface! +{ + exposed use Verifier; +} diff --git a/module/move/wca/src/lib.rs b/module/move/wca/src/lib.rs new file mode 100644 index 0000000000..acfd31609c --- /dev/null +++ b/module/move/wca/src/lib.rs @@ -0,0 +1,25 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wca/latest/wca/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "doc/", "wca.md" ) ) ] + +#![ allow( where_clauses_object_safety ) ] // https://github.com/chris-morgan/anymap/issues/31 + +use mod_interface::mod_interface; +/// Tools +pub mod wtools; + +// qqq : maybe remove this? +// /// Errors. +// #[ cfg( not( feature = "no_std" ) ) ] +// use wtools::error::BasicError; +// xxx : check + +crate::mod_interface! +{ + /// Commands aggregator library. + #[ cfg( not( feature = "no_std" ) ) ] + layer ca; +} diff --git a/module/move/wca/src/wtools.rs b/module/move/wca/src/wtools.rs new file mode 100644 index 0000000000..a5bf769f74 --- /dev/null +++ b/module/move/wca/src/wtools.rs @@ -0,0 +1,17 @@ + +crate::mod_interface! +{ + protected use ::iter_tools::Itertools; + protected use ::error_tools::err; + protected use ::error_tools::dependency::*; + use ::strs_tools as string; + use ::error_tools as error; + use ::mod_interface; +} + +// /// Requests parser. +// #[ cfg( not( feature = "no_std" ) ) ] +// pub mod string +// { +// pub use strs_tools::string::*; +// } diff --git a/module/move/wca/tests/inc/adapter.rs b/module/move/wca/tests/inc/adapter.rs new file mode 100644 index 0000000000..33d5cd7e61 --- /dev/null +++ b/module/move/wca/tests/inc/adapter.rs @@ -0,0 +1,44 @@ +use super::*; +use the_module::exposed::*; + +tests_impls! +{ + fn simple() + { + fn command( () : (), args : Args, props : Props) -> Result< (), () > + { + Ok( () ) + } + + fn command2( () : (), args : Args, props : Props ) -> Result< (), () > + { + Ok( () ) + } + + fn echo( () : (), args : Args, props : Props ) -> Result< (), () > + { + Ok( () ) + } + + let ca = the_module::cui( () ).command( command ).command( command2 ).command( echo.arg( "string", Type::String ) ).build(); + + a_id!( (), ca.perform( ".command2 .help" ).unwrap() ); + + a_id!( (), ca.perform( ".help command" ).unwrap() ); + a_id!( (), ca.perform( ".help command2" ).unwrap() ); + a_id!( (), ca.perform( ".help help" ).unwrap() ); + + a_id!( (), ca.perform( ".help.command" ).unwrap() ); + a_id!( (), ca.perform( ".help.command2" ).unwrap() ); + a_id!( (), ca.perform( ".help.help" ).unwrap() ); + + a_true!( ca.perform( ".help.help.help" ).is_err() ); + a_true!( ca.perform( ".echo 34" ).is_ok() ); + a_true!( ca.perform( ".echo" ).is_err() ); + } +} + +tests_index! +{ + simple +} diff --git a/module/move/wca/tests/inc/commands_aggregator/basic.rs b/module/move/wca/tests/inc/commands_aggregator/basic.rs new file mode 100644 index 0000000000..f7019bebf6 --- /dev/null +++ b/module/move/wca/tests/inc/commands_aggregator/basic.rs @@ -0,0 +1,250 @@ +use super::*; +use the_module::VerifiedCommand; + +// + +tests_impls! +{ + fn simple() + { + let ca = CommandsAggregator::former() + .command( "command" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || println!( "Command" ) ) + .end() + .perform(); + + a_id!( (), ca.perform( ".command" ).unwrap() ); // Parse -> Validate -> Execute + } + + fn with_only_general_help() + { + let ca = CommandsAggregator::former() + .command( "command" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || println!( "Command" ) ) + .end() + .help_variants([ HelpVariants::General ]) + .perform(); + + a_id!( (), ca.perform( ".help" ).unwrap() ); // raw string -> GrammarProgram -> ExecutableProgram -> execute + + a_true!( ca.perform( ".help command" ).is_err() ); + + a_true!( ca.perform( ".help.command" ).is_err() ); + } + + fn dot_command() + { + let ca = CommandsAggregator::former() + .command( "cmd.first" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || println!( "Command" ) ) + .end() + .command( "cmd.second" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || println!( "Command2" ) ) + .end() + .perform(); + + a_id!( (), ca.perform( "." ).unwrap() ); + // qqq : this use case is disabled + // a_id!( (), ca.perform( ".cmd." ).unwrap() ); + } + + fn error_types() + { + let ca = CommandsAggregator::former() + .command( "command" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || println!( "command" ) ) + .end() + .command( "command_with_execution_error" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || { println!( "command" ); Err( "runtime error" ) } ) + .end() + .perform(); + + a_true!( ca.perform( ".command" ).is_ok() ); + // Expect execution error + a_true! + ( + matches! + ( + ca.perform( ".command_with_execution_error" ), + Err( Error::Execution( _ ) ) + ), + "Unexpected error type, expected Error::Execution." + ); + // Expect ValidationError::Verifier + a_true! + ( + matches! + ( + ca.perform( ".help.help.help" ), + Err( Error::Validation( ValidationError::Verifier( _ ) ) ) + ), + "Unexpected validation error type, expected ValidationError::Verifier." + ); + // Expect ValidationError::Parser + a_true! + ( + matches! + ( + ca.perform( "command" ), + Err( Error::Validation( ValidationError::Parser { .. } ) ) + ), + "Unexpected validation error type, expected ValidationError::Parser." + ); + } + + // tests bug fix when passing a subject with a colon character + // example: passing the path to a directory with a colon in its name + fn path_subject_with_colon() + { + let ca = CommandsAggregator::former() + .command( "command" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .subject().hint( "A path to directory." ).kind( Type::Path ).optional( true ).end() + .routine( || println!( "hello" ) ) + .end() + .perform(); + + let command = vec![ ".command".into(), "./path:to_dir".into() ]; + + a_id!( (), ca.perform( command ).unwrap() ); + + let wrong_command = r#".command ./path:to_dir "#; + + a_true! + ( + matches! + ( + ca.perform( wrong_command ), + Err( Error::Validation( ValidationError::Parser { .. } ) ) + ), + "It is a sentence that can not be parsed: `/path:to_dir`" + ); + } + + fn string_subject_with_colon() + { + let dictionary = &the_module::Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "Any string." ).kind( Type::String ).optional( true ).end() + .property( "nightly" ).hint( "Some property." ).kind( Type::String ).optional( true ).end() + .routine( || println!( "hello" ) ) + .form() + ) + .perform(); + let parser = Parser; + let grammar = the_module::Verifier; + let executor = the_module::Executor::former().form(); + + let raw_command = parser.parse( [ ".command", "qwe:rty", "nightly:true" ] ).unwrap().commands.remove( 0 ); + let grammar_command = grammar.to_command( dictionary, raw_command ).unwrap(); + + a_id!( grammar_command.args.0, vec![ the_module::Value::String( "qwe:rty".into() ) ] ); + + a_id!( (), executor.command( dictionary, grammar_command ).unwrap() ); + } + + fn no_prop_subject_with_colon() + { + let dictionary = &the_module::Dictionary::former() + .command + ( + the_module::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "Any string." ).kind( Type::String ).optional( true ).end() + .routine( || println!( "hello" ) ) + .form() + ) + .form(); + + let parser = Parser; + let grammar = the_module::Verifier; + let executor = the_module::Executor::former().form(); + + let raw_command = parser.parse( [ ".command", "qwe:rty" ] ).unwrap().commands.remove( 0 ); + let grammar_command = grammar.to_command( dictionary, raw_command ).unwrap(); + + a_id!( grammar_command.args.0, vec![ the_module::Value::String( "qwe:rty".into() ) ] ); + + a_id!( (), executor.command( dictionary, grammar_command ).unwrap() ); + } + + fn optional_prop_subject_with_colon() + { + let dictionary = &the_module::Dictionary::former() + .command + ( + the_module::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "Any string." ).kind( Type::String ).optional( true ).end() + .property( "nightly" ).hint( "Some property." ).kind( Type::String ).optional( true ).end() + .routine( || println!( "hello" ) ) + .form() + ) + .form(); + + let parser = Parser; + let grammar = the_module::Verifier; + let executor = the_module::Executor::former().form(); + + let raw_command = parser.parse( [ ".command", "qwe:rty" ] ).unwrap().commands.remove( 0 ); + let grammar_command = grammar.to_command( dictionary, raw_command ).unwrap(); + + a_id!( grammar_command.args.0, vec![ the_module::Value::String("qwe:rty".into()) ] ); + + a_id!( (), executor.command( dictionary, grammar_command ).unwrap() ); + } + + // qqq : make the following test work + fn subject_with_spaces() + { + let query = "SELECT title, links, MIN( published ) FROM Frames"; + + let ca = CommandsAggregator::former() + .command( "query.execute" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .subject().hint( "SQL query" ).kind( Type::String ).optional( false ).end() + .routine( move | o : VerifiedCommand | assert_eq!( query, o.args.get_owned::< &str >( 0 ).unwrap() ) ) + .end() + .perform(); + + a_id!( (), ca.perform( vec![ ".query.execute".to_string(), query.into() ] ).unwrap() ); + } +} + +// + +tests_index! +{ + simple, + with_only_general_help, + dot_command, + error_types, + path_subject_with_colon, + string_subject_with_colon, + no_prop_subject_with_colon, + optional_prop_subject_with_colon, + subject_with_spaces, +} diff --git a/module/move/wca/tests/inc/commands_aggregator/callback.rs b/module/move/wca/tests/inc/commands_aggregator/callback.rs new file mode 100644 index 0000000000..834426c32d --- /dev/null +++ b/module/move/wca/tests/inc/commands_aggregator/callback.rs @@ -0,0 +1,49 @@ +use super::*; +use std::sync::{ Arc, Mutex }; + +#[ test ] +fn changes_state_of_local_variable_on_perform() +{ + let history = Arc::new( Mutex::new( vec![] ) ); + + let ca_history = Arc::clone( &history ); + let ca = CommandsAggregator::former() + .command( "command" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || println!( "command" ) ) + .end() + .command( "command2" ) + .hint( "hint" ) + .long_hint( "long_hint" ) + .routine( || println!( "command2" ) ) + .end() + .callback + ( + move | input, program | + ca_history.lock().unwrap() + .push( + ( + input.to_string(), + program.commands.clone() ) + )) + .perform(); + + { + assert!( history.lock().unwrap().is_empty() ); + } + + { + ca.perform( ".command" ).unwrap(); + let current_history = history.lock().unwrap(); + assert_eq!( [ ".command" ], current_history.iter().map( |( input, _ )| input ).collect::< Vec< _ > >().as_slice() ); + assert_eq!( 1, current_history.len() ); + } + + { + ca.perform( ".command2" ).unwrap(); + let current_history = history.lock().unwrap(); + assert_eq!( [ ".command", ".command2" ], current_history.iter().map( |( input, _ )| input ).collect::< Vec< _ > >().as_slice() ); + assert_eq!( 2, current_history.len() ); + } +} diff --git a/module/move/wca/tests/inc/commands_aggregator/help.rs b/module/move/wca/tests/inc/commands_aggregator/help.rs new file mode 100644 index 0000000000..1df2be062e --- /dev/null +++ b/module/move/wca/tests/inc/commands_aggregator/help.rs @@ -0,0 +1,196 @@ +use std::fs::{DirBuilder, File}; +use std::io::Write; +use std::path::Path; +use std::process::{Command, Stdio}; + +pub fn start_sync< AP, Args, Arg, P > +( + application : AP, + args: Args, + path : P, +) -> String where AP : AsRef< Path >, Args : IntoIterator< Item = Arg >, Arg : AsRef< std::ffi::OsStr >, P : AsRef< Path >, +{ + let ( application, path ) = ( application.as_ref(), path.as_ref() ); + let args = args.into_iter().map( | a | a.as_ref().into() ).collect::< Vec< std::ffi::OsString > >(); + let child = Command::new( application ).args( &args ).stdout( Stdio::piped() ).stderr( Stdio::piped() ).current_dir( path ).spawn().unwrap(); + let output = child.wait_with_output().unwrap(); + + String::from_utf8( output.stdout ).unwrap() +} + +#[ test ] +fn help_command_with_optional_params() +{ + let temp = assert_fs::TempDir::new().unwrap(); + + let toml = format! + ( + r#"[package] +name = "wca_hello_test" +version = "0.1.0" +edition = "2021" +[dependencies] +wca = {{path = "{}"}}"#, + env!( "CARGO_MANIFEST_DIR" ).replace( "\\", "/" ) + ) ; + + let main = r#"use wca::{ Type, VerifiedCommand }; + fn main(){ + let ca = wca::CommandsAggregator::former() + .command( "echo" ) + .hint( "prints all subjects and properties" ) + .subject().hint( "Subject" ).kind( Type::String ).optional( true ).end() + .property( "property" ).hint( "simple property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!( "= Args\n{:?}\n\n= Properties\n{:?}\n", o.args, o.props ) } ) + .end() + .perform(); + + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + ca.perform( args ).unwrap(); + } + "#; + File::create( temp.path().join( "Cargo.toml" ) ).unwrap().write_all( toml.as_bytes() ).unwrap(); + DirBuilder::new().create( temp.join( "src" ) ).unwrap(); + File::create( temp.path().join( "src" ).join( "main.rs" ) ).unwrap().write_all( main.as_bytes() ).unwrap(); + let result = start_sync( "cargo", [ "r", ".help", "echo" ], temp.path() ); + assert_eq! + ( + "Help command\n\n.echo < subjects > < properties > - prints all subjects and properties\n\nSubjects:\n\t- Subject [?String]\nProperties:\n\tproperty - simple property [?String]\n", + result + ); +} + +#[ test ] +fn help_command_with_nature_order() +{ + let temp = assert_fs::TempDir::new().unwrap(); + + let toml = format! + ( + r#"[package] +name = "wca_hello_test" +version = "0.1.0" +edition = "2021" +[dependencies] +wca = {{path = "{}"}}"#, + env!( "CARGO_MANIFEST_DIR" ).replace( "\\", "/" ) + ) ; + + let main = r#"fn main() + { + use wca::{ Type, VerifiedCommand, Order }; + + let ca = wca::CommandsAggregator::former() + .command( "c" ) + .hint( "c" ) + .property( "c-property" ).kind( Type::String ).optional( true ).end() + .property( "b-property" ).kind( Type::String ).optional( true ).end() + .property( "a-property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!("c") } ) + .end() + .command( "b" ) + .hint( "b" ) + .property( "b-property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!("b") } ) + .end() + .command( "a" ) + .hint( "a" ) + .property( "a-property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!("a") } ) + .end() + .order( Order::Nature ) + + .perform(); + + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + ca.perform( args ).unwrap(); + }"#; + + File::create( temp.path().join( "Cargo.toml" ) ).unwrap().write_all( toml.as_bytes() ).unwrap(); + DirBuilder::new().create( temp.join( "src" ) ).unwrap(); + File::create( temp.path().join( "src" ).join( "main.rs" ) ).unwrap().write_all( main.as_bytes() ).unwrap(); + + let result = start_sync( "cargo", [ "r", ".help" ], temp.path() ); + + assert_eq! + ( + "Help command\n\n.c - c\n.b - b\n.a - a\n", + result + ); + + let result = start_sync( "cargo", [ "r", ".help", "c" ], temp.path() ); + + println!( "{result}" ); + + assert_eq! + ( + "Help command\n\n.c - c\n\nProperties:\n\tc-property - [?String]\n\tb-property - [?String]\n\ta-property - [?String]\n", + result + ); +} + +#[ test ] +fn help_command_with_lexicography_order() +{ + let temp = assert_fs::TempDir::new().unwrap(); + + let toml = format! + ( + r#"[package] +name = "wca_hello_test" +version = "0.1.0" +edition = "2021" +[dependencies] +wca = {{path = "{}"}}"#, + env!( "CARGO_MANIFEST_DIR" ).replace( "\\", "/" ) + ) ; + + let main = r#"fn main() + { + use wca::{ Type, VerifiedCommand, Order }; + + let ca = wca::CommandsAggregator::former() + .command( "c" ) + .hint( "c" ) + .property( "c-property" ).kind( Type::String ).optional( true ).end() + .property( "b-property" ).kind( Type::String ).optional( true ).end() + .property( "a-property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!("c") } ) + .end() + .command( "b" ) + .hint( "b" ) + .property( "b-property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!("b") } ) + .end() + .command( "a" ) + .hint( "a" ) + .property( "a-property" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | { println!("a") } ) + .end() + .order( Order::Lexicography ) + .perform(); + + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + ca.perform( args ).unwrap(); + }"#; + + File::create( temp.path().join( "Cargo.toml" ) ).unwrap().write_all( toml.as_bytes() ).unwrap(); + DirBuilder::new().create( temp.join( "src" ) ).unwrap(); + File::create( temp.path().join( "src" ).join( "main.rs" ) ).unwrap().write_all( main.as_bytes() ).unwrap(); + + let result = start_sync( "cargo", [ "r", ".help" ], temp.path() ); + + assert_eq! + ( + "Help command\n\n.a - a\n.b - b\n.c - c\n", + result + ); + + let result = start_sync( "cargo", [ "r", ".help", "c" ], temp.path() ); + + assert_eq! + ( + "Help command\n\n.c - c\n\nProperties:\n\ta-property - [?String]\n\tb-property - [?String]\n\tc-property - [?String]\n", + result + ); +} diff --git a/module/move/wca/tests/inc/commands_aggregator/mod.rs b/module/move/wca/tests/inc/commands_aggregator/mod.rs new file mode 100644 index 0000000000..ca0cdc4b5a --- /dev/null +++ b/module/move/wca/tests/inc/commands_aggregator/mod.rs @@ -0,0 +1,16 @@ +use super::*; + +use the_module:: +{ + Parser, + + CommandsAggregator, + HelpVariants, + Type, + Error, + ValidationError, +}; + +mod basic; +mod callback; +mod help; diff --git a/module/move/wca/tests/inc/executor/command.rs b/module/move/wca/tests/inc/executor/command.rs new file mode 100644 index 0000000000..b1dcf7ac12 --- /dev/null +++ b/module/move/wca/tests/inc/executor/command.rs @@ -0,0 +1,191 @@ +use super::*; +use the_module::VerifiedCommand; + +// + +tests_impls! +{ + fn basic() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .routine( || println!( "hello" ) ) + .form() + ) + .form(); + let verifier = Verifier; + + // init executor + let raw_command = parser.parse( [ ".command" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + let executor = Executor::former().form(); + + // execute the command + a_true!( executor.command( dictionary, grammar_command ).is_ok() ); + } + + fn with_subject() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "hint" ).kind( Type::String ).optional( false ).end() + .routine( | o : VerifiedCommand | o.args.get( 0 ).map( | a | println!( "{a:?}" )).ok_or_else( || "Subject not found" ) ) + .form() + ) + .form(); + let verifier = Verifier; + + // init executor + let executor = Executor::former().form(); + + // with subject + let raw_command = parser.parse( [ ".command", "subject" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + // execute the command + a_true!( executor.command( dictionary, grammar_command ).is_ok() ); + + // without subject + let raw_command = parser.parse( [ ".command" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + } + + fn with_property() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .property( "prop" ).hint( "about prop" ).kind( Type::String ).optional( true ).end() + .routine( | o : VerifiedCommand | o.props.get( "prop" ).map( | a | println!( "{a:?}" )).ok_or_else( || "Prop not found" ) ) + .form() + ) + .form(); + let verifier = Verifier; + + // init executor + let executor = Executor::former().form(); + + // with property + let raw_command = parser.parse( [ ".command", "prop:value" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + // execute the command + a_true!( executor.command( dictionary, grammar_command ).is_ok() ); + + // with subject and without property + let raw_command = parser.parse( [ ".command", "subject" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + + // with subject and with property + let raw_command = parser.parse( [ ".command", "subject", "prop:value" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + } + + fn with_context() + { + use std::sync::{ Arc, Mutex }; + + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "check" ) + .routine + ( + | ctx : Context | + ctx + .get() + .ok_or_else( || "Have no value" ) + .and_then( | x : Arc< Mutex< i32 > > | if *x.lock().unwrap() != 1 { Err( "x not eq 1" ) } else { Ok( () ) } ) + ) + .form() + ) + .form(); + let verifier = Verifier; + let mut ctx = wca::Context::new( Mutex::new( 1 ) ); + // init executor + let executor = Executor::former() + .context( ctx ) + .form(); + + let raw_command = parser.parse( [ ".check" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + // execute the command + a_true!( executor.command( dictionary, grammar_command ).is_ok() ); + } + + #[ should_panic( expected = "A handler function for the command is missing" ) ] + fn without_routine() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .form() + ) + .form(); + let verifier = Verifier; + + // init executor + let executor = Executor::former().form(); + + let raw_command = parser.parse( [ ".command" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( executor.command( dictionary, grammar_command ).is_err() ); + } +} + +// + +tests_index! +{ + basic, + with_subject, + with_property, + with_context, + without_routine, +} diff --git a/module/move/wca/tests/inc/executor/mod.rs b/module/move/wca/tests/inc/executor/mod.rs new file mode 100644 index 0000000000..6b2906031a --- /dev/null +++ b/module/move/wca/tests/inc/executor/mod.rs @@ -0,0 +1,15 @@ +use super::*; +use the_module:: +{ + Parser, + + Context, Type, + Dictionary, + Verifier, + + Executor, + wtools +}; + +mod command; +mod program; diff --git a/module/move/wca/tests/inc/executor/program.rs b/module/move/wca/tests/inc/executor/program.rs new file mode 100644 index 0000000000..885d2e017e --- /dev/null +++ b/module/move/wca/tests/inc/executor/program.rs @@ -0,0 +1,120 @@ +use super::*; +use the_module::VerifiedCommand; + +// + +tests_impls! +{ + fn basic() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .routine( || println!( "hello" ) ) + .form() + ) + .form(); + let verifier = Verifier; + + // init executor + let executor = Executor::former().form(); + + // existed command | unknown command will fail on converter + let raw_program = parser.parse( [ ".command" ] ).unwrap(); + let grammar_program = verifier.to_program( dictionary, raw_program ).unwrap(); + + // execute the command + a_true!( executor.program( dictionary, grammar_program ).is_ok() ); + } + + fn with_context() + { + use std::sync::{ Arc, Mutex }; + use wtools::error::for_app::Error; + + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "inc" ) + .routine + ( + | ctx : Context | + ctx + .get() + .ok_or_else( || "Have no value" ) + .and_then( | x : Arc< Mutex< i32 > > | { *x.lock().unwrap() += 1; Ok( () ) } ) + ) + .form() + ) + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "eq" ) + .subject().hint( "number" ).kind( Type::Number ).optional( true ).end() + .routine + ( + | ctx : Context, o : VerifiedCommand | + ctx + .get() + .ok_or_else( || "Have no value".to_string() ) + .and_then + ( + | x : Arc< Mutex< i32 > > | + { + let x = x.lock().unwrap(); + let y : i32 = o.args.get( 0 ).ok_or_else( || "Missing subject".to_string() ).unwrap().to_owned().into(); + + if dbg!( *x ) != y { Err( format!( "{} not eq {}", x, y ) ) } else { Ok( () ) } + } + ) + ) + .form() + ) + .form(); + let verifier = Verifier; + + // starts with 0 + let ctx = wca::Context::new( Mutex::new( 0 ) ); + // init simple executor + let executor = Executor::former() + .context( ctx ) + .form(); + + // value in context = 0 + let raw_program = parser.parse( [ ".eq", "1" ] ).unwrap(); + let grammar_program = verifier.to_program( dictionary, raw_program ).unwrap(); + + a_true!( executor.program( dictionary, grammar_program ).is_err() ); + + // value in context = 1 + 1 + 1 = 3 + let raw_program = parser.parse( [ ".eq", "0", ".inc", ".inc", ".eq", "2" ] ).unwrap(); + let grammar_program = verifier.to_program( dictionary, raw_program ).unwrap(); + + a_true!( executor.program( dictionary, grammar_program ).is_ok() ); + } +} + +// + +tests_index! +{ + basic, + with_context, +} diff --git a/module/move/wca/tests/inc/grammar/from_command.rs b/module/move/wca/tests/inc/grammar/from_command.rs new file mode 100644 index 0000000000..9823236c0c --- /dev/null +++ b/module/move/wca/tests/inc/grammar/from_command.rs @@ -0,0 +1,405 @@ +use super::*; + +// + +tests_impls! +{ + fn command_validation() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .form() + ) + .form(); + let verifier = Verifier; + + // existed command + let raw_command = parser.parse( [ ".command" ] ).unwrap().commands.remove( 0 ); + + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + // not existed command + let raw_command = parser.parse( [ ".invalid_command" ] ).unwrap().commands.remove( 0 ); + + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + + // invalid command syntax + let raw_command = parser.parse( [ "invalid_command" ] ); + a_true!( raw_command.is_err() ); + } + + fn subjects() + { + // init parser + let parser = Parser; + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "first subject" ).kind( Type::String ).end() + .form() + ) + .form(); + + // init converter + let verifier = Verifier; + + // with only one subject + let raw_command = parser.parse( [ ".command", "subject" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_id!( vec![ Value::String( "subject".to_string() ) ], grammar_command.args.0 ); + a_true!( grammar_command.props.is_empty() ); + + // with more subjects that it is set + let raw_command = parser.parse( [ ".command", "subject1", "subject2" ] ).unwrap().commands.remove( 0 ); + + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + + // with subject and property that isn't declared + let raw_command = parser.parse( [ ".command", "subject", "prop:value" ] ).unwrap().commands.remove( 0 ); + + a_true!( verifier.to_command( dictionary, raw_command ).is_err() ); + + // subject with colon when property not declared + let raw_command = parser.parse( [ ".command", "prop:value" ] ).unwrap().commands.remove( 0 ); + + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + a_id!( vec![ Value::String( "prop:value".to_string() ) ], grammar_command.args.0 ); + a_true!( grammar_command.props.is_empty() ); + } + + fn subject_type_check() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "number value" ).kind( Type::Number ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // string when number expected + let raw_command = parser.parse( [ ".command", "subject" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + + // valid negative float number when number expected + let raw_command = parser.parse( [ ".command", "-3.14" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + } + + fn subject_with_list() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "Subjects list" ).kind( Type::List( Type::String.into(), ',' ) ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // with only one subject + let raw_command = parser.parse( [ ".command", "first_subject,second_subject,third_subject" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( &dictionary, raw_command ).unwrap(); + + a_id!( vec! + [ + Value::List( vec! + [ + Value::String( "first_subject".into() ), + Value::String( "second_subject".into() ), + Value::String( "third_subject".into() ), + ]) + ], grammar_command.args.0 ); + a_true!( grammar_command.props.is_empty() ); + } + + fn subject_is_optional_basic() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "This subject is optional" ).kind( Type::String ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // with subject + let raw_command = parser.parse( [ ".command", "subject" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + // without subject + let raw_command = parser.parse( [ ".command" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + } + + fn preferred_non_optional_first_order() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .subject().hint( "This subject is optional and type number" ).kind( Type::Number ).optional( true ).end() + .subject().hint( "This subject is required and type that accepts the optional one" ).kind( Type::String ).optional( false ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // second subject is required, but missing + let raw_command = parser.parse( [ ".command", "42" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err(), "subject identifies as first subject" ); + + // first subject is missing + let raw_command = parser.parse( [ ".command", "valid_string" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + // both subjects exists + let raw_command = parser.parse( [ ".command", "42", "string" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + // first subject not a number, but both arguments exists + let raw_command = parser.parse( [ ".command", "not_a_number", "string" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err(), "first subject not a number" ); + } + + fn properties() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .property( "prop1" ).hint( "hint of prop1" ).kind( Type::String ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // with only one property + let raw_command = parser.parse( [ ".command", "prop1:value1" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( grammar_command.args.0.is_empty() ); + a_id!( HashMap::from_iter([ ( "prop1".to_string(), Value::String( "value1".to_string() ) ) ]), grammar_command.props.0 ); + + // with property re-write + let raw_command = parser.parse( [ ".command", "prop1:value", "prop1:another_value" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( grammar_command.args.0.is_empty() ); + a_id!( HashMap::from_iter([ ( "prop1".to_string(), Value::String( "another_value".to_string() ) ) ]), grammar_command.props.0 ); + + // with undeclareted property + let raw_command = parser.parse( [ ".command", "undeclareted_prop:value" ] ).unwrap().commands.remove( 0 ); + + a_true!( verifier.to_command( dictionary, raw_command ).is_err() ); + + // with undeclareted subject + let raw_command = parser.parse( [ ".command", "subject", "prop1:value" ] ).unwrap().commands.remove( 0 ); + + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + } + + fn property_type_check() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .property( "prop" ).hint( "Number property" ).kind( Type::Number ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // string when number expected + let raw_command = parser.parse( [ ".command", "prop:Property" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ); + a_true!( grammar_command.is_err() ); + + // valid negative float number when number expected + let raw_command = parser.parse( [ ".command", "prop:-3.14" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + } + + fn property_with_list() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .property( "prop" ).hint( "Numbers list property" ).kind( Type::List( Type::Number.into(), ',' ) ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // with only one subject + let raw_command = parser.parse( [ ".command", "prop:1,2,3" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( grammar_command.args.0.is_empty() ); + a_id! + ( + vec![ 1.0, 2.0, 3.0 ], + Vec::< f64 >::from( grammar_command.props.0[ "prop" ].clone() ) + ); + } + + fn alias_property() + { + // init parser + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .property( "property" ) + .hint( "string property" ) + .kind( Type::String ) + .optional( true ) + .alias( "prop" ) + .alias( "p" ) + .end() + .form() + ) + .form(); + let verifier = Verifier; + + // basic + let raw_command = parser.parse( [ ".command", "property:value" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( grammar_command.args.0.is_empty() ); + a_id!( HashMap::from_iter([ ( "property".to_string(), Value::String( "value".to_string() ) ) ]), grammar_command.props.0 ); + + // first alias + let raw_command = parser.parse( [ ".command", "prop:value" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( grammar_command.args.0.is_empty() ); + a_id!( HashMap::from_iter([ ( "property".to_string(), Value::String( "value".to_string() ) ) ]), grammar_command.props.0 ); + + // second alias + let raw_command = parser.parse( [ ".command", "p:value" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( grammar_command.args.0.is_empty() ); + a_id!( HashMap::from_iter([ ( "property".to_string(), Value::String( "value".to_string() ) ) ]), grammar_command.props.0 ); + + // init converter with layered properties + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command" ) + .property( "property" ).hint( "string property" ).kind( Type::String ).optional( true ).alias( "p" ).end() + .property( "proposal" ).hint( "string property" ).kind( Type::String ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + let raw_command = parser.parse( [ ".command", "p:value" ] ).unwrap().commands.remove( 0 ); + let grammar_command = verifier.to_command( dictionary, raw_command ).unwrap(); + + a_true!( grammar_command.args.0.is_empty() ); + a_id!( HashMap::from_iter([ ( "property".to_string(), Value::String( "value".to_string() ) ) ]), grammar_command.props.0 ); + } +} + +// + +tests_index! +{ + command_validation, + subjects, + subject_type_check, + subject_with_list, + subject_is_optional_basic, + preferred_non_optional_first_order, + properties, + property_type_check, + property_with_list, + alias_property, +} diff --git a/module/move/wca/tests/inc/grammar/from_program.rs b/module/move/wca/tests/inc/grammar/from_program.rs new file mode 100644 index 0000000000..670eaf178c --- /dev/null +++ b/module/move/wca/tests/inc/grammar/from_program.rs @@ -0,0 +1,58 @@ +use super::*; + +// + +tests_impls! +{ + fn basic() + { + let parser = Parser; + + // init converter + let dictionary = &Dictionary::former() + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command1" ) + .subject().hint( "subject" ).kind( Type::String ).optional( true ).end() + .form() + ) + .command + ( + wca::Command::former() + .hint( "hint" ) + .long_hint( "long_hint" ) + .phrase( "command2" ) + .subject().hint( "subject" ).kind( Type::String ).optional( true ).end() + .form() + ) + .form(); + let verifier = Verifier; + + // parse program with only one command + let raw_program = parser.parse( [ ".command1", "subject" ] ).unwrap(); + + // convert program + let grammar_program = verifier.to_program( dictionary, raw_program ).unwrap(); + a_true!( grammar_program.commands.len() == 1 ); + a_id!( vec![ Value::String( "subject".to_string() ) ], grammar_program.commands[ 0 ].args.0 ); + + // parse program several commands + let raw_program = parser.parse( [ ".command1", "first_subj", ".command2", "second_subj" ] ).unwrap(); + + // convert program + let grammar_program = verifier.to_program( dictionary, raw_program ).unwrap(); + a_true!( grammar_program.commands.len() == 2 ); + a_id!( vec![ Value::String( "first_subj".to_string() ) ], grammar_program.commands[ 0 ].args.0 ); + a_id!( vec![ Value::String( "second_subj".to_string() ) ], grammar_program.commands[ 1 ].args.0 ); + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/move/wca/tests/inc/grammar/mod.rs b/module/move/wca/tests/inc/grammar/mod.rs new file mode 100644 index 0000000000..38c94dc114 --- /dev/null +++ b/module/move/wca/tests/inc/grammar/mod.rs @@ -0,0 +1,13 @@ +use super::*; +use the_module:: +{ + Parser, + + Type, Value, + Dictionary, + Verifier, +}; + +mod from_command; +mod from_program; +mod types; diff --git a/module/move/wca/tests/inc/grammar/types.rs b/module/move/wca/tests/inc/grammar/types.rs new file mode 100644 index 0000000000..7421fce48f --- /dev/null +++ b/module/move/wca/tests/inc/grammar/types.rs @@ -0,0 +1,155 @@ +use super::*; +use wca::TryCast; + +// + +tests_impls! +{ + fn number() + { + // basic + let number = Type::Number.try_cast( "1".into() ); + + let number = number.unwrap(); + a_id!( Value::Number( 1.0 ) , number ); + + let inner_number : i32 = number.clone().into(); + a_id!( 1, inner_number ); + + let inner_number : f64 = number.into(); + a_id!( 1.0, inner_number ); + + // negative float number + let number = Type::Number.try_cast( "-3.14".into() ); + + let number = number.unwrap(); + a_id!( Value::Number( -3.14 ) , number ); + + let inner_number : i32 = number.clone().into(); + a_id!( -3, inner_number ); + + let inner_number : u32 = number.clone().into(); + a_id!( 0, inner_number ); + + let inner_number : f64 = number.into(); + a_id!( -3.14, inner_number ); + + // not a number + let not_number = Type::Number.try_cast( "text".into() ); + a_true!( not_number.is_err() ); + } + + fn string() + { + let string = Type::String.try_cast( "some string".into() ); + + let string = string.unwrap(); + a_id!( Value::String( "some string".into() ) , string ); + + let inner_string : String = string.clone().into(); + a_id!( "some string", inner_string ); + + let inner_string : &str = string.into(); + a_id!( "some string", inner_string ); + } + + fn boolean() + { + // 1 -> Value(true) -> true + let boolean = Type::Bool.try_cast( "1".into() ); + + let boolean = boolean.unwrap(); + a_id!( Value::Bool( true ) , boolean ); + + let inner_boolean : bool = boolean.into(); + a_id!( true, inner_boolean ); + + // 0 -> Value(false) -> false + let boolean = Type::Bool.try_cast( "0".into() ); + + let boolean = boolean.unwrap(); + a_id!( Value::Bool( false ) , boolean ); + + let inner_boolean : bool = boolean.into(); + a_id!( false, inner_boolean ); + + // true -> Value(true) + let boolean = Type::Bool.try_cast( "true".into() ); + + let boolean = boolean.unwrap(); + a_id!( Value::Bool( true ) , boolean ); + + // false -> Value(false) + let boolean = Type::Bool.try_cast( "false".into() ); + + let boolean = boolean.unwrap(); + a_id!( Value::Bool( false ) , boolean ); + } + + fn path() + { + use std::str::FromStr; + let path = Type::Path.try_cast( "./some/relative/path".into() ); + + let path = path.unwrap(); + a_id!( Value::Path( "./some/relative/path".into() ) , path ); + + let inner_path : std::path::PathBuf = path.into(); + a_id!( std::path::PathBuf::from_str( "./some/relative/path" ).unwrap(), inner_path ); + } + + fn values_list() + { + // strings + let string = Type::List( Type::String.into(), ',' ).try_cast( "some,string".into() ).unwrap(); + + a_id!( + Value::List( vec![ Value::String( "some".into() ), Value::String( "string".into() ) ] ) + , string ); + + let inner_string : Vec< String > = string.clone().into(); + a_id!( vec![ "some".to_string(), "string".into() ], inner_string ); + + let inner_string : Vec< &str > = string.into(); + a_id!( vec![ "some", "string" ], inner_string ); + + // numbers + let numbers = Type::List( Type::Number.into(), ';' ).try_cast( "100;3.14".into() ); + let numbers = numbers.unwrap(); + a_id!( + Value::List( vec![ Value::Number( 100.0 ), Value::Number( 3.14 ) ] ) + , numbers ); + + let inner_numbers : Vec< i32 > = numbers.clone().into(); + a_id!( vec![ 100, 3 ], inner_numbers ); + + let inner_numbers : Vec< f64 > = numbers.into(); + a_id!( vec![ 100.0, 3.14 ], inner_numbers ); + } + + // xxx : The try_cast method on value is designed to convert user input strings into parsed values, such as lists of strings or numbers. However, when converting these parsed values back into their original string representations using the display method, the resulting string may not match the original user input. + fn values_list_display() + { + let origin_string = "some,string"; + let string = Type::List( Type::String.into(), ',' ).try_cast( origin_string.into() ).unwrap(); + a_id!( origin_string, string.to_string() ); + + // xxx : qqq : that fails now. suggest solution + // let origin_string = "100;3.14"; + // let string = Type::List( Type::Number.into(), ';' ).try_cast( origin_string.into() ).unwrap(); + // a_id!( origin_string, string.to_string() ); + } + +} + +// + +tests_index! +{ + number, + string, + path, + boolean, + values_list, + values_list_display, +} diff --git a/module/move/wca/tests/inc/mod.rs b/module/move/wca/tests/inc/mod.rs new file mode 100644 index 0000000000..e07349dc81 --- /dev/null +++ b/module/move/wca/tests/inc/mod.rs @@ -0,0 +1,16 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ allow( unused_imports ) ] +use std::collections::HashMap; + +#[ cfg( not( feature = "no_std" ) ) ] +mod parser; +#[ cfg( not( feature = "no_std" ) ) ] +mod grammar; +#[ cfg( not( feature = "no_std" ) ) ] +mod executor; +#[ cfg( not( feature = "no_std" ) ) ] +mod commands_aggregator; +// #[ cfg( not( feature = "no_std" ) ) ] +// mod adapter; diff --git a/module/move/wca/tests/inc/parser/command.rs b/module/move/wca/tests/inc/parser/command.rs new file mode 100644 index 0000000000..986ab1d0c0 --- /dev/null +++ b/module/move/wca/tests/inc/parser/command.rs @@ -0,0 +1,394 @@ +use super::*; + +// + +tests_impls! +{ + fn basic() + { + let parser = Parser; + + // only command + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::new(), + }, + parser.parse( [ ".command" ] ).unwrap().commands[ 0 ] + ); + + // command with one subject + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "subject".into() ], + properties : HashMap::new(), + }, + parser.parse( [ ".command", "subject" ] ).unwrap().commands[ 0 ] + ); + + // command with many subjects + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "subject1".into(), "subject2".into(), "subject3".into() ], + properties : HashMap::new(), + }, + parser.parse( [ ".command", "subject1", "subject2", "subject3" ] ).unwrap().commands[ 0 ] + ); + + // command with one property + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "prop".into(), "value".into() ) ]), + }, + parser.parse( [ ".command", "prop:value" ] ).unwrap().commands[ 0 ] + ); + + // command with many properties + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter( + [ + ( "prop1".into(), "value1".into() ), + ( "prop2".into(), "value2".into() ), + ( "prop3".into(), "value3".into() ) + ]), + }, + parser.parse( [ ".command", "prop1:value1", "prop2:value2", "prop3:value3" ] ).unwrap().commands[ 0 ] + ); + + // command with one subject and one property + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "subject".into() ], + properties : HashMap::from_iter([ ( "prop".into(), "value".into() ) ]), + }, + parser.parse( [ ".command", "subject", "prop:value" ] ).unwrap().commands[ 0 ] + ); + + // command with many subjects and many properties + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec! + [ + "subject1".into(), + "subject2".into(), + "subject3".into(), + ], + properties : HashMap::from_iter( + [ + ( "prop1".into(), "value1".into() ), + ( "prop2".into(), "value2".into() ), + ( "prop3".into(), "value3".into() ), + ]), + }, + parser.parse( [ ".command", "subject1", "subject2", "subject3", "prop1:value1", "prop2:value2", "prop3:value3" ] ).unwrap().commands[ 0 ] + ); + } + + // aaa : the parser must be able to accept a list of arguments(std::env::args()) + // aaa : yep + fn with_spaces_in_value() + { + let parser = Parser; + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "value with spaces".into() ], + properties : HashMap::new(), + }, + parser.parse( [ ".command", "value with spaces" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "prop".into(), "value with spaces".into() ) ]), + }, + parser.parse( [ ".command", "prop:value with spaces" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "prop".into(), "value with spaces".into() ) ]), + }, + parser.parse( [ ".command", "prop:", "value with spaces" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "prop".into(), "value with spaces".into() ) ]), + }, + parser.parse( [ ".command", "prop", ":value with spaces" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "prop".into(), "value with spaces".into() ) ]), + }, + parser.parse( [ ".command", "prop", ":", "value with spaces" ] ).unwrap().commands[ 0 ] + ); + } + + fn not_only_alphanumeric_symbols() + { + let parser = Parser; + + a_id! + ( + ParsedCommand + { + name : "additional_command".into(), + subjects : vec![], + properties : HashMap::new(), + }, + parser.parse( [ ".additional_command" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command.sub_command".into(), + subjects : vec![ "subj_ect".into() ], + properties : HashMap::new(), + }, + parser.parse( [ ".command.sub_command", "subj_ect" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "long_prop".into(), "some-value".into() ) ]), + }, + parser.parse( [ ".command", "long_prop:some-value" ] ).unwrap().commands[ 0 ] + ); + } + + fn path_in_subject() + { + let parser = Parser; + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "/absolute/path/to/something".into() ], + properties : HashMap::new(), + }, + parser.parse( [ ".command", "/absolute/path/to/something" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "./path/to/something".into() ], + properties : HashMap::new(), + }, + parser.parse( [ ".command", "./path/to/something" ] ).unwrap().commands[ 0 ] + ); + } + + fn path_in_property() + { + let parser = Parser; + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "path".into(), "/absolute/path/to/something".into() ) ]), + }, + parser.parse( [ ".command", "path:/absolute/path/to/something" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "path".into(), "./path/to/something".into() ) ]), + }, + parser.parse( [ ".command", "path:./path/to/something" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "path".into(), "../path/to/something".into() ) ]), + }, + parser.parse( [ ".command", "path:../path/to/something" ] ).unwrap().commands[ 0 ] + ); + } + + fn list_in_property() + { + let parser = Parser; + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::from_iter([ ( "list".into(), "[1,2,3]".into() ) ]), + }, + parser.parse( [ ".command", "list:[1,2,3]" ] ).unwrap().commands[ 0 ] + ); + } + + fn string_value() + { + let parser = Parser; + + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "subject with spaces".into() ], + properties : HashMap::from_iter([ ( "prop".into(), "property with spaces".into() ) ]), + }, + parser.parse( [ ".command", "subject with spaces", "prop:property with spaces" ] ).unwrap().commands[ 0 ] + ); + + // command in subject and property + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "\\.command".into() ], + properties : HashMap::from_iter([ ( "prop".into(), ".command".into() ) ]), + }, + parser.parse( [ ".command", "\\.command", "prop:.command" ] ).unwrap().commands[ 0 ] + ); + + // with escaped quetes + a_id! + ( + ParsedCommand + { + name : "command".into(), + subjects : vec![ "' queted ' \\ value".into() ], + properties : HashMap::from_iter([ ( "prop".into(), "some \"quetes\" ' \\ in string".into() ) ]), + }, + parser.parse( [ ".command", "\' queted \' \\ value", "prop:some \"quetes\" ' \\ in string" ] ).unwrap().commands[ 0 ] + ); + } + + fn dot_command() + { + let parser = Parser; + + a_id! + ( + ParsedCommand + { + name : ".".into(), + subjects : vec![], + properties : HashMap::new(), + }, + parser.parse( [ "." ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command.".into(), + subjects : vec![], + properties : HashMap::new(), + }, + parser.parse( [ ".command." ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : ".?".into(), + subjects : vec![], + properties : HashMap::new(), + }, + parser.parse( [ ".?" ] ).unwrap().commands[ 0 ] + ); + + a_id! + ( + ParsedCommand + { + name : "command.?".into(), + subjects : vec![], + properties : HashMap::new(), + }, + parser.parse( [ ".command.?" ] ).unwrap().commands[ 0 ] + ); + } +} + +// + +tests_index! +{ + basic, + with_spaces_in_value, + not_only_alphanumeric_symbols, + path_in_subject, + path_in_property, + list_in_property, + string_value, + dot_command, +} diff --git a/module/move/wca/tests/inc/parser/mod.rs b/module/move/wca/tests/inc/parser/mod.rs new file mode 100644 index 0000000000..456679d11a --- /dev/null +++ b/module/move/wca/tests/inc/parser/mod.rs @@ -0,0 +1,10 @@ +use super::*; +use wca:: +{ + Program, ParsedCommand, + + Parser, +}; + +mod command; +mod program; diff --git a/module/move/wca/tests/inc/parser/program.rs b/module/move/wca/tests/inc/parser/program.rs new file mode 100644 index 0000000000..081f8cc3e8 --- /dev/null +++ b/module/move/wca/tests/inc/parser/program.rs @@ -0,0 +1,59 @@ +use super::*; + +// + +tests_impls! +{ + fn basic() + { + let parser = Parser; + + // only one command + a_id! + ( + Program { commands : vec! + [ + ParsedCommand + { + name : "command".into(), + subjects : vec![], + properties : HashMap::new(), + }, + ]}, + parser.parse( [ ".command" ] ).unwrap() + ); + + a_id! + ( + Program { commands : vec! + [ + ParsedCommand + { + name : "command1".into(), + subjects : vec![], + properties : HashMap::new(), + }, + ParsedCommand + { + name : "command2".into(), + subjects : vec![], + properties : HashMap::new(), + }, + ParsedCommand + { + name : "command3".into(), + subjects : vec![], + properties : HashMap::new(), + } + ]}, + parser.parse( [ ".command1", ".command2", ".command3" ] ).unwrap() + ); + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/move/wca/tests/smoke_test.rs b/module/move/wca/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/move/wca/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/wca/tests/wca_tests.rs b/module/move/wca/tests/wca_tests.rs new file mode 100644 index 0000000000..85a4f35ea3 --- /dev/null +++ b/module/move/wca/tests/wca_tests.rs @@ -0,0 +1,12 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +#[ allow( unused_imports ) ] +use wca as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; +#[ allow( unused_imports ) ] +use wca::wtools::*; + +mod inc; diff --git a/module/move/willbe/Cargo.toml b/module/move/willbe/Cargo.toml new file mode 100644 index 0000000000..63c66bd6c0 --- /dev/null +++ b/module/move/willbe/Cargo.toml @@ -0,0 +1,77 @@ +[package] +name = "willbe" +version = "0.12.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/willbe" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/willbe" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/move/willbe" +description = """ +Utility to publish multi-crate and multi-workspace environments and maintain their consistency. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] +default-run = "will" + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled", "progress_bar" ] +full = [ "enabled", "progress_bar" ] +enabled = [] +tracing = [ "dep:tracing", "dep:tracing-subscriber" ] +progress_bar = [ "dep:indicatif" ] + +[dependencies] +cargo_metadata = "~0.18.1" +convert_case = "0.6.0" +flate2 = "~1.0" +globwalk = "~0.8" +toml_edit = "~0.14" +petgraph = "~0.6" +ptree = "~0.4" +rayon = "1.8.0" +semver = "~1.0.0" +similar = "~2.4" +regex = "1.10.2" +sha-1 = "~0.10" +tar = "~0.4" +handlebars = "4.5.0" +ureq = "~2.9" +colored = "2.1.0" +duct = "0.13.7" +tracing = { version = "0.1", features = [ "log-always" ], optional = true } +tracing-subscriber = { version = "0.3", optional = true } +indicatif = { version = "0.17", optional = true } +prettytable-rs = "0.10" +serde_json = "1.0" # for CargoMetadata::Package::metadata (need serde_json::Value) +serde = "1.0" # for CargoMetadata::Package + +## internal +crates_tools = { workspace = true } +error_tools = { workspace = true, features = [ "default" ] } +former = { workspace = true, features = [ "default" ] } +iter_tools = { workspace = true, features = [ "default" ] } +mod_interface = { workspace = true, features = [ "default" ] } +wca = { workspace = true, features = [ "default" ] } +proper_path_tools = { workspace = true, features = [ "default" ] } +process_tools = { workspace = true, features = [ "default" ] } + +[dev-dependencies] +test_tools = { workspace = true } +assert_fs = "1.0" +serde_yaml = "0.9" +serde_json = "1.0.114" +serde = "1.0" +assert_cmd = "2.0" diff --git a/module/move/willbe/License b/module/move/willbe/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/willbe/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/willbe/Readme.md b/module/move/willbe/Readme.md new file mode 100644 index 0000000000..b387b877c6 --- /dev/null +++ b/module/move/willbe/Readme.md @@ -0,0 +1,38 @@ + + +# Module:: willbe + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_push.yml) [![docs.rs](https://img.shields.io/docsrs/willbe?color=e3e8f0&logo=docs.rs)](https://docs.rs/willbe) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Utility to publish multi-crate and multi-workspace environments and maintain their consistency. + +### Purpose + +1. **Multi-Workspace Consistency**: In a project setup involving multiple workspaces with shared dependencies, `willbe` maintains consistency. It ensures all workspaces are updated with compatible dependency versions. + +2. **Publishing Multi-Crate Projects**: If your project structure includes multiple crates that need simultaneous publishing, `willbe` manages the process seamlessly. It ensures the crates are published in the right order while staying in version sync. + +3. **Dependency Analysis**: `willbe` can perform a thorough analysis of your project's dependencies, providing a detailed highlight of inconsistencies or areas that need attention. + +4. **Test Execution With Varied Configurations**: `willbe` can execute tests with varying configurations, such as different combinations of crate features. This assists in ensuring comprehensive coverage of test scenarios. + +5. **Generate Health Table**: Quickly visualize important project metrics like build status for each crate, creating a single, easy-to-read table. + +6. **Automating CI/CD Workflow Generation**: Automatically generate a series of CI/CD operations suitable for the task at hand to enhance productivity and improve the development process. + +### To install + +```bash +cargo install willbe +will . +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools/module/move/willbe +cargo install --path . +will . +``` diff --git a/module/move/willbe/src/action/cicd_renew.rs b/module/move/willbe/src/action/cicd_renew.rs new file mode 100644 index 0000000000..573a2a13bc --- /dev/null +++ b/module/move/willbe/src/action/cicd_renew.rs @@ -0,0 +1,277 @@ +mod private +{ + use crate::*; + + use std:: + { + path::Path, + fs::File, + io::{ Write, Read }, + collections::BTreeMap + }; + // aaa : for Petro : don't use cargo_metadata and Package directly, use facade + // aaa : ✅ + + use convert_case::{ Casing, Case }; + use handlebars::{ RenderError, TemplateError }; + use toml_edit::Document; + + use _path::AbsolutePath; + use crate::manifest::private::CrateDirError; + use error_tools::for_lib::Error; + use error_tools::dependency::*; + use workspace::WorkspacePackage; + + use wtools::error::for_app::{ Result, Error as wError }; + use entity::WorkspaceError; + use error_tools::err; + + #[ derive( Debug, Error ) ] + pub enum CiCdGenerateError + { + #[ error( "Common error: {0}" ) ] + Common(#[ from ] wError ), + #[ error( "I/O error: {0}" ) ] + IO( #[ from ] std::io::Error ), + #[ error( "Crate directory error: {0}" ) ] + CrateDir( #[ from ] CrateDirError ), + #[ error( "Workspace error: {0}" ) ] + Workspace( #[ from ] WorkspaceError), + #[ error( "Template error: {0}" ) ] + Template( #[ from ] TemplateError ), + #[ error( "Render error: {0}" ) ] + Render( #[ from ] RenderError ), + } + + // qqq : for Petro : should return Report and typed error in Result + /// Generate workflows for modules in .github/workflows directory. + pub fn cicd_renew( base_path : &Path ) -> Result< (), CiCdGenerateError > + { + let workspace_cache = Workspace::with_crate_dir( AbsolutePath::try_from( base_path )?.try_into()? )?; + let packages = workspace_cache.packages()?; + let username_and_repository = &username_and_repository( &workspace_cache.workspace_root()?.join( "Cargo.toml" ).try_into()?, packages.as_slice() )?; + let workspace_root = workspace_cache.workspace_root()?; + // find directory for workflows + let workflow_root = workspace_root.join( ".github" ).join( "workflows" ); + // map packages name's to naming standard + // aaa : for Petro : avoid calling packages_get twice + // aaa : remove it + let names = packages.iter().map( | p | p.name() ).collect::< Vec< _ > >(); + // map packages path to relative paths fom workspace root, for example D :/work/wTools/module/core/iter_tools => module/core/iter_tools + let relative_paths = + packages + .iter() + .map( | p | p.manifest_path() ) + .filter_map( | p | p.strip_prefix( workspace_root ).ok() ) + .map( | p | p.with_file_name( "" ) ) + .collect::< Vec< _ > >(); + + // preparing templates + let mut handlebars = handlebars::Handlebars::new(); + + handlebars.register_template_string( "auto_pr_to", include_str!( "../../template/workflow/auto_pr_to.hbs" ) )?; + handlebars.register_template_string( "appropraite_branch_for", include_str!( "../../template/workflow/appropraite_branch_for.hbs" ) )?; + handlebars.register_template_string( "auto_merge_to", include_str!( "../../template/workflow/auto_merge_to.hbs" ) )?; + handlebars.register_template_string( "standard_rust_pull_request", include_str!( "../../template/workflow/standard_rust_pull_request.hbs" ) )?; + handlebars.register_template_string( "module_push", include_str!( "../../template/workflow/module_push.hbs" ) )?; + + + // qqq : for Petro : instead of iterating each file manually, iterate each file in loop + + // creating workflow for each module + for ( name, relative_path ) in names.iter().zip( relative_paths.iter() ) + { + // generate file names + let workflow_file_name = workflow_root.join( format!( "module_{}_push.yml", name.to_case( Case::Snake ) ) ); + let path = relative_path.join( "Cargo.toml" ); + let mut data = BTreeMap::new(); + data.insert( "name", name.as_str() ); + data.insert( "username_and_repository", username_and_repository.0.as_str() ); + data.insert( "branch", "alpha" ); + let path = path.as_str().replace( "\\", "/" ); + data.insert( "manifest_path", path.as_str() ); + let content = handlebars.render( "module_push", &data )?; + file_write( &workflow_file_name, &content )?; + } + + file_write( &workflow_root.join( "appropriate_branch.yml" ), include_str!( "../../template/workflow/appropriate_branch.yml" ) )?; + + let data = map_prepare_for_appropriative_branch( "- beta", username_and_repository.0.as_str(), "alpha", "alpha", "beta" ); + file_write( &workflow_root.join( "appropriate_branch_beta.yml" ), &handlebars.render( "appropraite_branch_for", &data )? )?; + + let data = map_prepare_for_appropriative_branch( "- main\n - master", username_and_repository.0.as_str(), "alpha", "beta", "master" ); + file_write( &workflow_root.join( "appropriate_branch_master.yml" ), &handlebars.render( "appropraite_branch_for", &data )? )?; + + let mut data = BTreeMap::new(); + data.insert( "name", "beta" ); + data.insert( "group_branch", "beta" ); + data.insert( "branch", "alpha" ); + + file_write( &workflow_root.join( "auto_merge_to_beta.yml" ), &handlebars.render( "auto_merge_to", &data )? )?; + + file_write( &workflow_root.join( "auto_pr.yml" ), include_str!( "../../template/workflow/auto_pr.yml" ) )?; + + let mut data = BTreeMap::new(); + data.insert( "name", "alpha" ); + data.insert + ( + "branches", + " - '*' + - '*/*' + - '**' + - '!master' + - '!main' + - '!alpha' + - '!beta' + - '!*test*' + - '!*test*/*' + - '!*/*test*' + - '!*experiment*' + - '!*experiment*/*' + - '!*/*experiment*'" + ); + data.insert( "username_and_repository", username_and_repository.0.as_str() ); + data.insert( "uses_branch", "alpha" ); + data.insert( "src_branch", "${{ github.ref_name }}" ); + data.insert( "dest_branch", "alpha" ); + + file_write( &workflow_root.join( "auto_pr_to_alpha.yml" ), &handlebars.render( "auto_pr_to", &data )? )?; + + let mut data = BTreeMap::new(); + data.insert( "name", "beta" ); + data.insert( "branches", "- alpha" ); + data.insert( "username_and_repository", username_and_repository.0.as_str() ); + data.insert( "uses_branch", "alpha" ); + data.insert( "src_branch", "alpha" ); + data.insert( "dest_branch", "beta" ); + + file_write( &workflow_root.join( "auto_pr_to_beta.yml" ), &handlebars.render( "auto_pr_to", &data )? )?; + + let mut data = BTreeMap::new(); + data.insert( "name", "master" ); + data.insert( "branches", "- beta" ); + data.insert( "username_and_repository", username_and_repository.0.as_str() ); + data.insert( "uses_branch", "alpha" ); + data.insert( "src_branch", "beta" ); + data.insert( "dest_branch", "master" ); + + file_write( &workflow_root.join( "auto_pr_to_master.yml" ), &handlebars.render( "auto_pr_to", &data )? )?; + + file_write( &workflow_root.join( "runs_clean.yml" ), include_str!( "../../template/workflow/rust_clean.yml" ) )?; + + let mut data = BTreeMap::new(); + data.insert( "username_and_repository", username_and_repository.0.as_str() ); + + file_write( &workflow_root.join( "standard_rust_pull_request.yml" ), &handlebars.render( "standard_rust_pull_request", &data )? )?; + + file_write( &workflow_root.join( "standard_rust_push.yml" ), include_str!( "../../template/workflow/standard_rust_push.yml" ) )?; + + file_write( &workflow_root.join( "for_pr_rust_push.yml" ), include_str!( "../../template/workflow/for_pr_rust_push.yml" ) )?; + + file_write( &workflow_root.join( "standard_rust_scheduled.yml" ), include_str!( "../../template/workflow/standard_rust_scheduled.yml" ) )?; + + file_write( &workflow_root.join( "standard_rust_status.yml" ), include_str!( "../../template/workflow/standard_rust_status.yml" ) )?; + + file_write( &workflow_root.join( "status_checks_rules_update.yml" ), include_str!( "../../template/workflow/status_checks_rules_update.yml" ) )?; + + file_write( &workflow_root.join( "Readme.md" ), include_str!( "../../template/workflow/Readme.md" ) )?; + + Ok( () ) + } + + /// Prepare params for render appropriative_branch_for template. + fn map_prepare_for_appropriative_branch< 'a > + ( + branches : &'a str, + username_and_repository : &'a str, + uses_branch : &'a str, + src_branch : &'a str, + name : &'a str + ) + -> BTreeMap< &'a str, &'a str > + { + let mut data = BTreeMap::new(); + data.insert( "branches", branches ); + data.insert( "username_and_repository", username_and_repository ); + data.insert( "uses_branch", uses_branch ); + data.insert( "src_branch", src_branch ); + data.insert( "name", name ); + data + } + + /// Create and write or rewrite content in file. + pub fn file_write( filename : &Path, content : &str ) -> Result< () > + { + if let Some( folder ) = filename.parent() + { + match std::fs::create_dir_all( folder ) + { + Ok( _ ) => {}, + Err( e ) if e.kind() == std::io::ErrorKind::AlreadyExists => {}, + Err( e ) => return Err( e.into() ), + } + } + + let mut file = File::create( filename )?; + file.write_all( content.as_bytes() )?; + Ok( () ) + } + + #[derive( Debug ) ] + struct UsernameAndRepository( String ); + + // aaa : for Petro : not clear how output should look + // aaa : add to documentation + // aaa : for Petro : newtype? + // aaa : replace to AbsolutePath + // aaa : for Petro : why mut? + // aaa : change signature + /// Searches and extracts the username and repository name from the repository URL. + /// The repository URL is first sought in the Cargo.toml file of the workspace; + /// if not found there, it is then searched in the Cargo.toml file of the module. + /// If it is still not found, the search continues in the GitHub remotes. + /// Result looks like this: `Wandalen/wTools` + fn username_and_repository( cargo_toml_path : &AbsolutePath, packages : &[ WorkspacePackage ] ) -> Result< UsernameAndRepository > + { + let mut contents = String::new(); + File::open( cargo_toml_path )?.read_to_string( &mut contents )?; + let doc = contents.parse::< Document >()?; + let url = + doc + .get( "workspace" ) + .and_then( | workspace | workspace.get( "metadata" ) ) + .and_then( | metadata | metadata.get( "repo_url" ) ) + .and_then( | url | url.as_str() ) + .map( String::from ); + if let Some( url ) = url + { + return url::extract_repo_url( &url ) + .and_then( | url | url::git_info_extract( &url ).ok() ) + .map( UsernameAndRepository ) + .ok_or_else( || err!( "Fail to parse repository url from workspace Cargo.toml")) + } + else + { + let mut url = None; + for package in packages + { + if let Ok( wu ) = manifest::private::repo_url( package.manifest_path().parent().unwrap().as_std_path() ) + { + url = Some( wu ); + break; + } + } + return url + .and_then( | url | url::extract_repo_url( &url ) ) + .and_then( | url | url::git_info_extract( &url ).ok() ) + .map( UsernameAndRepository ) + .ok_or_else( || err!( "Fail to extract repository url") ) + } + } + +} + +crate::mod_interface! +{ + exposed use cicd_renew; +} diff --git a/module/move/willbe/src/action/deploy_renew.rs b/module/move/willbe/src/action/deploy_renew.rs new file mode 100644 index 0000000000..2bd04f640c --- /dev/null +++ b/module/move/willbe/src/action/deploy_renew.rs @@ -0,0 +1,187 @@ +mod private +{ + use crate::*; + use std::path::Path; + use error_tools::{for_app::Context, Result}; + use tool::template::*; + + /// Template for creating deploy files. + /// + /// Includes terraform deploy options to GCP, and Hetzner, + /// a Makefile for useful commands, and a key directory. + #[ derive( Debug ) ] + pub struct DeployTemplate + { + files : DeployTemplateFiles, + parameters : TemplateParameters, + values : TemplateValues, + } + + // qqq : for Viktor : why DeployTemplate can't be part of template.rs? + + impl Template< DeployTemplateFiles > for DeployTemplate + { + fn create_all( self, path : &Path ) -> Result< () > + { + self.files.create_all( path, &self.values ) + } + + fn parameters( &self ) -> &TemplateParameters + { + &self.parameters + } + + fn set_values( &mut self, values : TemplateValues ) + { + self.values = values + } + + fn get_values( &self ) -> &TemplateValues + { + &self.values + } + + fn get_values_mut( &mut self ) -> &mut TemplateValues + { + &mut self.values + } + + fn parameter_storage( &self ) -> &Path { + "./.deploy_template.toml".as_ref() + } + + fn template_name( &self ) -> &'static str { + "deploy" + } + } + + impl Default for DeployTemplate + { + fn default() -> Self + { + let parameters = TemplateParameters::former() + .parameter( "gcp_project_id" ).is_mandatory( true ).end() + .parameter( "gcp_region" ).end() + .parameter( "gcp_artifact_repo_name" ).end() + .parameter( "docker_image_name" ).end() + .form(); + + Self + { + files : Default::default(), + parameters, + values : Default::default(), + } + } + } + + // qqq : for Viktor : is that structure required? + /// Files for the deploy template. + /// + /// Default implementation contains all required files. + #[ derive( Debug ) ] + pub struct DeployTemplateFiles( Vec< TemplateFileDescriptor > ); + + impl Default for DeployTemplateFiles + { + fn default() -> Self + { + let formed = TemplateFilesBuilder::former() + // root + .file().data( include_str!( "../../template/deploy/.deploy_template.toml.hbs" ) ).path( "./.deploy_template.toml" ).mode( WriteMode::TomlExtend ).is_template( true ).end() + .file().data( include_str!( "../../template/deploy/Makefile.hbs" ) ).path( "./Makefile" ).is_template( true ).end() + // /key + .file().data( include_str!( "../../template/deploy/key/pack.sh" ) ).path( "./key/pack.sh" ).end() + .file().data( include_str!( "../../template/deploy/key/Readme.md" ) ).path( "./key/Readme.md" ).end() + // /deploy/ + .file().data( include_str!( "../../template/deploy/deploy/Dockerfile" ) ).path( "./deploy/Dockerfile" ).end() + .file().data( include_str!( "../../template/deploy/deploy/Readme.md" ) ).path( "./deploy/Readme.md" ).end() + // /deploy/gar + .file().data( include_str!( "../../template/deploy/deploy/gar/Readme.md" ) ).path( "./deploy/gar/Readme.md" ).end() + .file().data( include_str!( "../../template/deploy/deploy/gar/main.tf" ) ).path( "./deploy/gar/main.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/gar/outputs.tf" ) ).path( "./deploy/gar/outputs.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/gar/variables.tf" ) ).path( "./deploy/gar/variables.tf" ).end() + // /deploy/gce + .file().data( include_str!( "../../template/deploy/deploy/gce/Readme.md" ) ).path( "./deploy/gce/Readme.md" ).end() + .file().data( include_str!( "../../template/deploy/deploy/gce/main.tf" ) ).path( "./deploy/gce/main.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/gce/outputs.tf" ) ).path( "./deploy/gce/outputs.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/gce/variables.tf" ) ).path( "./deploy/gce/variables.tf" ).end() + // /deploy/gce/templates + .file().data( include_str!( "../../template/deploy/deploy/gce/templates/cloud-init.tpl" ) ).path( "./deploy/gce/templates/cloud-init.tpl" ).end() + // /deploy/gcs + .file().data( include_str!( "../../template/deploy/deploy/gcs/main.tf" ) ).path( "./deploy/gcs/main.tf" ).end() + // /deploy/hetzner + .file().data( include_str!( "../../template/deploy/deploy/hetzner/main.tf" ) ).path( "./deploy/hetzner/main.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/hetzner/outputs.tf" ) ).path( "./deploy/hetzner/outputs.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/hetzner/variables.tf" ) ).path( "./deploy/hetzner/variables.tf" ).end() + // /deploy/hetzner/templates + .file().data( include_str!( "../../template/deploy/deploy/hetzner/templates/cloud-init.tpl" ) ).path( "./deploy/hetzner/templates/cloud-init.tpl" ).end() + // /deploy/aws + .file().data( include_str!( "../../template/deploy/deploy/aws/main.tf" ) ).path( "./deploy/aws/main.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/aws/outputs.tf" ) ).path( "./deploy/aws/outputs.tf" ).end() + .file().data( include_str!( "../../template/deploy/deploy/aws/variables.tf" ) ).path( "./deploy/aws/variables.tf" ).end() + // /deploy/aws/templates + .file().data( include_str!( "../../template/deploy/deploy/aws/templates/cloud-init.tpl" ) ).path( "./deploy/aws/templates/cloud-init.tpl" ).end() + .form(); + + Self( formed.files ) + } + } + + // qqq : for Viktor : should not be required + impl TemplateFiles for DeployTemplateFiles {} + // qqq : for Viktor : should not be required + impl IntoIterator for DeployTemplateFiles + { + type Item = TemplateFileDescriptor; + + type IntoIter = std::vec::IntoIter< Self::Item >; + + fn into_iter( self ) -> Self::IntoIter + { + self.0.into_iter() + } + } + + fn get_dir_name() -> Result< String > + { + let current_dir = std::env::current_dir()?; + let current_dir = current_dir.components().last().context( "Invalid current directory" )?; + Ok( current_dir.as_os_str().to_string_lossy().into() ) + } + + fn dir_name_to_formatted( dir_name : &str, separator : &str ) -> String + { + dir_name + .replace( ' ', separator ) + .replace( '_', separator ) + .to_lowercase() + } + + /// Creates deploy template + pub fn deploy_renew + ( + path : &Path, + mut template : DeployTemplate + ) -> Result< () > + { + if let None = template.load_existing_params( path ) + { + let current_dir = get_dir_name()?; + let artifact_repo_name = dir_name_to_formatted( ¤t_dir, "-" ); + let docker_image_name = dir_name_to_formatted( ¤t_dir, "_" ); + template.values.insert_if_empty( "gcp_artifact_repo_name", wca::Value::String( artifact_repo_name ) ); + template.values.insert_if_empty( "docker_image_name", wca::Value::String( docker_image_name ) ); + template.values.insert_if_empty( "gcp_region", wca::Value::String( "europe-central2".into() ) ); + } + template.create_all( path )?; + Ok( () ) + } + +} + +crate::mod_interface! +{ + orphan use deploy_renew; + orphan use DeployTemplate; +} diff --git a/module/move/willbe/src/action/features.rs b/module/move/willbe/src/action/features.rs new file mode 100644 index 0000000000..47b9e98f44 --- /dev/null +++ b/module/move/willbe/src/action/features.rs @@ -0,0 +1,97 @@ +mod private +{ + use crate::*; + + use std:: + { + collections::{ BTreeMap, HashMap }, + fmt + }; + + use _path::AbsolutePath; + use former::Former; + use error_tools::{ for_app::Context, Result }; + use workspace::Workspace; + + /// Options available for the .features command + #[ derive( Debug, Former ) ] + pub struct FeaturesOptions + { + manifest_dir : AbsolutePath, + with_features_deps : bool, + } + + /// Represents a report about features available in the package + #[ derive( Debug, Default ) ] + pub struct FeaturesReport + { + /// Flag to turn off/on displaying feature dependencies - "feature: [deps...]" + pub with_features_deps : bool, + + /// A key-value pair structure representing available features. + /// + /// Key: name of the package (useful for workspaces, where multiple packages can be found). + /// + /// Value: Another key-value pair representing a feature and its dependencies + pub inner : HashMap< String, BTreeMap< String, Vec< String > > >, + } + + impl fmt::Display for FeaturesReport + { + fn fmt( &self, f : &mut fmt::Formatter< '_ >) -> Result< (), fmt::Error > + { + self.inner.iter().try_for_each + ( | ( package, features ) | + { + writeln!(f, "Package {}:", package)?; + features.iter().try_for_each + ( | ( feature, dependencies ) | + { + let feature = match self.with_features_deps + { + false => format!( "\t{feature}" ), + true + => + { + let deps = dependencies.join( ", " ); + format!( "\t{feature}: [{deps}]" ) + } + }; + writeln!( f, "{feature}" ) + } + ) + } + ) + } + } + + /// List features + pub fn features( FeaturesOptions { manifest_dir, with_features_deps } : FeaturesOptions ) -> Result< FeaturesReport > + { + let workspace = Workspace::with_crate_dir( CrateDir::try_from( manifest_dir.clone() )? ).context( "Failed to find workspace" )?; + let packages = workspace.packages()?.into_iter().filter + ( | package | + package.manifest_path().as_str().starts_with( manifest_dir.as_ref().as_os_str().to_str().unwrap() ) + ).collect::< Vec< _ > >(); + let mut report = FeaturesReport + { + with_features_deps, + ..Default::default() + }; + packages.iter().for_each + ( | package | + { + let features = package.features(); + report.inner.insert(package.name().to_owned(), features.to_owned()); + } + ); + Ok( report ) + } +} + +crate::mod_interface! +{ + orphan use features; + orphan use FeaturesOptions; + orphan use FeaturesReport; +} diff --git a/module/move/willbe/src/action/list.rs b/module/move/willbe/src/action/list.rs new file mode 100644 index 0000000000..6e4bd01dc0 --- /dev/null +++ b/module/move/willbe/src/action/list.rs @@ -0,0 +1,693 @@ +/// Internal namespace. +mod private +{ + use crate::*; + use std:: + { + fmt::{ Formatter, Write }, + path::PathBuf, + collections::HashSet, + }; + use std::collections::HashMap; + use petgraph:: + { + prelude::*, + algo::toposort, + visit::Topo, + }; + use std::str::FromStr; + use packages::FilterMapOptions; + use wtools::error:: + { + for_app::{ Error, Context }, + err + }; + // aaa : for Petro : don't use cargo_metadata and Package directly, use facade + // aaa : ✅ + + use petgraph::prelude::{ Dfs, EdgeRef }; + use former::Former; + + use workspace::Workspace; + use _path::AbsolutePath; + use workspace::WorkspacePackage; + + /// Args for `list` action. + #[ derive( Debug, Default, Copy, Clone ) ] + pub enum ListFormat + { + /// Tree like format. + #[ default ] + Tree, + /// Topologically sorted list. + Topological, + } + + impl FromStr for ListFormat + { + type Err = Error; + + fn from_str( s : &str ) -> Result< Self, Self::Err > + { + let value = match s + { + "tree" => ListFormat::Tree, + "toposort" => ListFormat::Topological, + e => return Err( err!( "Unknown format '{}'. Available values : [tree, toposort]", e )) + }; + + Ok( value ) + } + } + + /// Enum representing the different dependency categories. + /// + /// These categories include : + /// - `Primary`: This category represents primary dependencies. + /// - `Dev`: This category represents development dependencies. + /// - `Build`: This category represents build-time dependencies. + #[ derive( Debug, Copy, Clone, Hash, Eq, PartialEq ) ] + pub enum DependencyCategory + { + /// Represents the primary dependencies, i.e., libraries or packages that + /// are required for your code to run. These are typically listed in your + /// `Cargo.toml`'s `[dependencies]` section. + Primary, + /// Represents the development dependencies. These are used for compiling + /// tests, examples, or benchmarking code. They are not used when compiling + /// the normal application or library. These are typically listed in your + /// `Cargo.toml`'s `[dev-dependencies]` section. + Dev, + /// Represents build-time dependencies. These are used only to compile + /// build scripts (`build.rs`) but not for the package code itself. These + /// are typically listed in your `Cargo.toml`'s `[build-dependencies]` section. + Build, + } + + /// Enum representing the source of a dependency. + /// + /// This enum has the following values : + /// * `Local` - Represents a dependency located locally. + /// * `Remote` - Represents a dependency fetched from a remote source. + #[ derive( Debug, Copy, Clone, Hash, Eq, PartialEq ) ] + pub enum DependencySource + { + /// Represents a dependency that is located on the local file system. + Local, + /// Represents a dependency that is to be fetched from a remote source. + Remote, + } + + /// Args for `list` action. + #[ derive( Debug, Default, Copy, Clone ) ] + pub enum ListFilter + { + /// With all packages. + #[ default ] + Nothing, + /// With local only packages. + Local, + } + + impl FromStr for ListFilter + { + type Err = Error; + + fn from_str( s : &str ) -> Result< Self, Self::Err > + { + let value = match s + { + "nothing" => ListFilter::Nothing, + "local" => ListFilter::Local, + e => return Err( err!( "Unknown filter '{}'. Available values : [nothing, local]", e ) ) + }; + + Ok( value ) + } + } + + /// Additional information to include in a package report. + #[ derive( Debug, Copy, Clone, Hash, Eq, PartialEq ) ] + pub enum PackageAdditionalInfo + { + /// Include the version of the package, if possible. + Version, + /// Include the path to the package, if it exists. + Path, + } + + /// A struct representing the arguments for listing crates. + /// + /// This struct is used to pass the necessary arguments for listing crates. It includes the + /// following fields : + /// + /// - `path_to_manifest`: A `CrateDir` representing the path to the manifest of the crates. + /// - `format`: A `ListFormat` enum representing the desired format of the output. + /// - `dependency_sources`: A `HashSet` of `DependencySource` representing the sources of the dependencies. + #[ derive( Debug, Former ) ] + pub struct ListOptions + { + path_to_manifest : CrateDir, + format : ListFormat, + info : HashSet< PackageAdditionalInfo >, + dependency_sources : HashSet< DependencySource >, + dependency_categories : HashSet< DependencyCategory >, + } + + struct Symbols + { + down : &'static str, + tee : &'static str, + ell : &'static str, + right : &'static str, + } + + // qqq : fro Bohdan : abstract and move out tree printing. or reuse ready solution for tree printing + // stick to single responsibility + const UTF8_SYMBOLS : Symbols = Symbols + { + down : "│", + tee : "├", + ell : "â””", + right : "─", + }; + + /// Represents a node in a dependency graph. + /// It holds essential information about the project dependencies. It is also capable + /// of holding any nested dependencies in a recursive manner, allowing the modeling + /// of complex dependency structures. + #[ derive( Debug, Clone, Eq, PartialEq ) ] + pub struct ListNodeReport + { + /// This could be the name of the library or crate. + pub name : String, + /// Ihe version of the crate. + pub version : Option< String >, + /// The path to the node's source files in the local filesystem. This is + /// optional as not all nodes may have a local presence (e.g., nodes representing remote crates). + pub path : Option< PathBuf >, + /// This field is a flag indicating whether the Node is a duplicate or not. + pub duplicate : bool, + /// A list that stores normal dependencies. + /// Each element in the list is also of the same 'ListNodeReport' type to allow + /// storage of nested dependencies. + pub normal_dependencies : Vec< ListNodeReport >, + /// A list that stores dev dependencies(dependencies required for tests or examples). + /// Each element in the list is also of the same 'ListNodeReport' type to allow + /// storage of nested dependencies. + pub dev_dependencies : Vec< ListNodeReport >, + /// A list that stores build dependencies. + /// Each element in the list is also of the same 'ListNodeReport' type to allow + /// storage of nested dependencies. + pub build_dependencies : Vec< ListNodeReport >, + } + + impl ListNodeReport + { + /// Displays the name, version, path, and dependencies of a package with appropriate indentation and spacing. + /// + /// # Arguments + /// + /// * `spacer` - A string used for indentation. + /// + /// # Returns + /// + /// * A `Result` containing the formatted string or a `std::fmt::Error` if formatting fails. + pub fn display_with_spacer( &self, spacer : &str ) -> Result< String, std::fmt::Error > + { + let mut f = String::new(); + + write!( f, "{}", self.name )?; + if let Some( version ) = &self.version { write!( f, " {version}" )? } + if let Some( path ) = &self.path { write!( f, " {}", path.display() )? } + if self.duplicate { write!( f, "(*)" )? } + write!( f, "\n" )?; + + let mut new_spacer = format!( "{spacer}{} ", if self.normal_dependencies.len() < 2 { " " } else { UTF8_SYMBOLS.down } ); + + let mut normal_dependencies_iter = self.normal_dependencies.iter(); + let last = normal_dependencies_iter.next_back(); + + for dep in normal_dependencies_iter + { + write!( f, "{spacer}{}{} {}", UTF8_SYMBOLS.tee, UTF8_SYMBOLS.right, dep.display_with_spacer( &new_spacer )? )?; + } + if let Some( last ) = last + { + new_spacer = format!( "{spacer} " ); + write!( f, "{spacer}{}{} {}", UTF8_SYMBOLS.ell, UTF8_SYMBOLS.right, last.display_with_spacer( &new_spacer )? )?; + } + if !self.dev_dependencies.is_empty() + { + let mut dev_dependencies_iter = self.dev_dependencies.iter(); + let last = dev_dependencies_iter.next_back(); + write!( f, "{spacer}[dev-dependencies]\n" )?; + for dep in dev_dependencies_iter + { + write!( f, "{spacer}{}{} {}", UTF8_SYMBOLS.tee, UTF8_SYMBOLS.right, dep.display_with_spacer( &new_spacer )? )?; + } + // unwrap - safe because `is_empty` check + write!( f, "{spacer}{}{} {}", UTF8_SYMBOLS.ell, UTF8_SYMBOLS.right, last.unwrap().display_with_spacer( &new_spacer )? )?; + } + if !self.build_dependencies.is_empty() + { + let mut build_dependencies_iter = self.build_dependencies.iter(); + let last = build_dependencies_iter.next_back(); + write!( f, "{spacer}[build-dependencies]\n" )?; + for dep in build_dependencies_iter + { + write!( f, "{spacer}{}{} {}", UTF8_SYMBOLS.tee, UTF8_SYMBOLS.right, dep.display_with_spacer( &new_spacer )? )?; + } + // unwrap - safe because `is_empty` check + write!( f, "{spacer}{}{} {}", UTF8_SYMBOLS.ell, UTF8_SYMBOLS.right, last.unwrap().display_with_spacer( &new_spacer )? )?; + } + + Ok( f ) + } + } + + impl std::fmt::Display for ListNodeReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + write!( f, "{}", self.display_with_spacer( "" )? )?; + + Ok( () ) + } + } + + /// Represents the different report formats for the `list` action. + #[ derive( Debug, Default, Clone ) ] + pub enum ListReport + { + /// Represents a tree-like report format. + Tree( Vec< ListNodeReport > ), + /// Represents a standard list report format in topological order. + List( Vec< String > ), + /// Represents an empty report format. + #[ default ] + Empty, + } + + impl std::fmt::Display for ListReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + match self + { + Self::Tree( v ) => write!( f, "{}", v.iter().map( | l | l.to_string() ).collect::< Vec< _ > >().join( "\n" ) ), + Self::List( v ) => write!( f, "{}", v.iter().enumerate().map( |( i, v )| format!( "[{i}] {v}" ) ).collect::< Vec< _ > >().join( "\n" ) ), + Self::Empty => write!( f, "Nothing" ), + } + } + } + + fn process_package_dependency + ( + workspace : &Workspace, + package : &WorkspacePackage, + args : &ListOptions, + dep_rep : &mut ListNodeReport, + visited : &mut HashSet< String > + ) + { + for dependency in &package.dependencies() + { + if dependency.path().is_some() && !args.dependency_sources.contains( &DependencySource::Local ) { continue; } + if dependency.path().is_none() && !args.dependency_sources.contains( &DependencySource::Remote ) { continue; } + let dep_id = format!( "{}+{}+{}", dependency.name(), dependency.req(), dependency.path().as_ref().map( | p | p.join( "Cargo.toml" ) ).unwrap_or_default() ); + + let mut temp_vis = visited.clone(); + let dependency_rep = process_dependency( workspace, dependency, args, &mut temp_vis ); + + match dependency.kind() + { + workspace::DependencyKind::Normal if args.dependency_categories.contains( &DependencyCategory::Primary ) => dep_rep.normal_dependencies.push( dependency_rep ), + workspace::DependencyKind::Development if args.dependency_categories.contains( &DependencyCategory::Dev ) => dep_rep.dev_dependencies.push( dependency_rep ), + workspace::DependencyKind::Build if args.dependency_categories.contains( &DependencyCategory::Build ) => dep_rep.build_dependencies.push( dependency_rep ), + _ => { visited.remove( &dep_id ); std::mem::swap( &mut temp_vis, visited ); } + } + + *visited = std::mem::take( &mut temp_vis ); + } + } + + fn process_dependency( workspace : &Workspace, dep : &workspace::Dependency, args : &ListOptions, visited : &mut HashSet< String > ) -> ListNodeReport + { + let mut dep_rep = ListNodeReport + { + name : dep.name().clone(), + version : if args.info.contains( &PackageAdditionalInfo::Version ) { Some( dep.req().to_string() ) } else { None }, + path : if args.info.contains( &PackageAdditionalInfo::Path ) { dep.path().as_ref().map( | p | p.clone().into_std_path_buf() ) } else { None }, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + + let dep_id = format!( "{}+{}+{}", dep.name(), dep.req(), dep.path().as_ref().map( | p | p.join( "Cargo.toml" ) ).unwrap_or_default() ); + // if this is a cycle (we have visited this node before) + if visited.contains( &dep_id ) + { + dep_rep.duplicate = true; + + return dep_rep; + } + + // if we have not visited this node before, mark it as visited + visited.insert( dep_id ); + if let Some( path ) = &dep.path() + { + if let Some( package ) = workspace.package_find_by_manifest( path.as_std_path().join( "Cargo.toml" ) ) + { + process_package_dependency( workspace, &package, args, &mut dep_rep, visited ); + } + } + + dep_rep + } + + trait ErrWith< T, T1, E > + { + fn err_with( self, v : T ) -> std::result::Result< T1, ( T, E ) >; + } + + impl< T, T1, E > ErrWith< T, T1, E > for Result< T1, E > + { + fn err_with( self, v : T ) -> Result< T1, ( T, E ) > + { + self.map_err( | e | ( v, e ) ) + } + } + + /// Retrieve a list of packages based on the given arguments. + /// + /// # Arguments + /// + /// - `args`: ListOptions - The arguments for listing packages. + /// + /// # Returns + /// + /// - `Result` - A result containing the list report if successful, + /// or a tuple containing the list report and error if not successful. + #[ cfg_attr( feature = "tracing", tracing::instrument ) ] + pub fn list( args : ListOptions ) -> Result< ListReport, ( ListReport, Error ) > + { + let mut report = ListReport::default(); + + let manifest = manifest::open( args.path_to_manifest.absolute_path() ).context( "List of packages by specified manifest path" ).err_with( report.clone() )?; + let metadata = Workspace::with_crate_dir( manifest.crate_dir() ).err_with( report.clone() )?; + + let is_package = manifest.package_is().context( "try to identify manifest type" ).err_with( report.clone() )?; + + let tree_package_report = | path : AbsolutePath, report : &mut ListReport, visited : &mut HashSet< String > | + { + let package = metadata.package_find_by_manifest( path ).unwrap(); + let mut package_report = ListNodeReport + { + name : package.name().to_string(), + version : if args.info.contains( &PackageAdditionalInfo::Version ) { Some( package.version().to_string() ) } else { None }, + path : if args.info.contains( &PackageAdditionalInfo::Path ) { Some( package.manifest_path().as_std_path().to_path_buf() ) } else { None }, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + + process_package_dependency( &metadata, &package, &args, &mut package_report, visited ); + + *report = match report + { + ListReport::Tree( ref mut v ) => ListReport::Tree( { v.extend([ package_report ]); v.clone() } ), + ListReport::Empty => ListReport::Tree( vec![ package_report ] ), + ListReport::List( _ ) => unreachable!(), + }; + }; + match args.format + { + ListFormat::Tree if is_package => + { + let mut visited = HashSet::new(); + tree_package_report( manifest.manifest_path, &mut report, &mut visited ); + let ListReport::Tree( tree ) = report else { unreachable!() }; + let tree = rearrange_duplicates( merge_dev_dependencies( merge_build_dependencies( tree ) ) ); + report = ListReport::Tree( tree ); + } + ListFormat::Tree => + { + let packages = metadata.packages().context( "workspace packages" ).err_with( report.clone() )?; + let mut visited = packages.iter().map( | p | format!( "{}+{}+{}", p.name(), p.version().to_string(), p.manifest_path() ) ).collect(); + for package in packages + { + tree_package_report( package.manifest_path().as_std_path().try_into().unwrap(), &mut report, &mut visited ) + } + let ListReport::Tree( tree ) = report else { unreachable!() }; + let tree = merge_dev_dependencies( merge_build_dependencies( tree ) ); + report = ListReport::Tree( tree ); + } + ListFormat::Topological => + { + let root_crate = manifest + .manifest_data + .as_ref() + .and_then( | m | m.get( "package" ) ) + .map( | m | m[ "name" ].to_string().trim().replace( '\"', "" ) ) + .unwrap_or_default(); + + let dep_filter = move | _p : &WorkspacePackage, d : &workspace::Dependency | + { + ( + args.dependency_categories.contains( &DependencyCategory::Primary ) && d.kind() == workspace::DependencyKind::Normal + || args.dependency_categories.contains( &DependencyCategory::Dev ) && d.kind() == workspace::DependencyKind::Development + || args.dependency_categories.contains( &DependencyCategory::Build ) && d.kind() == workspace::DependencyKind::Build + ) + && + ( + args.dependency_sources.contains( &DependencySource::Remote ) && d.path().is_none() + || args.dependency_sources.contains( &DependencySource::Local ) && d.path().is_some() + ) + }; + + let packages = metadata.packages().context( "workspace packages" ).err_with( report.clone() )?; + let packages_map = packages::filter + ( + packages.as_slice(), + FilterMapOptions { dependency_filter : Some( Box::new( dep_filter ) ), ..Default::default() } + ); + + let graph = graph::construct( &packages_map ); + + let sorted = toposort( &graph, None ).map_err( | e | { use std::ops::Index; ( report.clone(), err!( "Failed to process toposort for package : {:?}", graph.index( e.node_id() ) ) ) } )?; + let packages_info = packages.iter().map( | p | ( p.name().clone(), p ) ).collect::< HashMap< _, _ > >(); + + if root_crate.is_empty() + { + let names = sorted + .iter() + .rev() + .map( | dep_idx | graph.node_weight( *dep_idx ).unwrap().to_string() ) + .map + ( + | mut name | + { + if let Some( p ) = packages_info.get( &name ) + { + if args.info.contains( &PackageAdditionalInfo::Version ) + { + name.push_str( " " ); + name.push_str( &p.version().to_string() ); + } + if args.info.contains( &PackageAdditionalInfo::Path ) + { + name.push_str( " " ); + name.push_str( &p.manifest_path().to_string() ); + } + } + name + } + ) + .collect::< Vec< String > >(); + + report = ListReport::List( names ); + } + else + { + let node = graph.node_indices().find( | n | graph.node_weight( *n ).unwrap() == &&root_crate ).unwrap(); + let mut dfs = Dfs::new( &graph, node ); + let mut subgraph = Graph::new(); + let mut node_map = HashMap::new(); + while let Some( n )= dfs.next( &graph ) + { + node_map.insert( n, subgraph.add_node( graph[ n ] ) ); + } + + for e in graph.edge_references() + { + if let ( Some( &s ), Some( &t ) ) = ( node_map.get( &e.source() ), node_map.get( &e.target() ) ) + { + subgraph.add_edge( s, t, () ); + } + } + + let mut topo = Topo::new( &subgraph ); + let mut names = Vec::new(); + while let Some( n ) = topo.next( &subgraph ) + { + let mut name = subgraph[ n ].clone(); + if let Some( p ) = packages_info.get( &name ) + { + if args.info.contains( &PackageAdditionalInfo::Version ) + { + name.push_str( " " ); + name.push_str( &p.version().to_string() ); + } + if args.info.contains( &PackageAdditionalInfo::Path ) + { + name.push_str( " " ); + name.push_str( &p.manifest_path().to_string() ); + } + } + names.push( name ); + } + names.reverse(); + + report = ListReport::List( names ); + } + } + } + + Ok( report ) + } + + fn merge_build_dependencies( mut report: Vec< ListNodeReport > ) -> Vec< ListNodeReport > + { + let mut build_dependencies = vec![]; + for node_report in &mut report + { + build_dependencies = merge_build_dependencies_impl( node_report, build_dependencies ); + } + if let Some( last_report ) = report.last_mut() + { + last_report.build_dependencies = build_dependencies; + } + + report + } + + fn merge_build_dependencies_impl( report : &mut ListNodeReport, mut build_deps_acc : Vec< ListNodeReport > ) -> Vec< ListNodeReport > + { + for dep in report.normal_dependencies.iter_mut() + .chain( report.dev_dependencies.iter_mut() ) + .chain( report.build_dependencies.iter_mut() ) + { + build_deps_acc = merge_build_dependencies_impl(dep, build_deps_acc ); + } + + for dep in std::mem::take( &mut report.build_dependencies ) + { + if !build_deps_acc.contains( &dep ) + { + build_deps_acc.push( dep ); + } + } + + build_deps_acc + } + + fn merge_dev_dependencies( mut report: Vec< ListNodeReport > ) -> Vec< ListNodeReport > + { + let mut dev_dependencies = vec![]; + for node_report in &mut report + { + dev_dependencies = merge_dev_dependencies_impl( node_report, dev_dependencies ); + } + if let Some( last_report ) = report.last_mut() + { + last_report.dev_dependencies = dev_dependencies; + } + + report + } + + fn merge_dev_dependencies_impl( report : &mut ListNodeReport, mut dev_deps_acc : Vec< ListNodeReport > ) -> Vec< ListNodeReport > + { + for dep in report.normal_dependencies.iter_mut() + .chain( report.dev_dependencies.iter_mut() ) + .chain( report.build_dependencies.iter_mut() ) + { + dev_deps_acc = merge_dev_dependencies_impl( dep, dev_deps_acc ); + } + + for dep in std::mem::take( &mut report.dev_dependencies ) + { + if !dev_deps_acc.contains( &dep ) + { + dev_deps_acc.push( dep ); + } + } + + dev_deps_acc + } + + fn rearrange_duplicates( mut report : Vec< ListNodeReport > ) -> Vec< ListNodeReport > + { + let mut required_normal : HashMap< usize, Vec< ListNodeReport > > = HashMap::new(); + for i in 0 .. report.len() + { + let ( required, exist ) : ( Vec< _ >, Vec< _ > ) = std::mem::take( &mut report[ i ].normal_dependencies ).into_iter().partition( | d | d.duplicate ); + report[ i ].normal_dependencies = exist; + required_normal.insert( i, required ); + } + + rearrange_duplicates_resolver( &mut report, &mut required_normal ); + for ( i, deps ) in required_normal + { + report[ i ].normal_dependencies.extend( deps ); + } + + report + } + + fn rearrange_duplicates_resolver( report : &mut [ ListNodeReport ], required : &mut HashMap< usize, Vec< ListNodeReport > > ) + { + for node in report + { + rearrange_duplicates_resolver( &mut node.normal_dependencies, required ); + rearrange_duplicates_resolver( &mut node.dev_dependencies, required ); + rearrange_duplicates_resolver( &mut node.build_dependencies, required ); + + if !node.duplicate + { + if let Some( r ) = required.iter_mut().flat_map( |( _, v )| v ) + .find( | r | r.name == node.name && r.version == node.version && r.path == node.path ) + { + std::mem::swap( r, node ); + } + } + } + } +} + +// + +crate::mod_interface! +{ + /// Arguments for `list` action. + protected use ListOptions; + /// Additional information to include in a package report. + protected use PackageAdditionalInfo; + /// Represents where a dependency located. + protected use DependencySource; + /// Represents the category of a dependency. + protected use DependencyCategory; + /// Argument for `list` action. Sets the output format. + protected use ListFormat; + /// Argument for `list` action. Sets filter(local or all) packages should be in the output. + protected use ListFilter; + /// Contains output of the action. + protected use ListReport; + /// Contains output of a single node of the action. + protected use ListNodeReport; + /// List packages in workspace. + orphan use list; +} diff --git a/module/move/willbe/src/action/main_header.rs b/module/move/willbe/src/action/main_header.rs new file mode 100644 index 0000000000..e1b5a7a16e --- /dev/null +++ b/module/move/willbe/src/action/main_header.rs @@ -0,0 +1,248 @@ +mod private +{ + use crate::*; + use std::fmt::{ Display, Formatter }; + use std::fs:: + { + OpenOptions + }; + use std::io:: + { + Read, + Seek, + SeekFrom, + Write + }; + use std::path::PathBuf; + use regex::Regex; + use wca::wtools::anyhow::Error; + use action::readme_health_table_renew:: + { + readme_path, + workspace_root + }; + use _path::AbsolutePath; + use { CrateDir, query, url, Workspace, wtools }; + use entity::{ CrateDirError, WorkspaceError }; + use wtools::error:: + { + anyhow::format_err, + err, + for_app:: + { + Result, + Error as wError, + Context, + }, + }; + use error_tools:: + { + dependency::*, + for_lib::Error, + }; + + static TAGS_TEMPLATE : std::sync::OnceLock< Regex > = std::sync::OnceLock::new(); + + fn regexes_initialize() + { + TAGS_TEMPLATE.set( Regex::new( r"(.|\n|\r\n)+" ).unwrap() ).ok(); + } + + /// Report. + #[ derive( Debug, Default, Clone ) ] + pub struct MainHeaderRenewReport + { + found_file : Option< PathBuf >, + touched_file : PathBuf, + success : bool, + } + + impl Display for MainHeaderRenewReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + if self.success + { + if let Some( file_path ) = self.touched_file.to_str() + { + writeln!( f, "File successful changed : {file_path}." )?; + } + else + { + writeln!( f, "File successful changed but contains non-UTF-8 characters." )?; + } + } + else + { + if let Some( Some( file_path ) ) = self.found_file.as_ref().map( | p | p.to_str() ) + { + writeln!( f, "File found but not changed : {file_path}." )?; + } + else + { + writeln!( f, "File not found or contains non-UTF-8 characters." )?; + } + } + Ok( () ) + } + } + + #[ derive( Debug, Error ) ] + pub enum MainHeaderRenewError + { + #[ error( "Common error: {0}" ) ] + Common(#[ from ] wError ), + #[ error( "I/O error: {0}" ) ] + IO( #[ from ] std::io::Error ), + #[ error( "Workspace error: {0}" ) ] + Workspace( #[ from ] WorkspaceError), + #[ error( "Directory error: {0}" ) ] + Directory( #[ from ] CrateDirError ), + } + + /// The `HeaderParameters` structure represents a set of parameters, used for creating url for header. + struct HeaderParameters + { + master_branch : String, + repository_url : String, + workspace_name : String, + discord_url : Option< String >, + } + + impl HeaderParameters + { + /// Create `HeaderParameters` instance from the folder where Cargo.toml is stored. + fn from_cargo_toml( workspace : Workspace ) -> Result< Self, MainHeaderRenewError > + { + let repository_url = workspace.repository_url()?.ok_or_else::< Error, _ >( || err!( "repo_url not found in workspace Cargo.toml" ) )?; + let master_branch = workspace.master_branch()?.unwrap_or( "master".into() ); + let workspace_name = workspace.workspace_name()?.ok_or_else::< Error, _ >( || err!( "workspace_name not found in workspace Cargo.toml" ) )?; + let discord_url = workspace.discord_url()?; + + Ok + ( + Self + { + master_branch, + repository_url, + workspace_name, + discord_url, + } + ) + } + + /// Convert `Self`to header. + fn to_header( self ) -> Result< String, MainHeaderRenewError > + { + let discord = self.discord_url.map( | discord | + format!( "\n[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)]({discord})" ) + ) + .unwrap_or_default(); + + Ok + ( + format! + ( + r#"[![{}](https://img.shields.io/github/actions/workflow/status/{}/standard_rust_scheduled.yml?label={}&logo=github&branch={})](https://github.com/{}/actions/workflows/standard_rust_scheduled.yml){} +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2F{}_trivial_sample%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20{}_trivial_sample/https://github.com/{}) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/{})"#, + self.workspace_name, url::git_info_extract( &self.repository_url )?, self.workspace_name, self.master_branch, url::git_info_extract( &self.repository_url )?, + discord, + self.workspace_name.to_lowercase(), self.workspace_name.to_lowercase(), url::git_info_extract( &self.repository_url )?, + self.workspace_name, + ) + ) + } + } + + /// Generate header in main Readme.md. + /// The location of header is defined by a tag : + /// ``` md + /// + /// + /// ``` + /// To use it you need to add these fields to Cargo.toml of workspace : + /// ``` toml + /// [workspace.metadata] + /// master_branch = "alpha" (Optional) + /// workspace_name = "wtools" + /// repo_url = "https://github.com/Wandalen/wTools" + /// discord_url = "https://discord.gg/123123" (Optional) + /// ``` + /// Result example : + /// ``` md + /// + /// [![alpha](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/StandardRustScheduled.yml?branch=master&label=alpha&logo=github)](https://github.com/Wandalen/wTools/actions/workflows/StandardRustStatus.yml) + /// [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/123123) + /// [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2Fwtools_trivial%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20wtools_trivial/https://github.com/Wandalen/wTools) + /// [![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/wtools) + /// + /// ``` + pub fn readme_header_renew( path : AbsolutePath ) -> Result< MainHeaderRenewReport, ( MainHeaderRenewReport, MainHeaderRenewError ) > + { + let mut report = MainHeaderRenewReport::default(); + regexes_initialize(); + + let mut cargo_metadata = Workspace::with_crate_dir + ( + CrateDir::try_from( path ) + .map_err( | e | ( report.clone(), e.into() ) )? + ).map_err( | e | ( report.clone(), e.into() ) )?; + + let workspace_root = workspace_root( &mut cargo_metadata ) + .map_err( | e | ( report.clone(), e.into() ) )?; + + let header_param = HeaderParameters::from_cargo_toml( cargo_metadata ) + .map_err( | e | ( report.clone(), e.into() ) )?; + + let read_me_path = workspace_root.join + ( + readme_path( &workspace_root ) + .ok_or_else( || format_err!( "Fail to find README.md" ) ) + .map_err( | e | ( report.clone(), e.into() ) )? + ); + + report.found_file = Some( read_me_path.clone() ); + + let mut file = OpenOptions::new() + .read( true ) + .write( true ) + .open( &read_me_path ) + .map_err( | e | ( report.clone(), e.into() ) )?; + + let mut content = String::new(); + file.read_to_string( &mut content ).map_err( | e | ( report.clone(), e.into() ) )?; + + let raw_params = TAGS_TEMPLATE + .get() + .unwrap() + .captures( &content ) + .and_then( | c | c.get( 1 ) ) + .map( | m | m.as_str() ) + .unwrap_or_default(); + + _ = query::parse( raw_params ).context( "Fail to parse arguments" ); + + let header = header_param.to_header().map_err( | e | ( report.clone(), e.into() ) )?; + let content : String = TAGS_TEMPLATE.get().unwrap().replace + ( + &content, + &format!( "\n{header}\n" ) + ).into(); + + file.set_len( 0 ).map_err( | e | ( report.clone(), e.into() ) )?; + file.seek( SeekFrom::Start( 0 ) ).map_err( | e | ( report.clone(), e.into() ) )?; + file.write_all( content.as_bytes() ).map_err( | e | ( report.clone(), e.into() ) )?; + report.touched_file = read_me_path; + report.success = true; + Ok( report ) + } +} + +crate::mod_interface! +{ + /// Generate header. + orphan use readme_header_renew; + /// Report. + orphan use MainHeaderRenewReport; +} \ No newline at end of file diff --git a/module/move/willbe/src/action/mod.rs b/module/move/willbe/src/action/mod.rs new file mode 100644 index 0000000000..0c66bb41ce --- /dev/null +++ b/module/move/willbe/src/action/mod.rs @@ -0,0 +1,27 @@ +crate::mod_interface! +{ + /// Deploy new. + layer deploy_renew; + /// List packages. + layer list; + /// Main Header. + layer main_header; + /// Publish packages. + layer publish; + /// Return the differences between a local and remote package versions. + layer publish_diff; + /// Generates health table in main Readme.md file of workspace. + // aaa : for Petro : give high quality explanations + // aaa : add more details to description + layer readme_health_table_renew; + /// Module headers. + layer readme_modules_headers_renew; + /// Run all tests + layer test; + /// Workflow. + layer cicd_renew; + /// Workspace new. + layer workspace_renew; + /// List features. + layer features; +} diff --git a/module/move/willbe/src/action/publish.rs b/module/move/willbe/src/action/publish.rs new file mode 100644 index 0000000000..6788a11f1c --- /dev/null +++ b/module/move/willbe/src/action/publish.rs @@ -0,0 +1,240 @@ +/// Internal namespace. +mod private +{ + use crate::*; + + use std::collections::{ HashSet, HashMap }; + use core::fmt::Formatter; + use std::{ env, fs }; + + use wtools::error::for_app::{ Error, anyhow }; + use _path::AbsolutePath; + use workspace::Workspace; + use package::Package; + + /// Represents a report of publishing packages + #[ derive( Debug, Default, Clone ) ] + pub struct PublishReport + { + /// Represents the absolute path to the root directory of the workspace. + pub workspace_root_dir : Option< AbsolutePath >, + pub plan : Option< package::PublishPlan >, + /// Represents a collection of packages and their associated publishing reports. + pub packages : Vec<( AbsolutePath, package::PublishReport )> + } + + impl std::fmt::Display for PublishReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + if self.packages.is_empty() + { + write!( f, "Nothing to publish" )?; + return Ok( () ); + } + + writeln!( f, "Actions :" )?; + for ( path, report ) in &self.packages + { + let report = report.to_string().replace("\n", "\n "); + let path = if let Some( wrd ) = &self.workspace_root_dir + { + path.as_ref().strip_prefix( &wrd.as_ref() ).unwrap() + } + else + { + path.as_ref() + }; + write!( f, "Publishing crate by `{}` path\n {report}", path.display() )?; + } + if let Some( plan ) = &self.plan + { + if !plan.dry + { + let expected_to_publish = plan + .plans + .iter() + .map( | p | ( p.version_bump.crate_dir.absolute_path(), p.package_name.clone(), p.version_bump.clone() ) ) + .collect::< Vec< _ > >(); + let mut actually_published = self.packages.iter() + .filter_map + ( + |( path, repo )| + if repo.publish.as_ref().is_some_and( | r | r.error.is_ok() ) + { + Some( path.clone() ) + } + else + { + None + } + ) + .collect::< Vec< _ > >(); + + writeln!( f, "Status :" )?; + for ( path, name, version ) in expected_to_publish + { + if let Some( pos ) = actually_published.iter().position( | p | p == &path ) + { + writeln!( f, "✅ {name} {}", version.new_version )?; + // want to check that only expected packages actually published + _ = actually_published.remove( pos ); + } + else + { + writeln!( f, "⌠{name} {}", version.old_version )?; + } + } + if !actually_published.is_empty() + { + writeln!( f, "Logical error. Published unexpected packages" )?; + return Err( std::fmt::Error ); + } + } + } + + Ok( () ) + } + } + + /// Publishes packages based on the specified patterns. + /// + /// # Arguments + /// * `patterns` - A vector of patterns specifying the folders to search for packages. + /// * `dry` - A boolean value indicating whether to perform a dry run. + /// * `temp` - A boolean value indicating whether to use a temporary directory. + /// + /// # Returns + /// A Result containing a `PublishPlan` if successful, or an `Error` otherwise. + #[ cfg_attr( feature = "tracing", tracing::instrument ) ] + pub fn publish_plan( patterns : Vec< String >, dry : bool, temp : bool ) -> Result< package::PublishPlan, Error > + { + let mut paths = HashSet::new(); + // find all packages by specified folders + for pattern in &patterns + { + let current_path = AbsolutePath::try_from( std::path::PathBuf::from( pattern ) )?; + // let current_paths = files::find( current_path, &[ "Cargo.toml" ] ); + paths.extend( Some( current_path ) ); + } + + let mut metadata = if paths.is_empty() + { + Workspace::from_current_path()? + } + else + { + // FIX : patterns can point to different workspaces. Current solution take first random path from list + let current_path = paths.iter().next().unwrap().clone(); + let dir = CrateDir::try_from( current_path )?; + + Workspace::with_crate_dir( dir )? + }; + let workspace_root_dir : AbsolutePath = metadata + .workspace_root()? + .try_into()?; + let packages = metadata.load()?.packages()?; + let packages_to_publish : Vec< _ > = packages + .iter() + .filter( | &package | paths.contains( &AbsolutePath::try_from( package.manifest_path().as_std_path().parent().unwrap() ).unwrap() ) ) + .map( | p | p.name().clone() ) + .collect(); + let package_map = packages.into_iter().map( | p | ( p.name().clone(), Package::from( p.clone() ) ) ).collect::< HashMap< _, _ > >(); + + let graph = metadata.graph(); + let subgraph_wanted = graph::subgraph( &graph, &packages_to_publish ); + let tmp = subgraph_wanted.map( | _, n | graph[ *n ].clone(), | _, e | graph[ *e ].clone() ); + + let mut unique_name = format!( "temp_dir_for_publish_command_{}", path_tools::path::unique_folder_name()? ); + + let dir = if temp + { + let mut temp_dir = env::temp_dir().join( unique_name ); + + while temp_dir.exists() + { + unique_name = format!( "temp_dir_for_publish_command_{}", path_tools::path::unique_folder_name()? ); + temp_dir = env::temp_dir().join( unique_name ); + } + + fs::create_dir( &temp_dir )?; + Some( temp_dir ) + } + else + { + None + }; + + let subgraph = graph::remove_not_required_to_publish( &package_map, &tmp, &packages_to_publish, dir.clone() )?; + let subgraph = subgraph.map( | _, n | n, | _, e | e ); + + let queue = graph::toposort( subgraph ).unwrap().into_iter().map( | n | package_map.get( &n ).unwrap() ).cloned().collect::< Vec< _ > >(); + + let roots = packages_to_publish.iter().map( | p | package_map.get( p ).unwrap().crate_dir() ).collect::< Vec< _ > >(); + + let plan = package::PublishPlan::former() + .workspace_dir( CrateDir::try_from( workspace_root_dir ).unwrap() ) + .option_base_temp_dir( dir.clone() ) + .dry( dry ) + .roots( roots ) + .packages( queue ) + .form(); + + Ok( plan ) + } + + /// + /// Publish packages. + /// + + #[ cfg_attr( feature = "tracing", tracing::instrument ) ] + pub fn publish( plan : package::PublishPlan ) -> Result< PublishReport, ( PublishReport, Error ) > + { + let mut report = PublishReport::default(); + let temp = plan.base_temp_dir.clone(); + + report.plan = Some( plan.clone() ); + for package_report in package::perform_packages_publish( plan ).err_with( || report.clone() )? + { + let path : &std::path::Path = package_report.get_info.as_ref().unwrap().current_path.as_ref(); + report.packages.push(( AbsolutePath::try_from( path ).unwrap(), package_report )); + } + + if let Some( dir ) = temp + { + fs::remove_dir_all( dir ).err_with( || report.clone() )?; + } + + Ok( report ) + } + + + trait ErrWith< T, T1, E > + { + fn err_with< F >( self, f : F ) -> std::result::Result< T1, ( T, E ) > + where + F : FnOnce() -> T; + } + + impl< T, T1, E > ErrWith< T, T1, Error > for Result< T1, E > + where + E : std::fmt::Debug + std::fmt::Display + Send + Sync + 'static, + { + fn err_with< F >( self, f : F ) -> Result< T1, ( T, Error ) > + where + F : FnOnce() -> T, + { + self.map_err( | e | ( f(), anyhow!( e ) ) ) + } + } +} + +// + +crate::mod_interface! +{ + /// Create a plan for publishing packages + orphan use publish_plan; + /// Execute the publication plan + orphan use publish; +} diff --git a/module/move/willbe/src/action/publish_diff.rs b/module/move/willbe/src/action/publish_diff.rs new file mode 100644 index 0000000000..9d21fec7ec --- /dev/null +++ b/module/move/willbe/src/action/publish_diff.rs @@ -0,0 +1,149 @@ +/// Internal namespace. +mod private +{ + use crate::*; + + use std::path::PathBuf; + use std::collections::HashMap; + use std::fmt::Formatter; + use colored::Colorize; + use crates_tools::CrateArchive; + + use action::list::{ ListReport, ListNodeReport }; + use _path::AbsolutePath; + use wtools::error::for_app::Result; + use diff::{ DiffReport, crate_diff }; + use error_tools::for_app::format_err; + + /// Options for `publish_diff` command + #[ derive( Debug, former::Former ) ] + pub struct PublishDiffOptions + { + path : PathBuf, + keep_archive : Option< PathBuf >, + } + + #[ derive( Debug ) ] + pub struct PublishDiffReport + { + pub diffs : HashMap< AbsolutePath, DiffReport >, + pub root_path : AbsolutePath, + pub tree : ListNodeReport, + } + + impl std::fmt::Display for PublishDiffReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + let mut tree = self.tree.clone(); + let root_path = tree.path.as_ref().unwrap().clone(); + let root_name = tree.name.clone(); + let root_version = tree.version.as_ref().unwrap().clone(); + + fn modify( diffs : &HashMap< AbsolutePath, DiffReport >, tree : &mut ListNodeReport ) + { + let path = tree.path.take().unwrap(); + let path = path.as_path().to_string_lossy(); + let path = path.strip_suffix( "Cargo.toml" ).unwrap_or( &path ); + let root = AbsolutePath::try_from( path ).unwrap(); + + let diff = diffs.get( &root ).unwrap(); + + let has_changes = diff.has_changes(); + tree.name = if has_changes { format!( "{}", tree.name.yellow() ) } else { tree.name.clone() }; + tree.version.as_mut().map( | v | *v = format!( "{} {}", if has_changes { v.yellow() } else { v.as_str().into() }, if has_changes { "MODIFIED" } else { "" } ) ); + + for dep in &mut tree.normal_dependencies + { + modify( diffs, dep ) + } + } + modify( &self.diffs, &mut tree ); + + let path = root_path.as_path().to_string_lossy(); + let path = path.strip_suffix( "Cargo.toml" ).unwrap_or( &path ); + let root = AbsolutePath::try_from( path ).unwrap(); + let diff = self.diffs.get( &root ).unwrap(); + + write!( f, "Tree:\n{}\nChanges in `{root_name} {root_version}`:\n{}", tree, diff )?; + + Ok( () ) + } + } + + /// Return the differences between a local and remote package versions. + #[ cfg_attr( feature = "tracing", tracing::instrument ) ] + pub fn publish_diff( o : PublishDiffOptions ) -> Result< PublishDiffReport > + { + let path = AbsolutePath::try_from( o.path )?; + let dir = CrateDir::try_from( path.clone() )?; + + let list = action::list + ( + action::list::ListOptions::former() + .path_to_manifest( dir ) + .format( action::list::ListFormat::Tree ) + .info([ action::list::PackageAdditionalInfo::Version, action::list::PackageAdditionalInfo::Path ]) + .dependency_sources([ action::list::DependencySource::Local ]) + .dependency_categories([ action::list::DependencyCategory::Primary ]) + .form() + ) + .unwrap(); + let ListReport::Tree( mut tree ) = list else { return Err( format_err!( "Logical error. Unexpected list format" ) ) }; + let mut tasks = vec![ tree[ 0 ].clone() ]; + let mut diffs = HashMap::new(); + let mut current_idx = 0; + while current_idx < tasks.len() + { + let path = tasks[ current_idx ].path.as_ref().unwrap().to_string_lossy(); + let path = path.strip_suffix( "Cargo.toml" ).unwrap_or( &path ); + let path = AbsolutePath::try_from( path )?; + let dir = CrateDir::try_from( path.clone() )?; + + let package = package::Package::try_from( dir.clone() )?; + let name = &package.name()?; + let version = &package.version()?; + + _ = cargo::pack( cargo::PackOptions::former().path( dir.as_ref() ).allow_dirty( true ).no_verify( true ).dry( false ).form() )?; + let l = CrateArchive::read( packed_crate::local_path( name, version, dir )? )?; + let r = CrateArchive::download_crates_io( name, version ).unwrap(); + + + if let Some( out_path ) = &o.keep_archive + { + _ = std::fs::create_dir_all( &out_path ); + for path in r.list() + { + let local_path = out_path.join( path ); + let folder = local_path.parent().unwrap(); + _ = std::fs::create_dir_all( folder ); + + let content = r.content_bytes( path ).unwrap(); + + std::fs::write( local_path, content )?; + } + } + diffs.insert( path, crate_diff( &l, &r ).exclude( diff::PUBLISH_IGNORE_LIST ) ); + tasks.extend( tasks[ current_idx ].normal_dependencies.clone() ); + + current_idx += 1; + } + let report = PublishDiffReport + { + root_path : path.clone(), + diffs, + tree : tree.remove( 0 ), + }; + + Ok( report ) + } +} + +// + +crate::mod_interface! +{ + orphan use PublishDiffOptions; + /// Publishes the difference between the local and published versions of a package. + orphan use publish_diff; +} diff --git a/module/move/willbe/src/action/readme_health_table_renew.rs b/module/move/willbe/src/action/readme_health_table_renew.rs new file mode 100644 index 0000000000..e9a9bb72e6 --- /dev/null +++ b/module/move/willbe/src/action/readme_health_table_renew.rs @@ -0,0 +1,606 @@ +mod private +{ + use crate::*; + + use std:: + { + str::FromStr, + fs::{ OpenOptions, File, read_dir }, + path::{ Path, PathBuf }, + io::{ Write, Read, Seek, SeekFrom }, + collections::HashMap, + }; + + // aaa : for Petro : don't use cargo_metadata and Package directly, use facade + // aaa : ✅ + + + use convert_case::{ Case, Casing }; + use toml_edit::Document; + use regex::bytes::Regex; + + use wtools::error:: + { + err, + for_app:: + { + Error, + Result, + Context, + format_err, + bail, + } + }; + use manifest::private::repo_url; + use _path::AbsolutePath; + + static TAG_TEMPLATE: std::sync::OnceLock< Regex > = std::sync::OnceLock::new(); + static CLOSE_TAG: std::sync::OnceLock< Regex > = std::sync::OnceLock::new(); + + + /// Initializes two global regular expressions that are used to match tags. + fn regexes_initialize() + { + TAG_TEMPLATE.set( regex::bytes::Regex::new( r#""# ).unwrap() ).ok(); + CLOSE_TAG.set( regex::bytes::Regex::new( r#""# ).unwrap() ).ok(); + } + + + /// `Stability` is an enumeration that represents the stability level of a feature. + #[ derive( Debug ) ] + pub enum Stability + { + /// The feature is still being tested and may change. + Experimental, + /// The feature is not fully tested and may be unstable. + Unstable, + /// The feature is tested and stable. + Stable, + /// The feature is stable and will not change in future versions. + Frozen, + /// The feature is no longer recommended for use and may be removed in future versions. + Deprecated, + } + + impl FromStr for Stability + { + type Err = Error; + + fn from_str( s : &str ) -> Result< Self, Self::Err > + { + match s + { + "experimental" => Ok( Stability::Experimental ), + "unstable" => Ok( Stability::Unstable ), + "stable" => Ok( Stability::Stable ), + "frozen" => Ok( Stability::Frozen ), + "deprecated" => Ok( Stability::Deprecated ), + _ => Err( err!( "Fail to parse stability" ) ), + } + } + } + + /// Retrieves the stability level of a package from its `Cargo.toml` file. + fn stability_get( package_path: &Path ) -> Result< Stability > + { + let path = package_path.join( "Cargo.toml" ); + if path.exists() + { + let mut contents = String::new(); + File::open( path )?.read_to_string( &mut contents )?; + let doc = contents.parse::< Document >()?; + + let stable_status = doc + .get( "package" ) + .and_then( | package | package.get( "metadata" ) ) + .and_then( | metadata | metadata.get( "stability" ) ) + .and_then( | i | i.as_str() ) + .and_then( | s | s.parse::< Stability >().ok() ); + + Ok( stable_status.unwrap_or( Stability::Experimental ) ) + } + else + { + Err( err!( "No Cargo.toml found" ) ) + } + } + + /// Represents parameters that are common for all tables + #[ derive( Debug ) ] + struct GlobalTableParameters + { + /// Path to the root repository. + core_url: String, + /// User and repository name, written through '/'. + user_and_repo: String, + /// List of branches in the repository. + branches: Option< Vec< String > >, + /// workspace root + workspace_root : String, + } + + /// Structure that holds the parameters for generating a table. + #[ derive( Debug ) ] + struct TableParameters + { + // Relative path from workspace root to directory with modules + base_path: String, + // include branches column flag + include_branches: bool, + // include stability column flag + include_stability: bool, + // include docs column flag + include_docs: bool, + // include sample column flag + include: bool, + } + + impl From< HashMap< String, query::Value > > for TableParameters + { + fn from( value : HashMap< String, query::Value >) -> Self + { + let include_branches = value.get( "with_branches" ).map( | v | bool::from( v ) ).unwrap_or( true ); + let include_stability = value.get( "with_stability" ).map( | v | bool::from( v ) ).unwrap_or( true ); + let include_docs = value.get( "with_docs" ).map( | v | bool::from( v ) ).unwrap_or( true ); + let include = value.get( "with_gitpod" ).map( | v | bool::from( v ) ).unwrap_or( true ); + let b_p = value.get( "1" ); + let base_path = if let Some( query::Value::String( path ) ) = value.get( "path" ).or( b_p ) + { + path + } + else + { + "./" + }; + Self { base_path: base_path.to_string(), include_branches, include_stability, include_docs, include } + } + } + + impl GlobalTableParameters + { + /// Initializes the struct's fields from a `Cargo.toml` file located at a specified path. + fn initialize_from_path( path: &Path ) -> Result< Self > + { + let cargo_toml_path = path.join( "Cargo.toml" ); + if !cargo_toml_path.exists() + { + bail!( "Cannot find Cargo.toml" ) + } + else + { + let mut contents = String::new(); + File::open( cargo_toml_path )?.read_to_string( &mut contents )?; + let doc = contents.parse::< Document >()?; + + let core_url = + doc + .get( "workspace" ) + .and_then( | workspace | workspace.get( "metadata" ) ) + .and_then( | metadata | metadata.get( "repo_url" ) ) + .and_then( | url | url.as_str() ) + .map( String::from ); + + let branches = + doc + .get( "workspace" ) + .and_then( | workspace | workspace.get( "metadata" ) ) + .and_then( | metadata | metadata.get( "branches" ) ) + .and_then( | branches | branches.as_array()) + .map + ( + | array | + array + .iter() + .filter_map( | value | value.as_str() ) + .map( String::from ) + .collect::< Vec< String > >() + ); + let mut user_and_repo = "".to_string(); + if let Some( core_url ) = &core_url + { + user_and_repo = url::git_info_extract( core_url )?; + } + Ok( Self { core_url: core_url.unwrap_or_default(), user_and_repo, branches, workspace_root: path.to_string_lossy().to_string() } ) + } + } + + } + + /// Create health table in README.md file + /// + /// The location and filling of tables is defined by a tag, for example record: + /// ```md + /// + /// + /// ``` + /// will mean that at this place the table with modules located in the directory module/core will be generated. + /// The tags do not disappear after generation. + /// Anything between the opening and closing tag will be destroyed. + pub fn readme_health_table_renew( path : &Path ) -> Result< () > + { + regexes_initialize(); + let absolute_path = AbsolutePath::try_from( path )?; + let mut cargo_metadata = Workspace::with_crate_dir( CrateDir::try_from( absolute_path )? )?; + let workspace_root = workspace_root( &mut cargo_metadata )?; + let mut parameters = GlobalTableParameters::initialize_from_path( &workspace_root )?; + + let read_me_path = workspace_root.join( readme_path(&workspace_root ).ok_or_else( || format_err!( "Fail to find README.md" ) )?); + let mut file = OpenOptions::new() + .read( true ) + .write( true ) + .open( &read_me_path )?; + + let mut contents = Vec::new(); + + file.read_to_end( &mut contents )?; + + let mut tags_closures = vec![]; + let mut tables = vec![]; + let open_caps = TAG_TEMPLATE.get().unwrap().captures_iter( &*contents ); + let close_caps = CLOSE_TAG.get().unwrap().captures_iter( &*contents ); + // iterate by regex matches and generate table content for each dir which taken from open-tag + for ( open_captures, close_captures ) in open_caps.zip( close_caps ) + { + for captures in open_captures.iter().zip( close_captures.iter() ) + { + if let ( Some( open ), Some( close ) ) = captures + { + let raw_table_params = std::str::from_utf8 + ( + TAG_TEMPLATE.get().unwrap().captures( open.as_bytes() ) + .ok_or( format_err!( "Fail to parse tag" ) )? + .get( 1 ) + .ok_or( format_err!( "Fail to parse group" ) )? + .as_bytes() + )?; + let params: TableParameters = query::parse( raw_table_params ).unwrap().into_map( vec![] ).into(); + let table = package_readme_health_table_generate( &mut cargo_metadata, ¶ms, &mut parameters )?; + tables.push( table ); + tags_closures.push( ( open.end(), close.start() ) ); + } + } + } + tables_write_into_file( tags_closures, tables, contents, file )?; + + Ok( () ) + } + + /// Writes tables into a file at specified positions. + fn tables_write_into_file( tags_closures : Vec< ( usize, usize ) >, tables: Vec< String >, contents: Vec< u8 >, mut file: File ) -> Result< () > + { + let mut buffer: Vec< u8 > = vec![]; + let mut start: usize = 0; + for ( ( end_of_start_tag, start_of_end_tag ), con ) in tags_closures.iter().zip( tables.iter() ) + { + range_to_target_copy( &*contents, &mut buffer, start, *end_of_start_tag )?; + range_to_target_copy( con.as_bytes(), &mut buffer, 0,con.len() - 1 )?; + start = *start_of_end_tag; + } + range_to_target_copy( &*contents,&mut buffer,start,contents.len() - 1 )?; + file.set_len( 0 )?; + file.seek( SeekFrom::Start( 0 ) )?; + file.write_all( &buffer )?; + Ok(()) + } + + /// Generate table from `table_parameters`. + /// Generate header, iterate over all modules in package (from table_parameters) and append row. + fn package_readme_health_table_generate( cache : &mut Workspace, table_parameters: &TableParameters, parameters: & mut GlobalTableParameters ) -> Result< String, Error > + { + let directory_names = directory_names + ( + cache + .workspace_root()? + .join( &table_parameters.base_path ), + &cache + .load()? + .packages() + .map_err( | err | format_err!( err ) )? + )?; + let mut table = table_header_generate( parameters, &table_parameters ); + for package_name in directory_names + { + let stability = if table_parameters.include_stability + { + Some( stability_get( &cache.workspace_root()?.join( &table_parameters.base_path ).join( &package_name ) )? ) + } + else + { + None + }; + if parameters.core_url == "" + { + let module_path = &cache.workspace_root()?.join( &table_parameters.base_path ).join( &package_name ); + parameters.core_url = repo_url( &module_path ) + .context + ( + format_err!( "Can not find Cargo.toml in {} or Fail to extract repository url from git remote.\n specify the correct path to the main repository in Cargo.toml of workspace (in the [workspace.metadata] section named repo_url) in {} OR in Cargo.toml of each module (in the [package] section named repository, specify the full path to the module) for example {} OR ensure that at least one remotest is present in git. ", module_path.display(), cache.workspace_root()?.join( "Cargo.toml" ).display(), module_path.join( "Cargo.toml" ).display() ) + )?; + parameters.user_and_repo = url::git_info_extract( ¶meters.core_url )?; + } + table.push_str( &row_generate(&package_name, stability.as_ref(), parameters, &table_parameters) ); + } + Ok( table ) + } + + /// Return topologically sorted modules name, from packages list, in specified directory. + fn directory_names( path : PathBuf, packages : &[ workspace::WorkspacePackage ] ) -> Result< Vec< String > > + { + let path_clone = path.clone(); + let module_package_filter: Option< Box< dyn Fn( &workspace::WorkspacePackage ) -> bool > > = Some + ( + Box::new + ( + move | p | + p.publish().is_none() && p.manifest_path().starts_with( &path ) + ) + ); + let module_dependency_filter: Option< Box< dyn Fn( &workspace::WorkspacePackage, &workspace::Dependency ) -> bool > > = Some + ( + Box::new + ( + move | _, d | + d.path().is_some() && d.kind() != workspace::DependencyKind::Development && d.path().as_ref().unwrap().starts_with( &path_clone ) + ) + ); + let module_packages_map = packages::filter + ( + packages, + packages::FilterMapOptions { package_filter: module_package_filter, dependency_filter: module_dependency_filter }, + ); + let module_graph = graph::construct( &module_packages_map ); + let names = graph::topological_sort_with_grouping( module_graph ) + .into_iter() + .map + ( + | mut group | + { + group.sort(); + group + } + ).flatten().collect::< Vec< _ > >(); + + Ok(names) + } + + /// Generate row that represents a module, with a link to it in the repository and optionals for stability, branches, documentation and links to the gitpod. + fn row_generate( module_name : &str, stability : Option< &Stability >, parameters : &GlobalTableParameters, table_parameters : &TableParameters ) -> String + { + let mut rou = format!( "| [{}]({}/{}) |", &module_name, &table_parameters.base_path, &module_name ); + if table_parameters.include_stability + { + let mut stability = stability_generate( &stability.as_ref().unwrap() ); + stability.push_str( " |" ); + rou.push_str( &stability ); + } + if parameters.branches.is_some() && table_parameters.include_branches + { + rou.push_str( &branch_cells_generate( ¶meters, &module_name ) ); + } + if table_parameters.include_docs + { + rou.push_str( &format!( " [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/{}) |", &module_name ) ); + } + if table_parameters.include + { + let path = Path::new( table_parameters.base_path.as_str() ).join( &module_name ); + let p = Path::new( ¶meters.workspace_root ).join( &path ); + // let path = table_parameters.base_path. + let example = if let Some( name ) = find_example_file( p.as_path(), &module_name ) + { + let path = path.to_string_lossy().replace( '\\', "/" ).replace( "/", "%2F" ); + let tmp = name.replace( '\\', "/" ); + let file_name = tmp.split( '/' ).last().unwrap(); + let name = file_name.strip_suffix( ".rs" ).unwrap(); + format!( "[![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE={path}%2Fexamples%2F{file_name},RUN_POSTFIX=--example%20{name}/{})", parameters.core_url ) + } + else + { + "".into() + }; + rou.push_str( &format!( " {} |", example ) ); + } + format!( "{rou}\n" ) + } + + /// todo + pub fn find_example_file(base_path : &Path, module_name : &str ) -> Option< String > + { + let examples_dir = base_path.join("examples" ); + + if examples_dir.exists() && examples_dir.is_dir() + { + if let Ok( entries ) = std::fs::read_dir( &examples_dir ) + { + for entry in entries + { + if let Ok( entry ) = entry + { + let file_name = entry.file_name(); + if let Some( file_name_str ) = file_name.to_str() + { + if file_name_str == format!( "{module_name}_trivial.rs" ) + { + return Some( entry.path().to_string_lossy().into() ) + } + } + } + } + } + } + + // If module_trivial.rs doesn't exist, return any other file in the examples directory + if let Ok( entries ) = std::fs::read_dir( &examples_dir ) + { + for entry in entries + { + if let Ok( entry ) = entry + { + let file_name = entry.file_name(); + if let Some( file_name_str ) = file_name.to_str() + { + if file_name_str.ends_with( ".rs" ) + { + return Some( entry.path().to_string_lossy().into() ) + } + } + } + } + } + + None + } + + /// Generate stability cell based on stability + pub fn stability_generate( stability : &Stability ) -> String + { + match stability + { + Stability::Experimental => " [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental)".into(), + Stability::Stable => " [![stability-stable](https://img.shields.io/badge/stability-stable-green.svg)](https://github.com/emersion/stability-badges#stable)".into(), + Stability::Deprecated => " [![stability-deprecated](https://img.shields.io/badge/stability-deprecated-red.svg)](https://github.com/emersion/stability-badges#deprecated)".into(), + Stability::Unstable => " [![stability-unstable](https://img.shields.io/badge/stability-unstable-yellow.svg)](https://github.com/emersion/stability-badges#unstable)".into(), + Stability::Frozen => " [![stability-frozen](https://img.shields.io/badge/stability-frozen-blue.svg)](https://github.com/emersion/stability-badges#frozen)".into(), + } + } + + /// Generate table header + fn table_header_generate( parameters : &GlobalTableParameters, table_parameters : &TableParameters ) -> String + { + let mut header = String::from( "| Module |" ); + let mut separator = String::from( "|--------|" ); + + if table_parameters.include_stability + { + header.push_str( " Stability |" ); + separator.push_str( "-----------|" ); + } + + if let Some( branches ) = ¶meters.branches + { + if table_parameters.include_branches + { + for branch in branches + { + header.push_str( format!( " {} |", branch ).as_str() ); + separator.push_str( "--------|" ); + } + } + } + + if table_parameters.include_docs + { + header.push_str( " Docs |" ); + separator.push_str( ":----:|" ); + } + + if table_parameters.include + { + header.push_str( " Sample |" ); + separator.push_str( ":------:|" ); + } + + format!( "{}\n{}\n", header, separator ) + } + + /// Generate cells for each branch + fn branch_cells_generate( table_parameters: &GlobalTableParameters, module_name: &str ) -> String + { + let cells = table_parameters + .branches + .as_ref() + .unwrap() + .iter() + .map + ( + | b | + format!( "[![rust-status](https://img.shields.io/github/actions/workflow/status/{}/module_{}_push.yml?label=&branch={b})]({}/actions/workflows/module_{}_push.yml?query=branch%3A{})", table_parameters.user_and_repo, &module_name.to_case( Case::Snake ), table_parameters.core_url, &module_name.to_case( Case::Snake ), b ) + ) + .collect::< Vec< String > >() + .join( " | " ); + format!( " {cells} |" ) + } + + /// Return workspace root + pub fn workspace_root( metadata : &mut Workspace ) -> Result< PathBuf > + { + Ok( metadata.load()?.workspace_root()?.to_path_buf() ) + } + + fn range_to_target_copy< T : Clone >( source : &[ T ], target : &mut Vec< T >, from : usize, to : usize ) -> Result< () > + { + if from < source.len() && to < source.len() && from <= to + { + target.extend_from_slice( &source[ from..= to ] ); + return Ok( () ) + } + else + { + bail!( "Incorrect indexes" ) + } + } + + /// Searches for a README file in specific subdirectories of the given directory path. + /// + /// This function attempts to find a README file in the following subdirectories: ".github", + /// the root directory, and "./docs". It returns the path to the first found README file, or + /// `None` if no README file is found in any of these locations. + pub fn readme_path( dir_path : &Path ) -> Option< PathBuf > + { + if let Some( path ) = readme_in_dir_find( &dir_path.join( ".github" ) ) + { + Some( path ) + } + else if let Some( path ) = readme_in_dir_find( dir_path ) + { + Some( path ) + } + else if let Some( path ) = readme_in_dir_find( &dir_path.join( "docs" ) ) + { + Some( path ) + } + else + { + None + } + } + + /// Searches for a file named "readme.md" in the specified directory path. + /// + /// Given a directory path, this function searches for a file named "readme.md" in the specified + /// directory. + fn readme_in_dir_find( path : &Path ) -> Option< PathBuf > + { + read_dir( path ) + .ok()? + .filter_map( Result::ok ) + .filter( | p | p.path().is_file() ) + .filter_map( | f | + { + let l_f = f.file_name().to_ascii_lowercase(); + if l_f == "readme.md" + { + return Some( f.file_name() ) + } + None + }) + .max() + .map( PathBuf::from ) + } + +} + +crate::mod_interface! +{ + /// Return workspace root + protected use workspace_root; + /// Find readme.md file in directory + protected use readme_path; + /// Stability + protected use Stability; + /// Generate Stability badge + protected use stability_generate; + protected use find_example_file; + /// Create Table. + orphan use readme_health_table_renew; +} diff --git a/module/move/willbe/src/action/readme_modules_headers_renew.rs b/module/move/willbe/src/action/readme_modules_headers_renew.rs new file mode 100644 index 0000000000..5809369b10 --- /dev/null +++ b/module/move/willbe/src/action/readme_modules_headers_renew.rs @@ -0,0 +1,244 @@ +mod private +{ + use crate::*; + use _path::AbsolutePath; + use action::readme_health_table_renew::{ readme_path, Stability, stability_generate, find_example_file }; + use package::Package; + use wtools::error:: + { + err, + for_app:: + { + Result, + Error as wError, + Context, + }, + }; + use std::borrow::Cow; + use std::collections::BTreeSet; + use std::fmt::{Display, Formatter}; + use std::fs::{ OpenOptions }; + use std::io::{ Read, Seek, SeekFrom, Write }; + use std::path::PathBuf; + use convert_case::{ Case, Casing }; + use regex::Regex; + use entity::WorkspaceError; + use manifest::private::CrateDirError; + use package::PackageError; + use error_tools::for_lib::Error; + use error_tools::dependency::*; + // aaa : for Petro : rid off crate::x. ask + // aaa : add `use crate::*` first + + static TAGS_TEMPLATE : std::sync::OnceLock< Regex > = std::sync::OnceLock::new(); + + fn regexes_initialize() + { + TAGS_TEMPLATE.set( Regex::new( r"(.|\n|\r\n)+" ).unwrap() ).ok(); + } + + /// Report. + #[ derive( Debug, Default, Clone ) ] + pub struct ModulesHeadersRenewReport + { + found_files : BTreeSet< PathBuf >, + touched_files : BTreeSet< PathBuf >, + } + + impl Display for ModulesHeadersRenewReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + if self.touched_files.len() < self.found_files.len() + { + writeln!( f, "Something went wrong.\n{}/{} was touched.", self.found_files.len(), self.touched_files.len() )?; + return Ok(()) + } + writeln!( f, "Touched files :" )?; + let mut count = self.found_files.len(); + for path in &self.touched_files + { + if let Some( file_path ) = path.to_str() + { + writeln!( f, "{file_path}" )?; + count -= 1; + } + } + if count != 0 + { + writeln!( f, "Other {count} files contains non-UTF-8 characters." )?; + } + Ok( () ) + } + } + + #[ derive( Debug, Error ) ] + pub enum ModulesHeadersRenewError + { + #[ error( "Common error: {0}" ) ] + Common(#[ from ] wError ), + #[ error( "I/O error: {0}" ) ] + IO( #[ from ] std::io::Error ), + #[ error( "Workspace error: {0}" ) ] + Workspace( #[ from ] WorkspaceError), + #[ error( "Package error: {0}" ) ] + Package( #[ from ] PackageError), + #[ error( "Directory error: {0}" ) ] + Directory( #[ from ] CrateDirError ), + } + + /// The `ModuleHeader` structure represents a set of parameters, used for creating url for header. + struct ModuleHeader + { + module_path : PathBuf, + stability : Stability, + module_name : String, + repository_url : String, + discord_url : Option< String >, + } + + impl ModuleHeader + { + + /// Create `ModuleHeader` instance from the folder where Cargo.toml is stored. + fn from_cargo_toml( package : Package, default_discord_url : &Option< String > ) -> Result< Self, ModulesHeadersRenewError > + { + let stability = package.stability()?; + + let module_name = package.name()?; + + let repository_url = package.repository()?.ok_or_else::< wError, _ >( || err!( "Fail to find repository_url in module`s Cargo.toml" ) )?; + + let discord_url = package.discord_url()?.or_else( || default_discord_url.clone() ); + Ok + ( + Self + { + module_path: package.manifest_path().parent().unwrap().as_ref().to_path_buf(), + stability, + module_name, + repository_url, + discord_url, + } + ) + } + + /// Convert `ModuleHeader`to header. + fn to_header( self, workspace_path : &str ) -> Result< String, ModulesHeadersRenewError > + { + let discord = self.discord_url.map( | discord_url | + format!( " [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)]({discord_url})" ) + ) + .unwrap_or_default(); + + let repo_url = url::extract_repo_url( &self.repository_url ).and_then( | r | url::git_info_extract( &r ).ok() ).ok_or_else::< wError, _ >( || err!( "Fail to parse repository url" ) )?; + let example = if let Some( name ) = find_example_file( self.module_path.as_path(), &self.module_name ) + { + // qqq : for Petro : Hardcoded Strings, would be better to use `PathBuf` to avoid separator mismatch on Windows and Unix + let p = name.strip_prefix( workspace_path ).unwrap().get( 1.. ).unwrap().replace( "\\","%2F" ); + let name = name.replace( "/", "\\" ); + let name = name.split( "\\" ).last().unwrap().split( "." ).next().unwrap(); + format!( " [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE={p},RUN_POSTFIX=--example%20{}/https://github.com/{})", name, repo_url ) + } + else + { + "".into() + }; + Ok( format! + ( + "{} \ + [![rust-status](https://github.com/{}/actions/workflows/module_{}_push.yml/badge.svg)](https://github.com/{}/actions/workflows/module_{}_push.yml) \ + [![docs.rs](https://img.shields.io/docsrs/{}?color=e3e8f0&logo=docs.rs)](https://docs.rs/{}){}{}", + stability_generate( &self.stability ), + repo_url, self.module_name.to_case( Case::Snake ), repo_url, self.module_name.to_case( Case::Snake ), + self.module_name, self.module_name, + example, + discord, + ) ) + } + } + + /// Generate header in modules Readme.md. + /// The location of header is defined by a tag : + /// ``` md + /// + /// + /// ``` + /// To use it you need to add these fields to Cargo.toml each module workspace : + /// ``` toml + /// [package] + /// name = "test_module" + /// repository = "https://github.com/Wandalen/wTools/tree/master/module/move/test_module" + /// ... + /// [package.metadata] + /// stability = "stable" (Optional) + /// discord_url = "https://discord.gg/m3YfbXpUUY" (Optional) + /// ``` + /// Result example : + /// ``` md + /// + /// [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://github.com/Username/test/actions/workflows/ModuleChainOfPackagesAPush.yml/badge.svg)](https://github.com/Username/test/actions/workflows/ModuleChainOfPackagesAPush.yml)[![docs.rs](https://img.shields.io/docsrs/_chain_of_packages_a?color=e3e8f0&logo=docs.rs)](https://docs.rs/_chain_of_packages_a)[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2F_chain_of_packages_a_trivial%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20_chain_of_packages_a_trivial/https://github.com/Username/test) + /// + /// ``` + pub fn readme_modules_headers_renew( path : AbsolutePath ) -> Result< ModulesHeadersRenewReport, ( ModulesHeadersRenewReport, ModulesHeadersRenewError ) > + { + let mut report = ModulesHeadersRenewReport::default(); + regexes_initialize(); + let cargo_metadata = Workspace::with_crate_dir( CrateDir::try_from( path ).map_err( | e | ( report.clone(), e.into() ) )? ).map_err( | e | ( report.clone(), e.into() ) )?; + let discord_url = cargo_metadata.discord_url().map_err( | e | ( report.clone(), e.into() ) )?; + let paths = cargo_metadata.packages().map_err( | e | ( report.clone(), e.into() ) )?.into_iter().filter_map( | p | AbsolutePath::try_from( p.manifest_path() ).ok()).collect::< Vec< _ > >(); + report.found_files = paths.iter().map( | ap | ap.as_ref().to_path_buf() ).collect(); + for path in paths + { + let read_me_path = path + .parent() + .unwrap() + .join( readme_path( path.parent().unwrap().as_ref() ).ok_or_else::< wError, _ >( || err!( "Fail to find README.md" ) ).map_err( | e | ( report.clone(), e.into() ) )? ); + + let pakage = Package::try_from( path.clone() ).map_err( | e | ( report.clone(), e.into() ) )?; + let header = ModuleHeader::from_cargo_toml( pakage.into(), &discord_url ).map_err( | e | ( report.clone(), e.into() ) )?; + + let mut file = OpenOptions::new() + .read( true ) + .write( true ) + .open( &read_me_path ) + .map_err( | e | ( report.clone(), e.into() ) )?; + + let mut content = String::new(); + file.read_to_string( &mut content ).map_err( | e | ( report.clone(), e.into() ) )?; + + let raw_params = TAGS_TEMPLATE + .get() + .unwrap() + .captures( &content ) + .and_then( | c | c.get( 1 ) ) + .map( | m | m.as_str() ) + .unwrap_or_default(); + + _ = query::parse( raw_params ).context( "Fail to parse raw params." ); + + let content = header_content_generate( &content, header, raw_params, cargo_metadata.workspace_root().map_err( | e | ( report.clone(), e.into() ) )?.to_str().unwrap() ).map_err( | e | ( report.clone(), e.into() ) )?; + + file.set_len( 0 ).map_err( | e | ( report.clone(), e.into() ) )?; + file.seek( SeekFrom::Start( 0 ) ).map_err( | e | ( report.clone(), e.into() ) )?; + file.write_all( content.as_bytes() ).map_err( | e | ( report.clone(), e.into() ) )?; + report.touched_files.insert( path.as_ref().to_path_buf() ); + } + Ok( report ) + } + + fn header_content_generate< 'a >( content : &'a str, header : ModuleHeader, raw_params : &str, workspace_root : &str ) -> Result< Cow< 'a, str > > + { + let header = header.to_header( workspace_root )?; + let result = TAGS_TEMPLATE.get().unwrap().replace( &content, &format!( "\n{header}\n" ) ); + Ok( result ) + } +} + +crate::mod_interface! +{ + /// Generate headers in modules + orphan use readme_modules_headers_renew; + /// report + orphan use ModulesHeadersRenewReport; +} \ No newline at end of file diff --git a/module/move/willbe/src/action/test.rs b/module/move/willbe/src/action/test.rs new file mode 100644 index 0000000000..7ad9a532a4 --- /dev/null +++ b/module/move/willbe/src/action/test.rs @@ -0,0 +1,209 @@ +/// Internal namespace. +mod private +{ + use crate::*; + use test::*; + use _path::AbsolutePath; + + use std::collections::HashSet; + + use std::{ env, fs }; + + #[ cfg( feature = "progress_bar" ) ] + use indicatif::{ MultiProgress, ProgressStyle }; + + use former::Former; + use wtools:: + { + error:: + { + for_app:: + { + Error, + format_err + }, + Result + }, + iter::Itertools, + }; + use workspace::WorkspacePackage; + + /// Used to store arguments for running tests. + /// + /// - The `dir` field represents the directory of the crate under test. + /// - The `channels` field is a set of `Channel` enums representing the channels for which the tests should be run. + /// - The `concurrent` field determines how match tests can be run at the same time. + /// - The `exclude_features` field is a vector of strings representing the names of features to exclude when running tests. + /// - The `include_features` field is a vector of strings representing the names of features to include when running tests. + #[ derive( Debug, Former ) ] + pub struct TestsCommandOptions + { + dir : AbsolutePath, + channels : HashSet< channel::Channel >, + #[ former( default = 0u32 ) ] + concurrent : u32, + #[ former( default = 1u32 ) ] + power : u32, + include_features : Vec< String >, + #[ former( default = [ "full".to_string(), "default".to_string() ] ) ] + exclude_features : Vec< String >, + #[ former( default = true ) ] + temp : bool, + enabled_features : Vec< String >, + #[ former( default = true ) ] + with_all_features : bool, + #[ former( default = true ) ] + with_none_features : bool, + optimizations : HashSet< optimization::Optimization >, + #[ former( default = 1000u32 ) ] + variants_cap : u32, + #[ former( default = false ) ] + with_progress : bool, + } + + + /// The function runs tests with a different set of features in the selected crate (the path to the crate is specified in the dir variable). + /// Tests are run with each feature separately, with all features together, and without any features. + /// The tests are run in nightly and stable versions of Rust. + /// It is possible to enable and disable various features of the crate. + /// The function also has the ability to run tests in parallel using `Rayon` crate. + /// The result of the tests is written to the structure `TestsReport` and returned as a result of the function execution. + pub fn test( args : TestsCommandOptions, dry : bool ) -> Result< TestsReport, ( TestsReport, Error ) > + { + #[ cfg( feature = "progress_bar" ) ] + let multiprocess = MultiProgress::new(); + #[ cfg( feature = "progress_bar" ) ] + let style = ProgressStyle::with_template + ( + "[{elapsed_precise}] {bar:40.cyan/blue} {pos:>7}/{len:7} {msg}", + ) + .unwrap() + .progress_chars( "##-" ); + + let mut reports = TestsReport::default(); + // fail fast if some additional installations required + let channels = channel::available_channels( args.dir.as_ref() ).map_err( | e | ( reports.clone(), e ) )?; + let channels_diff = args.channels.difference( &channels ).collect::< Vec< _ > >(); + if !channels_diff.is_empty() + { + return Err(( reports, format_err!( "Missing toolchain(-s) that was required : [{}]. Try to install it with `rustup install {{toolchain name}}` command(-s)", channels_diff.into_iter().join( ", " ) ) )) + } + reports.dry = dry; + let TestsCommandOptions + { + dir : _ , + channels, + concurrent, + power, + include_features, + exclude_features, + temp, + enabled_features, + with_all_features, + with_none_features, + optimizations, + variants_cap, + with_progress, + } = args; + + let packages = needed_packages( args.dir.clone() ).map_err( | e | ( reports.clone(), e ) )?; + + let plan = TestPlan::try_from + ( + &packages, + &channels, + power, + include_features, + exclude_features, + &optimizations, + enabled_features, + with_all_features, + with_none_features, + variants_cap, + ).map_err( | e | ( reports.clone(), e ) )?; + + println!( "{plan}" ); + + let temp_path = if temp + { + let mut unique_name = format! + ( + "temp_dir_for_test_command_{}", + path_tools::path::unique_folder_name().map_err( | e | ( reports.clone(), e.into() ) )? + ); + + let mut temp_dir = env::temp_dir().join( unique_name ); + + while temp_dir.exists() + { + unique_name = format! + ( + "temp_dir_for_test_command_{}", + path_tools::path::unique_folder_name().map_err( | e | ( reports.clone(), e.into() ) )? + ); + temp_dir = env::temp_dir().join( unique_name ); + } + + fs::create_dir( &temp_dir ).map_err( | e | ( reports.clone(), e.into() ) )?; + Some( temp_dir ) + } + else + { + None + }; + + let test_options_former = TestOptions::former() + .concurrent( concurrent ) + .plan( plan ) + .option_temp( temp_path ) + .dry( dry ); + + #[ cfg( feature = "progress_bar" ) ] + let test_options_former = if with_progress + { + let test_options_former = test_options_former.feature( TestOptionsProgressBarFeature{ multiprocess, style } ); + test_options_former + } + else + { + test_options_former + }; + + let options = test_options_former.form(); + let result = tests_run( &options ); + + if temp + { + fs::remove_dir_all( options.temp_path.unwrap() ).map_err( | e | ( reports.clone(), e.into() ) )?; + } + + result + } + + fn needed_packages( path : AbsolutePath ) -> Result< Vec< WorkspacePackage > > + { + let path = if path.as_ref().file_name() == Some( "Cargo.toml".as_ref() ) + { + path.parent().unwrap() + } + else + { + path + }; + let metadata = Workspace::with_crate_dir( CrateDir::try_from( path.clone() )? )?; + + let result = metadata + .packages()? + .into_iter() + .filter( move | x | x.manifest_path().starts_with( path.as_ref() ) ) + .collect(); + Ok( result ) + } +} + +crate::mod_interface! +{ + /// run all tests in all crates + orphan use test; + protected use TestsCommandOptions; +} diff --git a/module/move/willbe/src/action/workspace_renew.rs b/module/move/willbe/src/action/workspace_renew.rs new file mode 100644 index 0000000000..d03fcda04d --- /dev/null +++ b/module/move/willbe/src/action/workspace_renew.rs @@ -0,0 +1,143 @@ +mod private +{ + use crate::*; + use std::fs; + use std::path::Path; + use error_tools::for_app::bail; + use error_tools::Result; + use wtools::iter::Itertools; + use crate::template::{Template, TemplateFileDescriptor, TemplateFiles, TemplateFilesBuilder, TemplateParameters, TemplateValues}; + + /// Template for creating workspace files. + #[ derive( Debug ) ] + pub struct WorkspaceTemplate + { + files : WorkspaceTemplateFiles, + parameters : TemplateParameters, + values : TemplateValues, + } + + impl Template for WorkspaceTemplate + { + fn create_all( self, path : &Path ) -> Result< () > + { + self.files.create_all( path, &self.values ) + } + + fn parameters( &self ) -> &TemplateParameters + { + &self.parameters + } + + fn set_values( &mut self, values : TemplateValues ) + { + self.values = values + } + + fn parameter_storage( &self ) -> &Path + { + "./.workspace_template.toml".as_ref() + } + + fn template_name( &self ) -> &'static str + { + "workspace" + } + + fn get_values( &self ) -> &TemplateValues + { + &self.values + } + + fn get_values_mut( &mut self ) -> &mut TemplateValues + { + &mut self.values + } + + + } + + impl Default for WorkspaceTemplate + { + fn default() -> Self + { + let parameters = TemplateParameters::former() + .parameter( "project_name" ).is_mandatory( true ).end() + .parameter( "url" ).is_mandatory( true ).end() + .parameter( "branches" ).is_mandatory( true ).end() + .form(); + Self + { + files : Default::default(), + parameters, + values : Default::default(), + } + } + } + + /// Files for the deploy template. + /// + /// Default implementation contains all required files. + #[ derive( Debug ) ] + pub struct WorkspaceTemplateFiles(Vec< TemplateFileDescriptor > ); + + impl Default for WorkspaceTemplateFiles + { + fn default() -> Self + { + let formed = TemplateFilesBuilder::former() + .file().data( include_str!( "../../template/workspace/.gitattributes" ) ).path( "./.gitattributes" ).end() + .file().data( include_str!( "../../template/workspace/.gitignore1" ) ).path( "./.gitignore" ).end() + .file().data( include_str!( "../../template/workspace/.gitpod.yml" ) ).path( "./.gitpod.yml" ).end() + .file().data( include_str!( "../../template/workspace/Cargo.hbs" ) ).path( "./Cargo.toml" ).is_template( true ).end() + .file().data( include_str!( "../../template/workspace/Makefile" ) ).path( "./Makefile" ).end() + .file().data( include_str!( "../../template/workspace/Readme.md" ) ).path( "./Readme.md" ).end() + .file().data( include_str!( "../../template/workspace/.cargo/config.toml" ) ).path( "./.cargo/config.toml" ).end() + .file().data( include_str!( "../../template/workspace/module/module1/Cargo.toml.x" ) ).path( "./module/Cargo.toml" ).end() + .file().data( include_str!( "../../template/workspace/module/module1/Readme.md" ) ).path( "./module/module1/Readme.md" ).end() + .file().data( include_str!( "../../template/workspace/module/module1/examples/module1_example.rs" ) ).path( "./module/module1/examples/module1_example.rs" ).end() + .file().data( include_str!( "../../template/workspace/module/module1/src/lib.rs" ) ).path( "./module/module1/src/lib.rs" ).end() + .file().data( include_str!( "../../template/workspace/module/module1/tests/hello_test.rs" ) ).path( "./module/module1/tests/hello_test.rs" ).end() + .form(); + + Self( formed.files ) + } + } + + impl TemplateFiles for WorkspaceTemplateFiles {} + impl IntoIterator for WorkspaceTemplateFiles + { + type Item = TemplateFileDescriptor; + + type IntoIter = std::vec::IntoIter< Self::Item >; + + fn into_iter( self ) -> Self::IntoIter + { + self.0.into_iter() + } + } + + // qqq : for Petro : should return report + // qqq : for Petro : should have typed error + // aaa : parametrized templates?? + // aaa : use Viktor lib + /// Creates workspace template + pub fn workspace_renew( path : &Path, mut template : WorkspaceTemplate, repository_url : String, branches : Vec< String > ) -> Result< () > + { + if fs::read_dir(path)?.count() != 0 + { + bail!( "Directory should be empty" ) + } + template.values.insert_if_empty( "project_name", wca::Value::String( path.file_name().unwrap().to_string_lossy().into() ) ); + template.values.insert_if_empty( "url", wca::Value::String( repository_url ) ); + template.values.insert_if_empty( "branches", wca::Value::String( branches.into_iter().map( | b | format!( r#""{}""#, b ) ).join( ", " ) ) ); + template.create_all( path )?; + Ok( () ) + } +} + +crate::mod_interface! +{ + exposed use workspace_renew; + orphan use WorkspaceTemplate; +} diff --git a/module/move/willbe/src/bin/cargo-will.rs b/module/move/willbe/src/bin/cargo-will.rs new file mode 100644 index 0000000000..3e4e4ffeaf --- /dev/null +++ b/module/move/willbe/src/bin/cargo-will.rs @@ -0,0 +1,13 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/willbe/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use::willbe::*; + +fn main() -> Result< (), wtools::error::for_app::Error > +{ + let args = std::env::args().skip( 1 ).collect(); + Ok( willbe::run( args )? ) +} diff --git a/module/move/willbe/src/bin/will.rs b/module/move/willbe/src/bin/will.rs new file mode 100644 index 0000000000..e514a10bc4 --- /dev/null +++ b/module/move/willbe/src/bin/will.rs @@ -0,0 +1,15 @@ +//! +//! Utility to publish multi-crate and multi-workspace environments and maintain their consistency. +//! +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/willbe/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use::willbe::*; + +fn main() -> Result< (), wtools::error::for_app::Error > +{ + Ok( willbe::run( std::env::args().collect() )? ) +} diff --git a/module/move/willbe/src/bin/willbe.rs b/module/move/willbe/src/bin/willbe.rs new file mode 100644 index 0000000000..4fe12f8995 --- /dev/null +++ b/module/move/willbe/src/bin/willbe.rs @@ -0,0 +1,12 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/willbe/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use::willbe::*; + +fn main() -> Result< (), wtools::error::for_app::Error > +{ + Ok( willbe::run( std::env::args().collect() )? ) +} diff --git a/module/move/willbe/src/command/cicd_renew.rs b/module/move/willbe/src/command/cicd_renew.rs new file mode 100644 index 0000000000..f87569e9a8 --- /dev/null +++ b/module/move/willbe/src/command/cicd_renew.rs @@ -0,0 +1,21 @@ +mod private +{ + use crate::*; + + use wtools::error::{ anyhow::Context, Result }; + + /// + /// Generate table. + /// + pub fn cicd_renew() -> Result< () > + { + action::cicd_renew( &std::env::current_dir()? ).context( "Fail to generate workflow" ) + } +} + +crate::mod_interface! +{ + /// List packages. + exposed use cicd_renew; +} + diff --git a/module/move/willbe/src/command/deploy_renew.rs b/module/move/willbe/src/command/deploy_renew.rs new file mode 100644 index 0000000000..7fe0ebf13e --- /dev/null +++ b/module/move/willbe/src/command/deploy_renew.rs @@ -0,0 +1,36 @@ +mod private +{ + use crate::*; + + use wca::VerifiedCommand; + use wtools::error::{ anyhow::Context, Result }; + use tool::template::Template; + use action::deploy_renew::*; + + /// + /// Create new deploy. + /// + + pub fn deploy_renew( o : VerifiedCommand ) -> Result< () > + { + let current_dir = std::env::current_dir()?; + let mut template = DeployTemplate::default(); + _ = template.load_existing_params( ¤t_dir ); + let parameters = template.parameters(); + let mut values = parameters.values_from_props( &o.props ); + for mandatory in template.get_missing_mandatory() + { + values.interactive_if_empty( mandatory ); + } + template.set_values( values ); + action::deploy_renew( ¤t_dir, template ).context( "Fail to create deploy template" ) + } + +} + +crate::mod_interface! +{ + /// Create deploy from template. + orphan use deploy_renew; +} + diff --git a/module/move/willbe/src/command/features.rs b/module/move/willbe/src/command/features.rs new file mode 100644 index 0000000000..ad69897935 --- /dev/null +++ b/module/move/willbe/src/command/features.rs @@ -0,0 +1,40 @@ +mod private +{ + use crate::*; + + use action::features::FeaturesOptions; + use std::path::PathBuf; + use _path::AbsolutePath; + use wca::VerifiedCommand; + use wtools::error::Result; + + /// + /// List features of a package. + /// + + pub fn features( o : VerifiedCommand ) -> Result< () > + { + let path : PathBuf = o.args.get_owned( 0 ).unwrap_or_else( || "./".into() ); + let path = AbsolutePath::try_from( path )?; + let with_features_deps = o.props.get_owned( "with_features_deps" ).unwrap_or( false ); + let options = FeaturesOptions::former() + .manifest_dir( path ) + .with_features_deps( with_features_deps ) + .form(); + let report = action::features( options ); + match report + { + Ok(success) => println!("{success}"), + Err(failure) => eprintln!("{failure}"), + } + Ok( () ) + } + +} + +crate::mod_interface! +{ + /// List features. + orphan use features; +} + diff --git a/module/move/willbe/src/command/list.rs b/module/move/willbe/src/command/list.rs new file mode 100644 index 0000000000..154317904c --- /dev/null +++ b/module/move/willbe/src/command/list.rs @@ -0,0 +1,125 @@ +/// Internal namespace. +mod private +{ + use crate::*; + + use { action, wtools }; + + use std:: + { + str::FromStr, + path::PathBuf, + collections::HashSet, + }; + + use wca::VerifiedCommand; + use wtools::error::{ for_app::Context, Result }; + + use _path::AbsolutePath; + use action::{ list as l, list::{ ListFormat, ListOptions } }; + use former::Former; + + #[ derive( Former ) ] + struct ListProperties + { + #[ former( default = ListFormat::Tree ) ] + format : ListFormat, + + #[ former( default = false ) ] + with_version : bool, + #[ former( default = false ) ] + with_path : bool, + + #[ former( default = true ) ] + with_local : bool, + #[ former( default = false ) ] + with_remote : bool, + + #[ former( default = true ) ] + with_primary : bool, + #[ former( default = false ) ] + with_dev : bool, + #[ former( default = false ) ] + with_build : bool, + } + + /// + /// List workspace packages. + /// + + pub fn list( o : VerifiedCommand ) -> Result< () > + { + let path_to_workspace : PathBuf = o.args.get_owned( 0 ).unwrap_or( std::env::current_dir().context( "Workspace list command without subject" )? ); + let path_to_workspace = AbsolutePath::try_from( path_to_workspace )?; + + let ListProperties { format, with_version, with_path, with_local, with_remote, with_primary, with_dev, with_build } = o.props.try_into()?; + + let crate_dir = CrateDir::try_from( path_to_workspace )?; + + let mut additional_info = HashSet::new(); + if with_version { additional_info.insert( l::PackageAdditionalInfo::Version ); } + if with_path { additional_info.insert( l::PackageAdditionalInfo::Path ); } + + let mut sources = HashSet::new(); + if with_local { sources.insert( l::DependencySource::Local ); } + if with_remote { sources.insert( l::DependencySource::Remote ); } + + let mut categories = HashSet::new(); + if with_primary { categories.insert( l::DependencyCategory::Primary ); } + if with_dev { categories.insert( l::DependencyCategory::Dev ); } + if with_build { categories.insert( l::DependencyCategory::Build ); } + + let args = ListOptions::former() + .path_to_manifest( crate_dir ) + .format( format ) + .info( additional_info ) + .dependency_sources( sources ) + .dependency_categories( categories ) + .form(); + + match action::list( args ) + { + Ok( report ) => + { + println!( "{report}" ); + } + Err(( report, e )) => + { + eprintln!( "{report}" ); + + return Err( e.context( "workspace list command" ) ); + } + } + + Ok( () ) + } + + impl TryFrom< wca::Props > for ListProperties + { + type Error = wtools::error::for_app::Error; + fn try_from( value : wca::Props ) -> Result< Self, Self::Error > + { + let mut this = Self::former(); + + this = if let Some( v ) = value.get_owned( "format" ).map( ListFormat::from_str ) { this.format( v? ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_version" ) { this.with_version::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_path" ) { this.with_path::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_local" ) { this.with_local::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_remote" ) { this.with_remote::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_primary" ) { this.with_primary::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_dev" ) { this.with_dev::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_build" ) { this.with_build::< bool >( v ) } else { this }; + + Ok( this.form() ) + } + } + +} + +// + +crate::mod_interface! +{ + /// List workspace packages. + orphan use list; +} diff --git a/module/move/willbe/src/command/main_header.rs b/module/move/willbe/src/command/main_header.rs new file mode 100644 index 0000000000..558f2a625b --- /dev/null +++ b/module/move/willbe/src/command/main_header.rs @@ -0,0 +1,32 @@ +mod private +{ + use crate::*; + use action; + use _path::AbsolutePath; + use error_tools::Result; + use wtools::error::anyhow::Error; + + /// Generates header to main Readme.md file. + pub fn readme_header_renew() -> Result< () > + { + match action::readme_header_renew( AbsolutePath::try_from( std::env::current_dir()? )? ) + { + Ok( report ) => + { + println!( "{report}" ); + Ok( () ) + } + Err( ( report, e ) ) => + { + eprintln!( "{report}" ); + Err( Error::from( e ).context( "Fail to generate main header." ) ) + } + } + } +} + +crate::mod_interface! +{ + /// Generate header. + orphan use readme_header_renew; +} \ No newline at end of file diff --git a/module/move/willbe/src/command/mod.rs b/module/move/willbe/src/command/mod.rs new file mode 100644 index 0000000000..74f58a48bc --- /dev/null +++ b/module/move/willbe/src/command/mod.rs @@ -0,0 +1,314 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + use wca::{ Type, CommandsAggregator, CommandsAggregatorFormer }; + + /// + /// Form CA commands grammar. + /// + + pub fn ca() -> CommandsAggregatorFormer + { + CommandsAggregator::former() + + .command( "publish" ) + .hint( "publish the specified package to `crates.io`" ) + .long_hint( "used to publish the specified local package, which is located in the provided directory path, to the `crates.io` crate registry." ) + .subject() + .hint( "Provide path(s) to the package(s) that you want to publish.\n\t Each path should point to a directory that contains a `Cargo.toml` file.\n\t Paths should be separated by a comma." ) + .kind( Type::List( Type::String.into(), ',' ) ) + .optional( true ) + .end() + .property( "dry" ) + .hint( "Enables 'dry run'. Does not publish, only simulates. Default is `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "temp" ) + .hint( "If flag is `true` all test will be running in temporary directories. Default `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + // .property( "verbosity" ).hint( "Setup level of verbosity." ).kind( Type::String ).optional( true ).alias( "v" ).end() + .routine( command::publish ) + .end() + + .command( "publish.diff" ) + .hint( "Display the differences between a local and remote package versions." ) + .long_hint( "Following this command, you will immediately get a comparison between the local and remote packages. It looks at each file, identifying those added, removed, or modified. A full report will then be generated where you can quickly and easily see the differences." ) + .subject() + .hint( "Provide path to the package that you want to check.\n\t The path should point to a directory that contains a `Cargo.toml` file." ) + .kind( Type::Path ) + .optional( true ) + .end() + .property( "keep_archive" ) + .hint( "Save remote package version to the specified path" ) + .kind( Type::Path ) + .optional( true ) + .end() + .routine( command::publish_diff ) + .end() + + .command( "list" ) + .hint( "list packages from a directory" ) + .long_hint( "generates a list of packages based on the provided directory path. The directory must contain a `Cargo.toml` file." ) + .subject() + .hint( "The command will generate a list of packages based on a path that must containing a `Cargo.toml` file. If no path is provided, the current directory is used." ) + .kind( Type::Path ) + .optional( true ) + .end() + .property( "format" ) + .hint( "Adjusts the output format - 'topsort' for a topologically sorted list or 'tree' for a structure of independent crates trees. The default is `tree`." ) + .kind( Type::String ) + .optional( true ) + .end() + .property( "with_version" ) + .hint( "`true` to include the versions of the packages in the output. Defaults to `false`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_path" ) + .hint( "`true` to include the paths of the packages in the output. Defaults to `false`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_primary" ) + .hint( "`true` to include primary packages in the output, `false` otherwise. Defaults to `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_dev" ) + .hint( "`true` to include development packages in the output, `false` otherwise. Defaults to `false`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_build" ) + .hint( "`true` to include build packages in the output, `false` otherwise. Defaults to `false`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_local" ) + .hint( "`true` to include local packages in the output, `false` otherwise. Defaults to `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_remote" ) + .hint( "`true` to include remote packages in the output, `false` otherwise. Defaults to `false`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .routine( command::list ) + .end() + + .command( "readme.health.table.renew" ) + .hint( "Generate a table for the root `Readme.md`" ) + .long_hint( + r#"Generates a data summary table for the `Readme.md` file located in the root of the workspace. +To ensure the proper execution of the command, the following tags need to be specified in the Readme.md file: + + + + +After executing the command, the tags will not be modified. + +Tags can contains params: + +path: The relative path to the directory from workspace root, which crates will be taken. Default is './'. +with_branches: If set to 1, it will display the status of workflow execution on branches specified in branches under workspace.metadata in the Cargo.toml of your workspace. For example, branches = ["master", "alpha"]. Default is 1. +with_stability: If set to 1, a column indicating the stability of the module will be added. Information is taken from package.metadata of each module (package.metadata.stability = "stable"). By default, the module is considered experimental. Default is 1. +with_docs: If set to 1, adds a column with a link to the module's documentation. Default is 1. +with_gitpod: If set to 1, a column with a link to Gitpod will be added. Clicking on it will open and run an example named _trivial. Default is 1."# ) + .routine( command::readme_health_table_renew ) + .end() + + .command( "test" ) + .hint( "execute tests in specific packages" ) + .long_hint( "this command runs tests in designated packages based on the provided path. It allows for inclusion and exclusion of features, testing on different Rust version channels, parallel execution, and feature combination settings." ) + .subject().hint( "A path to directories with packages. If no path is provided, the current directory is used." ).kind( Type::Path ).optional( true ).end() + .property( "dry" ).hint( "Enables 'dry run'. Does not run tests, only simulates. Default is `true`." ).kind( Type::Bool ).optional( true ).end() + .property( "temp" ).hint( "If flag is `true` all test will be running in temporary directories. Default `true`." ).kind( Type::Bool ).optional( true ).end() + .property( "include" ) + .hint( "A list of features to include in testing. Separate multiple features by comma. Default is empty." ) + .kind( Type::List( Type::String.into(), ',' ) ) + .optional( true ) + .end() + .property( "exclude" ) + .hint( "A list of features to exclude from testing. Separate multiple features by comma. Default is [full, default]." ) + .kind( Type::List( Type::String.into(), ',' ) ) + .optional( true ) + .end() + .property( "with_stable" ) + .hint( "Specifies whether or not to run tests on stable Rust version. Default is `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_nightly" ) + .hint( "Specifies whether or not to run tests on nightly Rust version. Default is `false`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "concurrent" ) + .hint( "Indicates how match test will be run at the same time. Default is `0` - which means the same number of cores." ) + .kind( Type::Number ) + .optional( true ) + .end() + .property( "power" ) + .hint( "Defines the depth of feature combination testing. Default is `1`." ) + .kind( Type::Number ) + .optional( true ) + .end() + .property( "always") + .hint( "This features will be always present in feature's combinations. Default is empty.") + .kind( Type::List( Type::String.into(), ',' ) ) + .optional( true ) + .end() + .property( "with_all_features" ) + .hint( "To powerset of features will be add one subset with all features. Default is `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_none_features" ) + .hint( "To powerset of features will be add one empty subset. Default is `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_release" ) + .hint( "Indicates whether or not tests will be run on the release optimization. Default is `false`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "with_debug" ) + .hint( "Indicates whether or not tests will be run on the debug optimization. Default is `true`." ) + .kind( Type::Bool ) + .optional( true ) + .end() + .property( "variants_cap" ) + .hint( "Regulates the number of possible combinations. Default is 1000.") + .kind( Type::Number ) + .optional( true ) + .end() + .property( "with_progress" ) + .hint( "If true, will display progressbar during the tests. Default is `true`. ! Work only with `progress_bar` feature !") + .kind( Type::Bool ) + .optional( true ) + .end() + .routine( command::test ) + .end() + + .command( "cicd.renew" ) + .hint( "generate a CI/CD for the workspace" ) + .long_hint( "this command generates a development workflow for the entire workspace inferred from the current directory. The workflow outlines the build steps, dependencies, test processes, and more for all modules within the workspace." ) + .routine( command::cicd_renew ) + .end() + + .command( "workspace.renew" ) + .hint( "Create workspace template" ) + .long_hint( "Creates static files and directories.\nIn workspace`s Cargo.toml and module Cargo.toml you need to specify some fields, fill them before use this template." ) + .property( "branches" ) + .hint( "List of branches in your project, this parameter affects the branches that will be specified in Cargo.toml of workspace, which in turn will affect the operation of other commands." ) + .kind( Type::List( Type::String.into(), ',' ) ) + .optional( false ) + .end() + .property( "repository_url" ) + .hint( "Link to project repository, this parameter affects the repo_url will be specified in Cargo.toml of workspace, which in turn will affect the operation of other commands.." ) + .kind( Type::String ) + .optional( false ) + .end() + .routine( command::workspace_renew ) + .end() + + .command( "deploy.renew" ) + .hint( "Create deploy template" ) + .long_hint( "Creates static files and directories.\nDeployment to different hosts is done via Makefile." ) + .property( "gcp_project_id" ) + .hint( "Google Cloud Platform Project id for image deployment, terraform state bucket, and, if specified, GCE instance deployment." ) + .kind( Type::String ) + .optional( false ) + .end() + .property( "gcp_region" ) + .hint( "Google Cloud Platform region location. Default: `europe-central2` (Warsaw)" ) + .kind( Type::String ) + .optional( true ) + .end() + .property( "gcp_artifact_repo_name" ) + .hint( "Google Cloud Platform Artifact Repository to store docker image in. Will be generated from current directory name if unspecified." ) + .kind( Type::String ) + .optional( false ) + .end() + .property( "docker_image_name" ) + .hint( "Docker image name to build and deploy. Will be generated from current directory name if unspecified." ) + .kind( Type::String ) + .optional( false ) + .end() + .routine( command::deploy_renew ) + .end() + + .command( "readme.header.renew" ) + .hint( "Generate header in workspace`s Readme.md file") + .long_hint( "Generate header which contains a badge with the general status of workspace, a link to discord, an example in gitpod and documentation in workspace`s Readme.md file.\n For use this command you need to specify:\n\n[workspace.metadata]\nmaster_branch = \"alpha\"\nworkspace_name = \"wtools\"\nrepo_url = \"https://github.com/Wandalen/wTools\"\ndiscord_url = \"https://discord.gg/123123\"\n\nin workspace's Cargo.toml.") + .routine( command::readme_header_renew ) + .end() + + .command( "readme.modules.headers.renew" ) + .hint( "Generates header for each workspace member." ) + .long_hint( "Generates header for each workspace member which contains a badge with the status of crate, a link to discord, an example in gitpod and documentation in crate Readme.md file.\nFor use this command you need to specify:\n\n[package]\nname = \"test_module\"\nrepository = \"https://github.com/Username/ProjectName/tree/master/module/test_module\"\n...\n[package.metadata]\nstability = \"stable\" (Optional)\ndiscord_url = \"https://discord.gg/1234567890\" (Optional)\n\nin module's Cargo.toml." ) + .routine( command::readme_modules_headers_renew ) + .end() + + .command( "readme.headers.renew" ) + .hint( "Aggregation of two command : `readme.header.renew` and `readme.modules.headers.renew`.\n Generated headers in workspace members and in main Readme.md file.") + .long_hint( "Generate header which contains a badge with the general status of workspace, a link to discord, an example in gitpod and documentation in workspace`s Readme.md file.\n For use this command you need to specify:\n\n[workspace.metadata]\nmaster_branch = \"alpha\"\nworkspace_name = \"wtools\"\nrepo_url = \"https://github.com/Wandalen/wTools\"\ndiscord_url = \"https://discord.gg/123123\"\n\nin workspace's Cargo.toml.\n\nGenerates header for each workspace member which contains a badge with the status of crate, a link to discord, an example in gitpod and documentation in crate Readme.md file.\nFor use this command you need to specify:\n\n[package]\nname = \"test_module\"\nrepository = \"https://github.com/Username/ProjectName/tree/master/module/test_module\"\n...\n[package.metadata]\nstability = \"stable\" (Optional)\ndiscord_url = \"https://discord.gg/1234567890\" (Optional)\n\nin module's Cargo.toml.") + .routine( command::readme_headers_renew ) + .end() + + .command( "features" ) + .hint( "Lists features of the package" ) + .long_hint( "Lists features of the package located in a folder.\nWill list either separate package features or features for every package of a workspace") + .subject() + .hint( "Provide path to the package that you want to check.\n\t The path should point to a directory that contains a `Cargo.toml` file." ) + .kind( Type::Path ) + .optional( true ) + .end() + .property("with_features_deps") + .hint( "Display dependencies of features of the package" ) + .kind( Type::Bool ) + .optional( true ) + .end() + .routine( command::features ) + .end() + } +} + +crate::mod_interface! +{ + + protected use ca; + + /// List packages. + layer list; + /// Publish packages. + layer publish; + /// Used to compare local and published versions of a specific package. + layer publish_diff; + /// Combination of two commands `main_header` and `readme_modules_headers_renew`. + layer readme_headers_renew; + /// Generates health table in main Readme.md file of workspace. + // aaa : for Petro : what a table?? + // aaa : add more details to documentation + layer readme_health_table_renew; + /// Run all tests + layer test; + /// Generate workflow + layer cicd_renew; + /// Workspace new + layer workspace_renew; + /// Deploy new + layer deploy_renew; + /// Generate header in main readme.md + layer main_header; + /// Generate headers + layer readme_modules_headers_renew; + /// List features + layer features; +} diff --git a/module/move/willbe/src/command/publish.rs b/module/move/willbe/src/command/publish.rs new file mode 100644 index 0000000000..9b1d09eff0 --- /dev/null +++ b/module/move/willbe/src/command/publish.rs @@ -0,0 +1,92 @@ +/// Internal namespace. +mod private +{ + use crate::*; + use colored::Colorize; + + use wca::VerifiedCommand; + use wtools::error::{ Result, for_app::Context }; + use former::Former; + use std::fmt::Write; + + #[ derive( Former ) ] + struct PublishProperties + { + #[ former( default = true ) ] + dry : bool, + #[ former( default = true ) ] + temp : bool, + } + + /// + /// Publish package. + /// + + pub fn publish( o : VerifiedCommand ) -> Result< () > + { + let args_line = format!( "{}", o.args.get_owned( 0 ).unwrap_or( std::path::PathBuf::from( "" ) ).display() ); + let prop_line = format!( "{}", o.props.iter().map( | p | format!( "{}:{}", p.0, p.1.to_string() ) ).collect::< Vec< _ > >().join(" ") ); + + let patterns : Vec< _ > = o.args.get_owned( 0 ).unwrap_or_else( || vec![ "./".into() ] ); + + let PublishProperties { dry, temp } = o.props.try_into()?; + let plan = action::publish_plan( patterns, dry, temp ).context( "Failed to plan the publication process" )?; + + let mut formatted_plan = String::new(); + writeln!( &mut formatted_plan, "Tree :" )?; + plan.write_as_tree( &mut formatted_plan )?; + + if !plan.plans.is_empty() + { + writeln!( &mut formatted_plan, "The following packages are pending for publication :" )?; + plan.write_as_list( &mut formatted_plan )?; + } + println!( "{formatted_plan}" ); + + match action::publish( plan ) + { + Ok( report ) => + { + println!( "{report}" ); + + if dry && report.packages.iter().find( |( _, p )| p.publish_required ).is_some() + { + let args = if args_line.is_empty() { String::new() } else { format!(" {}", args_line) }; + let prop = if prop_line.is_empty() { String::new() } else { format!(" {}", prop_line) }; + let line = format!("will .publish{}{} dry:0", args, prop); + println!("To apply plan, call the command `{}`", line.blue()); + // qqq : for Petro : for Bohdan : bad. should be exact command with exact parameters + } + + Ok( () ) + } + Err( ( report, e ) ) => + { + eprintln!( "{report}" ); + Err( e.context( "publish command" ) ) + } + } + } + + impl TryFrom< wca::Props > for PublishProperties + { + type Error = wtools::error::for_app::Error; + fn try_from( value : wca::Props ) -> Result< Self, Self::Error > + { + let mut this = Self::former(); + + this = if let Some( v ) = value.get_owned( "dry" ) { this.dry::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "temp" ) { this.temp::< bool >( v ) } else { this }; + + Ok( this.form() ) + } + } +} + +// + +crate::mod_interface! +{ + /// List packages. + orphan use publish; +} diff --git a/module/move/willbe/src/command/publish_diff.rs b/module/move/willbe/src/command/publish_diff.rs new file mode 100644 index 0000000000..961ba818c4 --- /dev/null +++ b/module/move/willbe/src/command/publish_diff.rs @@ -0,0 +1,70 @@ +mod private +{ + use crate::*; + + use std::path::PathBuf; + use wca::VerifiedCommand; + + use wtools::error::Result; + use _path::AbsolutePath; + + #[ derive( former::Former ) ] + struct PublishDiffProperties + { + keep_archive : Option< PathBuf >, + } + + /// Command to display the differences between a local and remote package versions. + /// + /// # Arguments + /// + /// * `args` - Command line arguments. + /// + /// # Returns + /// + /// Returns a `Result` indicating success or failure. + /// + /// # Errors + /// + /// Returns an error if there is an issue with the command. + pub fn publish_diff( o : VerifiedCommand ) -> Result< () > + { + let path : PathBuf = o.args.get_owned( 0 ).unwrap_or( std::env::current_dir()? ); + let PublishDiffProperties { keep_archive } = o.props.try_into()?; + + let mut o = action::PublishDiffOptions::former() + .path( path ); + if let Some( k ) = keep_archive.clone() { o = o.keep_archive( k ); } + let o = o.form(); + + println!( "{}", action::publish_diff( o )? ); + if let Some( keep ) = keep_archive + { + let keep = AbsolutePath::try_from( keep ).unwrap(); + println!( "Remote version of the package was saved at `{}`", keep.as_ref().display() ); + } + + Ok( () ) + } + + impl TryFrom< wca::Props > for PublishDiffProperties + { + type Error = wtools::error::for_app::Error; + fn try_from( value : wca::Props ) -> Result< Self, Self::Error > + { + let mut this = Self::former(); + + this = if let Some( v ) = value.get_owned( "keep_archive" ) { this.keep_archive::< PathBuf >( v ) } else { this }; + + Ok( this.form() ) + } + } +} + +// + +crate::mod_interface! +{ + /// Publishes the difference between the local and published versions of a package. + orphan use publish_diff; +} diff --git a/module/move/willbe/src/command/readme_headers_renew.rs b/module/move/willbe/src/command/readme_headers_renew.rs new file mode 100644 index 0000000000..d8b4edd5c5 --- /dev/null +++ b/module/move/willbe/src/command/readme_headers_renew.rs @@ -0,0 +1,118 @@ +mod private +{ + use crate::*; + use _path::AbsolutePath; + use action; + use wtools::error::anyhow::Error; + use error_tools::{ Result, err }; + use std::fmt::{ Display, Formatter }; + + #[ derive( Debug, Default ) ] + struct ReadmeHeadersRenewReport + { + main_header_renew_report : action::MainHeaderRenewReport, + main_header_renew_error : Option< Error >, + modules_headers_renew_report : action::ModulesHeadersRenewReport, + modules_headers_renew_error : Option< Error >, + } + + impl Display for ReadmeHeadersRenewReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + match ( &self.main_header_renew_error, &self.modules_headers_renew_error ) + { + ( Some( main ), Some( modules ) ) => + { + writeln! + ( + f, + "Main header renew report : \n{}\nError : \n{:?}\nModules headers renew report : \n{}\nError : \n{:?}", + self.main_header_renew_report, main, self.modules_headers_renew_report, modules + )?; + } + ( Some( main ), None ) => + { + writeln! + ( + f, + "Main header renew report : \n{}\nError : \n{:?}\nModules headers renew report : \n{}", + self.main_header_renew_report, main, self.modules_headers_renew_report + )?; + } + ( None, Some( modules) ) => + { + writeln! + ( + f, + "Main header renew report : \n{}\nModules headers renew report : \n{}\nError : \n{:?}\n", + self.main_header_renew_report, self.modules_headers_renew_report, modules + )?; + } + ( None, None ) => + { + writeln! + ( + f, + "Main header renew report : \n{}\n\nModules headers renew report : \n{}", + self.main_header_renew_report, self.modules_headers_renew_report + )?; + } + } + Ok( () ) + } + } + + + /// Aggregates two commands: `generate_modules_headers` & `generate_main_header` + pub fn readme_headers_renew() -> Result< () > + { + let mut report = ReadmeHeadersRenewReport::default(); + let absolute_path = AbsolutePath::try_from( std::env::current_dir()? )?; + let mut fail = false; + + match action::readme_header_renew( absolute_path.clone() ) + { + Ok( r ) => + { + report.main_header_renew_report = r; + } + Err( ( r, error ) ) => + { + fail = true; + report.main_header_renew_report = r; + report.main_header_renew_error = Some( Error::from( error ) ); + } + }; + match action::readme_modules_headers_renew( absolute_path ) + { + Ok( r ) => + { + report.modules_headers_renew_report = r; + } + Err( ( r, error ) ) => + { + fail = true; + report.modules_headers_renew_report = r; + report.modules_headers_renew_error = Some( Error::from( error ) ); + } + } + + if fail + { + eprintln!( "{report}" ); + Err( err!( "Something went wrong" ) ) + } + else + { + println!( "{report}" ); + Ok( () ) + } + } +} + +crate::mod_interface! +{ + /// Generate header's. + orphan use readme_headers_renew; +} \ No newline at end of file diff --git a/module/move/willbe/src/command/readme_health_table_renew.rs b/module/move/willbe/src/command/readme_health_table_renew.rs new file mode 100644 index 0000000000..945490062f --- /dev/null +++ b/module/move/willbe/src/command/readme_health_table_renew.rs @@ -0,0 +1,20 @@ +mod private +{ + use crate::*; + + use wtools::error::{ for_app::Context, Result }; + + /// + /// Generate table. + /// + pub fn readme_health_table_renew() -> Result< () > + { + action::readme_health_table_renew( &std::env::current_dir()? ).context( "Fail to create table" ) + } +} + +crate::mod_interface! +{ + /// List packages. + orphan use readme_health_table_renew; +} diff --git a/module/move/willbe/src/command/readme_modules_headers_renew.rs b/module/move/willbe/src/command/readme_modules_headers_renew.rs new file mode 100644 index 0000000000..e959c12365 --- /dev/null +++ b/module/move/willbe/src/command/readme_modules_headers_renew.rs @@ -0,0 +1,31 @@ +mod private +{ + use crate::*; + use _path::AbsolutePath; + use wtools::error::{ for_app::Error, Result }; + + /// Generate headers for workspace members + pub fn readme_modules_headers_renew() -> Result< () > + { + match action::readme_modules_headers_renew( AbsolutePath::try_from( std::env::current_dir()? )? ) + { + Ok( report ) => + { + println!( "{report}" ); + Ok( () ) + } + Err( ( report, e ) ) => + { + eprintln!( "{report}" ); + Err( Error::from( e ).context( "Fail to generate modules headers." ) ) + } + } + } + +} + +crate::mod_interface! +{ + /// List packages. + orphan use readme_modules_headers_renew; +} \ No newline at end of file diff --git a/module/move/willbe/src/command/test.rs b/module/move/willbe/src/command/test.rs new file mode 100644 index 0000000000..25019344fb --- /dev/null +++ b/module/move/willbe/src/command/test.rs @@ -0,0 +1,162 @@ +/// Internal namespace. +mod private +{ + use crate::*; + + use std::collections::HashSet; + use std::path::PathBuf; + use colored::Colorize; + use wca::VerifiedCommand; + use wtools::error::Result; + use _path::AbsolutePath; + use action::test::TestsCommandOptions; + use former::Former; + use channel::Channel; + use error_tools::for_app::bail; + use optimization::Optimization; + + #[ derive( Former, Debug ) ] + struct TestsProperties + { + #[ former( default = true ) ] + dry : bool, + #[ former( default = true ) ] + with_stable : bool, + #[ former( default = false ) ] + with_nightly : bool, + #[ former( default = 0u32 ) ] + concurrent : u32, + #[ former( default = 1u32 ) ] + power : u32, + include : Vec< String >, + #[ former( default = [ "full".to_string(), "default".to_string() ] ) ] + exclude : Vec< String >, + #[ former( default = true ) ] + temp : bool, + enabled_features : Vec< String >, + #[ former( default = true ) ] + with_all_features : bool, + #[ former( default = true ) ] + with_none_features : bool, + #[ former( default = true ) ] + with_debug : bool, + #[ former( default = false ) ] + with_release : bool, + #[ former( default = true ) ] + with_progress : bool, + } + + /// run tests in specified crate + pub fn test( o : VerifiedCommand ) -> Result< () > + { + let args_line = format!( "{}", o.args.get_owned( 0 ).unwrap_or( std::path::PathBuf::from( "" ) ).display() ); + let prop_line = format!( "{}", o.props.iter().map( | p | format!( "{}:{}", p.0, p.1.to_string() ) ).collect::< Vec< _ > >().join(" ") ); + + let path : PathBuf = o.args.get_owned( 0 ).unwrap_or_else( || "./".into() ); + let path = AbsolutePath::try_from( path )?; + let TestsProperties + { + dry, + with_stable, + with_nightly, + concurrent, + power, + include, + exclude, + temp, + enabled_features, + with_all_features, + with_none_features, + with_debug, + with_release, + with_progress + } = o.props.try_into()?; + + let mut channels = HashSet::new(); + if with_stable { channels.insert( Channel::Stable ); } + if with_nightly { channels.insert( Channel::Nightly ); } + + let mut optimizations = HashSet::new(); + if with_release { optimizations.insert( Optimization::Release ); } + if with_debug { optimizations.insert( Optimization::Debug ); } + + if optimizations.is_empty() + { + bail!( "Cannot run tests if with_debug and with_release are both false. Set at least one of them to true." ); + } + + + let args = TestsCommandOptions::former() + .dir( path ) + .concurrent( concurrent ) + .channels( channels ) + .power( power ) + .exclude_features( exclude ) + .include_features( include ) + .temp( temp ) + .enabled_features( enabled_features ) + .with_all_features( with_all_features ) + .with_none_features( with_none_features ) + .optimizations( optimizations ) + .with_progress( with_progress ) + .form(); + + match action::test( args, dry ) + { + + Ok( report ) => + { + if dry + { + let args = if args_line.is_empty() { String::new() } else { format!(" {}", args_line) }; + let prop = if prop_line.is_empty() { String::new() } else { format!(" {}", prop_line) }; + let line = format!("will .publish{}{} dry:0", args, prop); + println!("To apply plan, call the command `{}`", line.blue()); + } + else + { + println!( "{report} "); + } + + Ok( () ) + } + Err( ( report, e ) ) => + { + eprintln!( "{report}" ); + Err( e.context( "package test command" ) ) + } + } + } + + impl TryFrom< wca::Props > for TestsProperties + { + type Error = wtools::error::for_app::Error; + fn try_from( value : wca::Props ) -> Result< Self, Self::Error > + { + let mut this = Self::former(); + + this = if let Some( v ) = value.get_owned( "dry" ) { this.dry::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "temp" ) { this.temp::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_stable" ) { this.with_stable::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_nightly" ) { this.with_nightly::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "concurrent" ) { this.concurrent::< u32 >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "power" ) { this.power::< u32 >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "include" ) { this.include::< Vec< String > >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "exclude" ) { this.exclude::< Vec< String > >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_debug" ) { this.with_debug::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_release" ) { this.with_release::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_all_features" ) { this.with_all_features::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_none_features" ) { this.with_none_features::< bool >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "always" ) { this.enabled_features::< Vec< String > >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "with_progress" ) { this.with_progress::< bool >( v ) } else { this }; + + Ok( this.form() ) + } + } +} + +crate::mod_interface! +{ + /// run tests in specified crate + exposed use test; +} \ No newline at end of file diff --git a/module/move/willbe/src/command/workspace_renew.rs b/module/move/willbe/src/command/workspace_renew.rs new file mode 100644 index 0000000000..26cc520bf4 --- /dev/null +++ b/module/move/willbe/src/command/workspace_renew.rs @@ -0,0 +1,49 @@ +mod private +{ + use crate::*; + use former::Former; + + use wca::VerifiedCommand; + use wtools::error::{ anyhow::Context, Result }; + use action::WorkspaceTemplate; + + #[ derive( Former ) ] + struct WorkspaceNewProperties + { + repository_url : String, + branches : Vec< String >, + } + + /// + /// Create new workspace. + /// + + pub fn workspace_renew( o : VerifiedCommand ) -> Result< () > + { + let WorkspaceNewProperties { repository_url, branches } = o.props.try_into()?; + let template = WorkspaceTemplate::default(); + action::workspace_renew( &std::env::current_dir()?, template, repository_url, branches ).context( "Fail to create workspace" ) + } + + impl TryFrom< wca::Props > for WorkspaceNewProperties + { + type Error = wtools::error::for_app::Error; + + fn try_from( value : wca::Props ) -> std::result::Result< Self, Self::Error > + { + let mut this = Self::former(); + + this = if let Some( v ) = value.get_owned( "repository_url" ) { this.repository_url::< String >( v ) } else { this }; + this = if let Some( v ) = value.get_owned( "branches" ) { this.branches::< Vec< String > >( v ) } else { this }; + + Ok( this.form() ) + } + } +} + +crate::mod_interface! +{ + /// List packages. + exposed use workspace_renew; +} + diff --git a/module/move/willbe/src/description.md b/module/move/willbe/src/description.md new file mode 100644 index 0000000000..3a50a5a8cc --- /dev/null +++ b/module/move/willbe/src/description.md @@ -0,0 +1,25 @@ +### Project Directory Structure + +Below is a breakdown of the directory structure for the project: + +#### action + +This directory encompasses the logical content of commands, formerly referred to as "action". Here reside the core functionalities and logic related to executing commands within the project. + +#### bin + +Containing binaries, this directory houses executable files or scripts necessary for the functioning of the project. Binaries often include compiled code or scripts that facilitate various operations within the project environment. + +#### command + +The "command" directory serves as the entry point for each command within the project. Here, you'll find the essential scripts or modules that initiate and manage individual commands, directing them through the execution process. + +#### entity + +Within the "entity" directory reside common modules utilized across various actions within the project. These modules encapsulate shared functionalities and data structures integral to the project's operations, promoting modularity and code reuse. + +#### tool + +In the "tool" directory, you'll find modules designed for broader utility beyond the confines of the project itself. These modules may offer functionalities or tools that can be leveraged independently or integrated into other projects beyond the scope of the current endeavor. + +This structured organization enhances clarity, maintainability, and scalability within the project, facilitating efficient development and collaboration among team members. diff --git a/module/move/willbe/src/entity/channel.rs b/module/move/willbe/src/entity/channel.rs new file mode 100644 index 0000000000..e9611212d1 --- /dev/null +++ b/module/move/willbe/src/entity/channel.rs @@ -0,0 +1,74 @@ +mod private +{ + use crate::*; + use std:: + { + fmt::Formatter, + path::Path, + collections::HashSet, + }; + use std::ffi::OsString; + use error_tools::for_app::Error; + use wtools::error::Result; + use process_tools::process::*; + + /// The `Channel` enum represents different release channels for rust. + #[ derive( Debug, Default, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd ) ] + pub enum Channel + { + /// Represents the stable release channel. + #[ default ] + Stable, + /// Represents the nightly release channel. + Nightly, + } + + impl std::fmt::Display for Channel + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + match self + { + Self::Stable => write!( f, "stable" ), + Self::Nightly => write!( f, "nightly" ), + } + } + } + + /// Retrieves a list of available channels. + /// + /// This function takes a path and returns a `Result` with a vector of strings representing the available channels. + pub fn available_channels< P >( path : P ) -> Result< HashSet< Channel > > + where + P : AsRef< Path >, + { + let ( program, options ) = ( "rustup", [ "toolchain", "list" ] ); + let report = Run::former() + .bin_path( program ) + .args( options.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( path.as_ref().to_path_buf() ) + .run().map_err::< Error, _ >( | report | err!( report.to_string() ) )?; + + let list = report + .out + .lines() + .map( | l | l.split_once( '-' ).unwrap().0 ) + .filter_map( | c | match c + { + "stable" => Some( Channel::Stable ), + "nightly" => Some( Channel::Nightly ), + _ => None + } ) + .collect(); + + Ok( list ) + } +} + +// + +crate::mod_interface! +{ + protected use Channel; + protected use available_channels; +} diff --git a/module/move/willbe/src/entity/diff.rs b/module/move/willbe/src/entity/diff.rs new file mode 100644 index 0000000000..49ef63b29a --- /dev/null +++ b/module/move/willbe/src/entity/diff.rs @@ -0,0 +1,226 @@ +mod private +{ + use crate::*; + + use std:: + { + collections::HashSet, + fmt::Formatter, + path::PathBuf, + }; + use std::collections::HashMap; + use colored::Colorize; + use crates_tools::CrateArchive; + use similar::*; + + use wtools::iter::Itertools; + + /// These files are ignored because they can be safely changed without affecting functionality + /// + /// - `.cargo_vcs_info.json` - contains the git sha1 hash that varies between different commits + /// - `Cargo.toml` - can be safely modified because it is used to generate the `Cargo.toml` file automatically, and the `Cargo.toml` file is sufficient to check for changes + /// - `Cargo.lock` - this file is generated automatically by Cargo. It contains the exact versions of dependencies that your project is using. Changes in this file do not affect the functionality + pub const PUBLISH_IGNORE_LIST : [ &str; 3 ] = [ ".cargo_vcs_info.json", "Cargo.toml", "Cargo.lock" ]; + + + /// The `Diff` enum is designed to represent differences between two versions + /// of some kind of item identified. + #[ derive( Debug, Clone ) ] + pub enum Diff< T > + { + /// This variant represents items that are identical or same in both versions. + Same( T ), + /// This variant represents items that were added. + Add( T ), + /// This variant represents items that were removed. + Rem( T ), + } + + /// The `DiffItem` enum is designed to represent differences between two versions + /// of an item. It contains two variants `File` and `Content`. + #[ derive( Debug, Clone ) ] + pub enum DiffItem + { + /// - `File(Diff<()>)`: Represents differences in the file itself. The `Diff` enum + /// contains three possible variants `Same`, `Add`, and `Rem`. Each variant of `Diff` + /// represents the status of the file. + /// - `Same(())`: Represents that the file is identical or the same in both versions. + /// - `Add(())`: Represents that the file was added in the new version. + /// - `Rem(())`: Represents that the file was removed in the new version. + File( Diff< () > ), + /// - `Content(Vec>): Represents differences in the content of the item. + /// The `Diff` enum inside `Vec` represents differences in strings present in the file. + /// The `Diff` enum contains three possible variants `Same`, `Add`, and `Rem`. Each variant + /// of `Diff` represents the status of the string. + /// - `Same(String)`: Represents that the string is identical or the same in both versions. + /// - `Add(String)`: Represents that the string was added in the new version. + /// - `Rem(String)`: Represents that the string was removed in the new version. + Content( Vec< Diff< String > > ), + } + + /// The `DiffReport` struct represents a diff report containing a list of `Diff` objects. + #[ derive( Debug, Default, Clone ) ] + pub struct DiffReport( pub( crate ) HashMap< PathBuf, DiffItem > ); + + impl DiffReport + { + /// Excludes specified items from a report. + /// + /// # Arguments + /// + /// * `items` - A collection of items to exclude. This can be any type that can be converted into a `HashSet` of `PathBuf` objects. + /// + /// # Returns + /// + /// Returns a new instance of the struct with the excluded items removed from the internal report. + pub fn exclude< Is, I >( mut self, items : Is ) -> Self + where + Is : Into< HashSet< I > >, + I : AsRef< std::path::Path >, + { + let current = self.0.keys().cloned().collect::< HashSet< _ > >(); + let Some( key ) = current.iter().next() else { return self }; + + let crate_part = std::path::Path::new( key.components().next().unwrap().as_os_str() ); + let excluded_paths = items.into().into_iter().map( | i | crate_part.join( i ) ).collect(); + + let map = current.difference( &excluded_paths ).filter_map( | key | self.0.remove_entry( key ) ).collect(); + + Self( map ) + } + + /// Checks if there are any changes in the DiffItems. + /// + /// # Returns + /// * `true` if there are changes in any of the DiffItems. + /// * `false` if all DiffItems are the same. + pub fn has_changes( &self ) -> bool + { + !self.0.iter().all( |( _, item )| matches!( item, DiffItem::File( Diff::Same( () ) ) )) + } + } + + impl std::fmt::Display for DiffReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + for ( path , diff ) in self.0.iter().sorted_by_key( |( k, _ )| k.as_path() ) + { + match diff + { + DiffItem::File( item ) => + { + match item + { + Diff::Same( _ ) => writeln!( f, " {}", path.display() )?, + Diff::Add( _ ) => writeln!( f, "+ {} NEW", path.to_string_lossy().green() )?, + Diff::Rem( _ ) => writeln!( f, "- {} REMOVED", path.to_string_lossy().red() )?, + }; + } + DiffItem::Content( items ) => + { + let path = path.to_string_lossy(); + let len = path.len() + "~ MODIFIED".len(); + writeln!( f, "~ {} MODIFIED", path.yellow() )?; + writeln!( f, "{}", "=".repeat( len + 2 ) )?; + for item in items + { + match item + { + Diff::Same( t ) => write!( f, "| {}", t )?, + Diff::Add( t ) => write!( f, "| + {}", t.green() )?, + Diff::Rem( t ) => write!( f, "| - {}", t.red() )?, + }; + } + writeln!( f, "{}", "=".repeat( len + 2 ) )?; + } + }; + } + + Ok( () ) + } + } + + /// Creates a differential report between two crate archives. + /// + /// This function compares two crate archives and generates a report (`DiffReport`), + /// indicating the discrepancies between them. + /// + /// # Arguments + /// + /// * `left`: A reference to the first crate archive. + /// Changes that are present here but lacking in 'right' are classified as additions. + /// * `right`: A reference to the second crate archive. + /// Changes not found in 'left' but present in 'right' are classified as removals. + /// + /// # Returns + /// + /// A `DiffReport` struct, representing the unique and shared attributes of the two crate archives. + pub fn crate_diff( left : &CrateArchive, right : &CrateArchive ) -> DiffReport + { + let mut report = DiffReport::default(); + + let local_package_files : HashSet< _ > = left.list().into_iter().collect(); + let remote_package_files : HashSet< _ > = right.list().into_iter().collect(); + + let local_only = local_package_files.difference( &remote_package_files ); + let remote_only = remote_package_files.difference( &local_package_files ); + let both = local_package_files.intersection( &remote_package_files ); + + for &path in local_only + { + report.0.insert( path.to_path_buf(), DiffItem::File( Diff::Add( () ) ) ); + } + + for &path in remote_only + { + report.0.insert( path.to_path_buf(), DiffItem::File( Diff::Rem( () ) ) ); + } + + for &path in both + { + // unwraps are safe because the paths to the files was compared previously + let local = left.content_bytes( path ).unwrap(); + let remote = right.content_bytes( path ).unwrap(); + + if local == remote + { + report.0.insert( path.to_path_buf(), DiffItem::File( Diff::Same( () ) ) ); + } + else + { + let mut items = vec![]; + let local_str = String::from_utf8_lossy( local ); + let remote_str = String::from_utf8_lossy( remote ); + let diff = TextDiff::from_lines( &remote_str, &local_str ); + for hunk in diff.unified_diff().context_radius( 5 ).iter_hunks() + { + for change in hunk.iter_changes() + { + let item = match change.tag() + { + ChangeTag::Delete => Diff::Rem( change.to_string() ), + ChangeTag::Insert => Diff::Add( change.to_string() ), + ChangeTag::Equal => Diff::Same( change.to_string() ), + }; + items.push( item ); + } + } + report.0.insert( path.to_path_buf(), DiffItem::Content( items ) ); + } + } + + report + } +} + +// + +crate::mod_interface! +{ + protected use Diff; + protected use DiffItem; + protected use DiffReport; + protected use crate_diff; + protected use PUBLISH_IGNORE_LIST; +} \ No newline at end of file diff --git a/module/move/willbe/src/entity/features.rs b/module/move/willbe/src/entity/features.rs new file mode 100644 index 0000000000..54f38b2d22 --- /dev/null +++ b/module/move/willbe/src/entity/features.rs @@ -0,0 +1,153 @@ +mod private +{ + use crate::*; + use std::collections::{ BTreeSet, HashSet }; + // aaa : for Petro : don't use cargo_metadata and Package directly, use facade + // aaa : ✅ + use error_tools::for_app::{ bail, Result }; + use wtools::iter::Itertools; + use workspace::WorkspacePackage; + + /// Generates a powerset of the features available in the given `package`, + /// filtered according to specified inclusion and exclusion criteria, + /// and limited by a specified maximum size (`power`). + /// + /// This function is useful for generating combinations of feature sets + /// to test different feature configurations in a Rust package. + /// + /// # Arguments + /// + /// * `package` - A reference to the `Package` struct which contains the features. + /// * `power` - The maximum size of each subset in the powerset. This limits the number of features in any given combination. + /// * `exclude_features` - A slice of feature names to exclude from the powerset. + /// * `include_features` - A slice of feature names to include in the powerset. + /// * `enabled_features` - A slice of features names to always include in each subset of powerset. + /// * `with_all_features` - If it's true - return powerset from one subset which contains all features. + /// * `with_none_features` - If it's true - return powerset from one empty subset. + /// + /// # Returns + /// + /// Returns a `HashSet< BTreeSet< String > >` where each `BTreeSet< String >` is a unique combination of feature names, + /// taking into account the inclusion, exclusion, and size constraints. + /// + /// # Examples + /// + /// ```ignore + /// // Assuming `package` is a valid `Package` instance with features. + /// let power = 2; + /// let exclude_features = vec![ "feature1".to_string() ]; + /// let include_features = vec![ "feature2".to_string() ]; + /// let enable_features = vec![ "feature5".to_string() ]; + /// let feature_combinations = features_powerset( &package, power, &exclude_features, &include_features, enabled_features, false, false ); + /// // Use `feature_combinations` as needed. + /// ``` + + // aaa : for Petro : bad, don't use ignore with need + // aaa : I have to ignore this test because the function accepts &Package as input, and to mock it requires a lot of lines + + pub fn features_powerset + ( + package : &WorkspacePackage, + power : usize, + exclude_features : &[ String ], + include_features : &[ String ], + enabled_features : &[ String ], + with_all_features : bool, + with_none_features : bool, + variants_cap : u32, + ) + -> Result< HashSet< BTreeSet< String > > > + { + let mut features_powerset = HashSet::new(); + + let filtered_features : BTreeSet< _ > = package + .features() + .keys() + .filter( | f | !exclude_features.contains( f ) && (include_features.contains(f) || include_features.is_empty()) ) + .cloned() + .collect(); + + if estimate_with( filtered_features.len(), power, with_all_features, with_none_features, enabled_features, package.features().len() ) > variants_cap as usize + { + bail!( "Feature powerset longer then cap." ) + } + + for subset_size in 0..= std::cmp::min( filtered_features.len(), power ) + { + for combination in filtered_features.iter().combinations( subset_size ) + { + let mut subset : BTreeSet< String > = combination.into_iter().cloned().collect(); + if subset.is_empty() || subset == filtered_features + { + continue + } + subset.extend( enabled_features.iter().cloned() ); + features_powerset.insert( subset ); + } + } + + if with_all_features + { + features_powerset.insert( filtered_features ); + } + + if with_none_features + { + features_powerset.insert( [].into_iter().collect() ); + features_powerset.insert( enabled_features.iter().cloned().collect() ); + } + + Ok( features_powerset ) + } + + /// Calculate estimate for `features_powerset.length` + pub fn estimate_with + ( + n : usize, + power : usize, + with_all_features : bool, + with_none_features : bool, + enabled_features : &[ String ], + total_features : usize + ) + -> usize + { + let mut estimate = 0; + let mut binom = 1; + let power = power.min( n ); + + for k in 0..=power + { + estimate += binom; + binom = binom * ( n - k ) / ( k + 1 ); + } + + if with_all_features { estimate += 1; } + if with_none_features { estimate += 1; } + + if !enabled_features.is_empty() + { + let len = enabled_features.len(); + let combinations = ( 0..=len.min( total_features ) ).map( | k | + { + let mut binom = 1; + for i in 0..k + { + binom = binom * ( len - i ) / ( i + 1 ); + } + binom + }).sum::< usize >(); + estimate += combinations; + } + + estimate + } + +} + +crate::mod_interface! +{ + /// Features + protected use features_powerset; + protected use estimate_with; +} diff --git a/module/move/willbe/src/entity/manifest.rs b/module/move/willbe/src/entity/manifest.rs new file mode 100644 index 0000000000..d167175177 --- /dev/null +++ b/module/move/willbe/src/entity/manifest.rs @@ -0,0 +1,295 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + use std:: + { + io::{ self, Read }, + fs, + path::{ Path, PathBuf }, + }; + use wtools::error:: + { + Result, + thiserror, + for_lib::Error, + for_app::format_err, + }; + use _path::AbsolutePath; + + /// `CrateDirError` enum represents errors when creating a `CrateDir` object. + #[ derive( Debug, Error ) ] + pub enum CrateDirError + { + /// Indicates a validation error with a descriptive message. + #[ error( "Failed to create a `CrateDir` object due to `{0}`" ) ] + Validation( String ), + } + + /// Path to crate directory + #[ derive( Debug, Clone ) ] + pub struct CrateDir( AbsolutePath ); + + impl AsRef< Path > for CrateDir + { + fn as_ref( &self ) -> &Path + { + self.0.as_ref() + } + } + + impl TryFrom< AbsolutePath > for CrateDir + { + // aaa : make better errors + // aaa : use `CrateDirError` for it + type Error = CrateDirError; + + fn try_from( crate_dir_path : AbsolutePath ) -> Result< Self, Self::Error > + { + if !crate_dir_path.as_ref().join( "Cargo.toml" ).exists() + { + return Err( CrateDirError::Validation( "The path is not a crate directory path".into() ) ); + } + + Ok( Self( crate_dir_path ) ) + } + } + + impl TryFrom< PathBuf > for CrateDir + { + type Error = CrateDirError; + + fn try_from( crate_dir_path : PathBuf ) -> Result< Self, Self::Error > + { + if !crate_dir_path.join( "Cargo.toml" ).exists() + { + return Err( CrateDirError::Validation( "The path is not a crate directory path".into() ) ); + } + + Ok( Self( AbsolutePath::try_from( crate_dir_path ).unwrap() ) ) + } + } + + impl CrateDir + { + /// Returns an absolute path. + pub fn absolute_path( &self ) -> AbsolutePath + { + self.0.clone() + } + } + + + +/// Represents errors related to manifest data processing. + #[ derive( Debug, Error ) ] + pub enum ManifestError + { + /// Manifest data not loaded. + #[ error( "Manifest data not loaded." ) ] + EmptyManifestData, + /// Cannot find the specified tag in the TOML file. + #[ error( "Cannot find tag {0} in toml file." ) ] + CannotFindValue( String ), + /// Try to read or write + #[ error( "Io operation with manifest failed. Details : {0}" ) ] + Io( #[ from ] io::Error ), + /// It was expected to be a package, but it wasn't + #[ error( "Is not a package" ) ] + NotAPackage, + /// It was expected to be a package, but it wasn't + #[ error( "Invalid value `{0}` in manifest file." ) ] + InvalidValue( String ), + } + + /// + /// Hold manifest data. + /// + #[ derive( Debug, Clone ) ] + pub struct Manifest + { + /// Path to `Cargo.toml` + pub manifest_path : AbsolutePath, + /// Strict type of `Cargo.toml` manifest. + pub manifest_data : Option< toml_edit::Document >, + } + + impl TryFrom< AbsolutePath > for Manifest + { + // aaa : make better errors + // aaa : return `ManifestError` + type Error = ManifestError; + + fn try_from( manifest_path : AbsolutePath ) -> Result< Self, Self::Error > + { + if !manifest_path.as_ref().ends_with( "Cargo.toml" ) + { + let err = io::Error::new( io::ErrorKind::NotFound, "Cannot find manifest" ); + return Err( ManifestError::Io( err ) ); + } + + Ok + ( + Manifest + { + manifest_path, + manifest_data : None, + } + ) + } + } + + impl From< CrateDir > for Manifest + { + fn from( value : CrateDir ) -> Self + { + Self + { + manifest_path : value.0.join( "Cargo.toml" ), + manifest_data : None, + } + } + } + + impl Manifest + { + /// Returns a mutable reference to the TOML document. + /// + /// If the TOML document has not been loaded yet, this function will load it + /// by calling the `load` method. If loading fails, this function will panic. + /// + /// # Returns + /// + /// A mutable reference to the TOML document. + pub fn data( &mut self ) -> &mut toml_edit::Document + { + if self.manifest_data.is_none() { self.load().unwrap() } + + self.manifest_data.as_mut().unwrap() + } + + /// Returns path to `Cargo.toml`. + pub fn manifest_path( &self ) -> &AbsolutePath + { + &self.manifest_path + } + + /// Path to directory where `Cargo.toml` located. + pub fn crate_dir( &self ) -> CrateDir + { + CrateDir( self.manifest_path.parent().unwrap() ) + } + + /// Load manifest from path. + pub fn load( &mut self ) -> Result< (), ManifestError > + { + let read = fs::read_to_string( &self.manifest_path )?; + let result = read.parse::< toml_edit::Document >().map_err( | e | io::Error::new( io::ErrorKind::InvalidData, e ) )?; + self.manifest_data = Some( result ); + + Ok( () ) + } + + // aaa : for Bohdan : don't abuse anyhow + // aaa : return `io` error + /// Store manifest. + pub fn store( &self ) -> io::Result< () > + { + // If the `manifest_data` doesn't contain any data, then there's no point in attempting to write + if let Some( data ) = &self.manifest_data + { + fs::write( &self.manifest_path, data.to_string() )?; + } + + Ok( () ) + } + + /// Check that the current manifest is the manifest of the package (can also be a virtual workspace). + pub fn package_is( &self ) -> Result< bool, ManifestError> + { + let data = self.manifest_data.as_ref().ok_or_else( || ManifestError::EmptyManifestData )?; + if data.get( "package" ).is_some() && data[ "package" ].get( "name" ).is_some() + { + return Ok( true ); + } + Ok( false ) + } + + /// Check that module is local. + /// The package is defined as local if the `publish` field is set to `false' or the registers are specified. + pub fn local_is( &self ) -> Result + { + let data = self.manifest_data.as_ref().ok_or_else( || ManifestError::EmptyManifestData )?; + if data.get( "package" ).is_some() && data[ "package" ].get( "name" ).is_some() + { + let remote = data[ "package" ].get( "publish" ).is_none() + || data[ "package" ][ "publish" ].as_bool().ok_or_else( || ManifestError::CannotFindValue( "[package], [publish]".into() ) )?; + return Ok(!remote); + } + Ok(true) + } + } + + /// Create and load manifest by specified path + // aaa : for Bohdan : use newtype, add proper errors handing + // aaa : return `ManifestError` + pub fn open( path : AbsolutePath ) -> Result< Manifest, ManifestError > + { + let mut manifest = if let Ok( dir ) = CrateDir::try_from( path.clone() ) + { + Manifest::from( dir ) + } + else + { + Manifest::try_from( path )? + }; + + manifest.load()?; + + Ok( manifest ) + } + + /// Retrieves the repository URL of a package from its `Cargo.toml` file. + pub fn repo_url( package_path : &Path ) -> Result< String > + { + let path = package_path.join( "Cargo.toml" ); + if path.exists() + { + let mut contents = String::new(); + fs::File::open( path )?.read_to_string( &mut contents )?; + let doc = contents.parse::< toml_edit::Document >()?; + + let repo_url = doc + .get( "package" ) + .and_then( | package | package.get( "repository" ) ) + .and_then( | i | i.as_str() ); + if let Some( repo_url ) = repo_url + { + url::extract_repo_url( repo_url ).ok_or_else( || format_err!( "Fail to extract repository url ") ) + } + else + { + let report = git::ls_remote_url( package_path )?; + url::extract_repo_url( &report.out.trim() ).ok_or_else( || format_err!( "Fail to extract repository url from git remote.") ) + } + } + else + { + Err( format_err!( "No Cargo.toml found" ) ) + } + } + +} + +// + +crate::mod_interface! +{ + exposed use Manifest; + exposed use CrateDir; + orphan use ManifestError; + orphan use CrateDirError; + protected use open; + protected use repo_url; +} diff --git a/module/move/willbe/src/entity/mod.rs b/module/move/willbe/src/entity/mod.rs new file mode 100644 index 0000000000..24342f1c3b --- /dev/null +++ b/module/move/willbe/src/entity/mod.rs @@ -0,0 +1,51 @@ +crate::mod_interface! +{ + + /// Compare two crate archives and create a difference report. + layer diff; + orphan use super::diff; + + /// Operation with features + layer features; + orphan use super::features; + + /// Handles operations related to packed Rust crates + layer packed_crate; + orphan use super::packed_crate; + + /// Facade for `preatytable` crate. + layer table; + orphan use super::table; + + /// Provides a set of functionalities for handling and manipulating packages. + layer packages; + orphan use super::packages; + + /// Offers capabilities for package management, facilitating the handling and organization of packages. + layer package; + orphan use super::package; + + /// It features the ability to interact with workspaces, manage their participants, and other functionalities. + layer workspace; + orphan use super::workspace; + + /// To manipulate manifest data. + layer manifest; + orphan use super::manifest; + + /// Provides an opportunity to work with versions. + layer version; + orphan use super::version; + + /// Operations with tests + layer test; + orphan use super::test; + + /// Rust toolchain channel: stable/nightly. + layer channel; + orphan use super::channel; + + /// Rust build optimization: debug/release + layer optimization; + orphan use super::optimization; +} diff --git a/module/move/willbe/src/entity/optimization.rs b/module/move/willbe/src/entity/optimization.rs new file mode 100644 index 0000000000..a2c1a58241 --- /dev/null +++ b/module/move/willbe/src/entity/optimization.rs @@ -0,0 +1,34 @@ +mod private +{ + use std::fmt::Formatter; + + /// Rust optimization + #[ derive( Debug, Default, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd ) ] + pub enum Optimization + { + /// Debug + #[ default ] + Debug, + /// Release + Release, + } + + // qqq : use derive + impl std::fmt::Display for Optimization + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + match self + { + Optimization::Debug => write!( f, "debug" ), + Optimization::Release => write!( f, "release" ), + } + } + } +} +// qqq : for Petro : why is it here? + +crate::mod_interface! +{ + protected use Optimization; +} diff --git a/module/move/willbe/src/entity/package.rs b/module/move/willbe/src/entity/package.rs new file mode 100644 index 0000000000..9e1f281ebc --- /dev/null +++ b/module/move/willbe/src/entity/package.rs @@ -0,0 +1,975 @@ +mod private +{ + use crate::*; + + use std:: + { + path::Path, + collections::{ HashMap, HashSet }, + }; + use std::fmt::Formatter; + use std::hash::Hash; + use std::path::PathBuf; + + use process_tools::process; + use manifest::{ Manifest, ManifestError }; + use crates_tools::CrateArchive; + + use workspace::Workspace; + use _path::AbsolutePath; + + use wtools:: + { + iter::Itertools, + error:: + { + thiserror, + Result, + for_lib::Error, + for_app::{ format_err, Context }, + } + }; + use action::readme_health_table_renew::Stability; + use former::Former; + use workspace::WorkspacePackage; + use diff::crate_diff; + use version::version_revert; + use error_tools::for_app::Error; + + /// + #[ derive( Debug, Clone ) ] + pub enum Package + { + /// `Cargo.toml` file. + Manifest( Manifest ), + /// Cargo metadata package. + Metadata( WorkspacePackage ), + } + + /// Represents errors related to package handling. + #[ derive( Debug, Error ) ] + pub enum PackageError + { + /// Manifest error. + #[ error( "Manifest error. Reason : {0}." ) ] + Manifest( #[ from ] ManifestError ), + /// Fail to load metadata. + #[ error( "Fail to load metadata." ) ] + Metadata, + /// Fail to load remote package. + #[ error( "Fail to load remote package." ) ] + LoadRemotePackage, + /// Fail to get crate local path. + #[ error( "Fail to get crate local path." ) ] + LocalPath, + /// Fail to read archive + #[ error( "Fail to read archive" ) ] + ReadArchive, + /// Try to identify something as a package. + #[ error( "Not a package" ) ] + NotAPackage, + } + + impl TryFrom< AbsolutePath > for Package + { + // aaa : make better errors + // aaa : return `PackageError` instead of `anohow` message + type Error = PackageError; + + fn try_from( value : AbsolutePath ) -> Result< Self, Self::Error > + { + let manifest = manifest::open( value.clone() )?; + if !manifest.package_is()? + { + return Err( PackageError::NotAPackage ); + } + + Ok( Self::Manifest( manifest ) ) + } + } + + impl TryFrom< CrateDir > for Package + { + type Error = PackageError; + + fn try_from( value : CrateDir ) -> Result< Self, Self::Error > + { + let manifest = manifest::open( value.absolute_path().join( "Cargo.toml" ) )?; + if !manifest.package_is()? + { + return Err( PackageError::NotAPackage ); + } + + Ok( Self::Manifest( manifest ) ) + } + } + + impl TryFrom< Manifest > for Package + { + // aaa : make better errors + // aaa : return `PackageError` instead of `anohow` message + type Error = PackageError; + + fn try_from( value : Manifest ) -> Result< Self, Self::Error > + { + if !value.package_is()? + { + return Err( PackageError::NotAPackage ); + } + + Ok( Self::Manifest( value ) ) + } + } + + impl From< WorkspacePackage > for Package + { + fn from( value : WorkspacePackage ) -> Self + { + Self::Metadata( value ) + } + } + + impl Package + { + /// Path to `Cargo.toml` + pub fn manifest_path( &self ) -> AbsolutePath + { + match self + { + Self::Manifest( manifest ) => manifest.manifest_path.clone(), + Self::Metadata( metadata ) => AbsolutePath::try_from( metadata.manifest_path().as_std_path().to_path_buf() ).unwrap(), + } + } + + /// Path to folder with `Cargo.toml` + pub fn crate_dir( &self ) -> CrateDir + { + match self + { + Self::Manifest( manifest ) => manifest.crate_dir(), + Self::Metadata( metadata ) => + { + let path = metadata.manifest_path().parent().unwrap().as_std_path().to_path_buf(); + let absolute = AbsolutePath::try_from( path ).unwrap(); + + CrateDir::try_from( absolute ).unwrap() + }, + } + } + + /// Package name + pub fn name( &self ) -> Result< String, PackageError > + { + match self + { + Self::Manifest( manifest ) => + { + let data = manifest.manifest_data.as_ref().ok_or_else( || PackageError::Manifest( ManifestError::EmptyManifestData ) )?; + + // Unwrap safely because of the `Package` type guarantee + Ok( data[ "package" ][ "name" ].as_str().unwrap().to_string() ) + } + Self::Metadata( metadata ) => + { + Ok( metadata.name().clone() ) + } + } + } + + /// Package version + pub fn version( &self ) -> Result< String, PackageError > + { + match self + { + Self::Manifest( manifest ) => + { + let data = manifest.manifest_data.as_ref().ok_or_else( || PackageError::Manifest( ManifestError::EmptyManifestData ) )?; + + // Unwrap safely because of the `Package` type guarantee + Ok( data[ "package" ][ "version" ].as_str().unwrap().to_string() ) + } + Self::Metadata( metadata ) => + { + Ok( metadata.version().to_string() ) + } + } + } + + /// Stability + pub fn stability( &self ) -> Result< Stability, PackageError > + { + match self + { + Self::Manifest( manifest ) => + { + let data = manifest.manifest_data.as_ref().ok_or_else( || PackageError::Manifest( ManifestError::EmptyManifestData ) )?; + + // Unwrap safely because of the `Package` type guarantee + Ok( data[ "package" ].get( "metadata" ).and_then( | m | m.get( "stability" ) ).and_then( | s | s.as_str() ).and_then( | s | s.parse::< Stability >().ok() ).unwrap_or( Stability::Experimental) ) + } + Self::Metadata( metadata ) => + { + Ok( metadata.metadata()[ "stability" ].as_str().and_then( | s | s.parse::< Stability >().ok() ).unwrap_or( Stability::Experimental) ) + } + } + } + + /// Repository + pub fn repository( &self ) -> Result< Option< String >, PackageError > + { + match self + { + Self::Manifest( manifest ) => + { + let data = manifest.manifest_data.as_ref().ok_or_else( || PackageError::Manifest( ManifestError::EmptyManifestData ) )?; + + // Unwrap safely because of the `Package` type guarantee + Ok( data[ "package" ].get( "repository" ).and_then( | r | r.as_str() ).map( | r | r.to_string()) ) + } + Self::Metadata( metadata ) => + { + Ok( metadata.repository().cloned() ) + } + } + } + + /// Discord url + pub fn discord_url( &self ) -> Result< Option< String >, PackageError > + { + match self + { + Self::Manifest( manifest ) => + { + let data = manifest.manifest_data.as_ref().ok_or_else( || PackageError::Manifest( ManifestError::EmptyManifestData ) )?; + + Ok( data[ "package" ].get( "metadata" ).and_then( | m | m.get( "discord_url" ) ).and_then( | url | url.as_str() ).map( | r | r.to_string() ) ) + } + Self::Metadata( metadata ) => + { + Ok( metadata.metadata()[ "discord_url" ].as_str().map( | url | url.to_string() ) ) + } + } + } + + /// Check that module is local. + pub fn local_is( &self ) -> Result< bool, ManifestError > + { + match self + { + Self::Manifest( manifest ) => + { + // verify that manifest not empty + manifest.local_is() + } + Self::Metadata( metadata ) => + { + Ok( !( metadata.publish().is_none() || metadata.publish().as_ref().is_some_and( | p | p.is_empty() ) ) ) + } + } + } + + /// Returns the `Manifest` + pub fn manifest( &self ) -> Result< Manifest, PackageError > + { + match self + { + Package::Manifest( manifest ) => Ok( manifest.clone() ), + Package::Metadata( metadata ) => manifest::open + ( + AbsolutePath::try_from( metadata.manifest_path() ).map_err( | _ | PackageError::LocalPath )? + ) + .map_err( | _ | PackageError::Metadata ), + } + } + + /// Returns the `Metadata` + pub fn metadata( &self ) -> Result< WorkspacePackage, PackageError > + { + match self + { + Package::Manifest( manifest ) => + Workspace::with_crate_dir( manifest.crate_dir() ).map_err( | _ | PackageError::Metadata )? + .package_find_by_manifest( &manifest.manifest_path ) + .ok_or_else( || PackageError::Metadata ), + Package::Metadata( metadata ) => Ok( metadata.clone() ), + } + } + } + + #[ derive( Debug, Default, Clone ) ] + pub struct ExtendedGitReport + { + pub add : Option< process::Report >, + pub commit : Option< process::Report >, + pub push : Option< process::Report >, + } + + impl std::fmt::Display for ExtendedGitReport + { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let Self { add, commit, push } = &self; + if let Some( add ) = add { writeln!( f, "{add}" )? } + if let Some( commit ) = commit { writeln!( f, "{commit}" )? } + if let Some( push ) = push { writeln!( f, "{push}" )? } + + Ok( () ) + } + } + + #[ derive( Debug, Clone ) ] + pub struct GitOptions + { + pub git_root : AbsolutePath, + pub items : Vec< AbsolutePath >, + pub message : String, + pub dry : bool, + } + + fn perform_git_commit( o : GitOptions ) -> Result< ExtendedGitReport > + { + let mut report = ExtendedGitReport::default(); + if o.items.is_empty() { return Ok( report ); } + let items = o + .items + .iter() + .map + ( + | item | item.as_ref().strip_prefix( o.git_root.as_ref() ).map( Path::to_string_lossy ) + .with_context( || format!("git_root: {}, item: {}", o.git_root.as_ref().display(), item.as_ref().display() ) ) + ) + .collect::< Result< Vec< _ > > >()?; + let res = git::add( &o.git_root, &items, o.dry ).map_err( | e | format_err!( "{report}\n{e}" ) )?; + report.add = Some( res ); + let res = git::commit( &o.git_root, &o.message, o.dry ).map_err( | e | format_err!( "{report}\n{e}" ) )?; + report.commit = Some( res ); + + Ok( report ) + } + + #[ derive( Debug, Clone ) ] + pub struct PackagePublishInstruction + { + pub package_name : String, + pub pack : cargo::PackOptions, + pub version_bump : version::BumpOptions, + pub git_options : GitOptions, + pub publish : cargo::PublishOptions, + pub dry : bool, + } + + /// Represents a planner for publishing a single package. + #[ derive( Debug, Former ) ] + #[ perform( fn build() -> PackagePublishInstruction ) ] + pub struct PublishSinglePackagePlanner + { + workspace_dir : CrateDir, + package : Package, + base_temp_dir : Option< PathBuf >, + #[ former( default = true ) ] + dry : bool, + } + + impl PublishSinglePackagePlanner + { + fn build( self ) -> PackagePublishInstruction + { + let crate_dir = self.package.crate_dir(); + let workspace_root : AbsolutePath = self.workspace_dir.absolute_path(); + let pack = cargo::PackOptions + { + path : crate_dir.as_ref().into(), + allow_dirty : self.dry, + no_verify : self.dry, + temp_path : self.base_temp_dir.clone(), + dry : self.dry, + }; + let old_version : version::Version = self.package.version().as_ref().unwrap().try_into().unwrap(); + let new_version = old_version.clone().bump(); + // bump the package version in dependents (so far, only workspace) + let dependencies = vec![ CrateDir::try_from( workspace_root.clone() ).unwrap() ]; + let version_bump = version::BumpOptions + { + crate_dir : crate_dir.clone(), + old_version : old_version.clone(), + new_version : new_version.clone(), + dependencies : dependencies.clone(), + dry : self.dry, + }; + let git_options = GitOptions + { + git_root : workspace_root, + items : dependencies.iter().chain([ &crate_dir ]).map( | d | d.absolute_path().join( "Cargo.toml" ) ).collect(), + message : format!( "{}-v{}", self.package.name().unwrap(), new_version ), + dry : self.dry, + }; + let publish = cargo::PublishOptions + { + path : crate_dir.as_ref().into(), + temp_path : self.base_temp_dir.clone(), + retry_count : 2, + dry : self.dry, + }; + + PackagePublishInstruction + { + package_name : self.package.name().unwrap(), + pack, + version_bump, + git_options, + publish, + dry : self.dry, + } + } + } + + /// Performs package publishing based on the given arguments. + /// + /// # Arguments + /// + /// * `args` - The package publishing instructions. + /// + /// # Returns + /// + /// * `Result` - The result of the publishing operation, including information about the publish, version bump, and git operations. + pub fn perform_package_publish( instruction : PackagePublishInstruction ) -> Result< PublishReport, ( PublishReport, Error ) > + { + let mut report = PublishReport::default(); + let PackagePublishInstruction + { + package_name: _, + mut pack, + mut version_bump, + mut git_options, + mut publish, + dry, + } = instruction; + pack.dry = dry; + version_bump.dry = dry; + git_options.dry = dry; + publish.dry = dry; + + report.get_info = Some( cargo::pack( pack ).map_err( | e | ( report.clone(), e ) )? ); + // qqq : redundant field? + report.publish_required = true; + let bump_report = version::version_bump( version_bump ).map_err( | e | ( report.clone(), e ) )?; + report.bump = Some( bump_report.clone() ); + let git_root = git_options.git_root.clone(); + let git = match perform_git_commit( git_options ) + { + Ok( git ) => git, + Err( e ) => + { + version_revert( &bump_report ) + .map_err( | le | + ( + report.clone(), + format_err!( "Base error:\n{}\nRevert error:\n{}", e.to_string().replace( '\n', "\n\t" ), le.to_string().replace( '\n', "\n\t" ) ) + ))?; + return Err(( report, e )); + } + }; + report.add = git.add; + report.commit = git.commit; + report.publish = match cargo::publish( publish ) + { + Ok( publish ) => Some( publish ), + Err( e ) => + { + git::reset( git_root.as_ref(), true, 1, false ) + .map_err( | le | + ( + report.clone(), + format_err!( "Base error:\n{}\nRevert error:\n{}", e.to_string().replace( '\n', "\n\t" ), le.to_string().replace( '\n', "\n\t" ) ) + ))?; + return Err(( report, e )); + } + }; + + let res = git::push( &git_root, dry ).map_err( | e | ( report.clone(), e ) )?; + report.push = Some( res ); + + Ok( report ) + } + + /// `PublishPlan` manages the overall publication process for multiple packages. + /// It organizes the necessary details required for publishing each individual package. + /// This includes the workspace root directory, any temporary directories used during the process, + /// and the set of specific instructions for publishing each package. + #[ derive( Debug, Former, Clone ) ] + pub struct PublishPlan + { + /// `workspace_dir` - This is the root directory of your workspace, containing all the Rust crates + /// that make up your package. It is used to locate the packages within your workspace that are meant + /// to be published. The value here is represented by `CrateDir` which indicates the directory of the crate. + pub workspace_dir : CrateDir, + + /// `base_temp_dir` - This is used for any temporary operations during the publication process, like + /// building the package or any other processes that might require the storage of transient data. It's + /// optional as not all operations will require temporary storage. The type used is `PathBuf` which allows + /// manipulation of the filesystem paths. + pub base_temp_dir : Option< PathBuf >, + + /// `dry` - A boolean value indicating whether to do a dry run. If set to `true`, the application performs + /// a simulated run without making any actual changes. If set to `false`, the operations are actually executed. + /// This property is optional and defaults to `true`. + #[ former( default = true ) ] + pub dry : bool, + + /// Required for tree view only + pub roots : Vec< CrateDir >, + + /// `plans` - This is a vector containing the instructions for publishing each package. Each item + /// in the `plans` vector indicates a `PackagePublishInstruction` set for a single package. It outlines + /// how to build and where to publish the package amongst other instructions. The `#[setter( false )]` + /// attribute indicates that there is no setter method for the `plans` variable and it can only be modified + /// within the struct. + #[ scalar( setter = false ) ] + pub plans : Vec< PackagePublishInstruction >, + } + + impl PublishPlan + { + /// Displays a tree-like structure of crates and their dependencies. + /// + /// # Arguments + /// + /// * `f` - A mutable reference to a `Formatter` used for writing the output. + /// + /// # Errors + /// + /// Returns a `std::fmt::Error` if there is an error writing to the formatter. + pub fn write_as_tree< W >( &self, f : &mut W ) -> std::fmt::Result + where + W : std::fmt::Write + { + let name_bump_report = self + .plans + .iter() + .map( | x | ( &x.package_name, ( x.version_bump.old_version.to_string(), x.version_bump.new_version.to_string() ) ) ) + .collect::< HashMap< _, _ > >(); + for wanted in &self.roots + { + let list = action::list + ( + action::list::ListOptions::former() + .path_to_manifest( wanted.clone() ) + .format( action::list::ListFormat::Tree ) + .dependency_sources([ action::list::DependencySource::Local ]) + .dependency_categories([ action::list::DependencyCategory::Primary ]) + .form() + ) + .map_err( |( _, _e )| std::fmt::Error )?; + let action::list::ListReport::Tree( list ) = list else { unreachable!() }; + + fn callback( name_bump_report : &HashMap< &String, ( String, String ) >, mut r : action::list::ListNodeReport ) -> action::list::ListNodeReport + { + if let Some(( old, new )) = name_bump_report.get( &r.name ) + { + r.version = Some( format!( "({old} -> {new})" ) ); + } + r.normal_dependencies = r.normal_dependencies.into_iter().map( | r | callback( name_bump_report, r ) ).collect(); + r.dev_dependencies = r.dev_dependencies.into_iter().map( | r | callback( name_bump_report, r ) ).collect(); + r.build_dependencies = r.build_dependencies.into_iter().map( | r | callback( name_bump_report, r ) ).collect(); + + r + } + let list = list.into_iter().map( | r | callback( &name_bump_report, r ) ).collect(); + + let list = action::list::ListReport::Tree( list ); + writeln!( f, "{}", list )?; + } + + Ok( () ) + } + + /// Format and display the list of packages and their version bumps in a formatted way. + /// + /// # Arguments + /// + /// - `f`: A mutable reference to a `Formatter` where the output will be written to. + /// + /// # Errors + /// + /// Returns a `std::fmt::Error` if there is an error writing to the formatter. + pub fn write_as_list< W >( &self, f : &mut W ) -> std::fmt::Result + where + W : std::fmt::Write + { + for ( idx, package ) in self.plans.iter().enumerate() + { + let bump = &package.version_bump; + writeln!( f, "[{idx}] {} ({} -> {})", package.package_name, bump.old_version, bump.new_version )?; + } + + Ok( () ) + } + } + + impl PublishPlanFormer + { + pub fn option_base_temp_dir( mut self, path : Option< PathBuf > ) -> Self + { + self.storage.base_temp_dir = path; + self + } + + pub fn package< IntoPackage >( mut self, package : IntoPackage ) -> Self + where + IntoPackage : Into< Package >, + { + let mut plan = PublishSinglePackagePlanner::former(); + if let Some( workspace ) = &self.storage.workspace_dir + { + plan = plan.workspace_dir( workspace.clone() ); + } + if let Some( base_temp_dir ) = &self.storage.base_temp_dir + { + plan = plan.base_temp_dir( base_temp_dir.clone() ); + } + if let Some( dry ) = self.storage.dry + { + plan = plan.dry( dry ); + } + let plan = plan + .package( package ) + .perform(); + let mut plans = self.storage.plans.unwrap_or_default(); + plans.push( plan ); + + self.storage.plans = Some( plans ); + + self + } + + pub fn packages< IntoPackageIter, IntoPackage >( mut self, packages : IntoPackageIter ) -> Self + where + IntoPackageIter : IntoIterator< Item = IntoPackage >, + IntoPackage : Into< Package >, + { + for package in packages + { + self = self.package( package ); + } + + self + } + } + + + /// Perform publishing of multiple packages based on the provided publish plan. + /// + /// # Arguments + /// + /// * `plan` - The publish plan with details of packages to be published. + /// + /// # Returns + /// + /// Returns a `Result` containing a vector of `PublishReport` if successful, else an error. + pub fn perform_packages_publish( plan : PublishPlan ) -> Result< Vec< PublishReport > > + { + let mut report = vec![]; + for package in plan.plans + { + let res = perform_package_publish( package ).map_err( |( current_rep, e )| format_err!( "{}\n{current_rep}\n{e}", report.iter().map( | r | format!( "{r}" ) ).join( "\n" ) ) )?; + report.push( res ); + } + + Ok( report ) + } + + /// Holds information about the publishing process. + #[ derive( Debug, Default, Clone ) ] + pub struct PublishReport + { + /// Retrieves information about the package. + pub get_info : Option< process::Report >, + /// Indicates whether publishing is required for the package. + pub publish_required : bool, + /// Bumps the version of the package. + pub bump : Option< version::ExtendedBumpReport >, + /// Report of adding changes to the Git repository. + pub add : Option< process::Report >, + /// Report of committing changes to the Git repository. + pub commit : Option< process::Report >, + /// Report of pushing changes to the Git repository. + pub push : Option< process::Report >, + /// Report of publishes the package using the `cargo publish` command. + pub publish : Option< process::Report >, + } + + impl std::fmt::Display for PublishReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + let PublishReport + { + get_info, + publish_required, + bump, + add, + commit, + push, + publish, + } = self; + + if get_info.is_none() + { + f.write_str( "Empty report" )?; + return Ok( () ) + } + let info = get_info.as_ref().unwrap(); + write!( f, "{}", info )?; + + if !publish_required + { + f.write_str( "The package has no changes, so no publishing is required" )?; + return Ok( () ) + } + + if let Some( bump ) = bump + { + writeln!( f, "{}", bump )?; + } + if let Some( add ) = add + { + write!( f, "{add}" )?; + } + if let Some( commit ) = commit + { + write!( f, "{commit}" )?; + } + if let Some( push ) = push + { + write!( f, "{push}" )?; + } + if let Some( publish ) = publish + { + write!( f, "{publish}" )?; + } + + Ok( () ) + } + } + + /// Sorting variants for dependencies. + #[ derive( Debug, Copy, Clone ) ] + pub enum DependenciesSort + { + /// List will be topologically sorted. + Topological, + /// List will be unsorted. + Unordered, + } + + #[ derive( Debug, Clone ) ] + /// Args for `local_dependencies` function. + pub struct DependenciesOptions + { + /// With dependencies of dependencies. + pub recursive : bool, + /// With sorting. + pub sort : DependenciesSort, + /// Include dev dependencies. + pub with_dev : bool, + /// Include remote dependencies. + pub with_remote : bool, + } + + impl Default for DependenciesOptions + { + fn default() -> Self + { + Self + { + recursive : true, + sort : DependenciesSort::Unordered, + with_dev : false, + with_remote : false, + } + } + } + + // + + /// Identifier of any crate(local and remote) + #[ derive( Debug, Clone, Hash, Eq, PartialEq ) ] + pub struct CrateId + { + /// TODO : make it private + pub name : String, + /// TODO : make it private + pub path : Option< AbsolutePath >, + } + + impl From< &WorkspacePackage > for CrateId + { + fn from( value : &WorkspacePackage ) -> Self + { + Self + { + name : value.name().clone(), + path : Some( AbsolutePath::try_from( value.manifest_path().parent().unwrap() ).unwrap() ), + } + } + } + + impl From< &workspace::Dependency > for CrateId + { + fn from( value : &workspace::Dependency ) -> Self + { + Self + { + name : value.name().clone(), + path : value.path().clone().map( | path | AbsolutePath::try_from( path ).unwrap() ), + } + } + } + + /// Recursive implementation of the `dependencies` function + pub fn _dependencies + ( + workspace : &mut Workspace, + manifest : &Package, + graph : &mut HashMap< CrateId, HashSet< CrateId > >, + opts : DependenciesOptions + ) -> Result< CrateId > + { + let DependenciesOptions + { + recursive, + sort : _, + with_dev, + with_remote, + } = opts; + if recursive && with_remote { unimplemented!( "`recursive` + `with_remote` options") } + + let manifest_path = &manifest.manifest_path(); + + let package = workspace + .load()? + .package_find_by_manifest( &manifest_path ) + .ok_or( format_err!( "Package not found in the workspace with path : `{}`", manifest_path.as_ref().display() ) )?; + + let deps = package + .dependencies() + .iter() + .filter( | dep | ( with_remote || dep.path().is_some() ) && ( with_dev || dep.kind() != workspace::DependencyKind::Development ) ) + .map( CrateId::from ) + .collect::< HashSet< _ > >(); + + let package = CrateId::from( &package ); + graph.insert( package.clone(), deps.clone() ); + + if recursive + { + for dep in deps + { + if graph.get( &dep ).is_none() + { + // unwrap because `recursive` + `with_remote` not yet implemented + _dependencies( workspace, &dep.path.as_ref().unwrap().join( "Cargo.toml" ).try_into().unwrap(), graph, opts.clone() )?; + } + } + } + + Ok( package ) + } + + /// Returns local dependencies of a specified package by its manifest path from a workspace. + /// + /// # Arguments + /// + /// - `workspace` - holds cached information about the workspace, such as the packages it contains and their dependencies. By passing it as a mutable reference, function can update the cache as needed. + /// - `manifest` - The package manifest file contains metadata about the package such as its name, version, and dependencies. + /// - `opts` - used to specify options or configurations for fetching local dependencies. + /// + /// # Returns + /// + /// If the operation is successful, returns a vector of `PathBuf` objects, where each `PathBuf` represents the path to a local dependency of the specified package. + pub fn dependencies( workspace : &mut Workspace, manifest : &Package, opts : DependenciesOptions ) -> Result< Vec< CrateId > > + { + let mut graph = HashMap::new(); + let root = _dependencies( workspace, manifest, &mut graph, opts.clone() )?; + + let output = match opts.sort + { + DependenciesSort::Unordered => + { + graph + .into_iter() + .flat_map( | ( id, dependency ) | + { + dependency + .into_iter() + .chain( Some( id ) ) + }) + .unique() + .filter( | x | x != &root ) + .collect() + } + DependenciesSort::Topological => + { + graph::toposort( graph::construct( &graph ) ).map_err( | err | format_err!( "{}", err ) )?.into_iter().filter( | x | x != &root ).collect() + }, + }; + + Ok( output ) + } + + // + + /// Determines whether a package needs to be published by comparing `.crate` files from the local and remote package. + /// + /// This function requires the local package to be previously packed. + /// + /// # Returns : + /// - `true` if the package needs to be published. + /// - `false` if there is no need to publish the package. + /// + /// Panics if the manifest is not loaded or local package is not packed. + + pub fn publish_need( package : &Package, path : Option< PathBuf > ) -> Result< bool, PackageError > + { + let name = package.name()?; + let version = package.version()?; + let local_package_path = path + .map( | p | p.join( format!( "package/{0}-{1}.crate", name, version ) ) ) + .unwrap_or( packed_crate::local_path( &name, &version, package.crate_dir() ).map_err( | _ | PackageError::LocalPath )? ); + + // aaa : for Bohdan : bad, properly handle errors + // aaa : return result instead of panic + let local_package = CrateArchive::read( local_package_path ).map_err( | _ | PackageError::ReadArchive )?; + let remote_package = match CrateArchive::download_crates_io( name, version ) + { + Ok( archive ) => archive, + // qqq : fix. we don't have to know about the http status code + Err( ureq::Error::Status( 403, _ ) ) => return Ok( true ), + _ => return Err( PackageError::LoadRemotePackage ), + }; + + Ok( crate_diff( &local_package, &remote_package ).exclude( diff::PUBLISH_IGNORE_LIST ).has_changes() ) + } +} + +// + +crate::mod_interface! +{ + + protected use PublishSinglePackagePlanner; + protected use PublishPlan; + protected use perform_package_publish; + protected use perform_packages_publish; + + protected use PublishReport; + protected use Package; + protected use PackageError; + + protected use publish_need; + + protected use CrateId; + protected use DependenciesSort; + protected use DependenciesOptions; + protected use dependencies; + +} diff --git a/module/move/willbe/src/entity/packages.rs b/module/move/willbe/src/entity/packages.rs new file mode 100644 index 0000000000..5f48b09b3f --- /dev/null +++ b/module/move/willbe/src/entity/packages.rs @@ -0,0 +1,109 @@ +mod private +{ + use crate::*; + use std:: + { + fmt::Formatter, + collections::{ HashMap, HashSet }, + }; + use workspace::WorkspacePackage; + use crate::workspace::Dependency; + + /// Type aliasing for String + pub type PackageName = String; + + /// A configuration struct for specifying optional filters when using the + /// `filter` function. It allows users to provide custom filtering + /// functions for packages and dependencies. + #[ derive( Default ) ] + pub struct FilterMapOptions + { + /// An optional package filtering function. If provided, this function is + /// applied to each package, and only packages that satisfy the condition + /// are included in the final result. If not provided, a default filter that + /// accepts all packages is used. + pub package_filter : Option< Box< dyn Fn( &WorkspacePackage ) -> bool > >, + + /// An optional dependency filtering function. If provided, this function + /// is applied to each dependency of each package, and only dependencies + /// that satisfy the condition are included in the final result. If not + /// provided, a default filter that accepts all dependencies is used. + pub dependency_filter : Option< Box< dyn Fn( &WorkspacePackage, &Dependency ) -> bool > >, + } + + impl std::fmt::Debug for FilterMapOptions + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + f + .debug_struct( "FilterMapOptions" ) + .field( "package_filter", &"package_filter" ) + .field( "dependency_filter", &"dependency_filter" ) + .finish() + } + } + + /// Provides a means to filter both packages and dependencies of an existing package metadata set. + /// + /// # Arguments + /// + /// * `packages` - A slice of `PackageMetadata` instances presenting the original set of packages. + /// + /// * `options` - An instance of `FilterMapOptions` which includes a package filter + /// and a dependency filter, both optional. If these filters are not provided (`None`), then + /// all packages and their dependencies are accepted (`true`). + /// + /// # Returns + /// + /// This function returns a `HashMap` where : + /// + /// * The key is `PackageName`, referring to the name of each package. + /// + /// * The value is `HashSet< PackageName >`, representing a unique collection of names of its dependencies. + /// + /// # Filters + /// + /// * `package_filter`: When specified, it will be used to decide whether each incoming given + /// package should be included in the return. If this filter is not provided, all packages will be + /// included. + /// + /// * `dependency_filter`: When specified, it's used with each package and its dependencies to decide + /// which dependencies should be included in the return for that package. If not provided, all + /// dependencies for a package are included. + + // qqq : for Bohdan : for Petro : bad. don't use PackageMetadata directly, use its abstraction only! + + pub fn filter( packages : &[ WorkspacePackage ], options : FilterMapOptions ) -> HashMap< PackageName, HashSet< PackageName > > + { + let FilterMapOptions { package_filter, dependency_filter } = options; + let package_filter = package_filter.unwrap_or_else( || Box::new( | _ | true ) ); + let dependency_filter = dependency_filter.unwrap_or_else( || Box::new( | _, _ | true ) ); + packages + .iter() + .filter( | &p | package_filter( p ) ) + .map + ( + | package | + ( + package.name().clone(), + package.dependencies() + .iter() + .filter( | &d | dependency_filter( package, d ) ) + .map( | d | d.name().clone() ) + .collect::< HashSet< _ > >() + ) + ) + .collect() + } +} + +// + +crate::mod_interface! +{ + + protected use PackageName; + protected use FilterMapOptions; + protected use filter; + +} diff --git a/module/move/willbe/src/entity/packed_crate.rs b/module/move/willbe/src/entity/packed_crate.rs new file mode 100644 index 0000000000..9bf462d782 --- /dev/null +++ b/module/move/willbe/src/entity/packed_crate.rs @@ -0,0 +1,73 @@ +mod private +{ + use crate::*; + + use std:: + { + io::Read, + fmt::Write, + time::Duration, + path::PathBuf, + }; + use wtools::error::{ for_app::Context, Result }; + use ureq::Agent; + + /// Returns the local path of a packed `.crate` file based on its name, version, and manifest path. + /// + /// # Args : + /// - `name` - the name of the package. + /// - `version` - the version of the package. + /// - `manifest_path` - path to the package `Cargo.toml` file. + /// + /// # Returns : + /// The local packed `.crate` file of the package + pub fn local_path< 'a >( name : &'a str, version : &'a str, crate_dir : CrateDir ) -> Result< PathBuf > + { + let buf = format!( "package/{0}-{1}.crate", name, version ); + + let workspace = Workspace::with_crate_dir( crate_dir )?; + + let mut local_package_path = PathBuf::new(); + local_package_path.push( workspace.target_directory()? ); + local_package_path.push( buf ); + + Ok( local_package_path ) + } + + /// + /// Get data of remote package from crates.io. + /// + pub fn download< 'a >( name : &'a str, version : &'a str ) -> Result< Vec< u8 > > + { + let agent : Agent = ureq::AgentBuilder::new() + .timeout_read( Duration::from_secs( 5 ) ) + .timeout_write( Duration::from_secs( 5 ) ) + .build(); + let mut buf = String::new(); + write!( &mut buf, "https://static.crates.io/crates/{0}/{0}-{1}.crate", name, version )?; + + let resp = agent.get( &buf[ .. ] ).call().context( "Get data of remote package" )?; + + let len : usize = resp.header( "Content-Length" ) + .unwrap() + .parse()?; + + let mut bytes : Vec< u8 > = Vec::with_capacity( len ); + resp.into_reader() + .take( u64::MAX ) + .read_to_end( &mut bytes )?; + + Ok( bytes ) + } + +} + +// + +crate::mod_interface! +{ + + protected use local_path; + protected use download; + +} diff --git a/module/move/willbe/src/entity/table.rs b/module/move/willbe/src/entity/table.rs new file mode 100644 index 0000000000..564c1f6d43 --- /dev/null +++ b/module/move/willbe/src/entity/table.rs @@ -0,0 +1,109 @@ +mod private +{ + use std::fmt::{Display, Formatter}; + + /// An owned printable table. + #[ derive( Debug ) ] + pub struct Table + { + inner : prettytable::Table, + } + + impl Display for Table + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + writeln!( f, "{}", self.inner.to_string() ) + } + } + + impl Table + { + /// Create an empty table. + pub fn new() -> Self + { + Self + { + inner : prettytable::Table::new(), + } + } + } + + impl Table + { + /// Set the optional header. + pub fn set_header(&mut self, row : Row ) + { + self.inner.set_titles( row.inner ); + } + + /// Append a row in the table. + pub fn add_row(&mut self, row : Row ) + { + self.inner.add_row( row.inner ); + } + } + + impl Default for Table + { + fn default() -> Self + { + let mut table = Self::new(); + let format = default_format(); + table.inner.set_format( format ); + table + } + } + + fn default_format() -> prettytable::format::TableFormat + { + let format = prettytable::format::FormatBuilder::new() + .column_separator( ' ' ) + .borders( ' ' ) + .separators + ( + &[ prettytable::format::LinePosition::Title ], + prettytable::format::LineSeparator::new( '-', '+', '+', '+' ) + ) + .padding( 1, 1 ) + .build(); + format + } + + /// Represent a table row made of cells. + #[ derive( Debug ) ] + pub struct Row + { + inner : prettytable::Row, + } + + impl Row + { + + /// Append a cell at the end of the row. + pub fn add_cell( &mut self, title : &str ) + { + let mut cell = prettytable::Cell::new( title ); + cell.align( prettytable::format::Alignment::CENTER ); + self.inner.add_cell( prettytable::Cell::new( title ) ); + } + } + + impl Row + { + /// Create an row of length size, with empty strings stored. + pub fn new() -> Self + { + Self + { + inner : prettytable::Row::empty(), + } + } + } +} + +crate::mod_interface! +{ + protected use Table; + protected use Row; +} \ No newline at end of file diff --git a/module/move/willbe/src/entity/test.rs b/module/move/willbe/src/entity/test.rs new file mode 100644 index 0000000000..b8298d7f4e --- /dev/null +++ b/module/move/willbe/src/entity/test.rs @@ -0,0 +1,839 @@ +mod private +{ + + // qqq : for Petro : use https://github.com/console-rs/indicatif + + use crate::*; + use table::*; + use std:: + { + collections::{ BTreeMap, BTreeSet, HashSet }, + fmt::Formatter, + sync::{ Arc, Mutex }, + path::Path, + }; + use std::collections::HashMap; + use std::ffi::OsString; + use std::fmt::{ Debug, Display }; /* qqq : import only fmt here and everywhere */ + use std::marker::PhantomData; + use std::path::PathBuf; + // aaa : for Petro : don't use cargo_metadata directly, use facade + // aaa : ✅ + use colored::Colorize; + // qqq : for Petro : don't do micro imports + // qqq : for Petro : don't do micro imports + #[ cfg( feature = "progress_bar" ) ] + use indicatif:: + { + MultiProgress, + ProgressBar, + ProgressStyle + }; + use rayon::ThreadPoolBuilder; + use process_tools::process::*; + use wtools::error::anyhow::{ Error, format_err }; + use wtools::iter::Itertools; + use wtools::error::Result; + use former::Former; + use channel::Channel; + use optimization::Optimization; + use workspace::WorkspacePackage; + + /// Newtype for package name + #[ derive( Debug, Default, Clone ) ] + pub struct PackageName( String ); + + /// Represents a variant for testing purposes. + #[ derive( Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Former ) ] + pub struct TestVariant + { + /// Represents the channel for the test variant. + channel : Channel, + /// Represents the optimization setting for the test variant. + optimization : Optimization, + /// Contains additional features or characteristics of the test variant. + features : BTreeSet< String >, + } + + impl Display for TestVariant + { + fn fmt( &self, f : &mut Formatter< '_ >) -> std::fmt::Result + { + let features = if self.features.is_empty() { " ".to_string() } else { self.features.iter().join( " " ) }; + writeln!( f, "{} {} {}", self.optimization, self.channel, features )?; + Ok( () ) + } + } + + /// Global test plan + #[ derive( Debug ) ] + pub struct TestPlan + { + packages_plan : Vec< TestPackagePlan >, + } + + impl Display for TestPlan + { + fn fmt( &self, f : &mut Formatter< '_ >) -> std::fmt::Result + { + writeln!( f, "Plan: " )?; + for plan in &self.packages_plan + { + writeln!( f, "{plan}" )?; + } + Ok( () ) + } + } + + impl TestPlan + { + /// Create plan from params: + /// `packages` - List of packages which will be tested + /// `channels` - A set of Cargo channels that are to be tested. + /// `power` - An integer value indicating the power or intensity of testing. + /// `include_features` - A vector of strings, each representing a feature to be included during testing. + /// `exclude_features` - A vector of strings, each representing a feature to be excluded during testing. + /// `optimizations` - A set of optimizations (Release & Debug) + /// `enabled_features` - A slice of features names to always include in each subset of powerset. + /// `with_all_features` - If it's true - add to powerset one subset which contains all features. + /// `with_none_features` - If it's true - add to powerset one empty subset. + /// `variants_cap` - Maximum of subset in powerset + pub fn try_from + ( + packages : &[ WorkspacePackage ], + channels : &HashSet< Channel >, + power : u32, + include_features : Vec< String >, + exclude_features : Vec< String >, + optimizations : &HashSet< Optimization >, + enabled_features : Vec< String >, + with_all_features : bool, + with_none_features : bool, + variants_cap : u32, + ) -> Result< Self > + { + let mut packages_plan = vec![]; + for package in packages + { + packages_plan.push + ( + TestPackagePlan::try_from + ( + package, + channels, + power, + include_features.as_slice(), + exclude_features.as_slice(), + optimizations, + enabled_features.as_slice(), with_all_features, with_none_features, variants_cap + )? + ); + } + Ok + ( + Self + { + packages_plan + } + ) + } + } + + #[ derive( Debug ) ] + pub struct TestPackagePlan + { + enabled_features : BTreeSet< String >, + package : PathBuf, + test_variants : BTreeSet< TestVariant >, + } + + impl Display for TestPackagePlan + { + fn fmt( &self, f : &mut Formatter< '_ >) -> std::fmt::Result + { + writeln!( f, "Package : {}\nThe tests will be executed using the following configurations :", self.package.file_name().unwrap().to_string_lossy() )?; + let mut all_features = BTreeSet::new(); + for variant in &self.test_variants + { + let features = variant.features.iter().cloned(); + if features.len() == 0 + { + all_features.extend( [ "[]".to_string() ] ); + } + all_features.extend( features ); + } + let mut ff = Vec::from_iter( self.enabled_features.iter().cloned() ); + for feature in all_features + { + if !ff.contains( &feature ) + { + ff.push( feature ); + } + } + let mut table = Table::default(); + // let format = format(); + // table.set_format( format ); + + let mut header_row = Row::new(); + header_row.add_cell( "Channel" ); + header_row.add_cell( "Opt" ); + + for feature in &ff + { + header_row.add_cell( feature ); + } + table.set_header( header_row ); + + for variant in &self.test_variants + { + let mut row = Row::new(); + + row.add_cell( &variant.channel.to_string() ); + row.add_cell( &variant.optimization.to_string() ); + let counter = 0; + let flag = true; + generate_features_cells(&mut ff, variant, &mut row, counter, flag, &self.enabled_features ); + + table.add_row( row ); + } + // aaa : for Petro : bad, DRY + // aaa : replace with method + writeln!( f, "{}", table )?; + Ok( () ) + } + } + + impl TestPackagePlan + { + /// Create plan from params: + /// `packages` - Package which will be tested + /// `channels` - A set of Cargo channels that are to be tested. + /// `power` - An integer value indicating the power or intensity of testing. + /// `include_features` - A vector of strings, each representing a feature to be included during testing. + /// `exclude_features` - A vector of strings, each representing a feature to be excluded during testing. + /// `optimizations` - A set of optimizations (Release & Debug) + /// `enabled_features` - A slice of features names to always include in each subset of powerset. + /// `with_all_features` - If it's true - add to powerset one subset which contains all features. + /// `with_none_features` - If it's true - add to powerset one empty subset. + /// `variants_cap` - Maximum of subset in powerset + fn try_from + ( + package : &WorkspacePackage, + channels : &HashSet< Channel >, + power : u32, + include_features : &[ String ], + exclude_features : &[ String ], + optimizations : &HashSet< Optimization >, + enabled_features : &[ String ], + with_all_features : bool, + with_none_features : bool, + variants_cap : u32, + ) -> Result< Self > + { + let dir = package.manifest_path().parent().unwrap().as_std_path().to_path_buf(); + let mut test_variants = BTreeSet::new(); + let features_powerset = features::features_powerset + ( + package, + power as usize, + exclude_features, + include_features, + enabled_features, + with_all_features, + with_none_features, + variants_cap, + )?; + for optimization in optimizations + { + for channel in channels + { + for feature in &features_powerset + { + test_variants.insert + ( + TestVariant + { + channel : channel.clone(), + optimization : optimization.clone(), + features : feature.clone(), + } + ); + } + } + } + Ok + ( + Self + { + enabled_features: enabled_features.iter().cloned().collect(), + package : dir, + test_variants, + } + ) + } + } + + fn generate_features_cells( ff : &mut Vec< String >, variant : &TestVariant, row : &mut Row, mut counter : usize, mut flag : bool, enabled_features : &BTreeSet< String > ) + { + for feature in ff + { + let mut c = "+"; + if variant.features.is_empty() && counter == enabled_features.len() && flag + { + flag = false; + row.add_cell( c ); + } + else if variant.features.contains( feature ) + { + row.add_cell( c ); + } + else + { + c = ""; + row.add_cell( c ); + } + counter += 1; + } + } + + #[ derive( Debug, Former ) ] + pub struct PackageTestOptions< 'a > + { + temp_path : Option< PathBuf >, + plan : &'a TestPackagePlan, + dry : bool, + progress_bar_feature : Option< PackageTestOptionsProgressBarFeature< 'a > >, + } + + #[ derive( Debug ) ] + struct PackageTestOptionsProgressBarFeature< 'a > + { + phantom : PhantomData< &'a () >, + #[ cfg( feature = "progress_bar" ) ] + multi_progress : &'a Option< &'a MultiProgress >, + #[ cfg( feature = "progress_bar" ) ] + progress_bar : &'a Option< ProgressBar > + } + + + impl PackageTestOptionsFormer< '_ > + { + pub fn option_temp( mut self, value : impl Into< Option< PathBuf > > ) -> Self + { + self.storage.temp_path = value.into(); + self + } + } + + /// Represents the options for the test. + #[ derive( Debug, Former, Clone ) ] + pub struct SingleTestOptions + { + /// Specifies the release channels for rust. + /// More details : https://rust-lang.github.io/rustup/concepts/channels.html#:~:text=Rust%20is%20released%20to%20three,releases%20are%20made%20every%20night. + channel : Channel, + /// Specifies the optimization for rust. + optimization : Optimization, + /// Determines whether to use default features in the test. + /// Enabled by default. + #[ former( default = true ) ] + with_default_features : bool, + /// Determines whether to use all available features in the test. + /// Disabled by default. + #[ former( default = false ) ] + with_all_features : bool, + /// Specifies a list of features to be enabled in the test. + enable_features : BTreeSet< String >, + /// Temp directory path + temp_directory_path : Option< PathBuf >, + /// A boolean indicating whether to perform a dry run or not. + dry : bool, + /// RUST_BACKTRACE + #[ former( default = true ) ] + backtrace : bool, + } + + impl SingleTestOptions + { + fn as_rustup_args( &self ) -> Vec< String > + { + debug_assert!( !self.with_default_features ); // qqq : remove later + debug_assert!( !self.with_all_features ); // qqq : remove later + [ "run".into(), self.channel.to_string(), "cargo".into(), "test".into() ] + .into_iter() + .chain( if self.optimization == Optimization::Release { Some( "--release".into() ) } else { None } ) + .chain( if self.with_default_features { None } else { Some( "--no-default-features".into() ) } ) + // qqq : for Petro : bad, --no-default-features is always enabled! + .chain( if self.with_all_features { Some( "--all-features".into() ) } else { None } ) + // qqq : for Petro : bad, --all-features is always disabled! + .chain( if self.enable_features.is_empty() { None } else { Some([ "--features".into(), self.enable_features.iter().join( "," ) ]) }.into_iter().flatten() ) + .chain( self.temp_directory_path.clone().map( | p | vec![ "--target-dir".to_string(), p.to_string_lossy().into() ] ).into_iter().flatten() ) + .collect() + } + } + + /// Executes a test command with the given arguments. + /// + /// # Arguments + /// + /// * `path` - The path to the test command. + /// * `options` - The options for the test command. + /// * `dry` - A boolean indicating whether to perform a dry run or not. + /// + /// # Returns + /// + /// Returns a `Result` containing a `Report` if the command is executed successfully, + /// or an error if the command fails to execute. + pub fn _run< P >( path : P, options : SingleTestOptions ) -> Result< Report, Report > + where + P : AsRef< Path > + { + let ( program, args ) = ( "rustup", options.as_rustup_args() ); + // qqq : for Petro : rustup ??? + // aaa : for Petro : RUST_BACKTRACE=1 ?? // add to SingleTestOptions, by default true + // aaa : add + + if options.dry + { + Ok + ( + Report + { + command : format!( "{program} {}", args.join( " " ) ), + out : String::new(), + err : String::new(), + current_path: path.as_ref().to_path_buf(), + error: Ok( () ), + } + ) + } + else + { + let envs = if options.backtrace { [( "RUST_BACKTRACE".to_string(), "full".to_string() )].into_iter().collect() } else { HashMap::new() }; + Run::former() + .bin_path( program ) + .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( path.as_ref().to_path_buf() ) + .joining_streams( true ) + .env_variable( envs ) + .run() + } + } + + /// `TestOptions` is a structure used to store the arguments for tests. + #[ derive( Former ) ] + pub struct TestOptions + { + /// Plan for testing + pub plan : TestPlan, + + /// `concurrent` - A usize value indicating how much test`s can be run at the same time. + pub concurrent : u32, + + /// `temp_path` - path to temp directory. + pub temp_path : Option< PathBuf >, + + /// A boolean indicating whether to perform a dry run or not. + pub dry : bool, + + /// This field contains fields for progress_bar feature + pub feature : Option< TestOptionsProgressBarFeature >, + } + + // qqq : for Petro : remove after Former fix + /// Structure for progress bar feature field + pub struct TestOptionsProgressBarFeature + { + #[ cfg( feature = "progress_bar" ) ] + /// Base progress bar + pub multiprocess : MultiProgress, + + #[ cfg( feature = "progress_bar" ) ] + /// Style for progress bar + pub style : ProgressStyle, + } + + impl Debug for TestOptionsProgressBarFeature + { + fn fmt( &self, f : &mut Formatter< '_ >) -> std::fmt::Result + { + f.debug_struct( "TestOptionsProgressBarFeature" ) + .finish() + } + } + + impl Debug for TestOptions + { + fn fmt( &self, f : &mut Formatter< '_ >) -> std::fmt::Result { + f.debug_struct( "TestOptions" ) + .field( "plan", &self.plan) + .field( "concurrent", &self.concurrent) + .field( "temp_path", &self.temp_path) + .field( "plan", &self.plan) + .finish() + } + } + + impl TestOptionsFormer + { + pub fn option_temp( mut self, value : impl Into< Option< PathBuf > > ) -> Self + { + self.storage.temp_path = value.into(); + self + } + } + + + /// Represents a report of test results. + #[ derive( Debug, Default, Clone ) ] + pub struct TestReport + { + /// A boolean flag indicating whether or not the code is being run in dry mode. + /// + /// Dry mode is a mode in which the code performs a dry run, simulating the execution + /// of certain tasks without actually making any changes. When the `dry` flag is set to + /// `true`, the code will not perform any actual actions, but instead only output the + /// results it would have produced. + /// + /// This flag can be useful for testing and debugging purposes, as well as for situations + /// where it is important to verify the correctness of the actions being performed before + /// actually executing them. + pub dry : bool, + /// A string containing the name of the package being tested. + pub package_name : PackageName, /* aaa : for Petro : bad, reuse newtype / aaa : add newtype*/ + /// A `BTreeMap` where the keys are `channel::Channel` enums representing the channels + /// for which the tests were run, and the values are nested `BTreeMap` where the keys are + /// feature names and the values are `Report` structs representing the test results for + /// the specific feature and channel. + pub tests : BTreeMap< TestVariant, Result< Report, Report > > , + /// Enabled features + pub enabled_features : BTreeSet< String >, + // qqq : for Petro : rid off map of map of map, keep flat map + } + + impl Display for TestReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + if self.dry + { + return Ok( () ) + } + let mut failed = 0; + let mut success = 0; + let mut all_features = BTreeSet::new(); + for variant in self.tests.keys() + { + let features = variant.features.iter().cloned(); + if features.len() == 0 + { + all_features.extend( [ "[]".to_string() ] ); + } + all_features.extend( features ); + } + let mut ff = Vec::from_iter( self.enabled_features.iter().cloned() ); + for feature in all_features + { + if !ff.contains( &feature ) + { + ff.push( feature ); + } + } + let mut table = Table::default(); + let mut header_row = Row::new(); + header_row.add_cell( "Result" ); + header_row.add_cell( "Channel" ); + header_row.add_cell( "Opt" ); + for feature in &ff + { + header_row.add_cell( feature ); + } + table.set_header( header_row ); + + writeln!( f, "{} {}\n", "\n=== Module".bold(), self.package_name.0.bold() )?; + if self.tests.is_empty() + { + writeln!( f, "unlucky" )?; + return Ok( () ); + } + for ( variant, result) in &self.tests + { + let mut row = Row::new(); + let result_text = match result + { + Ok( _ ) => + { + success += 1; + "✅" + }, + Err( report ) => + { + failed += 1; + let mut out = report.out.replace( "\n", "\n " ); + out.push_str( "\n" ); + write!( f, " ⌠> {}\n\n{out}", report.command )?; + "âŒ" + }, + }; + row.add_cell( result_text ); + row.add_cell( &variant.channel.to_string() ); + row.add_cell( &variant.optimization.to_string() ); + let counter = 0; + let flag = true; + generate_features_cells( &mut ff, variant, &mut row, counter, flag, &self.enabled_features ); + + + table.add_row( row ); + } + // aaa : for Petro : bad, DRY + // aaa : replace with method + writeln!( f, "{}", table )?; + writeln!( f, " {}", generate_summary_message( failed, success ) )?; + + Ok( () ) + } + } + + + fn generate_summary_message( failed : i32, success : i32 ) -> String + { + if success == failed + success + { + format!( "✅ All passed {success} / {}", failed + success ) + } + else + { + format!( "⌠Not all passed {success} / {}", failed + success ) + } + } + + /// Represents a vector of reposts + #[ derive( Debug, Default, Clone ) ] + pub struct TestsReport + { + /// A boolean flag indicating whether or not the code is being run in dry mode. + /// + /// Dry mode is a mode in which the code performs a dry run, simulating the execution + /// of certain tasks without actually making any changes. When the `dry` flag is set to + /// `true`, the code will not perform any actual actions, but instead only output the + /// results it would have produced. + /// + /// This flag can be useful for testing and debugging purposes, as well as for situations + /// where it is important to verify the correctness of the actions being performed before + /// actually executing them. + pub dry : bool, + /// Vector of succses reports. + pub success_reports : Vec< TestReport >, + /// Vector of failure reports. + pub failure_reports : Vec< TestReport >, + } + + impl Display for TestsReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + if self.dry + { + writeln!( f, "\nYou can execute the plan with 'will .test dry : 0'." )?; + // qqq : for Petro : bad. should be exact command with exact parameters / при виклику зовнішніх команд повинен бути вивід у конÑоль про цей виклик Ñ– його аргументи за виключеннÑм коли ційлий блок виводу прихований (у моєму випадку при фейлі) + return Ok( () ) + } + if self.success_reports.is_empty() && self.failure_reports.is_empty() + { + writeln!( f, "The tests have not been run." )?; + return Ok( () ); + } + if !self.success_reports.is_empty() + { + writeln!( f, "Successful :" )?; + for report in &self.success_reports + { + writeln!( f, "{}", report )?; + } + } + if !self.failure_reports.is_empty() + { + writeln!( f, "Failure :" )?; + for report in &self.failure_reports + { + writeln!( f, "{}", report )?; + } + } + writeln!( f, "Global report" )?; + writeln!( f, " {}", generate_summary_message( self.failure_reports.len() as i32, self.success_reports.len() as i32 ) )?; + + Ok( () ) + } + } + + /// `tests_run` is a function that runs tests on a given package with specified arguments. + /// It returns a `TestReport` on success, or a `TestReport` and an `Error` on failure. + pub fn run( options : &PackageTestOptions< '_ > ) -> Result< TestReport, ( TestReport, Error ) > + { + let mut report = TestReport::default(); + report.dry = options.dry; + report.enabled_features = options.plan.enabled_features.clone(); + let report = Arc::new( Mutex::new( report ) ); + let dir = options.plan.package.clone(); + + rayon::scope + ( + | s | + { + for variant in &options.plan.test_variants + { + let TestVariant{ channel, optimization, features } = variant; + let r = report.clone(); + let dir = dir.clone(); + s.spawn + ( + move | _ | + { + let mut args_t = SingleTestOptions::former() + .channel( *channel ) + .optimization( *optimization ) + .with_default_features( false ) + .enable_features( features.clone() ) + .dry( options.dry ); + + if let Some( p ) = options.temp_path.clone() + { + let path = p.join( path_tools::path::unique_folder_name().unwrap() ); + // qqq : for Petro : rid off unwrap + std::fs::create_dir_all( &path ).unwrap(); + args_t = args_t.temp_directory_path( path ); + } + #[ cfg( feature = "progress_bar" ) ] + let _s = + { + let s = if let Some( multi_progress ) = options.progress_bar_feature.as_ref().and_then( | f | f.multi_progress.as_ref() ) + { + let s = multi_progress.add( ProgressBar::new_spinner().with_message( format!( "{}", variant ) ) ); + s.enable_steady_tick( std::time::Duration::from_millis( 100 ) ); + Some( s ) + } + else + { + None + }; + // spinner.enable_steady_tick( std::time::Duration::from_millis( 100 ) ); + s + }; + let args = args_t.form(); + let temp_dir = args.temp_directory_path.clone(); + let cmd_rep = _run( dir, args ); + r.lock().unwrap().tests.insert( variant.clone(), cmd_rep ); + #[ cfg( feature = "progress_bar" ) ] + options.progress_bar_feature.as_ref().unwrap().progress_bar.as_ref().map( | b | b.inc( 1 ) ); + if let Some( path ) = temp_dir + { + std::fs::remove_dir_all( path ).unwrap(); + } + } + ); + } + } + ); + + // unpack. all tasks must be completed until now + let report = Mutex::into_inner( Arc::into_inner( report ).unwrap() ).unwrap(); + let at_least_one_failed = report + .tests + .iter() + .any( | ( _, result ) | result.is_err() ); + if at_least_one_failed { Err( ( report, format_err!( "Some tests was failed" ) ) ) } else { Ok( report ) } + } + + /// Run tests for given packages. + pub fn tests_run( args : &TestOptions ) -> Result< TestsReport, ( TestsReport, Error ) > + { + let mut report = TestsReport::default(); + report.dry = args.dry; + let report = Arc::new( Mutex::new( report ) ); + let pool = ThreadPoolBuilder::new().use_current_thread().num_threads( args.concurrent as usize ).build().unwrap(); + pool.scope + ( + | s | + { + for plan in &args.plan.packages_plan + { + let report = report.clone(); + s.spawn + ( + move | _ | + { + #[ cfg( feature = "progress_bar" ) ] + let pb = + { + let pb = if let Some( feature ) = args.feature.as_ref() + { + let pb = feature.multiprocess.add(ProgressBar::new(plan.test_variants.len() as u64)); + pb.set_style( args.feature.as_ref().unwrap().style.clone() ); + pb.inc( 0 ); + Some( pb ) + } + else + { + None + }; + pb + }; + #[ cfg( feature = "progress_bar" ) ] + let multi_progress = args.feature.as_ref().map( | f | &f.multiprocess ); + let test_package_options = PackageTestOptions::former().option_temp( args.temp_path.clone() ).plan( plan ).dry( args.dry ); + #[ cfg( feature = "progress_bar" ) ] + let test_package_options = test_package_options.progress_bar_feature + ( + PackageTestOptionsProgressBarFeature + { + phantom : PhantomData, + multi_progress : &multi_progress, + progress_bar : &pb, + } + ); + let options = test_package_options.form(); + match run( &options ) + { + Ok( r ) => + { + report.lock().unwrap().success_reports.push( r ); + } + Err(( r, _ )) => + { + report.lock().unwrap().failure_reports.push( r ); + } + } + } + ); + } + } + ); + let report = Arc::into_inner( report ).unwrap().into_inner().unwrap(); + if report.failure_reports.is_empty() + { + Ok( report ) + } + else + { + Err(( report, format_err!( "Some tests was failed" ) )) + } + } +} + +crate::mod_interface! +{ + + protected use SingleTestOptions; + protected use TestVariant; + protected use _run; + + protected use TestPlan; + + protected use TestOptions; + protected use TestReport; + protected use TestsReport; + protected use run; + protected use tests_run; + + protected use TestOptionsProgressBarFeature; +} \ No newline at end of file diff --git a/module/move/willbe/src/entity/version.rs b/module/move/willbe/src/entity/version.rs new file mode 100644 index 0000000000..e3900e1d57 --- /dev/null +++ b/module/move/willbe/src/entity/version.rs @@ -0,0 +1,387 @@ +/// Internal namespace. +mod private +{ + use crate::*; + + use std:: + { + fmt, + str::FromStr, + }; + use std::fmt::Formatter; + use toml_edit::value; + use semver::Version as SemVersion; + + use wtools::error::for_app::Result; + use manifest::Manifest; + use _path::AbsolutePath; + use package::Package; + use wtools::{ error::anyhow::format_err, iter::Itertools }; + + /// Wrapper for a SemVer structure + #[ derive( Debug, Clone, Eq, PartialEq, Ord, PartialOrd ) ] + pub struct Version( SemVersion ); + + impl FromStr for Version + { + type Err = semver::Error; + + fn from_str( s : &str ) -> std::result::Result< Self, Self::Err > + { + Ok( Self( SemVersion::from_str( s )? ) ) + } + } + + impl TryFrom< &str > for Version + { + type Error = semver::Error; + + fn try_from( value : &str ) -> Result< Self, Self::Error > + { + FromStr::from_str( value ) + } + } + + impl TryFrom< &String > for Version + { + type Error = semver::Error; + + fn try_from( value : &String ) -> Result< Self, Self::Error > + { + Self::try_from( value.as_str() ) + } + } + + impl fmt::Display for Version + { + fn fmt( &self, f : &mut fmt::Formatter< '_ > ) -> fmt::Result + { + write!( f, "{}", self.0.to_string() ) + } + } + + impl Version + { + /// Bump a version with default strategy + /// + /// This function increases first not 0 number + pub fn bump( self ) -> Self + { + let mut ver = self.0; + // we shouldn't change the major part of a version yet + if ver.minor != 0 || ver.major != 0 + { + ver.minor += 1; + ver.patch = 0; + } + else + { + ver.patch += 1; + } + + Self( ver ) + } + } + + /// A structure that represents a bump report, which contains information about a version bump. + #[ derive( Debug, Default, Clone ) ] + pub struct BumpReport + { + /// Pacakge name. + pub name : Option< String >, + /// Package old version. + pub old_version : Option< String >, + /// Package new version. + pub new_version : Option< String >, + } + + impl fmt::Display for BumpReport + { + fn fmt( &self, f : &mut fmt::Formatter< '_ > ) -> fmt::Result + { + let Self { name, old_version, new_version } = self; + match ( name, old_version, new_version ) + { + ( Some( name ), Some( old_version ), Some( new_version ) ) + => f.write_fmt( format_args!( "`{name}` bumped from {old_version} to {new_version}" ) ), + _ => f.write_fmt( format_args!( "Bump failed" ) ) + } + } + } + + /// Bump version by manifest. + /// It takes data from the manifest and increments the version number according to the semantic versioning scheme. + /// It then writes the updated manifest file back to the same path, unless the flag is set to true, in which case it only returns the new version number as a string. + /// + /// # Args : + /// - `manifest` - a manifest mutable reference + /// - `dry` - a flag that indicates whether to apply the changes or not + /// - `true` - does not modify the manifest file, but only returns the new version; + /// - `false` - overwrites the manifest file with the new version. + /// + /// # Returns : + /// - `Ok` - the new version number as a string; + /// - `Err` - if the manifest file cannot be read, written, parsed. + pub fn bump( manifest : &mut Manifest, dry : bool ) -> Result< BumpReport, manifest::ManifestError > + { + let mut report = BumpReport::default(); + + let version= + { + if manifest.manifest_data.is_none() + { + manifest.load()?; + } + let data = manifest.manifest_data.as_ref().unwrap(); + if !manifest.package_is()? + { + return Err( manifest::ManifestError::NotAPackage ); + } + let package = data.get( "package" ).unwrap(); + + let version = package.get( "version" ); + if version.is_none() + { + return Err( manifest::ManifestError::CannotFindValue( "version".into() ) ); + } + let version = version.unwrap().as_str().unwrap(); + report.name = Some( package[ "name" ].as_str().unwrap().to_string() ); + report.old_version = Some( version.to_string() ); + + Version::from_str( version ).map_err( | e | manifest::ManifestError::InvalidValue( e.to_string() ) )? + }; + + let new_version = version.bump().to_string(); + report.new_version = Some( new_version.clone() ); + + if !dry + { + let data = manifest.manifest_data.as_mut().unwrap(); + data[ "package" ][ "version" ] = value( &new_version ); + manifest.store()?; + } + + Ok( report ) + } + + // qqq : we have to replace the implementation above with the implementation below, don't we? + // qqq : for Bohdan : duplication? + + /// `BumpOptions` manages the details necessary for the version bump process for crates. + /// This includes the directory of the crate whose version is being bumped, the old and new version numbers, + /// and the set of dependencies of that crate. + #[ derive( Debug, Clone ) ] + pub struct BumpOptions + { + /// `crate_dir` - The directory of the crate which you want to bump the version of. This value is + /// represented by `CrateDir` which indicates the directory of the crate. + pub crate_dir : CrateDir, + + /// `old_version` - The version of the crate before the bump. It's represented by `Version` which + /// denotes the old version number of the crate. + pub old_version : Version, + + /// `new_version` - The version number to assign to the crate after the bump. It's also represented + /// by `Version` which denotes the new version number of the crate. + pub new_version : Version, + + /// `dependencies` - This is a vector containing the directories of all the dependencies of the crate. + /// Each item in the `dependencies` vector indicates a `CrateDir` directory of a single dependency. + pub dependencies : Vec< CrateDir >, + + /// `dry` - A boolean indicating whether to do a "dry run". If set to `true`, a simulated run is performed + /// without making actual changes. If set to `false`, the operations are actually executed. This is + /// useful for validating the process of bumping up the version or for testing and debugging. + pub dry : bool, + } + + /// Report about a changing version. + #[ derive( Debug, Default, Clone ) ] + pub struct ExtendedBumpReport + { + /// Pacakge name. + pub name : Option< String >, + /// Package old version. + pub old_version : Option< String >, + /// Package new version. + pub new_version : Option< String >, + /// Files that should(already) changed for bump. + pub changed_files : Vec< AbsolutePath > + } + + impl std::fmt::Display for ExtendedBumpReport + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + let Self { name, old_version, new_version, changed_files } = self; + if self.changed_files.is_empty() + { + write!( f, "Files were not changed during bumping the version" )?; + return Ok( () ) + } + + let files = changed_files.iter().map( | f | f.as_ref().display() ).join( ",\n " ); + match ( name, old_version, new_version ) + { + ( Some( name ), Some( old_version ), Some( new_version ) ) + => writeln!( f, "`{name}` bumped from {old_version} to {new_version}\n changed files :\n {files}" ), + _ => writeln!( f, "Bump failed" ) + }?; + + Ok( () ) + } + } + + + /// Bumps the version of a package and its dependencies. + /// + /// # Arguments + /// + /// * `args` - The options for version bumping. + /// + /// # Returns + /// + /// Returns a result containing the extended bump report if successful. + /// + pub fn version_bump( o : BumpOptions ) -> Result< ExtendedBumpReport > + { + let mut report = ExtendedBumpReport::default(); + let package_path = o.crate_dir.absolute_path().join( "Cargo.toml" ); + let package = Package::try_from( package_path.clone() ).map_err( | e | format_err!( "{report:?}\n{e:#?}" ) )?; + let name = package.name().map_err( | e | format_err!( "{report:?}\n{e:#?}" ) )?; + report.name = Some( name.clone() ); + let package_version = package.version().map_err( | e | format_err!( "{report:?}\n{e:#?}" ) )?; + let current_version = version::Version::try_from( package_version.as_str() ).map_err( | e | format_err!( "{report:?}\n{e:#?}" ) )?; + if current_version > o.new_version + { + return Err( format_err!( "{report:?}\nThe current version of the package is higher than need to be set\n\tpackage: {name}\n\tcurrent_version: {current_version}\n\tnew_version: {}", o.new_version ) ); + } + report.old_version = Some( o.old_version.to_string() ); + report.new_version = Some( o.new_version.to_string() ); + + let mut package_manifest = package.manifest().map_err( | e | format_err!( "{report:?}\n{e:#?}" ) )?; + if !o.dry + { + let data = package_manifest.manifest_data.as_mut().unwrap(); + data[ "package" ][ "version" ] = value( &o.new_version.to_string() ); + package_manifest.store()?; + } + report.changed_files = vec![ package_path ]; + let new_version = &o.new_version.to_string(); + for dep in &o.dependencies + { + let manifest_path = dep.absolute_path().join( "Cargo.toml" ); + let mut manifest = manifest::open( manifest_path.clone() ).map_err( | e | format_err!( "{report:?}\n{e:#?}" ) )?; + let data = manifest.manifest_data.as_mut().unwrap(); + let item = if let Some( item ) = data.get_mut( "package" ) { item } + else if let Some( item ) = data.get_mut( "workspace" ) { item } + else { return Err( format_err!( "{report:?}\nThe manifest nor the package and nor the workspace" ) ); }; + if let Some( dependency ) = item.get_mut( "dependencies" ).and_then( | ds | ds.get_mut( &name ) ) + { + if let Some( previous_version ) = dependency.get( "version" ).and_then( | v | v.as_str() ).map( | v | v.to_string() ) + { + if previous_version.starts_with('~') + { + dependency[ "version" ] = value( format!( "~{new_version}" ) ); + } + else + { + dependency[ "version" ] = value( new_version.clone() ); + } + } + } + if !o.dry { manifest.store().map_err( | e | format_err!( "{report:?}\n{e:#?}" ) )?; } + report.changed_files.push( manifest_path ); + } + + Ok( report ) + } + + /// Reverts the version of a package in the provided `ExtendedBumpReport`. + /// + /// # Arguments + /// + /// * `report` - The `ExtendedBumpReport` containing the bump information. + /// + /// # Returns + /// + /// Returns `Ok(())` if the version is reverted successfully. Returns `Err` with an error message if there is any issue with reverting the version. + pub fn version_revert( report : &ExtendedBumpReport ) -> Result< () > + { + let Some( name ) = report.name.as_ref() else { return Ok( () ) }; + let Some( old_version ) = report.old_version.as_ref() else { return Ok( () ) }; + let Some( new_version ) = report.new_version.as_ref() else { return Ok( () ) }; + + let dependencies = | item_maybe_with_dependencies : &mut toml_edit::Item | + { + if let Some( dependency ) = item_maybe_with_dependencies.get_mut( "dependencies" ).and_then( | ds | ds.get_mut( name ) ) + { + if let Some( current_version ) = dependency.get( "version" ).and_then( | v | v.as_str() ).map( | v | v.to_string() ) + { + let version = &mut dependency[ "version" ]; + if let Some( current_version ) = current_version.strip_prefix( '~' ) + { + if current_version != new_version { return Err( format_err!( "The current version of the package does not match the expected one. Expected: `{new_version}` Current: `{}`", version.as_str().unwrap_or_default() ) ); } + *version = value( format!( "~{}", old_version ) ); + } + else + { + if version.as_str().unwrap() != new_version { return Err( format_err!( "The current version of the package does not match the expected one. Expected: `{new_version}` Current: `{}`", version.as_str().unwrap_or_default() ) ); } + *version = value( old_version.clone() ); + } + } + } + + Ok( () ) + }; + + for path in &report.changed_files + { + let mut manifest = manifest::open( path.clone() )?; + let data = manifest.data(); + if let Some( workspace ) = data.get_mut( "workspace" ) + { + dependencies( workspace )?; + } + if let Some( package ) = data.get_mut( "package" ) + { + if package.get_mut( "name" ).unwrap().as_str().unwrap() == name + { + let version = &mut package[ "version" ]; + if version.as_str().unwrap() != new_version { return Err( format_err!( "The current version of the package does not match the expected one. Expected: `{new_version}` Current: `{}`", version.as_str().unwrap_or_default() ) ); } + *version = value( old_version.clone() ); + } + else + { + dependencies( package )?; + } + } + manifest.store()?; + } + + Ok( () ) + } +} + +// + +crate::mod_interface! +{ + /// Version entity. + protected use Version; + + /// Report for bump operation. + protected use BumpReport; + + /// Bump version. + protected use bump; + + /// Options for version bumping. + protected use BumpOptions; + /// Report about a changing version with list of files that was changed. + protected use ExtendedBumpReport; + /// Bumps the version of a package and its dependencies. + protected use version_bump; + /// Reverts the version of a package. + protected use version_revert; +} diff --git a/module/move/willbe/src/entity/workspace.rs b/module/move/willbe/src/entity/workspace.rs new file mode 100644 index 0000000000..b477aa3c97 --- /dev/null +++ b/module/move/willbe/src/entity/workspace.rs @@ -0,0 +1,367 @@ +mod private +{ + use std::collections::BTreeMap; + use crate::*; + + use std::path::Path; + use cargo_metadata::camino::{ Utf8Path, Utf8PathBuf }; + use petgraph::Graph; + use serde::Deserialize; + use serde_json::Value; + use wtools::error:: + { + for_app::Context, + for_lib::Error, + Result + }; + use _path::AbsolutePath; + + /// Facade for cargo_metadata::Package + #[ derive( Debug, Clone, Deserialize ) ] + pub struct WorkspacePackage + { + #[ serde( flatten ) ] + inner : cargo_metadata::Package + } + + impl From< cargo_metadata::Package > for WorkspacePackage + { + fn from( inner : cargo_metadata::Package) -> Self + { + Self + { + inner + } + } + } + + impl WorkspacePackage + { + /// The name field as given in the Cargo.toml + pub fn name( &self ) -> &String + { + &self.inner.name + } + + /// List of dependencies of this particular package + pub fn dependencies( &self ) -> Vec< Dependency > + { + self.inner.dependencies.iter().cloned().map( Dependency::from ).collect() + } + + /// Path containing the Cargo.toml + pub fn manifest_path( &self ) -> &Utf8Path + { + self.inner.manifest_path.as_path() + } + + /// The version field as specified in the Cargo.toml + pub fn version( &self ) -> semver::Version + { + self.inner.version.clone() + } + + /// List of registries to which this package may be published (derived from the publish field). + /// Publishing is unrestricted if None, and forbidden if the Vec is empty. + /// This is always None if running with a version of Cargo older than 1.39. + pub fn publish( &self ) -> Option< &Vec< String > > + { + self.inner.publish.as_ref() + } + + ///Contents of the free form package.metadata section. + /// This contents can be serialized to a struct using serde: + /// ``` rust + /// use serde::Deserialize; + /// use serde_json::json; + /// + /// #[ derive( Debug, Deserialize ) ] + /// struct SomePackageMetadata + /// { + /// some_value : i32, + /// } + /// + /// fn main() + /// { + /// let value = json! + /// ({ + /// "some_value" : 42, + /// }); + /// + /// let package_metadata : SomePackageMetadata = serde_json::from_value( value ).unwrap(); + /// assert_eq!( package_metadata.some_value, 42 ); + /// } + /// ``` + pub fn metadata( &self ) -> &Value + { + &self.inner.metadata + } + + /// The repository URL as specified in the Cargo.toml + pub fn repository( &self ) -> Option< &String > + { + self.inner.repository.as_ref() + } + + /// Features provided by the crate, mapped to the features required by that feature. + pub fn features( &self ) -> &BTreeMap< String, Vec< String > > + { + &self.inner.features + } + } + + /// A dependency of the main crate + #[ derive( Debug ) ] + pub struct Dependency + { + inner : cargo_metadata::Dependency, + } + + impl Dependency + { + /// The file system path for a local path dependency. + /// Only produced on cargo 1.51+ + pub fn path( &self ) -> Option< Utf8PathBuf > + { + self.inner.path.clone() + } + + /// Name as given in the Cargo.toml. + pub fn name( &self ) -> String + { + self.inner.name.clone() + } + + /// The kind of dependency this is. + pub fn kind( &self ) -> DependencyKind + { + match self.inner.kind + { + cargo_metadata::DependencyKind::Normal => DependencyKind::Normal, + cargo_metadata::DependencyKind::Development => DependencyKind::Development, + cargo_metadata::DependencyKind::Build => DependencyKind::Build, + cargo_metadata::DependencyKind::Unknown => DependencyKind::Unknown, + } + } + + /// he required version + pub fn req( &self ) -> semver::VersionReq + { + self.inner.req.clone() + } + } + + impl From< cargo_metadata::Dependency > for Dependency + { + fn from( inner : cargo_metadata::Dependency ) -> Self + { + Self + { + inner + } + } + } + + /// Dependencies can come in three kinds + #[ derive( Eq, PartialEq, Debug ) ] + pub enum DependencyKind + { + /// The 'normal' kind + Normal, + /// Those used in tests only + Development, + /// Those used in build scripts only + Build, + /// The 'unknown' kind + Unknown, + } + + /// Stores information about current workspace. + #[ derive( Debug, Clone ) ] + pub struct Workspace + { + metadata : Option< cargo_metadata::Metadata >, + manifest_dir : CrateDir, + } + + /// Represents errors related to workspace operations. + #[ derive( Debug, Error ) ] + pub enum WorkspaceError + { + /// Metadata is non. + #[ error( "Metadata is non " ) ] + MetadataError, + } + + impl Workspace + { + /// Load data from current directory + pub fn from_current_path() -> Result< Self > + { + let current_path = AbsolutePath::try_from( std::env::current_dir().unwrap_or_default() )?; + let metadata = cargo_metadata::MetadataCommand::new().no_deps().exec().context("fail to load CargoMetadata")?; + Ok( Self + { + metadata : Some( metadata ), + manifest_dir : CrateDir::try_from( current_path )?, + }) + } + + /// Load data from current directory + pub fn with_crate_dir( crate_dir : CrateDir ) -> Result< Self > + { + Ok + ( + Self + { + metadata : Some( cargo_metadata::MetadataCommand::new().current_dir( crate_dir.as_ref() ).no_deps().exec().context( "fail to load CargoMetadata" )? ), + manifest_dir : crate_dir, + } + ) + } + } + + impl From< cargo_metadata::Metadata > for Workspace + { + fn from( value : cargo_metadata::Metadata ) -> Self + { + let path = value.workspace_root.as_std_path().parent().unwrap().to_path_buf(); + let path = AbsolutePath::try_from( path ).unwrap(); + Self + { + metadata : Some( value ), + manifest_dir : CrateDir::try_from( path ).unwrap(), + } + } + } + + impl Workspace + { + /// Load data from the current location or from cache + // FIX : Maybe unsafe. Take metadata of workspace in current dir. + pub fn load( &mut self ) -> Result< &mut Self > + { + if self.metadata.is_none() + { + let metadata = Self::with_crate_dir( self.manifest_dir.clone() )?.metadata.unwrap(); + _ = self.metadata.insert( metadata ); + } + + Ok( self ) + } + + /// Force loads data from the current location + // FIX : Maybe unsafe. Take metadata of workspace in current dir. + pub fn force_reload( &mut self ) -> Result< &mut Self > + { + let metadata = Self::with_crate_dir( self.manifest_dir.clone() )?.metadata.unwrap(); + _ = self.metadata.insert( metadata ); + + Ok( self ) + } + } + + impl Workspace + { + /// Returns list of all packages + pub fn packages( &self ) -> Result< Vec< WorkspacePackage >, WorkspaceError > + { + self + .metadata + .as_ref() + .ok_or_else( || WorkspaceError::MetadataError ) + .map( | metadata | metadata.packages.clone() ) + .map( | p | p.into_iter().map( WorkspacePackage::from ).collect() ) + } + + + /// Returns the path to workspace root + pub fn workspace_root( &self ) -> Result< &Path, WorkspaceError > + { + Ok( self.metadata.as_ref().ok_or_else( || WorkspaceError::MetadataError )?.workspace_root.as_std_path() ) + } + + /// Returns the path to target directory + pub fn target_directory( &self ) -> Result< &Path, WorkspaceError > + { + Ok( self.metadata.as_ref().ok_or_else( || WorkspaceError::MetadataError )?.target_directory.as_std_path() ) + } + + /// Return discord url + pub fn discord_url( &self ) -> Result< Option< String >, WorkspaceError > + { + Ok( self.metadata.as_ref().ok_or_else( || WorkspaceError::MetadataError )?.workspace_metadata[ "discord_url" ].as_str().map( | url | url.to_string() ) ) + } + + /// Return the master branch + pub fn master_branch( &self ) -> Result< Option< String >, WorkspaceError > + { + Ok( self.metadata.as_ref().ok_or_else( || WorkspaceError::MetadataError )?.workspace_metadata.get( "master_branch" ).and_then( | b | b.as_str() ).map( | b | b.to_string() ) ) + } + + /// Return the repository url + pub fn repository_url( &self ) -> Result< Option< String >, WorkspaceError > + { + Ok( self.metadata.as_ref().ok_or_else( || WorkspaceError::MetadataError )?.workspace_metadata.get( "repo_url" ).and_then( | b | b.as_str() ).map( | b | b.to_string() ) ) + } + + /// Return the workspace_name + pub fn workspace_name( &self ) -> Result< Option< String >, WorkspaceError > + { + Ok( self.metadata.as_ref().ok_or_else( || WorkspaceError::MetadataError )?.workspace_metadata.get( "workspace_name" ).and_then( | b | b.as_str() ).map( | b | b.to_string() ) ) + } + + /// Find a package by its manifest file path + pub fn package_find_by_manifest< P >( &self, manifest_path : P ) -> Option< WorkspacePackage > + where + P : AsRef< Path >, + { + self + .packages() + .ok() + .and_then + ( + | packages | + packages + .iter() + .find( | &p | p.manifest_path().as_std_path() == manifest_path.as_ref() ) + .cloned() + ) + } + + /// Returns a graph of packages. + pub( crate ) fn graph( &self ) -> Graph< String, String > + { + let packages = self.packages().unwrap(); + let module_package_filter : Option< Box< dyn Fn( &WorkspacePackage ) -> bool > > = Some + ( + Box::new( move | p | p.publish().is_none() ) + ); + let module_dependency_filter : Option< Box< dyn Fn( &WorkspacePackage, &Dependency ) -> bool > > = Some + ( + Box::new + ( + move | _, d | d.path().is_some() && d.kind() != DependencyKind::Development + ) + ); + let module_packages_map = packages::filter + ( + packages.as_slice(), + packages::FilterMapOptions { package_filter : module_package_filter, dependency_filter : module_dependency_filter }, + ); + + graph::construct( &module_packages_map ).map( | _, x | x.to_string(), | _, x | x.to_string() ) + } + } +} + +// + +crate::mod_interface! +{ + exposed use Workspace; + orphan use WorkspaceError; + protected use WorkspacePackage; + protected use Dependency; + protected use DependencyKind; +} diff --git a/module/move/willbe/src/lib.rs b/module/move/willbe/src/lib.rs new file mode 100644 index 0000000000..3f0adc2fe1 --- /dev/null +++ b/module/move/willbe/src/lib.rs @@ -0,0 +1,66 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/willbe/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +use mod_interface::mod_interface; +/// Micro wtools +pub mod wtools; +use wtools::*; + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + /// Takes the command line arguments and perform associated function(s). + /// If no arguments are provided, the function identifies this as an ambiguous state and prompts the user with a help message, suggesting possible commands they might want to execute. + /// It then terminates the program with an exit code of 1 to indicate an error due to the lack of input. + /// + /// Do not support interactive mode. + pub fn run( args : Vec< String > ) -> Result< (), wtools::error::for_app::Error > + { + #[ cfg( feature = "tracing" ) ] + { + tracing_subscriber::fmt().pretty().init(); + } + + let args = args.into_iter().skip( 1 ).collect::< Vec< String > >(); + + let ca = command::ca() + .help_variants( [ wca::HelpVariants::General, wca::HelpVariants::SubjectCommand ] ) + .perform(); + + let program = args.join( " " ); + if program.is_empty() + { + eprintln!( "Ambiguity. Did you mean?" ); + ca.perform( ".help" )?; + std::process::exit( 1 ) + } + else + { + Ok( ca.perform( program.as_str() )? ) + } + + } +} + +mod_interface! +{ + + protected use run; + + /// Entities of which spaces consists of. + layer entity; + + /// Genera-purpose tools which might be moved out one day. + layer tool; + + /// Describes CLI commands. + layer command; + + /// Describes functions that can be called from an interface. + layer action; + +} diff --git a/module/move/willbe/src/tool/_path.rs b/module/move/willbe/src/tool/_path.rs new file mode 100644 index 0000000000..a8209366f7 --- /dev/null +++ b/module/move/willbe/src/tool/_path.rs @@ -0,0 +1,170 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::path::{ Path, PathBuf }; + use std::time::{ SystemTime, UNIX_EPOCH }; + use cargo_metadata::camino::{ Utf8Path, Utf8PathBuf }; + + /// Absolute path. + #[ derive( Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash ) ] + pub struct AbsolutePath( PathBuf ); + + impl TryFrom< &str > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : &str ) -> Result< Self, Self::Error > + { + let value = PathBuf::from( value ); + Ok( Self( canonicalize( value )? ) ) + } + } + + impl TryFrom< String > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : String ) -> Result< Self, Self::Error > + { + let value = PathBuf::from( value ); + Ok( Self( canonicalize( value )? ) ) + } + } + + impl TryFrom< PathBuf > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : PathBuf ) -> Result< Self, Self::Error > + { + Ok( Self( canonicalize( value )? ) ) + } + } + + impl TryFrom< &Path > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : &Path ) -> Result< Self, Self::Error > + { + Ok( Self( canonicalize( value )? ) ) + } + } + + impl TryFrom< Utf8PathBuf > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : Utf8PathBuf ) -> Result< Self, Self::Error > + { + AbsolutePath::try_from( value.as_std_path() ) + } + } + + impl TryFrom< &Utf8Path > for AbsolutePath + { + type Error = std::io::Error; + + fn try_from( value : &Utf8Path ) -> Result< Self, Self::Error > + { + AbsolutePath::try_from( value.as_std_path() ) + } + } + + impl AsRef< Path > for AbsolutePath + { + fn as_ref( &self ) -> &Path + { + self.0.as_ref() + } + } + + impl AbsolutePath + { + /// Returns the Path without its final component, if there is one. + /// Returns None if the path terminates in a root or prefix, or if it's the empty string. + pub fn parent( &self ) -> Option< AbsolutePath > + { + self.0.parent().map( PathBuf::from ).map( AbsolutePath ) + } + + /// Creates an owned `AbsolutePath` with path adjoined to self. + pub fn join< P >( &self, path : P ) -> AbsolutePath + where + P : AsRef< Path >, + { + Self::try_from( self.0.join( path ) ).unwrap() + } + } + + // qqq : for Petro : for Bohdan : bad. move out + + /// Check if path has a glob. + #[ allow( dead_code ) ] + fn glob_is( path : &str ) -> bool + { + let glob_chars = "*?[{"; + let mut last_char = ' '; + for char in path.chars() + { + if last_char != '\\' && glob_chars.contains( char ) + { + return true; + } + + last_char = char; + } + + false + } + + /// Returns the canonical, absolute form of the path with all intermediate components normalized and symbolic links resolved. + pub fn canonicalize( path : impl AsRef< Path > ) -> std::io::Result< PathBuf > + { + let path = path.as_ref().canonicalize()?; + + // In Windows the regular/legacy paths (C :\foo) are supported by all programs, but have lots of bizarre restrictions for backwards compatibility with MS-DOS. + // And there are Windows NT UNC paths (\\?\C :\foo), which are more robust and with fewer gotchas, but are rarely supported by Windows programs. Even Microsoft’s own! + // + // https://github.com/rust-lang/rust/issues/42869 + #[ cfg( target_os = "windows" ) ] + let path = + { + const VERBATIM_PREFIX : &str = r#"\\?\"#; + let p = path.display().to_string(); + if p.starts_with( VERBATIM_PREFIX ) + { + PathBuf::from( &p[ VERBATIM_PREFIX.len() .. ] ) + } + else + { + path.into() + } + }; + + Ok( path ) + } + + /// Generate name based on system time + pub fn unique_folder_name() -> crate::wtools::error::Result< String > + { + let timestamp = SystemTime::now() + .duration_since( UNIX_EPOCH )? + .as_nanos(); + + Ok( format!( "{}", timestamp ) ) + } + +} + +crate::mod_interface! +{ + // qqq : remove this? + // protected use glob_is; + protected use canonicalize; + protected use unique_folder_name; + + protected use AbsolutePath; +} + +// qqq : for Petro : for Bohdan : rid off this file. use proper_path_tools diff --git a/module/move/willbe/src/tool/cargo.rs b/module/move/willbe/src/tool/cargo.rs new file mode 100644 index 0000000000..d24ac23565 --- /dev/null +++ b/module/move/willbe/src/tool/cargo.rs @@ -0,0 +1,183 @@ +mod private +{ + use std::ffi::OsString; + use crate::*; + + use std::path::PathBuf; + use error_tools::err; + use error_tools::for_app::format_err; + use former::Former; + use process_tools::process::*; + use wtools::error::Result; + + /// Represents pack options + #[ derive( Debug, Former, Clone ) ] + pub struct PackOptions + { + pub( crate ) path : PathBuf, + #[ former( default = false ) ] + pub( crate ) allow_dirty : bool, + #[ former( default = false ) ] + pub( crate ) no_verify : bool, + pub( crate ) temp_path : Option< PathBuf >, + pub( crate ) dry : bool, + } + + impl PackOptionsFormer + { + pub fn option_temp_path( mut self, value : impl Into< Option< PathBuf > > ) -> Self + { + self.storage.temp_path = value.into(); + self + } + } + + impl PackOptions + { + fn to_pack_args( &self ) -> Vec< String > + { + [ "package".to_string() ] + .into_iter() + .chain( if self.allow_dirty { Some( "--allow-dirty".to_string() ) } else { None } ) + .chain( if self.no_verify { Some( "--no-verify".to_string() ) } else { None } ) + .chain( self.temp_path.clone().map( | p | vec![ "--target-dir".to_string(), p.to_string_lossy().into() ] ).into_iter().flatten() ) + .collect() + } + } + + /// + /// Assemble the local package into a distributable tarball. + /// + /// # Args : + /// - `path` - path to the package directory + /// - `dry` - a flag that indicates whether to execute the command or not + /// + #[ cfg_attr + ( + feature = "tracing", + track_caller, + tracing::instrument( fields( caller = ?{ let x = std::panic::Location::caller(); ( x.file(), x.line() ) } ) ) + )] + pub fn pack( args : PackOptions ) -> Result< Report > + { + let ( program, options ) = ( "cargo", args.to_pack_args() ); + + if args.dry + { + Ok + ( + Report + { + command : format!( "{program} {}", options.join( " " ) ), + out : String::new(), + err : String::new(), + current_path: args.path.to_path_buf(), + error: Ok( () ), + } + ) + } + else + { + Run::former() + .bin_path( program ) + .args( options.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( args.path ) + .run().map_err( | report | err!( report.to_string() ) ) + } + } + + + /// Represents the options for the publish. + #[ derive( Debug, Former, Clone, Default ) ] + pub struct PublishOptions + { + pub( crate ) path : PathBuf, + pub( crate ) temp_path : Option< PathBuf >, + #[ former( default = 0usize ) ] + pub( crate ) retry_count : usize, + pub( crate ) dry : bool, + } + + impl PublishOptionsFormer + { + pub fn option_temp_path( mut self, value : impl Into< Option< PathBuf > > ) -> Self + { + self.storage.temp_path = value.into(); + self + } + } + + impl PublishOptions + { + fn as_publish_args( &self ) -> Vec< String > + { + let target_dir = self.temp_path.clone().map( | p | vec![ "--target-dir".to_string(), p.to_string_lossy().into() ] ); + [ "publish".to_string() ].into_iter().chain( target_dir.into_iter().flatten() ).collect::< Vec< String > >() + } + } + + /// Upload a package to the registry + #[ cfg_attr + ( + feature = "tracing", + track_caller, + tracing::instrument( fields( caller = ?{ let x = std::panic::Location::caller(); ( x.file(), x.line() ) } ) ) + )] + pub fn publish( args : PublishOptions ) -> Result< Report > + { + let ( program, arguments) = ( "cargo", args.as_publish_args() ); + + if args.dry + { + Ok + ( + Report + { + command : format!( "{program} {}", arguments.join( " " ) ), + out : String::new(), + err : String::new(), + current_path: args.path.to_path_buf(), + error: Ok( () ), + } + ) + } + else + { + let mut results = Vec::with_capacity( args.retry_count + 1 ); + let run_args = arguments.into_iter().map( OsString::from ).collect::< Vec< _ > >(); + for _ in 0 .. args.retry_count + 1 + { + let result = Run::former() + .bin_path( program ) + .args( run_args.clone() ) + .current_path( &args.path ) + .run(); + match result + { + Ok( report ) => return Ok( report ), + Err( e ) => results.push( e ), + } + } + if args.retry_count > 0 + { + Err( format_err!( "It took {} attempts, but still failed. Here are the errors:\n{}", args.retry_count + 1, results.into_iter().map( | r | format!( "- {r}" ) ).collect::< Vec< _ > >().join( "\n" ) ) ) + } + else + { + Err( results.remove( 0 ) ).map_err( | report | err!( report.to_string() ) ) + } + } + } +} + +// + +crate::mod_interface! +{ + protected use pack; + protected use publish; + + protected use PublishOptions; + protected use PackOptions; + +} diff --git a/module/move/willbe/src/tool/files.rs b/module/move/willbe/src/tool/files.rs new file mode 100644 index 0000000000..8dfbc4f78c --- /dev/null +++ b/module/move/willbe/src/tool/files.rs @@ -0,0 +1,40 @@ + + +/// Internal namespace. +pub( crate ) mod private +{ + use std::path::{ Path, PathBuf }; + + /// + /// Find paths. + /// + + /* rrr : Dmytro : dubious prototype */ + pub fn find< P, S >( base_dir : P, patterns : &[ S ] ) -> Vec< PathBuf > + where + P : AsRef< Path >, + S : AsRef< str >, + { + globwalk::GlobWalkerBuilder::from_patterns( base_dir, patterns ) + .follow_links( false ) + .build().unwrap() + .into_iter() + .filter_map( Result::ok ) + .map( | s | s.path().to_path_buf() ) + .collect::< Vec< PathBuf > >() + } + + /// Check if path is valid. + pub fn valid_is( path : &str ) -> bool + { + std::fs::metadata( path ).is_ok() + } +} + +// + +crate::mod_interface! +{ + protected use valid_is; + orphan use find; +} diff --git a/module/move/willbe/src/tool/git.rs b/module/move/willbe/src/tool/git.rs new file mode 100644 index 0000000000..c90dc08109 --- /dev/null +++ b/module/move/willbe/src/tool/git.rs @@ -0,0 +1,226 @@ +mod private +{ + use crate::*; + use std::ffi::OsString; + use std::path::Path; + use process_tools::process::*; + use wtools::error::Result; + use wtools::error::err; + + /// Adds changes to the Git staging area. + /// + /// # Args : + /// - `path` - the root path + /// - `objects` - a list of paths from the root that will be added + /// - `dry` - a flag that indicates whether to apply the changes or not + /// - `true` - does not modify git state + /// - `false` - adds a change in the working directory to the staging area + /// + /// # Returns : + /// Returns a result containing a report indicating the result of the operation. + #[ cfg_attr( feature = "tracing", tracing::instrument( skip( path, objects ), fields( path = %path.as_ref().display() ) ) ) ] + pub fn add< P, Os, O >( path : P, objects : Os, dry : bool ) -> Result< Report > + where + P : AsRef< Path >, + Os : AsRef< [ O ] >, + O : AsRef< str >, + { + let objects = objects.as_ref().iter().map( | x | x.as_ref() ); + + let ( program, args ) = ( "git", Some( "add" ).into_iter().chain( objects ).collect::< Vec< _ > >() ); + + if dry + { + Ok + ( + Report + { + command : format!( "{program} {}", args.join( " " ) ), + out : String::new(), + err : String::new(), + current_path: path.as_ref().to_path_buf(), + error: Ok( () ), + } + ) + } + else + { + Run::former() + .bin_path( program ) + .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( path.as_ref().to_path_buf() ) + .run().map_err( | report | err!( report.to_string() ) ) + } + } + + /// Commits changes to the Git repository. + /// + /// # Args : + /// + /// - `path` - the root path + /// - `message` - a commit message describing the changes + /// - `dry` - a flag that indicates whether to apply the changes or not + /// - `true` - does not modify the Git state + /// - `false` - commits changes to the repository + /// + /// # Returns : + /// Returns a result containing a report indicating the result of the operation. + #[ cfg_attr( feature = "tracing", tracing::instrument( skip( path, message ), fields( path = %path.as_ref().display(), message = %message.as_ref() ) ) ) ] + pub fn commit< P, M >( path : P, message : M, dry : bool ) -> Result< Report > + where + P : AsRef< Path >, + M : AsRef< str >, + { + let ( program, args ) = ( "git", [ "commit", "-m", message.as_ref() ] ); + + if dry + { + Ok + ( + Report + { + command : format!( "{program} {}", args.join( " " ) ), + out : String::new(), + err : String::new(), + current_path: path.as_ref().to_path_buf(), + error: Ok( () ), + } + ) + } + else + { + Run::former() + .bin_path( program ) + .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( path.as_ref().to_path_buf() ) + .run().map_err( | report | err!( report.to_string() ) ) + } + } + + /// Pushes changes to the remote Git repository. + /// + /// # Args : + /// + /// - `path` - the root path + /// - `dry` - a flag that indicates whether to apply the changes or not + /// - `true` - does not modify the Git state + /// - `false` - pushes changes to the remote repository + /// + /// # Returns : + /// Returns a result containing a report indicating the result of the operation. + #[ cfg_attr( feature = "tracing", tracing::instrument( skip( path ), fields( path = %path.as_ref().display() ) ) ) ] + pub fn push< P >( path : P, dry : bool ) -> Result< Report > + where + P : AsRef< Path >, + { + let ( program, args ) = ( "git", [ "push" ] ); + + if dry + { + Ok + ( + Report + { + command : format!( "{program} {}", args.join( " " ) ), + out : String::new(), + err : String::new(), + current_path: path.as_ref().to_path_buf(), + error: Ok( () ), + } + ) + } + else + { + Run::former() + .bin_path( program ) + .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( path.as_ref().to_path_buf() ) + .run().map_err( | report | err!( report.to_string() ) ) + } + } + + /// This function is a wrapper around the `git reset` command. + /// + /// # Args : + /// + /// - `path`: The path to the directory on which the `git reset` command will be executed. + /// - `hard`: A boolean indicating whether to perform a hard reset or not. + /// - `commits_count`: The number of commits to reset(at least 1). + /// - `dry`: A boolean indicating whether to execute the command in dry-run mode or not. + /// + /// # Returns : + /// This function returns a `Result` containing a `Report` if the command is executed successfully. The `Report` contains the command executed, the output +// git reset command wrapper + pub fn reset< P >( path : P, hard : bool, commits_count : usize, dry : bool ) -> Result< Report > + where + P : AsRef< Path >, + { + if commits_count < 1 { return Err( err!( "Cannot reset, the count of commits must be greater than 0" ) ) } + let ( program, args ) = + ( + "git", + Some( "reset" ) + .into_iter() + .chain( if hard { Some( "--hard" ) } else { None } ) + .map( String::from ) + .chain( Some( format!( "HEAD~{}", commits_count ) ) ) + .collect::< Vec< _ > >() + ); + + if dry + { + Ok + ( + Report + { + command : format!( "{program} {}", args.join( " " ) ), + out : String::new(), + err : String::new(), + current_path : path.as_ref().to_path_buf(), + error : Ok( () ), + } + ) + } + else + { + Run::former() + .bin_path( program ) + .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( path.as_ref().to_path_buf() ) + .run().map_err( | report | err!( report.to_string() ) ) + } + } + + /// Retrieves the remote URL of a Git repository. + /// + /// # Arguments + /// + /// * `path` - A `Path` reference to the local Git repository. + /// + /// # Returns + /// + /// A `Result` containing a `Report`, which represents the result of the command execution. + pub fn ls_remote_url< P >( path : P ) -> Result< Report > + where + P : AsRef< Path >, + { + let ( program, args ) = ( "git", [ "ls-remote", "--get-url" ] ); + + Run::former() + .bin_path( program ) + .args( args.into_iter().map( OsString::from ).collect::< Vec< _ > >() ) + .current_path( path.as_ref().to_path_buf() ) + .run().map_err( | report | err!( report.to_string() ) ) + } +} + +// + +crate::mod_interface! +{ + protected use add; + protected use commit; + protected use push; + protected use reset; + protected use ls_remote_url; +} diff --git a/module/move/willbe/src/tool/graph.rs b/module/move/willbe/src/tool/graph.rs new file mode 100644 index 0000000000..db91c15afb --- /dev/null +++ b/module/move/willbe/src/tool/graph.rs @@ -0,0 +1,312 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + use std:: + { + ops::Index, + fmt::Debug, + hash::Hash, + collections::{ HashMap, HashSet } + }; + use std::collections::VecDeque; + use std::path::PathBuf; + use petgraph:: + { + graph::Graph, + algo::toposort as pg_toposort, + }; + use petgraph::graph::NodeIndex; + use petgraph::prelude::*; + + use error_tools::for_lib::Error; + use error::Result; + use package::{ Package, publish_need }; + + #[ derive( Debug, Error ) ] + pub enum GraphError< T : Debug > + { + #[ error( "Cycle: {0:?}" ) ] + Cycle( T ), + } + + /// Build a graph from map of packages and its dependencies + /// + /// Arg : + /// - packages - a map, where key is a package identifier and value - the package dependencies identifiers + /// + /// Returns : + /// The graph with all accepted packages + pub fn construct< PackageIdentifier > + ( + packages : &HashMap< PackageIdentifier, + HashSet< PackageIdentifier > > + ) + -> Graph< &PackageIdentifier, &PackageIdentifier > + where + PackageIdentifier : PartialEq + Eq + Hash, + { + let nudes : HashSet< _ > = packages + .iter() + .flat_map( | ( name, dependency ) | + { + dependency + .iter() + .chain( Some( name ) ) + }).collect(); + let mut deps = Graph::new(); + for nude in nudes + { + deps.add_node( nude ); + } + for ( name, dependencies ) in packages + { + let root_node = deps.node_indices().find( | i | deps[ *i ] == name ).unwrap(); + for dep in dependencies + { + let dep_node = deps.node_indices().find( | i | deps[ *i ] == dep ).unwrap(); + deps.add_edge(root_node, dep_node, name ); + } + } + deps + } + + /// Performs a topological sort of a graph of packages + /// + /// Arg : + /// - `graph` - a directed graph of packages and their dependencies. + /// + /// Returns + /// A list that contains the sorted packages identifiers in topological order. + /// + /// # Panics + /// If there is a cycle in the dependency graph + pub fn toposort< 'a, PackageIdentifier : Clone + std::fmt::Debug > + ( + graph : Graph< &'a PackageIdentifier, &'a PackageIdentifier > + ) + -> Result< Vec< PackageIdentifier >, GraphError< PackageIdentifier > > + { + match pg_toposort( &graph, None ) + { + Ok( list ) => Ok + ( + list + .iter() + .rev() + .map( | dep_idx | ( *graph.node_weight( *dep_idx ).unwrap() ).clone() ) + .collect::< Vec< _ > >() + ), + Err( index ) => Err( GraphError::Cycle( ( *graph.index( index.node_id() ) ).clone() ) ), + // aaa : for Bohdan : bad, make proper error handling + // aaa : now returns `GraphError` + } + } + + /// The function performs a topological sort of a graph with grouping. + /// + /// # Arguments + /// + /// * `graph` - A graph represented as an adjacency list. Each node in the graph represents a task, and edges represent dependencies. + /// + /// # Returns + /// + /// The function returns a vector of vectors, where each inner vector represents a group of nodes that can be executed in parallel. Tasks within each group are sorted in topological order. + pub fn topological_sort_with_grouping< 'a, PackageIdentifier : Clone + std::fmt::Debug > + ( + graph : Graph< &'a PackageIdentifier, &'a PackageIdentifier > + ) + -> Vec< Vec< PackageIdentifier > > + { + let mut in_degree = HashMap::new(); + for node in graph.node_indices() + { + in_degree.insert( node, graph.neighbors_directed( node, Incoming ).count() ); + } + + let mut roots = VecDeque::new(); + for ( node, °ree ) in in_degree.iter() + { + if degree == 0 + { + roots.push_back( *node ); + } + } + + let mut result = Vec::new(); + while !roots.is_empty() + { + let mut next_roots = Vec::new(); + let mut group = Vec::new(); + while let Some( node ) = roots.pop_front() + { + group.push( node ); + for edge in graph.neighbors( node ) + { + let degree = in_degree.get_mut( &edge ).unwrap(); + *degree -= 1; + if *degree == 0 + { + next_roots.push( edge ); + } + } + } + roots = VecDeque::from( next_roots ); + result.push( group ); + } + result + .into_iter() + .map + ( + | vec | + vec + .iter() + .map( | dep_idx | ( *graph.node_weight( *dep_idx ).unwrap() ).clone() ) + .collect() + ) + .rev() + .collect() + } + + /// Creates a subgraph from the given graph, containing only the nodes and edges reachable from the roots. + /// + /// # Arguments + /// * `graph` - The original graph from which to create the subgraph. + /// * `roots` - An array of nodes that will serve as the roots of the subgraph. + /// + /// # Returns + /// A new graph that represents the subgraph. + /// + /// # Generic Types + /// * `N` - The type of the node in the original graph. + /// * `E` - The type of the edge in the original graph. + /// + /// # Constraints + /// * `N` must implement the `PartialEq` trait. + pub fn subgraph< N, E >( graph : &Graph< N, E >, roots : &[ N ] ) -> Graph< NodeIndex, EdgeIndex > + where + N : PartialEq< N >, + { + let mut subgraph = Graph::new(); + let mut node_map = HashMap::new(); + + for root in roots + { + let root_id = graph.node_indices().find( | x | graph[ *x ] == *root ).unwrap(); + let mut dfs = Dfs::new( graph, root_id ); + while let Some( nx ) = dfs.next( &graph ) + { + if !node_map.contains_key( &nx ) + { + let sub_node = subgraph.add_node( nx ); + node_map.insert( nx, sub_node ); + } + } + } + + for ( _, sub_node_id ) in &node_map + { + let node_id_graph = subgraph[ *sub_node_id ]; + + for edge in graph.edges( node_id_graph ) + { + match ( node_map.get( &edge.source() ), node_map.get( &edge.target() ) ) + { + ( Some( &from ), Some( &to ) ) => + { + subgraph.add_edge( from, to, edge.id() ); + } + _ => {} + } + } + } + + subgraph + } + + /// Removes nodes that are not required to be published from the graph. + /// + /// # Arguments + /// + /// * `package_map` - A reference to a `HashMap` mapping `String` keys to `Package` values. + /// * `graph` - A reference to a `Graph` of nodes and edges, where nodes are of type `String` and edges are of type `String`. + /// * `roots` - A slice of `String` representing the root nodes of the graph. + /// + /// # Returns + /// + /// A new `Graph` with the nodes that are not required to be published removed. + pub fn remove_not_required_to_publish + ( + package_map : &HashMap< String, Package >, + graph : &Graph< String, String >, + roots : &[ String ], + temp_path : Option< PathBuf >, + ) + -> Result< Graph< String, String > > + { + let mut nodes = HashSet::new(); + let mut cleared_graph = Graph::new(); + + for root in roots + { + let root = graph.node_indices().find( | &i | graph[ i ] == *root ).unwrap(); + let mut dfs = DfsPostOrder::new( &graph, root ); + 'main : while let Some( n ) = dfs.next(&graph) + { + for neighbor in graph.neighbors_directed( n, Outgoing ) + { + if nodes.contains( &neighbor ) + { + nodes.insert( n ); + continue 'main; + } + } + let package = package_map.get( &graph[ n ] ).unwrap(); + _ = cargo::pack + ( + cargo::PackOptions::former() + .path( package.crate_dir().absolute_path().as_ref().to_path_buf() ) + .option_temp_path( temp_path.clone() ) + .dry( false ) + .allow_dirty( true ) + .form() + )?; + if publish_need( package, temp_path.clone() ).unwrap() + { + nodes.insert( n ); + } + } + } + let mut new_map = HashMap::new(); + for node in nodes.iter().copied() { new_map.insert( node, cleared_graph.add_node( graph[ node ].clone() ) ); } + + for sub_node_id in nodes + { + for edge in graph.edges( sub_node_id ) + { + match ( new_map.get( &edge.source() ), new_map.get( &edge.target() ) ) + { + ( Some( &from ), Some( &to ) ) => + { + cleared_graph.add_edge( from, to, graph[ edge.id() ].clone() ); + } + _ => {} + } + } + } + + Ok( cleared_graph ) + } +} + +// + +crate::mod_interface! +{ + protected use construct; + protected use toposort; + protected use topological_sort_with_grouping; + protected use subgraph; + protected use remove_not_required_to_publish; +} diff --git a/module/move/willbe/src/tool/http.rs b/module/move/willbe/src/tool/http.rs new file mode 100644 index 0000000000..4cd557ef59 --- /dev/null +++ b/module/move/willbe/src/tool/http.rs @@ -0,0 +1,48 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::*; + + use std:: + { + io::Read, + fmt::Write, + time::Duration + }; + use wtools::error::{ for_app::Context, Result }; + use ureq::Agent; + + /// + /// Get data of remote package. + /// + pub fn download< 'a >( name : &'a str, version : &'a str ) -> Result< Vec< u8 > > + { + let agent : Agent = ureq::AgentBuilder::new() + .timeout_read( Duration::from_secs( 5 ) ) + .timeout_write( Duration::from_secs( 5 ) ) + .build(); + let mut buf = String::new(); + write!( &mut buf, "https://static.crates.io/crates/{0}/{0}-{1}.crate", name, version )?; + + let resp = agent.get( &buf[ .. ] ).call().context( "Get data of remote package" )?; + + let len : usize = resp.header( "Content-Length" ) + .unwrap() + .parse()?; + + let mut bytes : Vec< u8 > = Vec::with_capacity( len ); + resp.into_reader() + .take( u64::MAX ) + .read_to_end( &mut bytes )?; + + Ok( bytes ) + } + +} + +// + +crate::mod_interface! +{ + orphan use download; +} diff --git a/module/move/willbe/src/tool/mod.rs b/module/move/willbe/src/tool/mod.rs new file mode 100644 index 0000000000..8f8e77635e --- /dev/null +++ b/module/move/willbe/src/tool/mod.rs @@ -0,0 +1,39 @@ +crate::mod_interface! +{ + + /// Make sha-1 hash for data. + layer sha; + orphan use super::sha; + + /// Operate over files. + layer files; + orphan use super::files; + + /// Work with paths. + layer _path; + orphan use super::_path; + + /// Tools for working with dependencies graph. + layer graph; + orphan use super::graph; + + /// Traits and structs for templates. + layer template; + orphan use super::template; + + /// Git interaction module that enables seamless integration and management of version control workflows. + layer git; + orphan use super::git; + + /// Interaction module with the `cargo` utilities. + layer cargo; + orphan use super::cargo; + + /// The parse function parses an input string into a HashMap where the keys are String and the values are of type Value. + layer query; + orphan use super::query; + + /// Tools for parsing and extracting information from url. + layer url; + orphan use super::url; +} diff --git a/module/move/willbe/src/tool/query.rs b/module/move/willbe/src/tool/query.rs new file mode 100644 index 0000000000..6686858821 --- /dev/null +++ b/module/move/willbe/src/tool/query.rs @@ -0,0 +1,259 @@ +mod private +{ + use crate::*; + + use std:: + { + str::FromStr, + collections::HashMap + }; + use error_tools::for_app::bail; + use wtools::error::{ for_app::{ Error }, Result }; + + #[ derive( Debug, PartialEq, Eq, Clone ) ] + /// Parser value enum + pub enum Value + { + /// string value + String( String ), + /// int value + Int( i32 ), + /// bool value + Bool( bool ), + } + + impl FromStr for Value + { + type Err = Error; + + fn from_str( s : &str ) -> Result< Self, Self::Err > + { + if let Ok( i ) = s.parse::< i32 >() + { + Ok( Value::Int( i ) ) + } else if let Ok( b ) = s.parse::< bool >() + { + Ok( Value::Bool( b ) ) + } else + { + let s = s.trim_matches( '\'' ); + Ok( Value::String( s.to_string() ) ) + } + } + } + + impl From< &Value > for bool + { + fn from( value : &Value ) -> Self + { + match value + { + Value::Bool( value ) => *value, + Value::String( string ) => string == "true", + Value::Int( i ) => *i == 1, + } + } + } + + /// Represents the result of parsing. + #[ derive( Debug, Clone ) ] + pub enum ParseResult + { + /// Named parsing result. + Named( HashMap< String, Value >), + /// Positional parsing result. + Positioning( Vec< Value >) + } + + impl ParseResult + { + /// Converts the parsing result into a vector of values. + /// ``` rust + /// use std::collections::HashMap; + /// use willbe::query::{ ParseResult, Value }; + /// + /// let params = HashMap::from( [ ( "v1".to_string(), Value::Int( 1 ) ), ( "v2".to_string(), Value::Int( 2 ) ), ( "v3".to_string(), Value::Int( 3 ) ) ] ); + /// + /// let result = ParseResult::Named( params ).into_vec(); + /// + /// assert!( result.contains( &Value::Int( 1 ) ) ); + /// assert!( result.contains( &Value::Int( 2 ) ) ); + /// assert!( result.contains( &Value::Int( 3 ) ) ); + /// ``` + pub fn into_vec( self ) -> Vec< Value > + { + match self + { + ParseResult::Named( map ) => map.values().cloned().collect(), + ParseResult::Positioning( vec ) => vec, + } + } + + /// Converts the parsing result into a hashmap, using a vector of names as keys. + /// ```rust + /// use std::collections::HashMap; + /// use willbe::query::{ ParseResult, Value }; + /// + /// let params = vec![ Value::Int( 1 ), Value::Int( 2 ), Value::Int( 3 ) ]; + /// let result = ParseResult::Positioning( params ); + /// + /// let named_map = result.clone().into_map( vec![ "var0".into(), "var1".into(),"var2".into() ] ); + /// let unnamed_map = result.clone().into_map( vec![] ); + /// let mixed_map = result.clone().into_map( vec![ "var0".into() ] ); + /// let vec = result.into_vec(); + /// + /// assert_eq!( HashMap::from( [ ( "var0".to_string(), Value::Int( 1 ) ), ( "var1".to_string(),Value::Int( 2 ) ), ( "var2".to_string(),Value::Int( 3 ) ) ] ), named_map ); + /// assert_eq!( HashMap::from( [ ( "1".to_string(), Value::Int( 1 ) ), ( "2".to_string(),Value::Int( 2 ) ), ( "3".to_string(),Value::Int( 3 ) ) ] ), unnamed_map ); + /// assert_eq!( HashMap::from( [ ( "var0".to_string(), Value::Int( 1 ) ), ( "1".to_string(),Value::Int( 2 ) ), ( "2".to_string(),Value::Int( 3 ) ) ] ), mixed_map ); + /// ``` + pub fn into_map( self, names : Vec< String > ) -> HashMap< String, Value > + { + match self + { + ParseResult::Named( map ) => map, + ParseResult::Positioning( vec ) => + { + let mut map = HashMap::new(); + let mut counter = 0; + for ( index, value ) in vec.into_iter().enumerate() { + map.insert + ( + names.get( index ).cloned().unwrap_or_else( || { counter+=1; counter.to_string() } ), + value + ); + } + map + } + } + } + } + + /// Parses an input string and returns a parsing result. + /// ```rust + /// use willbe::query::{ parse, Value }; + /// use std::collections::HashMap; + /// + /// assert_eq!( parse( "()" ).unwrap().into_vec(), vec![] ); + /// + /// let mut expected_map = HashMap::new(); + /// expected_map.insert( "1".to_string(), Value::String( "test/test".to_string() ) ); + /// assert_eq!( parse( "('test/test')" ).unwrap().into_map( vec![] ), expected_map ); + /// + /// let mut expected_map = HashMap::new(); + /// expected_map.insert( "key".to_string(), Value::String( r#"hello\'test\'test"#.into() ) ); + /// assert_eq!( parse( r#"{ key : 'hello\'test\'test' }"# ).unwrap().into_map( vec![] ), expected_map ); + /// ``` + pub fn parse( input_string : &str ) -> Result< ParseResult > + { + if input_string.len() < 2 + { + bail!( "Input length should be two or more" ) + } + if input_string.len() == 2 + { + return Ok( ParseResult::Positioning( vec![] ) ) + } + let start = input_string.chars().next().unwrap(); + let input_string = &input_string[1..input_string.len()-1]; + let params = split_string( input_string ); + let result = match start + { + '{' => + { + ParseResult::Named( parse_to_map( params )? ) + }, + '(' => + { + ParseResult::Positioning( parse_to_vec( params )? ) + }, + _ => bail!( "Invalid start character" ) + }; + + Ok( result ) + } + + fn split_string( input : &str ) -> Vec< String > + { + let mut result = Vec::new(); + let mut start = 0; + let mut in_quotes = false; + for ( i, c ) in input.char_indices() + { + match c + { + '"' | '\'' => in_quotes = !in_quotes, + ',' if !in_quotes => + { + result.push( input[ start..i ].trim().to_string() ); + start = i + 1; + } + _ => {} + } + } + result.push( input[ start.. ].trim().to_string() ); + result + } + + fn parse_to_map(input : Vec< String > ) -> Result< HashMap< String, Value > > + { + let mut map = HashMap::new(); + for line in input + { + let mut in_quotes = false; + let mut key = String::new(); + let mut value = String::new(); + let mut is_key = true; + for c in line.chars() + { + match c + { + '"' | '\'' => + { + in_quotes = !in_quotes; + if is_key + { + key.push( c ); + } + else + { + value.push( c ); + } + } + ':' if !in_quotes => + { + is_key = false; + } + _ => + { + if is_key + { + key.push( c ); + } + else + { + value.push( c ); + } + } + } + } + if value.trim().is_empty() + { + bail!( "Value is missing" ) + } + map.insert( key.trim().to_string(), Value::from_str( value.trim() )? ); + } + Ok( map ) + } + + fn parse_to_vec( input : Vec< String > ) -> Result< Vec< Value > > + { + Ok( input.into_iter().filter_map( | w | Value::from_str( w.trim() ).ok() ).collect() ) + } +} + +crate::mod_interface! +{ + protected use parse; + protected use Value; + protected use ParseResult; +} diff --git a/module/move/willbe/src/tool/sha.rs b/module/move/willbe/src/tool/sha.rs new file mode 100644 index 0000000000..5bb60bed23 --- /dev/null +++ b/module/move/willbe/src/tool/sha.rs @@ -0,0 +1,26 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use sha1::{ Sha1, Digest }; + + // zzz : not used + + /// + /// Make sha-1 hash for data. + /// + + pub fn hash( data : &[ u8 ] ) -> Vec< u8 > + { + let mut hasher = Sha1::new(); + hasher.update( data ); + let result = hasher.finalize(); + result.to_vec() + } +} + +// + +crate::mod_interface! +{ + orphan use hash; +} diff --git a/module/move/willbe/src/tool/template.rs b/module/move/willbe/src/tool/template.rs new file mode 100644 index 0000000000..ae07683d4b --- /dev/null +++ b/module/move/willbe/src/tool/template.rs @@ -0,0 +1,386 @@ +mod private +{ + use std::collections::BTreeMap; + use std::fs; + use error_tools::for_app::Context; + use error_tools::Result; + use former::Former; + use wca::Props; + use std::path::Path; + use std::path::PathBuf; + use wca::Value; + use std::collections::HashMap; + + // qqq : for Viktor : is that trait really necessary? + // Template - remove + // DeployTemplate - move here + // DeployTemplateFiles - remove + + /// Trait for creating a template for a file structure. + pub trait Template< F > : Sized + where + F : TemplateFiles + Default + { + /// Creates all files in the template. + /// + /// Path is the base path for the template to be created in. + fn create_all( self, path : &Path ) -> Result< () >; + + /// Returns all parameters used by the template. + fn parameters( &self ) -> &TemplateParameters; + + /// Sets values for provided parameters. + fn set_values( &mut self, values : TemplateValues ); + + /// Relative path for parameter values storage. + fn parameter_storage( &self ) -> &Path; + + /// + fn template_name( &self ) -> &'static str; + + /// Loads provided parameters from previous run. + fn load_existing_params( &mut self, path : &Path ) -> Option< () > + { + let data = fs::read_to_string( path.join( self.parameter_storage() ) ).ok()?; + let document = data.parse::< toml_edit::Document >().ok()?; + let parameters = self.parameters().descriptors.iter().map( | d | &d.parameter ).cloned().collect::< Vec< _ > >(); + let template_table = document.get( self.template_name() )?; + for parameter in parameters + { + let value = template_table.get( ¶meter ) + .and_then + ( + | item | + match item + { + toml_edit::Item::Value( toml_edit::Value::String( val ) ) => Some( val.value() ), + _ => None + } + ); + if let Some( value ) = value + { + self.get_values_mut().insert_if_empty( ¶meter, Value::String( value.into() ) ); + } + } + Some( () ) + } + + /// Get all template values. + fn get_values( &self ) -> &TemplateValues; + + /// Get all template values as a mutable reference. + fn get_values_mut( &mut self ) -> &mut TemplateValues; + + /// Fetches mandatory parameters that are not set yet. + fn get_missing_mandatory( &self ) -> Vec< &str > + { + let values = self.get_values(); + self + .parameters() + .list_mandatory() + .into_iter() + .filter( | key | values.0.get( *key ).map( | val | val.as_ref() ).flatten().is_none() ) + .collect() + } + } + + /// Files stored in a template. + /// + /// Can be iterated over, consuming the owner of the files. + pub trait TemplateFiles : IntoIterator< Item = TemplateFileDescriptor > + Sized + { + /// Creates all files in provided path with values for required parameters. + /// + /// Consumes owner of the files. + fn create_all( self, path : &Path, values : &TemplateValues ) -> Result< () > + { + let fsw = FileSystem; + for file in self.into_iter() + { + file.create_file( &fsw, path, values )?; + } + Ok( () ) + } + } + + /// Parameters required for the template. + #[ derive( Debug, Default, Former ) ] + pub struct TemplateParameters + { + #[ subform_entry( setter = false ) ] + descriptors : Vec< TemplateParameterDescriptor > + } + + impl TemplateParameters + { + /// Extracts template values from props for parameters required for this template. + pub fn values_from_props( &self, props : &Props ) -> TemplateValues + { + let values = self.descriptors + .iter() + .map( | d | &d.parameter ) + .map( | param | ( param.clone(), props.get( param ).map( Value::clone ) ) ) + .collect(); + TemplateValues( values ) + } + + /// Get a list of all mandatory parameters. + pub fn list_mandatory( &self ) -> Vec< &str > + { + self.descriptors.iter().filter( | d | d.is_mandatory ).map( | d | d.parameter.as_str() ).collect() + } + } + + /// Parameter description. + #[ derive( Debug, Default, Former ) ] + pub struct TemplateParameterDescriptor + { + parameter : String, + is_mandatory : bool, + } + + impl< Definition > TemplateParametersFormer< Definition > + where + Definition : former::FormerDefinition< Storage = < TemplateParameters as former::EntityToStorage >::Storage >, + { + #[ inline( always ) ] + pub fn parameter( self, name : &str ) -> + TemplateParameterDescriptorAsSubformer< Self, impl TemplateParameterDescriptorAsSubformerEnd< Self > > + { + self._descriptors_subform_entry::< TemplateParameterDescriptorFormer< _ >, _ >() + .parameter( name ) + } + } + + /// Holds a map of parameters and their values. + #[ derive( Debug, Default ) ] + pub struct TemplateValues( HashMap< String, Option< Value > > ); + + impl TemplateValues + { + /// Converts values to a serializable object. + /// + /// Currently only `String`, `Number`, and `Bool` are supported. + pub fn to_serializable( &self ) -> BTreeMap< String, String > + { + self.0.iter().map + ( + | ( key, value ) | + { + let value = value.as_ref().map + ( + | value | + { + match value + { + Value::String( val ) => val.to_string(), + Value::Number( val ) => val.to_string(), + Value::Path( _ ) => "unsupported".to_string(), + Value::Bool( val ) => val.to_string(), + Value::List( _ ) => "unsupported".to_string(), + } + } + ) + .unwrap_or( "___UNSPECIFIED___".to_string() ); + ( key.to_owned(), value ) + } + ) + .collect() + } + + /// Inserts new value if parameter wasn't initialized before. + pub fn insert_if_empty( &mut self, key : &str, value : Value ) + { + if let None = self.0.get( key ).and_then( | v | v.as_ref() ) + { + self.0.insert( key.into() , Some( value ) ); + } + } + + /// Interactively asks user to provide value for a parameter. + pub fn interactive_if_empty( &mut self, key : &str ) + { + if let None = self.0.get( key ).and_then( | v | v.as_ref() ) + { + println! ("Parameter `{key}` is not set" ); + let answer = wca::ask( "Enter value" ); + self.0.insert( key.into(), Some( Value::String( answer ) ) ); + } + } + } + + /// File descriptor for the template. + /// + /// Holds raw template data, relative path for the file, and a flag that + /// specifies whether the raw data should be treated as a template. + #[ derive( Debug, Former ) ] + pub struct TemplateFileDescriptor + { + path : PathBuf, + data : &'static str, + is_template : bool, + mode : WriteMode + } + + impl TemplateFileDescriptor + { + fn contents< FS : FileSystemPort >( &self, fs : &FS, path : &PathBuf, values : &TemplateValues ) + -> Result< String > + { + let contents = if self.is_template + { + self.build_template( values )? + } + else + { + self.data.to_owned() + }; + match self.mode + { + WriteMode::Rewrite => Ok( contents ), + WriteMode::TomlExtend => + { + let instruction = FileReadInstruction { path : path.into() }; + if let Some(existing_contents) = fs.read( &instruction ).ok() + { + let document = contents.parse::< toml_edit::Document >().context( "Failed to parse template toml file" )?; + let template_items = document.iter(); + let existing_toml_contents = String::from_utf8( existing_contents ).context( "Failed to read existing toml file as a UTF-8 String" )?; + let mut existing_document = existing_toml_contents.parse::< toml_edit::Document >().context( "Failed to parse existing toml file" )?; + for ( template_key, template_item ) in template_items + { + match existing_document.get_mut( &template_key ) + { + Some( item ) => *item = template_item.to_owned(), + None => existing_document[ &template_key ] = template_item.to_owned(), + } + } + return Ok( existing_document.to_string() ); + } + + Ok( contents ) + } + } + } + + fn build_template( &self, values : &TemplateValues ) -> Result< String > + { + let mut handlebars = handlebars::Handlebars::new(); + handlebars.register_escape_fn( handlebars::no_escape ); + handlebars.register_template_string( "templated_file", self.data )?; + handlebars.render( "templated_file", &values.to_serializable() ).context( "Failed creating a templated file" ) + } + + fn create_file< FS : FileSystemPort >( &self, fs : &FS, path : &Path, values : &TemplateValues ) -> Result< () > + { + let path = path.join( &self.path ); + let data = self.contents( fs, &path, values )?.as_bytes().to_vec(); + let instruction = FileWriteInstruction { path, data }; + fs.write( &instruction )?; + Ok( () ) + } + + } + + /// Determines how the template file should be written. + #[ derive( Debug, Default ) ] + pub enum WriteMode + { + /// Overwrites existing files. + #[default] + Rewrite, + /// Attempts to extend existing toml files. + /// + /// If files exists it searches for the same top-level items (tables, values) + /// and replaces them with template defined ones. + /// If file does not exist it creates a new one with contents provided by the template. + TomlExtend + } + + /// Helper builder for full template file list. + #[ derive( Debug, Former ) ] + pub struct TemplateFilesBuilder + { + /// Stores all file descriptors for current template. + #[ subform_entry( setter = true ) ] + #[ scalar( setter = false ) ] + pub files : Vec< TemplateFileDescriptor >, + } + + impl< Description > TemplateFilesBuilderFormer< Description > + where + Description : former::FormerDefinition< Storage = < TemplateFilesBuilder as former::EntityToStorage >::Storage >, + { + #[ inline( always ) ] + pub fn file( self ) -> TemplateFileDescriptorAsSubformer< Self, impl TemplateFileDescriptorAsSubformerEnd< Self > > + { + self._files_subform_entry() + } + } + + /// Instruction for writing a file. + #[ derive( Debug ) ] + pub struct FileWriteInstruction + { + path : PathBuf, + data : Vec< u8 >, + } + + /// Instruction for reading from a file. + #[ derive( Debug ) ] + pub struct FileReadInstruction + { + path : PathBuf, + } + + /// Describes how template file creation should be handled. + pub trait FileSystemPort + { + /// Writing to file implementation. + fn write( &self, instruction : &FileWriteInstruction ) -> Result< () >; + + /// Reading from a file implementation. + fn read( &self, instruction : &FileReadInstruction ) -> Result< Vec< u8 > >; + } + + // qqq : xxx : why not public? + struct FileSystem; + impl FileSystemPort for FileSystem + { + fn write( &self, instruction : &FileWriteInstruction ) -> Result< () > + { + let FileWriteInstruction { path, data } = instruction; + let dir = path.parent().context( "Invalid file path provided" )?; + if !dir.exists() + { + fs::create_dir_all( dir )?; + } + fs::write( path, data ).context( "Failed creating and writing to file" ) + } + + fn read( &self, instruction : &FileReadInstruction ) -> Result< Vec< u8 > > + { + let FileReadInstruction { path } = instruction; + fs::read( path ).context( "Failed reading a file" ) + } + + } + +} + +// + +crate::mod_interface! +{ + orphan use Template; + orphan use TemplateFiles; + orphan use TemplateFileDescriptor; + orphan use TemplateParameters; + orphan use TemplateParameterDescriptor; + orphan use TemplateValues; + orphan use TemplateFilesBuilder; + orphan use FileSystemPort; + orphan use FileWriteInstruction; + orphan use FileReadInstruction; + orphan use WriteMode; +} diff --git a/module/move/willbe/src/tool/url.rs b/module/move/willbe/src/tool/url.rs new file mode 100644 index 0000000000..f841613d79 --- /dev/null +++ b/module/move/willbe/src/tool/url.rs @@ -0,0 +1,46 @@ +mod private +{ + use error_tools::for_app:: + { + format_err, + Result, + }; + + /// Extracts the repository URL from a full URL. + pub fn extract_repo_url( full_url : &str ) -> Option< String > + { + let parts : Vec< &str > = full_url.split( '/' ).collect(); + + if parts.len() >= 4 && parts[ 0 ] == "https:" && parts[ 1 ] == "" && parts[ 2 ] == "github.com" + { + let user = parts[ 3 ]; + let repo = parts[ 4 ]; + let repo_url = format!( "https://github.com/{}/{}", user, repo ); + Some( repo_url ) + } + else + { + None + } + } + + /// Extracts the username and repository name from a given URL. + pub fn git_info_extract( url : &String ) -> Result< String > + { + let parts : Vec< &str > = url.split( '/' ).collect(); + if parts.len() >= 2 + { + Ok( format!( "{}/{}", parts[ parts.len() - 2 ], parts[ parts.len() - 1 ] ) ) + } + else + { + Err( format_err!( "Fail to extract git username and repository name" ) ) + } + } +} + +crate::mod_interface! +{ + protected use extract_repo_url; + protected use git_info_extract; +} diff --git a/module/move/willbe/src/wtools.rs b/module/move/willbe/src/wtools.rs new file mode 100644 index 0000000000..58a2d73144 --- /dev/null +++ b/module/move/willbe/src/wtools.rs @@ -0,0 +1,28 @@ +pub use error_tools::err; + +// pub use error_tools::BasicError; + +pub use mod_interface::mod_interface; + +/// error tools +pub mod error +{ + pub use error_tools::*; + pub use error_tools::for_lib::*; + pub use::error_tools::dependency::*; +} + +/// This module provides utilities for working with iterators. +pub mod iter +{ + pub use iter_tools::prelude::*; +} + +/// Collection of function and structures to manipulate paths. +pub mod path_tools +{ + // pub use proper_path_tools::protected::*; + // pub use proper_path_tools::protected::path; + // xxx : make use proper_path_tools::protected::path working + pub use proper_path_tools::path; +} diff --git a/module/move/willbe/template/deploy/.deploy_template.toml.hbs b/module/move/willbe/template/deploy/.deploy_template.toml.hbs new file mode 100644 index 0000000000..d38613b19f --- /dev/null +++ b/module/move/willbe/template/deploy/.deploy_template.toml.hbs @@ -0,0 +1,5 @@ +[deploy] +gcp_region = "{{gcp_region}}" +gcp_project_id = "{{gcp_project_id}}" +gcp_artifact_repo_name = "{{gcp_artifact_repo_name}}" +docker_image_name = "{{docker_image_name}}" diff --git a/module/move/willbe/template/deploy/Makefile.hbs b/module/move/willbe/template/deploy/Makefile.hbs new file mode 100644 index 0000000000..05601a05cf --- /dev/null +++ b/module/move/willbe/template/deploy/Makefile.hbs @@ -0,0 +1,209 @@ +.PHONY: deploy + +# Secrets that can be provided via ENV vars or files in ./key/ directory. + +# Hetzner API token +export SECRET_CSP_HETZNER ?= $(shell cat key/SECRET_CSP_HETZNER 2> /dev/null) +# Cloud Storage file encryption key +export SECRET_STATE_ARCHIVE_KEY ?= $(shell cat key/SECRET_STATE_ARCHIVE_KEY 2> /dev/null) +# AWS Access Key id +export SECRET_AWS_ACCESS_KEY_ID ?= $(shell cat key/SECRET_AWS_ACCESS_KEY_ID 2> /dev/null) +# AWS Access Key +export SECRET_AWS_ACCESS_KEY ?= $(shell cat key/SECRET_AWS_ACCESS_KEY 2> /dev/null) + +# Configuration variables for deployment. Can be edited for desired behavior. + +# Base terraform directory +export tf_dir ?= deploy +# Location for deployed resources +export TF_VAR_REGION ?= {{gcp_region}} +# Project id for deployed resources +export TF_VAR_PROJECT_ID ?= {{gcp_project_id}} +# Artifact Repository name for pushing the Docker images +export TF_VAR_REPO_NAME ?= {{gcp_artifact_repo_name}} +# Pushed image name +export TF_VAR_IMAGE_NAME ?= {{docker_image_name}} +# Path to the service account credentials +export google_sa_creds ?= key/service_account.json +# Cloud Storage bucket name +export TF_VAR_BUCKET_NAME ?= uaconf_tfstate +# Specifies where to deploy the project. Possible values: `hetzner`, `gce`, `aws` +export CSP ?= hetzner + +# Helper variables for deployment. + +# Helper var for tagging local image +export tag ?= $(TF_VAR_REGION)-docker.pkg.dev/$(TF_VAR_PROJECT_ID)/$(TF_VAR_REPO_NAME)/$(TF_VAR_IMAGE_NAME) +# Zone location for the resource +export TF_VAR_ZONE ?= $(TF_VAR_REGION)-a +# Hetzner Cloud auth token +export TF_VAR_HCLOUD_TOKEN ?= $(SECRET_CSP_HETZNER) +# AWS Access key for deploying to an EC2 instance +export AWS_ACCESS_KEY_ID ?= $(SECRET_AWS_ACCESS_KEY_ID) +# AWS Secret Access key for deploying to an EC2 instance +export AWS_SECRET_ACCESS_KEY ?= $(SECRET_AWS_ACCESS_KEY) + +# Check Hetzner and deployment related keys +check-hetzner-keys: + @[ -f key/SECRET_CSP_HETZNER ] \ + || [ ! -z "${SECRET_CSP_HETZNER}" ] \ + || { echo "ERROR: File key/SECRET_CSP_HETZNER does not exist"; exit 1; } + +# Check AWS and deployment related keys +check-aws-keys: + @[ -f key/SECRET_AWS_ACCESS_KEY_ID ] \ + || [ ! -z "${SECRET_AWS_ACCESS_KEY_ID}" ] \ + || echo "ERROR: File key/SECRET_AWS_ACCESS_KEY_ID does not exist" + @[ -f key/SECRET_AWS_ACCESS_KEY ] \ + || [ ! -z "${SECRET_AWS_ACCESS_KEY}" ] \ + || echo "ERROR: File key/SECRET_AWS_ACCESS_KEY does not exist" + @[ -f key/SECRET_AWS_ACCESS_KEY_ID ] \ + || [ ! -z "${SECRET_AWS_ACCESS_KEY_ID}" ] \ + || exit 1 + @[ -f key/SECRET_AWS_ACCESS_KEY ] \ + || [ ! -z "${SECRET_AWS_ACCESS_KEY}" ] \ + || exit 1 + +check-gce-keys: + @echo "All required GCE keys are the same as GCP keys" + +# Check if required GCP keys are present +check-gcp-keys: + @[ -f key/service_account.json ] \ + || echo "ERROR: File key/service_account.json does not exist" + @[ -f key/SECRET_STATE_ARCHIVE_KEY ] \ + || [ ! -z "${SECRET_STATE_ARCHIVE_KEY}" ] \ + || echo "ERROR: File key/SECRET_STATE_ARCHIVE_KEY does not exist" + @[ -f key/service_account.json ] \ + || exit 1 + @[ -f key/SECRET_STATE_ARCHIVE_KEY ] \ + || [ ! -z "${SECRET_STATE_ARCHIVE_KEY}" ] \ + || exit 1 + +# Start local docker container +start: + docker compose up -d + +# Stop local docker container +stop: + docker compose down + +# Remove created docker image +clean: stop + docker rmi $(TF_VAR_IMAGE_NAME) + docker buildx prune -af + +# Install gcloud for Debian/Ubuntu +install-gcloud: + # GCloud + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates gnupg curl sudo + curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg + echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list + sudo apt-get update && sudo apt-get install -y google-cloud-cli + +# Install terraform for Debian/Ubuntu +install-terraform: + sudo apt-get update && sudo apt-get install -y gnupg software-properties-common + wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg + gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint + echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list + sudo apt update && sudo apt-get install terraform + +# Install gcloud and terraform +install: install-gcloud install-terraform + gcloud --version + terraform -version + +# Login to GCP with user account +gcp-auth: + gcloud auth application-default login + +# Authorize to GCP with service account +gcp-service: + gcloud auth activate-service-account --key-file=$(google_sa_creds) + +# Add docker repo auth helper +gcp-docker: + gcloud auth configure-docker $(TF_VAR_REGION)-docker.pkg.dev --quiet + +# Initializes all terraform projects +# Downloads required modules and validates .tf files +tf-init: + terraform -chdir=$(tf_dir)/gar init + terraform -chdir=$(tf_dir)/gce init + terraform -chdir=$(tf_dir)/hetzner init + terraform -chdir=$(tf_dir)/aws init + +# Creates Artifact Registry repository on GCP in specified location +create-artifact-repo: tf-init + terraform -chdir=$(tf_dir)/gar apply -auto-approve + +# Builds uarust_conf_site image +build-image: + docker build . -t name:$(TF_VAR_IMAGE_NAME) -t $(tag) + +# Builds and pushes local docker image to the private repository +push-image: gcp-docker create-artifact-repo + docker push $(tag) + +# Creates GCE instance with the website configured on boot +create-gce: check-gce-keys gcp-service state_storage_pull push-image + terraform -chdir=$(tf_dir)/gce apply -auto-approve + +# Creates AWS EC2 instance with the website configured on boot +create-aws: check-aws-keys gcp-service state_storage_pull push-image + terraform -chdir=$(tf_dir)/aws apply -auto-approve + +# Creates Hetzner instance with the website configured on boot +create-hetzner: check-hetzner-keys gcp-service state_storage_pull push-image + terraform -chdir=$(tf_dir)/hetzner apply -auto-approve + +# Deploys everything and updates terraform states +deploy-in-container: create-$(CSP) state_storage_push + +# Deploys using tools from the container +deploy: check-gcp-keys build-image + docker build . -t deploy-$(TF_VAR_IMAGE_NAME) -f ./$(tf_dir)/Dockerfile --build-arg google_sa_creds="$(google_sa_creds)" + @docker run -v //var/run/docker.sock:/var/run/docker.sock -v .:/app \ + -e SECRET_STATE_ARCHIVE_KEY=$(SECRET_STATE_ARCHIVE_KEY) \ + -e SECRET_CSP_HETZNER=$(SECRET_CSP_HETZNER) \ + -e SECRET_AWS_ACCESS_KEY_ID=$(SECRET_AWS_ACCESS_KEY_ID) \ + -e SECRET_AWS_ACCESS_KEY=$(SECRET_AWS_ACCESS_KEY) \ + -e CSP=$(CSP) \ + --rm deploy-$(TF_VAR_IMAGE_NAME) + +# Review changes that terraform will do on apply +tf-plan: tf-init + terraform -chdir=$(tf_dir)/gar plan + terraform -chdir=$(tf_dir)/gce plan + terraform -chdir=$(tf_dir)/hetzner plan + terraform -chdir=$(tf_dir)/aws plan + +# Destroy created infrastracture on GCP +tf-destroy: tf-init + terraform -chdir=$(tf_dir)/gar destroy + terraform -chdir=$(tf_dir)/gce destroy + terraform -chdir=$(tf_dir)/hetzner destroy + terraform -chdir=$(tf_dir)/aws destroy + +# Pushes encrypted terraform state files to the GCS Bucket +state_storage_push: + @echo Pushing encrypted terraform state files to the GCS Bucket + @gcloud storage cp $(tf_dir)/gce/terraform.tfstate gs://$(TF_VAR_BUCKET_NAME)/gce.tfstate --encryption-key="$(SECRET_STATE_ARCHIVE_KEY)" + @gcloud storage cp $(tf_dir)/gar/terraform.tfstate gs://$(TF_VAR_BUCKET_NAME)/gar.tfstate --encryption-key="$(SECRET_STATE_ARCHIVE_KEY)" + @gcloud storage cp $(tf_dir)/hetzner/terraform.tfstate gs://$(TF_VAR_BUCKET_NAME)/hetzner.tfstate --encryption-key="$(SECRET_STATE_ARCHIVE_KEY)" + @gcloud storage cp $(tf_dir)/aws/terraform.tfstate gs://$(TF_VAR_BUCKET_NAME)/aws.tfstate --encryption-key="$(SECRET_STATE_ARCHIVE_KEY)" + +# Pulls and decrypts terraform state files to the GCS Bucket +state_storage_pull: + @echo Pulling terraform state files to the GCS Bucket + -@gcloud storage cp gs://$(TF_VAR_BUCKET_NAME)/gce.tfstate $(tf_dir)/gce/terraform.tfstate --decryption-keys="$(SECRET_STATE_ARCHIVE_KEY)" + -@gcloud storage cp gs://$(TF_VAR_BUCKET_NAME)/gar.tfstate $(tf_dir)/gar/terraform.tfstate --decryption-keys="$(SECRET_STATE_ARCHIVE_KEY)" + -@gcloud storage cp gs://$(TF_VAR_BUCKET_NAME)/hetzner.tfstate $(tf_dir)/hetzner/terraform.tfstate --decryption-keys="$(SECRET_STATE_ARCHIVE_KEY)" + -@gcloud storage cp gs://$(TF_VAR_BUCKET_NAME)/aws.tfstate $(tf_dir)/aws/terraform.tfstate --decryption-keys="$(SECRET_STATE_ARCHIVE_KEY)" + +# Creates GCS Bucket for terraform states +state_storage_init: + terraform -chdir=$(tf_dir)/gcs init + terraform -chdir=$(tf_dir)/gcs apply diff --git a/module/move/willbe/template/deploy/deploy/.gitignore b/module/move/willbe/template/deploy/deploy/.gitignore new file mode 100644 index 0000000000..5c6059c072 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/.gitignore @@ -0,0 +1,2 @@ +/*/.* +/*/*.tfstate* diff --git a/module/move/willbe/template/deploy/deploy/Dockerfile b/module/move/willbe/template/deploy/deploy/Dockerfile new file mode 100644 index 0000000000..c196de7aff --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/Dockerfile @@ -0,0 +1,23 @@ +FROM google/cloud-sdk +ENV TF_VERSION=1.7.4 + +WORKDIR / + +# Installation terraform +RUN apt update --allow-releaseinfo-change \ + && apt install wget unzip \ + && mkdir -p /usr/lib/terraform/${TF_VERSION} \ + && cd /usr/lib/terraform/${TF_VERSION} \ + && wget https://releases.hashicorp.com/terraform/${TF_VERSION}/terraform_${TF_VERSION}_linux_amd64.zip \ + && unzip terraform_${TF_VERSION}_linux_amd64.zip \ + && chmod 755 /usr/lib/terraform/${TF_VERSION}/terraform \ + && ln -s /usr/lib/terraform/${TF_VERSION}/terraform /usr/bin/terraform + +WORKDIR /app + +ARG google_sa_creds +ENV GOOGLE_APPLICATION_CREDENTIALS /app/$google_sa_creds + +VOLUME /var/run/docker.sock + +CMD [ "make", "deploy-in-container" ] diff --git a/module/move/willbe/template/deploy/deploy/Readme.md b/module/move/willbe/template/deploy/deploy/Readme.md new file mode 100644 index 0000000000..b513fb675e --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/Readme.md @@ -0,0 +1,20 @@ +# Terraform + +This directory contains [Compute Engine](gce/) and [Artifact Registry](gar/) terraform instructions for deploying the web app. + +- [gar/](gar/) - Directory contains all terraform resource declarations for creating a repository. + - [main.tf](./main.tf) - Resources. + - [outputs.tf](./outputs.tf) - Information to output after the creation of the resources. + - [variables.tf](./variables.tf) - Configurations for the resources to create. + - [.tfstate file](./terraform.tfstate) - Current state of GCP to help terraform correctly apply changes. +- [gce/](gce/) - Directory contains all terraform resource declarations for creating a Compute Engine instance. + - [main.tf](./main.tf) - Resources. + - [outputs.tf](./outputs.tf) - Information to output after the creation of the resources. + - [variables.tf](./variables.tf) - Configurations for the resources to create. + - [.tfstate file](./terraform.tfstate) - Current state of GCP to help terraform correctly apply changes. + - [templates](./templates/) - Contains templates to be used for resource creation. + - [templates/cloud-init.tpl](./templates/cloud-init.tpl) - Cloud-init script template to start docker container containing the webapp. + +To push an image to be deployed you need to have a [../Dockerfile](../Dockerfile) in the the same directory as your [../Makefile](../Makefile). + +[Compute Engine](gce/) is dependant on [Artifact Registry](gar/) so it's required to create [Artifact Registry](gar/) resources first. diff --git a/module/move/willbe/template/deploy/deploy/aws/main.tf b/module/move/willbe/template/deploy/deploy/aws/main.tf new file mode 100644 index 0000000000..4e83260aaf --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/aws/main.tf @@ -0,0 +1,80 @@ +provider "aws" { + region = "eu-west-3" +} + +# Search for Ubuntu 22.04 image to run on the instance +data "aws_ami" "ubuntu" { + most_recent = true + + filter { + name = "name" + values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"] + } + owners = ["amazon"] +} + +# Security group for the instance to allow for http and ssh connections +resource "aws_security_group" "allow_http_ssh" { + name = "allow_http" + description = "Allow http inbound traffic" + + + # Allows incoming requests on port 80 + ingress { + description = "http" + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + + } + # Allows incomming requests on port 22 + ingress { + description = "ssh" + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + + } + # Allows outgoing requests to any host on any port + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + + tags = { + Name = "allow_http_ssh" + } +} + +# EC2 instance itself +resource "aws_instance" "web" { + ami = data.aws_ami.ubuntu.id + instance_type = "t2.micro" + security_groups = ["${aws_security_group.allow_http_ssh.name}"] + + associate_public_ip_address = true + + # Startup script for the instance + # Installs docker, gcloud CLI, downloads docker images and starts the container + user_data = templatefile("${path.module}/templates/cloud-init.tpl", { + location = "${var.REGION}" + project_id = "${var.PROJECT_ID}" + repo_name = "${var.REPO_NAME}" + image_name = "${var.IMAGE_NAME}" + service_account_creds = "${replace(data.local_sensitive_file.service_account_creds.content, "\n", "")}" + timestamp = "${timestamp()}" + }) + + user_data_replace_on_change = true +} + +# Static IP address for the instace that will persist on restarts and redeploys +resource "aws_eip" "static" { + instance = aws_instance.web.id + domain = "vpc" +} diff --git a/module/move/willbe/template/deploy/deploy/aws/outputs.tf b/module/move/willbe/template/deploy/deploy/aws/outputs.tf new file mode 100644 index 0000000000..117f61a100 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/aws/outputs.tf @@ -0,0 +1,16 @@ +locals { + ip = aws_eip.static.public_ip +} + +# Output that we get after applying. +# IPv4 address of the created AWS EC2 instance. +output "ipv4" { + description = "The public IP address of the deployed instance" + value = local.ip +} + +# Output link to the deployed website. +output "http" { + description = "The public IP address of the deployed instance" + value = format("http://%s/", local.ip) +} diff --git a/module/move/willbe/template/deploy/deploy/aws/templates/cloud-init.tpl b/module/move/willbe/template/deploy/deploy/aws/templates/cloud-init.tpl new file mode 100644 index 0000000000..7a19732c3a --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/aws/templates/cloud-init.tpl @@ -0,0 +1,46 @@ +#cloud-config + +write_files: +- path: /etc/systemd/system/${image_name}.service + permissions: 0644 + owner: root + content: | + [Unit] + Description=Start ${image_name} docker container. Build: ${timestamp} + Wants=network-online.target + After=network-online.target + + [Service] + Environment="HOME=/root" + ExecStart=/usr/bin/docker run --restart unless-stopped -d -p 80:80 --name=${image_name} ${location}-docker.pkg.dev/${project_id}/${repo_name}/${image_name} +- path: /root/service_account.json + permissions: 0600 + owner: root + content: | + ${service_account_creds} +- path: /root/init.sh + permissions: 0700 + owner: root + content: | + # Install docker + apt update + apt install apt-transport-https ca-certificates curl software-properties-common -y + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - + add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + apt update + apt install docker-ce -y + # Install gcloud CLI + curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg + echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list + apt-get update + apt-get install -y google-cloud-cli + # Configure docker with gcloud + gcloud auth activate-service-account --key-file=/root/service_account.json + gcloud auth configure-docker ${location}-docker.pkg.dev --quiet + # Start docker container + systemctl daemon-reload + systemctl start ${image_name}.service + + +runcmd: +- nohup /root/init.sh > /var/log/uaconf-instance-init.log 2>&1 & diff --git a/module/move/willbe/template/deploy/deploy/aws/variables.tf b/module/move/willbe/template/deploy/deploy/aws/variables.tf new file mode 100644 index 0000000000..ede2b296f3 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/aws/variables.tf @@ -0,0 +1,24 @@ +# Specifies region location that's used for all GCP recources +variable "REGION" { + description = "region of the resources" +} + +# Project id where all resources will be created +variable "PROJECT_ID" { + description = "project id for the resources" +} + +# Artifact Registry repository name +variable "REPO_NAME" { + description = "artifact registry name" +} + +# Name of the docker image to pull +variable "IMAGE_NAME" { + description = "name of the webapp image" +} + +# Google Cloud Platform credentials +data "local_sensitive_file" "service_account_creds" { + filename = "${path.module}/../../key/service_account.json" +} diff --git a/module/move/willbe/template/deploy/deploy/gar/Readme.md b/module/move/willbe/template/deploy/deploy/gar/Readme.md new file mode 100644 index 0000000000..9d28cb2bc6 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gar/Readme.md @@ -0,0 +1,24 @@ +# Artifact Registry + +Directory contains all terraform resource declarations for creating a repository. + +- [main.tf](./main.tf) - Resources. +- [outputs.tf](./outputs.tf) - Information to output after the creation of the resources. +- [variables.tf](./variables.tf) - Configurations for the resources to create. +- [.tfstate file](./terraform.tfstate) - Current state of GCP to help terraform correctly apply changes. + +## Initialization + +Run `terraform init` to validate all resources and download required modules. + +## Planning + +Run `terraform plan` to review changes to be made by terraform. + +## Applying + +Run `terraform apply` to review changes to be made by terraform and create/modify resources. + +## Destroying + +Run `terraform destroy` to destroy created resources. diff --git a/module/move/willbe/template/deploy/deploy/gar/main.tf b/module/move/willbe/template/deploy/deploy/gar/main.tf new file mode 100644 index 0000000000..77709d13e6 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gar/main.tf @@ -0,0 +1,15 @@ +# Provider for resource creation +provider "google" { + project = var.PROJECT_ID +} + +# Artifact Registry block +resource "google_artifact_registry_repository" "container-images-repo" { + # Location for the repository + location = var.REGION + project = var.PROJECT_ID + repository_id = var.REPO_NAME + description = "Docker image registry for the Learn Together web-site" + # Format of the repository. We are using Docker. + format = "DOCKER" +} diff --git a/module/move/willbe/template/deploy/deploy/gar/outputs.tf b/module/move/willbe/template/deploy/deploy/gar/outputs.tf new file mode 100644 index 0000000000..4c4f920ac8 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gar/outputs.tf @@ -0,0 +1,6 @@ +# Output that we get after applying. +# Return name for the created repository for verification. +output "repo_name" { + description = "Name of the Artifact Registry" + value = google_artifact_registry_repository.container-images-repo.name +} diff --git a/module/move/willbe/template/deploy/deploy/gar/variables.tf b/module/move/willbe/template/deploy/deploy/gar/variables.tf new file mode 100644 index 0000000000..1a8e4ff9f8 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gar/variables.tf @@ -0,0 +1,14 @@ +# Specifies region location that will be used for all recources +variable "REGION" { + description = "region of the resources" +} + +# Project id where all resources will be created +variable "PROJECT_ID" { + description = "project id for the resources" +} + +# Artifact Registry repository name +variable "REPO_NAME" { + description = "artifact registry name" +} diff --git a/module/move/willbe/template/deploy/deploy/gce/Readme.md b/module/move/willbe/template/deploy/deploy/gce/Readme.md new file mode 100644 index 0000000000..f6a133d029 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gce/Readme.md @@ -0,0 +1,26 @@ +# Compute Engine + +Directory contains all terraform resource declarations for creating a Compute Engine instance. + +- [main.tf](./main.tf) - Resources. +- [outputs.tf](./outputs.tf) - Information to output after the creation of the resources. +- [variables.tf](./variables.tf) - Configurations for the resources to create. +- [.tfstate file](./terraform.tfstate) - Current state of GCP to help terraform correctly apply changes. +- [templates](./templates/) - Contains templates to be used for resource creation. + - [templates/cloud-init.tpl](./templates/cloud-init.tpl) - Cloud-init script template to start docker container containing the webapp. + +## Initialization + +Run `terraform init` to validate all resources and download required modules. + +## Planning + +Run `terraform plan` to review changes to be made by terraform. + +## Applying + +Run `terraform apply` to review changes to be made by terraform and create/modify resources. + +## Destroying + +Run `terraform destroy` to destroy created resources. diff --git a/module/move/willbe/template/deploy/deploy/gce/main.tf b/module/move/willbe/template/deploy/deploy/gce/main.tf new file mode 100644 index 0000000000..9e74a148e1 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gce/main.tf @@ -0,0 +1,88 @@ +locals { + # Helper var for formatting docker image name + image_name = format("%s-docker.pkg.dev/%s/%s/%s", var.REGION, var.PROJECT_ID, var.REPO_NAME, var.IMAGE_NAME) + # Helper var for formatting subnetwork for our instance + subnetwork = format("projects/%s/regions/%s/subnetworks/default", var.PROJECT_ID, var.REGION) + instance_name = format("ltsite-%s", formatdate("YYYYMMDDhhmmss", timestamp())) +} + +# Provider for resource creation +provider "google" { + project = var.PROJECT_ID +} + +# Static IP for our GCE instance so we don't lose the address after re-creating the instance. +resource "google_compute_address" "default" { + name = "lts-static-ip-address" + region = var.REGION +} + +# GCE instance block. +resource "google_compute_instance" "lts-container-vm" { + project = var.PROJECT_ID + # Instance name + name = local.instance_name + # Instance size. e2-micro is 0.25-2 vCPU & 1GB RAM + machine_type = "e2-micro" + zone = var.ZONE + + # Main disk options + boot_disk { + initialize_params { + # Disk image name. We're using Container-optimised OS (COS). + image = "projects/cos-cloud/global/images/cos-stable-109-17800-147-15" + # Disk size in GB. 10GB is allowed minimum. + size = 10 + # Disk type. Possible values: pd-standard, pd-ssd, or pd-balanced. + type = "pd-balanced" + } + } + + network_interface { + # Subnetwork to use. + subnetwork = local.subnetwork + access_config { + # Network tier for the instance. Possible values: PREMIUM or STANDARD. + network_tier = "STANDART" + # Set our static IP for the instance. + nat_ip = google_compute_address.default.address + } + } + + metadata = { + # Cloud-init startup script for configuring the instance with our docker container. + user-data = "${data.cloudinit_config.conf.rendered}" + } + + allow_stopping_for_update = true + + scheduling { + # Restart on failure. + automatic_restart = true + # Describes maintenance behavior for the instance. Possible values: MIGRATE or TERMINATE. + on_host_maintenance = "MIGRATE" + # Configures whether to allow stopping instance at any moment for reduced cost. + preemptible = false + # Configures spot instance. Possible values: SPOT or STANDARD. + provisioning_model = "STANDARD" + } + + # Configues service account scopes. + service_account { + scopes = [ + # Scope for reading data from buckets/Artifact Registry. + "https://www.googleapis.com/auth/devstorage.read_only", + # Logging and etc scopes + "https://www.googleapis.com/auth/logging.write", + "https://www.googleapis.com/auth/monitoring.write", + "https://www.googleapis.com/auth/service.management.readonly", + "https://www.googleapis.com/auth/servicecontrol", + "https://www.googleapis.com/auth/trace.append" + ] + } + + # Tags for the instance. + # `http-server` automatically allows all http traffic on port 80. + # Use `https-server` for https traffic on port 443. + tags = ["http-server"] +} diff --git a/module/move/willbe/template/deploy/deploy/gce/outputs.tf b/module/move/willbe/template/deploy/deploy/gce/outputs.tf new file mode 100644 index 0000000000..9228e2fa83 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gce/outputs.tf @@ -0,0 +1,16 @@ +locals { + ip = google_compute_instance.lts-container-vm.network_interface[0].access_config[0].nat_ip +} + +# Output that we get after applying. +# IPv4 address of the created GCE instance. +output "ipv4" { + description = "The public IP address of the deployed instance" + value = local.ip +} + +# Output link to the deployed website. +output "http" { + description = "The public IP address of the deployed instance" + value = format("http://%s/", local.ip) +} diff --git a/module/move/willbe/template/deploy/deploy/gce/templates/cloud-init.tpl b/module/move/willbe/template/deploy/deploy/gce/templates/cloud-init.tpl new file mode 100644 index 0000000000..5c465968d9 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gce/templates/cloud-init.tpl @@ -0,0 +1,24 @@ +#cloud-config + +users: +- name: ${image_name} + uid: 2000 + +write_files: +- path: /etc/systemd/system/${image_name}.service + permissions: 0644 + owner: root + content: | + [Unit] + Description=Start the Learn Together ${image_name} docker container + Wants=gcr-online.target + After=gcr-online.target + + [Service] + Environment="HOME=/home/${image_name}" + ExecStartPre=/usr/bin/docker-credential-gcr configure-docker --registries=${location}-docker.pkg.dev + ExecStart=/usr/bin/docker run -d -p 80:80 --name=${image_name} ${location}-docker.pkg.dev/${project_id}/${repo_name}/${image_name} + +runcmd: +- systemctl daemon-reload +- systemctl start ${image_name}.service \ No newline at end of file diff --git a/module/move/willbe/template/deploy/deploy/gce/variables.tf b/module/move/willbe/template/deploy/deploy/gce/variables.tf new file mode 100644 index 0000000000..c3e47c2765 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gce/variables.tf @@ -0,0 +1,48 @@ +# Specifies region location that will be used for all recources +variable "REGION" { + description = "region of the resources" +} + +# Specifies zone in the region that will be used for GCE instance +variable "ZONE" { + description = "zone of the resources" +} + +# Project id where all resources will be created +variable "PROJECT_ID" { + description = "project id for the resources" +} + +# Artifact Registry repository name +variable "REPO_NAME" { + description = "artifact registry name" +} + +# Name of the docker image to pull +variable "IMAGE_NAME" { + description = "name of the webapp image" +} + + +# Templated cloud-init file for providing vars to the boot script +data "template_file" "script" { + template = "${file("${path.module}/templates/cloud-init.tpl")}" + + vars = { + location = "${var.REGION}" + project_id = "${var.PROJECT_ID}" + repo_name = "${var.REPO_NAME}" + image_name = "${var.IMAGE_NAME}" + } +} + +# Rendered cloud-init file for startup configurations +data "cloudinit_config" "conf" { + gzip = false + base64_encode = false + + part { + content_type = "text/cloud-config" + content = "${data.template_file.script.rendered}" + } +} diff --git a/module/move/willbe/template/deploy/deploy/gcs/main.tf b/module/move/willbe/template/deploy/deploy/gcs/main.tf new file mode 100644 index 0000000000..42208a7f1e --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/gcs/main.tf @@ -0,0 +1,31 @@ +# Provider for resource creation +provider "google" { + project = var.PROJECT_ID +} + + +# Storage bucket itself +resource "google_storage_bucket" "tfstate-storage" { + name = var.BUCKET_NAME + location = var.REGION + # Delete files stored on the bucket when destroying the bucket + force_destroy = true + uniform_bucket_level_access = true + public_access_prevention = "enforced" +} + + +# Name of the bucket that will be created +variable "BUCKET_NAME" { + description = "name for the bucket to be created" +} + +# Specifies region location that will be used for all recources +variable "REGION" { + description = "region of the resources" +} + +# Project id where all resources will be created +variable "PROJECT_ID" { + description = "project id for the resources" +} diff --git a/module/move/willbe/template/deploy/deploy/hetzner/main.tf b/module/move/willbe/template/deploy/deploy/hetzner/main.tf new file mode 100644 index 0000000000..da3118ecef --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/hetzner/main.tf @@ -0,0 +1,49 @@ +terraform { + # Specifies terraform API provider to use for `hcloud` + required_providers { + hcloud = { + source = "hetznercloud/hcloud" + version = "1.45.0" + } + } +} + +# Configures hcloud provider for deploy +provider "hcloud" { + # Hetzner API token + token = var.HCLOUD_TOKEN +} + +# Static IP for the instance +resource "hcloud_primary_ip" "primary_ip" { + name = "uaconf-2024-ip" + datacenter = "hel1-dc2" + type = "ipv4" + assignee_type = "server" + auto_delete = false +} + +# Hetzner instance itself +resource "hcloud_server" "uaconf" { + name = "uaconf-2024" + image = "ubuntu-22.04" + server_type = "cx11" + datacenter = "hel1-dc2" + + public_net { + ipv4_enabled = true + ipv4 = hcloud_primary_ip.primary_ip.id + ipv6_enabled = false + } + + # Startup script for the instance + # Installs docker, gcloud CLI, downloads docker images and starts the container + user_data = templatefile("${path.module}/templates/cloud-init.tpl", { + location = "${var.REGION}" + project_id = "${var.PROJECT_ID}" + repo_name = "${var.REPO_NAME}" + image_name = "${var.IMAGE_NAME}" + service_account_creds = "${replace(data.local_sensitive_file.service_account_creds.content, "\n", "")}" + timestamp = "${timestamp()}" + }) +} diff --git a/module/move/willbe/template/deploy/deploy/hetzner/outputs.tf b/module/move/willbe/template/deploy/deploy/hetzner/outputs.tf new file mode 100644 index 0000000000..f6d2ebd5e8 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/hetzner/outputs.tf @@ -0,0 +1,16 @@ +locals { + ip = hcloud_server.uaconf.ipv4_address +} + +# Output that we get after applying. +# IPv4 address of the created GCE instance. +output "ipv4" { + description = "The public IP address of the deployed instance" + value = local.ip +} + +# Output link to the deployed website. +output "http" { + description = "The public IP address of the deployed instance" + value = format("http://%s/", local.ip) +} diff --git a/module/move/willbe/template/deploy/deploy/hetzner/templates/cloud-init.tpl b/module/move/willbe/template/deploy/deploy/hetzner/templates/cloud-init.tpl new file mode 100644 index 0000000000..37cb18d6e9 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/hetzner/templates/cloud-init.tpl @@ -0,0 +1,46 @@ +#cloud-config + +write_files: +- path: /etc/systemd/system/${image_name}.service + permissions: 0644 + owner: root + content: | + [Unit] + Description=Start ${image_name} docker container. Build: ${timestamp} + Wants=network-online.target + After=network-online.target + + [Service] + Environment="HOME=/root" + ExecStart=/usr/bin/docker run -d -p 80:80 --name=${image_name} ${location}-docker.pkg.dev/${project_id}/${repo_name}/${image_name} +- path: /root/service_account.json + permissions: 0600 + owner: root + content: | + ${service_account_creds} +- path: /root/init.sh + permissions: 0700 + owner: root + content: | + # Install docker + apt update + apt install apt-transport-https ca-certificates curl software-properties-common -y + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - + add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + apt update + apt install docker-ce -y + # Install gcloud CLI + curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg + echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list + apt-get update + apt-get install -y google-cloud-cli + # Configure docker with gcloud + gcloud auth activate-service-account --key-file=/root/service_account.json + gcloud auth configure-docker ${location}-docker.pkg.dev --quiet + # Start docker container + systemctl daemon-reload + systemctl start ${image_name}.service + + +runcmd: +- nohup /root/init.sh > /var/log/uaconf-instance-init.log 2>&1 & diff --git a/module/move/willbe/template/deploy/deploy/hetzner/variables.tf b/module/move/willbe/template/deploy/deploy/hetzner/variables.tf new file mode 100644 index 0000000000..92e5e44421 --- /dev/null +++ b/module/move/willbe/template/deploy/deploy/hetzner/variables.tf @@ -0,0 +1,29 @@ +# Hetzner API token +variable "HCLOUD_TOKEN" { + sensitive = true +} + +# Specifies region location that will be used for all recources +variable "REGION" { + description = "region of the resources" +} + +# Project id where all resources will be created +variable "PROJECT_ID" { + description = "project id for the resources" +} + +# Artifact Registry repository name +variable "REPO_NAME" { + description = "artifact registry name" +} + +# Name of the docker image to pull +variable "IMAGE_NAME" { + description = "name of the webapp image" +} + +# Google Cloud Platform credentials +data "local_sensitive_file" "service_account_creds" { + filename = "${path.module}/../../key/service_account.json" +} diff --git a/module/move/willbe/template/deploy/key/.gitignore b/module/move/willbe/template/deploy/key/.gitignore new file mode 100644 index 0000000000..38b7807347 --- /dev/null +++ b/module/move/willbe/template/deploy/key/.gitignore @@ -0,0 +1,4 @@ +* +!.gitignore +!*.md +!pack.sh diff --git a/module/move/willbe/template/deploy/key/Readme.md b/module/move/willbe/template/deploy/key/Readme.md new file mode 100644 index 0000000000..53c085c1cd --- /dev/null +++ b/module/move/willbe/template/deploy/key/Readme.md @@ -0,0 +1,92 @@ +# Deploy credentials + +A list of all keys you'd need to deploy your project on different hosts. + +- [Deploy credentials](#deploy-credentials) + - [Files](#files) + - [Env vars](#env-vars) + - [Retrieving keys](#retrieving-keys) + - [How to get `service_account.json`](#how-to-get-service_accountjson) + - [How to get `SECRET_STATE_ARCHIVE_KEY`](#how-to-get-secret_state_archive_key) + - [How to get `SECRET_CSP_HETZNER`](#how-to-get-secret_csp_hetzner) + - [How to get `SECRET_AWS_ACCESS_KEY_ID` and `SECRET_AWS_ACCESS_KEY`](#how-to-get-secret_aws_access_key_id-and-secret_aws_access_key) + +## Files + +All secrets can be provided as files in current directory: + +- [service_account.json](./service_account.json) - default credentials for the service account to use in deployment. +- [`SECRET_STATE_ARCHIVE_KEY`](./SECRET_STATE_ARCHIVE_KEY) - [📃] base64 encoded AES256 key to encrypt and decrypt .tfstate files. +- [`SECRET_CSP_HETZNER`](./SECRET_CSP_HETZNER) - [📃] Hetzner token for deploying a server. +- [`SECRET_AWS_ACCESS_KEY_ID`](./SECRET_AWS_ACCESS_KEY_ID) - [📃] Access Key ID from AWS Credentials. Created at the same time as the Access Key itself. +- [`SECRET_AWS_ACCESS_KEY`](./SECRET_AWS_ACCESS_KEY) - [📃] Access Key for AWS API. Has to be accompanied with respectful Access Key ID. + +## Env vars + +Some secrets can be presented as an env var: + +- [`SECRET_STATE_ARCHIVE_KEY`](./SECRET_STATE_ARCHIVE_KEY) - [📃] base64 encoded AES256 key to encrypt and decrypt .tfstate files. +- [`SECRET_CSP_HETZNER`](./SECRET_CSP_HETZNER) - [📃] Hetzner token for deploying a server. +- [`SECRET_AWS_ACCESS_KEY_ID`](./SECRET_AWS_ACCESS_KEY_ID) - [📃] Access Key ID from AWS Credentials. Created at the same time as the Access Key itself. +- [`SECRET_AWS_ACCESS_KEY`](./SECRET_AWS_ACCESS_KEY) - [📃] Access Key for AWS API. Has to be accompanied with respectful Access Key ID. + +Env vars have a higher priority then the files. + +For ENV [📃] secrets values can be placed in files in this directory for automatic exporting to env during deployment. + +Example of a file that will be pulled to env vars: + +File name: `SECRET_CSP_HETZNER` +File contents: +``` +hetzner_token_123 +``` + +Will export a variable to env like so `SECRET_CSP_HETZNER=hetzner_token_123` + +## Retrieving keys + +Explanation for fetching all required keys. + +### How to get `service_account.json` + +You can put your service account keys here for them to be used in deployment. + +Get your key from GCP panel at https://console.cloud.google.com/iam-admin/serviceaccounts + +Service Account -> Keys -> Add Key -> Create new key -> JSON + +Default key name is `service_account.json`, this can be modified in the [Makefile](../Makefile). + +### How to get `SECRET_STATE_ARCHIVE_KEY` + +You can generate this key via multiple ways. + +This page on GCP describes some methods you could utilize for generation: + +https://cloud.google.com/storage/docs/encryption/using-customer-supplied-keys + +### How to get `SECRET_CSP_HETZNER` + +This key can be retrieved from your Hetzner dashboard. + +Cloud Console -> Security -> API Tokens -> Generate API Token + +Fill the token description and all `Read & Write` access, since this key will be used for instance creation. + +### How to get `SECRET_AWS_ACCESS_KEY_ID` and `SECRET_AWS_ACCESS_KEY` + +Can be created in your AWS Console on the following the link: +https://console.aws.amazon.com/iam/home?#security_credential + +Access Keys -> Create Access Key -> Other -> Next -> Fill key description -> Create Access Key + +The Access Key ID will be always available to view, but secret access key is only visible after the key creation. + +You need to have credential creation permissions on your AWS account. + +An example of permissions to give to an account managing the deployment can be found here: +https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage-no-mfa.html + +You also need to give [AmazonEC2FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2FullAccess.html) +permission for your user to create an EC2 instance. diff --git a/module/move/willbe/template/deploy/key/pack.sh b/module/move/willbe/template/deploy/key/pack.sh new file mode 100755 index 0000000000..bebae09479 --- /dev/null +++ b/module/move/willbe/template/deploy/key/pack.sh @@ -0,0 +1,22 @@ +#!/bin/bash +FILE_PATH="$( realpath -qms "${BASH_SOURCE[0]:-$PWD}" )" +DIR_PATH="${FILE_PATH%/*}" + +cat << EOF > ${DIR_PATH}/unpack.sh +#!/bin/bash +FILE_PATH="\$( realpath -qms "\${BASH_SOURCE[0]:-\$PWD}" )" +DIR_PATH="\${FILE_PATH%/*}" + + +EOF +for filepath in ${DIR_PATH}/* +do + [[ "$filepath" == *.md ]] && continue + [[ "$filepath" == *.sh ]] && continue + echo $filepath + cat << EOFOut >> ${DIR_PATH}/unpack.sh +head -c -1 << EOF > \${DIR_PATH}/$(basename $filepath) +$(cat $filepath) +EOF +EOFOut +done diff --git a/module/move/willbe/template/workflow/Description.md b/module/move/willbe/template/workflow/Description.md new file mode 100644 index 0000000000..4ce26513f4 --- /dev/null +++ b/module/move/willbe/template/workflow/Description.md @@ -0,0 +1,19 @@ +### Templates and static files for .workflow.generate command + +## Static files + +- appropriate_branch.yml +- auto_pr.yml +- rust_clean.yml +- standard_rust_push.yml +- standard_rust_scheduled.yml +- standard_rust_status.yml +- status_checks_rules_update.yml + +## Templates that depend on branch names, module paths, module names, and repository url + +- appropraite_branch_for.hbs +- auto_merge_to.hbs +- auto_pr_to.hbs +- module_push.hbs +- standard_rust_pull_request.hbs \ No newline at end of file diff --git a/module/move/willbe/template/workflow/Readme.md b/module/move/willbe/template/workflow/Readme.md new file mode 100644 index 0000000000..52ce58143f --- /dev/null +++ b/module/move/willbe/template/workflow/Readme.md @@ -0,0 +1,133 @@ +# healthtable + +[healthtable](../../Readme.md) - in addition to information about modules, their stability contains the results of CI/CD of the master and alpha branches. + +# for_pr_rust_push.yml + +actions: +- install stable rust +- install nightly rust +- install willbe +- run tests with all features, but only on stable toolchain and in debug optimization mode + +Groups creates by strategy: +```yml +for_pr_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} +``` + +inputs.module_name - name of module +github.ref - name of branch +{{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} - returns true if commit message contains directive `+test` or starts with `merge` word. + +runs if commit message contains directive `+test` or starts with `merge` word. + +# standard_rust_push.yml + +actions: +- install stable rust +- install nightly rust +- install cargo-udeps +- install cargo-audit +- checks crate with cargo-udeps +- checks crete with cargo-audit +- install willbe +- run tests with all features, with stable and nightly toolchain, with release and debug optimization mode + +Groups creates by strategy: +```yml +standard_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} +``` + +inputs.module_name - name of module +github.ref - name of branch +{{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} - returns true if commit message contains directive `+test` or starts with `merge` word. + +runs if commit message contains directive `+test` or starts with `merge` word. + +# standard_rust_pool_request.yml + +actions: +- call [for_pr_rust_push.yml](#for_pr_rust_pushyml) for all project. + +# standard_rust_schedule.yml + +actions: +- call [standard_rust_push.yml](#standard_rust_pushyml) for `{module_name}` every day at 1:00 a.m. + +Affects badges in the header of the workspace readme.md file, looks like this [![wTools](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/standard_rust_scheduled.yml?label=master&logo=github&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/standard_rust_scheduled.yml). + +# module_{module_name}_push.yml + +actions: +- call [standard_rust_push.yml](#standard_rust_pushyml) for `{module_name}`. + +Affects badges that are opposite to modules in the **[healthtable](#healthtable)**, as well as badges in the header of the crate readme.md files. + + +# appropriate_branch.yml + +This workflow ensures that pull requests are opened against the correct target branches based on a predefined branching strategy (alpha -> beta -> master). It checks whether the destination branch specified in the pull request matches the expected branch according to the branching strategy. If it doesn't match, the pull request is converted to draft mode, and if it still doesn't match, the workflow fails. + +# appropriate_branch_beta.yml + +This workflow delegates the actual validation and actions to another workflow file (appropriate_branch.yml) located in the Wandalen/wTools repository under .github/workflows directory on the "alpha" branch. It ensures that pull requests targeting the "beta" branch are appropriately validated and processed according to the rules defined in the external workflow file. + +# appropriate_branch_master.yml + +Similar to the previous workflow, this one also delegates the validation and processing of pull requests to an external workflow file (appropriate_branch.yml) located in the Wandalen/wTools repository under the .github/workflows directory on the "alpha" branch. +By specifying the "beta" branch as the source branch and dynamically referencing the base branch of the pull request as the destination branch, this workflow ensures that pull requests targeting the "main" or "master" branches are appropriately validated and processed according to the rules defined in the external workflow file. +This setup promotes consistency and reusability of workflow logic across different branches within the repository, helping to maintain a standardized process for handling pull requests. + +# auto_merge_to_beta.yml + +This workflow automates the process of merging changes from the "alpha" branch into the "beta" branch after ensuring that related workflow runs for modules have completed successfully. +It waits for the completion of workflow runs related to modules and checks their statuses before proceeding with the merge process. +If all checks pass, it merges the changes into the "beta" branch using the provided GitHub token. + +# auto_pr.yml + +This workflow automates the process of opening pull requests between specified source and destination branches. +Upon triggering, it checks out the repository and opens a pull request from the source branch (src_branch) to the destination branch (dst_branch). +The pull request title is automatically generated to indicate that it's an automated pull request forwarding from one branch to another. +If a pull request already exists between the specified branches and PASS_IF_EXISTS is set to true, the action will pass without creating a new pull request. + +# auto_pr_to_alpha.yml + +This workflow automates the process of opening pull requests from any branch except for those explicitly excluded to the "alpha" branch. +It leverages branch filtering to include all branches and exclude specific ones such as master, main, alpha, beta, and any branches containing test or experiment in their names. +When triggered by a push event on a qualifying branch, it calls the external workflow (auto_pr.yml) to handle the process of opening a pull request to the "alpha" branch, passing the source and destination branch information along with the GitHub bot token for authentication. + +# auto_pr_to_beta.yml + +This workflow automates the process of opening pull requests from the "alpha" branch to the "beta" branch. +When triggered by a push event on the "alpha" branch, it calls the external workflow (auto_pr.yml) to handle the process of opening a pull request to the "beta" branch, passing the source and destination branch information along with the GitHub bot token for authentication. + +# auto_pr_to_master.yml + +This workflow automates the process of opening pull requests from the "beta" branch to the "master" branch. +When triggered by a push event on the "beta" branch, it calls the external workflow (auto_pr.yml) to handle the process of opening a pull request to the "master" branch, passing the source and destination branch information along with the GitHub bot token for authentication. + +# runs_clean.yml + +This workflow allows manual triggering to clean up workflow runs in the repository. +It first deletes any runs that have been cancelled or skipped, ensuring that they do not clutter the workflow history. +Then, it deletes runs older than a specified number of days, while ensuring that at least 20 runs are preserved regardless of their age. +By regularly cleaning up older workflow runs, this workflow helps maintain a clean and organized workflow history in the repository. + +# standard_rust_status.yml + +This workflow serves as a status monitor for the completion of specific workflows: "auto_merge_to_beta" and "rust_scheduled." +Upon completion of any of these workflows, it checks the status of their runs. +It employs a matrix strategy to iterate over different workflow files to check their statuses. +If the conclusion of any checked workflow run is "failure," "cancelled," or "skipped," the workflow exits with an error, indicating a problem. + +# status_checks_rules_update.yml + +When a pull request is opened targeting branches "alpha" or "beta": +- If the base branch is "beta": + - It compares the contents of the workflow directories between branches "alpha" and "beta". + - If they are not equal, it triggers an update of branch protection rules for the "beta" branch. +- If the base branch is "alpha": + - It directly triggers an update of branch protection rules for the "alpha" branch with specific required status checks for different contexts. \ No newline at end of file diff --git a/module/move/willbe/template/workflow/appropraite_branch_for.hbs b/module/move/willbe/template/workflow/appropraite_branch_for.hbs new file mode 100644 index 0000000000..e976386064 --- /dev/null +++ b/module/move/willbe/template/workflow/appropraite_branch_for.hbs @@ -0,0 +1,17 @@ + +name : appropriate_branch_{{name}} + +on : + pull_request_target : + branches : + {{branches}} + +jobs : + + appropriate_branch : + uses : {{username_and_repository}}/.github/workflows/appropriate_branch.yml@{{uses_branch}} + with : + src_branch : '{{src_branch}}' + dst_branch : '$\{{ github.base_ref }}' + secrets : + PRIVATE_GITHUB_BOT_TOKEN : '$\{{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}' diff --git a/module/move/willbe/template/workflow/appropriate_branch.yml b/module/move/willbe/template/workflow/appropriate_branch.yml new file mode 100644 index 0000000000..a966ab13cf --- /dev/null +++ b/module/move/willbe/template/workflow/appropriate_branch.yml @@ -0,0 +1,58 @@ + +name : appropriate_branch + +on : + + workflow_call : + inputs : + src_branch : + required : true + type : string + dst_branch : + required : true + type : string + secrets : + PRIVATE_GITHUB_BOT_TOKEN : + description : 'Github bot token' + required : true + +env : + + CARGO_TERM_COLOR : always + +concurrency : + + group : appropraite_branch_${{ inputs.src_branch }}_${{ inputs.dst_branch }} + cancel-in-progress : true + +jobs : + + check : + runs-on : ubuntu-latest + outputs : + shouldSkip : ${{ steps.validation.outputs.wrong-target }} + steps : + - name : Check branch + id : validation + uses : Vankka/pr-target-branch-action@v2.1 + env : + GITHUB_TOKEN : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + with : + target : ${{ inputs.dst_branch }} + exclude : ${{ inputs.src_branch }} + comment : | + To maintain stability of the module the repository uses 3-stages system to forward changes from an unstable branch to a stable. + The unstable branch is `alpha`. All user pull requests should be opened to this branch. + The staging branch is `beta`. Changes to this branch are forwarded by a pull request from branch `alpha` automatically. + The stable branch is `master`. Changes to this branch are forwarded by a pull request from branch `beta` automatically. + + The pull request was automatically converted to draft. + Please, change base branch taking into account the described system `alpha -> beta -> master`. + - name : Convert to draft + if : ${{ steps.validation.outputs.wrong-target == 'true' }} + uses: voiceflow/draft-pr@latest + with: + token: ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + - name : Failure + if : ${{ steps.validation.outputs.wrong-target == 'true' }} + run : exit 1 diff --git a/module/move/willbe/template/workflow/auto_merge_to.hbs b/module/move/willbe/template/workflow/auto_merge_to.hbs new file mode 100644 index 0000000000..61a949c664 --- /dev/null +++ b/module/move/willbe/template/workflow/auto_merge_to.hbs @@ -0,0 +1,95 @@ + +name : auto_merge_to_{{name}} + +on : + push : + branches : [ {{branch}} ] + +concurrency : + + group : auto_merge_to_{{ group_branch }} + cancel-in-progress : true + +jobs : + + get_modules: + outputs : + workflow_files: $\{{ steps.workflow_files.outputs.files }} + workflow_names: $\{{ steps.workflow_names.outputs.names }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - id: workflow_files + run: | + WORKFLOWS=$(ls .github/workflows | grep module) + for WORKFLOW in $WORKFLOWS ; do + NAME=$(echo $WORKFLOW | sed 's/\(\S\+\).yml/\1/') + NAMES="$NAMES $NAME" + done; + NAMES=$(sed 's/\s\+/\n/g' <<< $NAMES) + OUTPUT=$(echo "$NAMES" | jq -R -s -c 'split("\n")[1:-1]') + echo "files={\"modules\":$OUTPUT}" >> $GITHUB_OUTPUT + - id: workflow_names + run: | + WORKFLOWS=$(ls .github/workflows | grep module) + for WORKFLOW in $WORKFLOWS ; do + NAME=$(cat .github/workflows/$WORKFLOW | grep -G '^name :' | sed 's/name\s*:\s\+\(\S*\)/\1/') + NAMES="$NAMES%0A$NAME" + done; + echo "names=$NAMES" >> $GITHUB_OUTPUT + + wait_for_modules : + needs : get_modules + runs-on : ubuntu-latest + steps : + - name : Waiting ... + uses : willgarcia/workflow-wait-action@main + with : + timeout : 21600 + interval : 60 + initial_delay : 60 + workflows : $\{{ needs.get_modules.outputs.workflow_names }} + + runs_check : + needs : + - get_modules + - wait_for_modules + strategy : + matrix : $\{{ fromJSON( needs.get_modules.outputs.workflow_files ) }} + runs-on : ubuntu-latest + steps : + - name : Check workflow run status + id : check_ci + uses : ronymeyer/workflow-status@v0.3.7 + with : + token : $\{{ secrets.GITHUB_TOKEN }} + workflow : $\{{ matrix.modules }}.yml + event : push + branch : {{branch}} + - name : Check failure conclusion + if : $\{{ steps.check_ci.outputs.conclusion == 'failure' }} + run : exit 1 + - name : Check cancelled conclusion + if : $\{{ steps.check_ci.outputs.conclusion == 'cancelled' }} + run : exit 1 + - name : Check skipped conclusion + if : $\{{ steps.check_ci.outputs.conclusion == 'skipped' }} + run : exit 1 + + merge : + needs : runs_check + runs-on : ubuntu-latest + steps : + - name : Find PR number for current commit + uses : jwalton/gh-find-current-pr@v1 + id : find + with : + state: open + - name: Automerge passed pull request + if : $\{{ success() }} + uses: juliangruber/merge-pull-request-action@v1 + with: + github-token: $\{{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + repo: $\{{ github.repository }} + number: $\{{ steps.find.outputs.number }} + method: merge diff --git a/module/move/willbe/template/workflow/auto_pr.yml b/module/move/willbe/template/workflow/auto_pr.yml new file mode 100644 index 0000000000..bd87d03d26 --- /dev/null +++ b/module/move/willbe/template/workflow/auto_pr.yml @@ -0,0 +1,36 @@ + +name : auto_pr + +on : + + workflow_call : + inputs : + src_branch : + required : true + type : string + dst_branch : + required : true + type : string + secrets : + PRIVATE_GITHUB_BOT_TOKEN : + description : 'Github bot token' + required : true + +concurrency : + + group : auto_pr_${{ inputs.src_branch }}_${{ inputs.dst_branch }} + cancel-in-progress : true + +jobs : + + build : + runs-on : ubuntu-latest + steps : + - uses : actions/checkout@v3 + - name : Open PR + uses : vsoch/pull-request-action@1.1.0 + env : + GITHUB_TOKEN : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + PULL_REQUEST_BRANCH : ${{ inputs.dst_branch }} + PULL_REQUEST_TITLE : 'AUTO : Forward from ${{ inputs.src_branch }} to ${{ inputs.dst_branch }}' + PASS_IF_EXISTS : true diff --git a/module/move/willbe/template/workflow/auto_pr_to.hbs b/module/move/willbe/template/workflow/auto_pr_to.hbs new file mode 100644 index 0000000000..b8edfd3136 --- /dev/null +++ b/module/move/willbe/template/workflow/auto_pr_to.hbs @@ -0,0 +1,17 @@ + +name : auto_pr_to_{{name}} + +on : + push : + branches : + {{{branches}}} + +jobs : + + forward : + uses : {{username_and_repository}}/.github/workflows/auto_pr.yml@{{uses_branch}} + with : + src_branch : '{{src_branch}}' + dst_branch : '{{dest_branch}}' + secrets : + PRIVATE_GITHUB_BOT_TOKEN : '$\{{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}' diff --git a/module/move/willbe/template/workflow/for_pr_rust_push.yml b/module/move/willbe/template/workflow/for_pr_rust_push.yml new file mode 100644 index 0000000000..edbc5aa907 --- /dev/null +++ b/module/move/willbe/template/workflow/for_pr_rust_push.yml @@ -0,0 +1,72 @@ + +name : for_pr_push + +on : + + workflow_call : + inputs : + manifest_path : + required : true + type : string + module_name : + required : true + type : string + commit_message : + required : true + type : string + with_smoke : + required : false + type : string + default : true + +concurrency : + + group : for_pr_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} + cancel-in-progress : true + +env : + + RUST_BACKTRACE : 1 + CARGO_TERM_COLOR : always + WITH_SMOKE : ${{ inputs.with_smoke }} + +jobs : + + will_test : + if : contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + concurrency : + group : for_pr_rust_push_${{ inputs.module_name }}_${{ github.ref }}_${{ matrix.os }} + cancel-in-progress : true + strategy : + fail-fast : false + matrix : + os : [ ubuntu-latest, windows-latest, macos-latest ] + runs-on : ${{ matrix.os }} + steps : + - name : Install latest stable toolchain + uses : Wandalen/wretry.action/main@master + with : + action : actions-rs/toolchain@v1 + with : | + toolchain : stable + override : true + attempt_limit : 3 + attempt_delay: 10000 + - name: Install latest nightly toolchain + uses: Wandalen/wretry.action/main@master + with: + action: actions-rs/toolchain@v1 + with: | + toolchain : nightly + override : true + attempt_limit: 3 + attempt_delay: 10000 + - uses: actions/checkout@v3 + - name: Install will + run: cargo install --git https://github.com/Wandalen/wTools --branch alpha willbe + - name: Set MANIFEST_ROOT_PATH + id: rootpath + run: echo "::set-output name=path::$(dirname ${{ inputs.manifest_path }})" + - name: Run tests with each feature + run: will .test ${{ steps.rootpath.outputs.path }}/ dry:0 exclude:'' with_all_features:1 with_debug:1 with_nightly:0 with_none_features:1 with_release:0 with_stable:1 \ No newline at end of file diff --git a/module/move/willbe/template/workflow/module_push.hbs b/module/move/willbe/template/workflow/module_push.hbs new file mode 100644 index 0000000000..c3611bd498 --- /dev/null +++ b/module/move/willbe/template/workflow/module_push.hbs @@ -0,0 +1,23 @@ +name : {{name}} + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # {{name}} + + test : + uses : {{username_and_repository}}/.github/workflows/standard_rust_push.yml@{{branch}} + with : + manifest_path : '{{manifest_path}}' + module_name : '{{name}}' + commit_message : $\{{ github.event.head_commit.message }} diff --git a/module/move/willbe/template/workflow/rust_clean.yml b/module/move/willbe/template/workflow/rust_clean.yml new file mode 100644 index 0000000000..e05465ed0d --- /dev/null +++ b/module/move/willbe/template/workflow/rust_clean.yml @@ -0,0 +1,38 @@ + +name : runs_clean + +on : + + workflow_dispatch : + inputs : + days : + description : 'Older than number of days.' + required : true + type : number + default : 0 + +concurrency : + + group : runs_clean + cancel-in-progress : true + +jobs : + + del_runs : + runs-on : ubuntu-latest + steps : + - name : Delete skipped and cancelled runs + uses : dmvict/clean-workflow-runs@v1 + with : + token : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + run_conclusions : | + cancelled + skipped + save_period : 0 + save_min_runs_number : 0 + - name : Delete older workflow runs + uses : dmvict/clean-workflow-runs@v1 + with : + token : ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }} + save_period : ${{ github.event.inputs.days }} + save_min_runs_number : 20 diff --git a/module/move/willbe/template/workflow/standard_rust_pull_request.hbs b/module/move/willbe/template/workflow/standard_rust_pull_request.hbs new file mode 100644 index 0000000000..dc2999f144 --- /dev/null +++ b/module/move/willbe/template/workflow/standard_rust_pull_request.hbs @@ -0,0 +1,51 @@ + +name : rust_pull_request + +on : [ pull_request ] + +env : + CARGO_TERM_COLOR : always + +concurrency : + group : standard_rust_pull_request_$\{{ github.event.base.ref }}_$\{{ github.event.number }} + cancel-in-progress : true + +jobs : + + check : + if : $\{{ github.event.pull_request.head.repo.fork }} + runs-on : ubuntu-latest + outputs : + commit_message : $\{{ steps.message.outputs.message }} + should_run : $\{{ steps.run.outputs.should_run }} + steps : + - name : List commits on the pull request + run : | + response=$(curl --request GET \ + --url 'https://api.github.com/repos/$\{{ github.repository }}/pulls/$\{{ github.event.pull_request.number }}/commits' \ + --header 'Authorization: token $\{{ secrets.GITHUB_TOKEN }}' \ + --header 'Accept: application/vnd.github.v3+json' \ + --header 'Content-Type: application/json') + echo $response > response.json + - name : Get latest commit + id : message + run : | + length=$(jq 'length' response.json) + index=$(($length - 1)) + latest_commit=$(jq --argjson index $index '.[$index]' response.json) + latest_commit_message=$(echo "$latest_commit" | jq -r '.commit.message' | tr -d '\n') + echo "message=$latest_commit_message" >> $GITHUB_OUTPUT + - name : Set output + id: run + if : "!startsWith( steps.message.outputs.message, 'Merge ' )" + run : echo "should_run=true" >> $GITHUB_OUTPUT + + tested : + needs: check + if : $\{{ needs.check.outputs.should_run == 'true' }} + uses : {{username_and_repository}}/.github/workflows/for_pr_rust_push.yml@alpha + with : + manifest_path : './Cargo.toml' + module_name : $\{{ github.event.base.ref }}_$\{{ github.event.number }} + commit_message : "+test_$\{{ github.event.base.ref }}_$\{{ github.event.number }}" + with_smoke : false diff --git a/module/move/willbe/template/workflow/standard_rust_push.yml b/module/move/willbe/template/workflow/standard_rust_push.yml new file mode 100644 index 0000000000..1812c69512 --- /dev/null +++ b/module/move/willbe/template/workflow/standard_rust_push.yml @@ -0,0 +1,157 @@ + +name : rust_push + +on : + + workflow_call : + inputs : + manifest_path : + required : true + type : string + module_name : + required : true + type : string + commit_message : + required : true + type : string + with_smoke : + required : false + type : string + default : true + +concurrency : + + group : standard_rust_push_${{ inputs.module_name }}_${{ github.ref }}_ + ${{ contains( inputs.commit_message, '+test' ) || startsWith( inputs.commit_message, 'merge' ) }} + cancel-in-progress : true + +env : + + RUST_BACKTRACE : 1 + CARGO_TERM_COLOR : always + WITH_SMOKE : ${{ inputs.with_smoke }} + +jobs : + + checkmate: + if : contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + runs-on: ubuntu-latest + steps: + - name: Install latest nightly toolchain + uses: Wandalen/wretry.action/main@master + with: + action: actions-rs/toolchain@v1 + with: | + toolchain : nightly + override : true + components : clippy + attempt_limit: 3 + attempt_delay: 10000 + - uses: actions/checkout@v3 + + - name: Install cargo-audit + run: cargo install cargo-audit + - name: Install cargo-udeps + run: cargo install cargo-udeps --locked + + - name: Set MANIFEST_ROOT_PATH + id: rootpath + run: echo "::set-output name=path::$(dirname ${{ inputs.manifest_path }})" + - name: Audit the modules + run: cd ${{ steps.rootpath.outputs.path }} && make audit + continue-on-error: true + - name: Generate documentation for the modules + run: make doc open=no manifest_path=${{ inputs.manifest_path }} + continue-on-error: true + - name: Lint the modules + run: make lint manifest_path=${{ inputs.manifest_path }} warnings=no + continue-on-error: true + - name: Check the modules + run: make check manifest_path=${{ inputs.manifest_path }} + continue-on-error: true + - name: Check the modules dependencies + run: cargo +nightly udeps --all-targets --manifest-path ${{ inputs.manifest_path }} + continue-on-error: true + +# release: +# if: contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) +# strategy: +# fail-fast: false +# matrix: +# os: [ ubuntu-latest, windows-latest, macos-latest ] +# runs-on: ${{ matrix.os }} +# steps: +# - name: Install latest stable toolchain +# uses: Wandalen/wretry.action@master +# with: +# action: actions-rs/toolchain@v1 +# with: | +# toolchain : stable +# override : true +# attempt_limit: 3 +# attempt_delay: 10000 +# - uses: actions/checkout@v3 +# with: +# ref: alpha +# +# - name: Make release build +# run: cargo build --manifest-path ${{ inputs.manifest_path }} --release + + # miri: + # if: contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + # runs-on: ubuntu-latest + # steps: + # - name: Install latest nightly toolchain + # uses: Wandalen/wretry.action@master + # with: + # action: actions-rs/toolchain@v1 + # with: | + # toolchain : nightly + # override : true + # components : miri + # attempt_limit: 3 + # attempt_delay: 10000 + # - uses: actions/checkout@v3 + # with: + # ref: alpha + + # - name: Test with miri + # run: cargo miri test --manifest-path ${{ inputs.manifest_path }} + + will_test : + if : contains( inputs.commit_message, '+test' ) || contains( inputs.commit_message, 'merge' ) + concurrency : + group : standard_rust_push_${{ inputs.module_name }}_${{ github.ref }}_${{ matrix.os }} + cancel-in-progress : true + strategy : + fail-fast : false + matrix : + os : [ ubuntu-latest, windows-latest, macos-latest ] + runs-on : ${{ matrix.os }} + steps : + - name : Install latest stable toolchain + uses : Wandalen/wretry.action/main@master + with : + action : actions-rs/toolchain@v1 + with : | + toolchain : stable + override : true + attempt_limit : 3 + attempt_delay: 10000 + - name: Install latest nightly toolchain + uses: Wandalen/wretry.action/main@master + with: + action: actions-rs/toolchain@v1 + with: | + toolchain : nightly + override : true + attempt_limit: 3 + attempt_delay: 10000 + - uses: actions/checkout@v3 + - name: Install will + run: cargo install --git https://github.com/Wandalen/wTools --branch alpha willbe + - name: Set MANIFEST_ROOT_PATH + id: rootpath + run: echo "::set-output name=path::$(dirname ${{ inputs.manifest_path }})" + - name: Run tests with each feature + run: will .test ${{ steps.rootpath.outputs.path }}/ dry:0 exclude:'' with_all_features:1 with_debug:1 with_nightly:1 with_none_features:1 with_release:1 with_stable:1 \ No newline at end of file diff --git a/module/move/willbe/template/workflow/standard_rust_scheduled.yml b/module/move/willbe/template/workflow/standard_rust_scheduled.yml new file mode 100644 index 0000000000..ac680e60bd --- /dev/null +++ b/module/move/willbe/template/workflow/standard_rust_scheduled.yml @@ -0,0 +1,20 @@ +name : rust_scheduled + +on : + schedule : + - cron : '0 1 * * *' + +env : + + RUST_BACKTRACE : 1 + CARGO_TERM_COLOR : always + WITH_SMOKE : ${{ inputs.with_smoke }} + +jobs : + + tested : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : './Cargo.toml' + module_name : $\{{ github.event.base.ref }}_$\{{ github.event.number }} + commit_message : '+test_$\{{ github.event.base.ref }}_$\{{ github.event.number }}' \ No newline at end of file diff --git a/module/move/willbe/template/workflow/standard_rust_status.yml b/module/move/willbe/template/workflow/standard_rust_status.yml new file mode 100644 index 0000000000..36f5261f97 --- /dev/null +++ b/module/move/willbe/template/workflow/standard_rust_status.yml @@ -0,0 +1,39 @@ + +name : rust_status + +on: + workflow_run: + workflows: [ auto_merge_to_beta, rust_scheduled ] + types: + - completed + +concurrency : + + group : standard_rust_status + cancel-in-progress : true + +jobs : + + runs_check : + strategy : + matrix : + modules : [ 'auto_pr_to_beta', 'standard_rust_scheduled' ] + runs-on : ubuntu-latest + steps : + - name : Check workflow run status + id : check_ci + uses : ronymeyer/workflow-status@v0.3.7 + with : + token : ${{ secrets.GITHUB_TOKEN }} + workflow : ${{ matrix.modules }}.yml + branch : alpha + - name : Check failure conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'failure' }} + run : exit 1 + - name : Check cancelled conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'cancelled' }} + run : exit 1 + - name : Check skipped conclusion + if : ${{ steps.check_ci.outputs.conclusion == 'skipped' }} + run : exit 1 + diff --git a/module/move/willbe/template/workflow/status_checks_rules_update.yml b/module/move/willbe/template/workflow/status_checks_rules_update.yml new file mode 100644 index 0000000000..7d82451595 --- /dev/null +++ b/module/move/willbe/template/workflow/status_checks_rules_update.yml @@ -0,0 +1,77 @@ + +name : status_checks_rules_update + +on : + pull_request : + types : [ opened ] + branches : [ alpha, beta ] + +concurrency : + + group : projected_rules_update + cancel-in-progress : true + +jobs : + + check_workflows : + if : ${{ github.event.pull_request.base.ref == 'beta' }} + outputs : + should_update : ${{ steps.compare.outputs.not_equal }} + runs-on : ubuntu-latest + steps : + - name : Compare workflow directories content + id : compare + run : | + files_beta=$(curl -X GET -G \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/contents/.github/workflows \ + -d 'ref=beta') + files_alpha=$(curl -X GET -G \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/contents/.github/workflows \ + -d 'ref=alpha') + + if [[ "$files_beta" == "$files_alpha" ]] ; then + echo "not_equal=false" >> $GITHUB_OUTPUT + else + echo "not_equal=true" >> $GITHUB_OUTPUT + fi + + update_beta : + needs : check_workflows + if : ${{ needs.check_workflows.outputs.should_update == 'true' }} + runs-on : ubuntu-latest + steps : + - uses: actions/checkout@v3 + - name : Get options + id : options_get + run : | + WORKFLOWS=$(ls .github/workflows | grep module) + for WORKFLOW in $WORKFLOWS ; do + CONTEXT=$(echo $WORKFLOW | sed 's/\(\S\+\).yml/{"context":"check (\1)","app_id":null}/') + CONTEXTS="$CONTEXTS,$CONTEXT" + done; + CHECKS="[$(sed 's/^,//g' <<< $CONTEXTS),{\"context\":\"runs_check\",\"app_id\":null}]" + echo "options={\"required_status_checks\":{\"strict\":false,\"checks\":$CHECKS},\"enforce_admins\":false,\"required_pull_request_reviews\":null,\"restrictions\":null}" >> $GITHUB_OUTPUT + - name : Setup rules for beta + run : | + curl -X PUT \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/branches/beta/protection \ + -d '${{ steps.options_get.outputs.options }}' + + update_alpha : + if : ${{ github.event.pull_request.base.ref == 'alpha' }} + runs-on : ubuntu-latest + steps : + - name : Setup rules for alpha + run : | + CHECKS='[{"context":"tested / fast (ubuntu-latest)","app_id":null},{"context":"tested / fast (windows-latest)","app_id":null},{"context":"tested / fast (macos-latest)","app_id":null}]' + curl -X PUT \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PRIVATE_GITHUB_BOT_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/branches/alpha/protection \ + -d "{\"required_status_checks\":{\"strict\":false,\"checks\":$CHECKS},\"enforce_admins\":false,\"required_pull_request_reviews\":null,\"restrictions\":null}" diff --git a/module/move/willbe/template/workspace/.cargo/config.toml b/module/move/willbe/template/workspace/.cargo/config.toml new file mode 100644 index 0000000000..38ed1d83cd --- /dev/null +++ b/module/move/willbe/template/workspace/.cargo/config.toml @@ -0,0 +1,7 @@ + +[env] +MODULES_PATH = { value = "module", relative = true } +WORKSPACE_PATH = { value = ".", relative = true } + +[net] +# offline = true diff --git a/module/move/willbe/template/workspace/.gitattributes b/module/move/willbe/template/workspace/.gitattributes new file mode 100644 index 0000000000..b35f194c6b --- /dev/null +++ b/module/move/willbe/template/workspace/.gitattributes @@ -0,0 +1,4 @@ +*.s linguist-language=JavaScript +*.ss linguist-language=JavaScript +*.js linguist-language=JavaScript +* -text \ No newline at end of file diff --git a/module/move/willbe/template/workspace/.gitignore1 b/module/move/willbe/template/workspace/.gitignore1 new file mode 100644 index 0000000000..8927e5fa89 --- /dev/null +++ b/module/move/willbe/template/workspace/.gitignore1 @@ -0,0 +1,29 @@ +!/.github +!/.circleci +!/.* + +/build +/builder +/binding +/target +/node_modules +/.module +/package-lock.json +/Cargo.lock +/.vscode +/_* + +target +dist +.module +Cargo.lock +.DS_Store +.idea +*.log +*.db +*.tmp +*.build +*.code-workspace +.warchive* +-* +rustc-ice-*.txt diff --git a/module/move/willbe/template/workspace/.gitpod.yml b/module/move/willbe/template/workspace/.gitpod.yml new file mode 100644 index 0000000000..7ad3b97a13 --- /dev/null +++ b/module/move/willbe/template/workspace/.gitpod.yml @@ -0,0 +1,26 @@ +checkoutLocation : "." +workspaceLocation : "." + +tasks : + - init : | + rustup default nightly + cd $RUN_PATH + command : | + code $SAMPLE_FILE + cargo run $RUN_POSTFIX + echo 'To get list of samples in the repository try running from the root:' + echo 'cargo run --example' + +vscode : + extensions : + - rust-lang.rust-analyzer + +github : + prebuilds : + addBadge : true + pullRequests : true + +# +# # to list examples +# if [[ "${HAS_SAMPLES}" == "true" ]] || [[ "${HAS_SAMPLES}" == "1" ]]; then cargo run --example; fi +# \ No newline at end of file diff --git a/module/move/willbe/template/workspace/Cargo.hbs b/module/move/willbe/template/workspace/Cargo.hbs new file mode 100644 index 0000000000..276b4761e0 --- /dev/null +++ b/module/move/willbe/template/workspace/Cargo.hbs @@ -0,0 +1,26 @@ +[workspace] +resolver = "2" +members = [ + "module/*", +] + +exclude = [ + "-*", +] + +[workspace.metadata] +project_name = "{{project_name}}" +# url to project_repositiry +repo_url = "{{url}}" +# branches (includes master branch) +branches = [{{branches}}] + +[workspace.lints.rust] +missing_docs = "warn" +missing_debug_implementations = "warn" +rust_2018_idioms = "deny" +future_incompatible = "deny" + +[workspace.lints.clippy] +restriction = "deny" # opt out where this is redundant +pedantic = "deny" # opt out where this is redundant diff --git a/module/move/willbe/template/workspace/Makefile b/module/move/willbe/template/workspace/Makefile new file mode 100644 index 0000000000..b1036cde01 --- /dev/null +++ b/module/move/willbe/template/workspace/Makefile @@ -0,0 +1,151 @@ +# abc def +# === common +# + +# Comma +comma := , + +# Checks two given strings for equality. +eq = $(if $(or $(1),$(2)),$(and $(findstring $(1),$(2)),\ + $(findstring $(2),$(1))),1) + +# +# === Parameters +# + +VERSION ?= $(strip $(shell grep -m1 'version = "' Cargo.toml | cut -d '"' -f2)) + +# +# === Git +# + +# Sync local repostiry. +# +# Usage : +# make git.sync [message='description of changes'] + +git.sync : + git add --all && git commit -am $(message) && git pull + +sync : git.sync + +# +# === External cargo crates commands +# + +# Check vulnerabilities with cargo-audit. +# +# Usage : +# make audit + +audit : + cargo audit + +# +# === General commands +# + +# Generate crates documentation from Rust sources. +# +# Usage : +# make doc [private=(yes|no)] [open=(yes|no)] [clean=(no|yes)] [manifest_path=(|[path])] + +doc : +ifeq ($(clean),yes) + @rm -rf target/doc/ +endif + cargo doc --all-features \ + $(if $(call eq,$(private),no),,--document-private-items) \ + $(if $(call eq,$(manifest_path),),--manifest-path ./Cargo.toml,--manifest-path $(manifest_path)) \ + $(if $(call eq,$(open),no),,--open) + +# Lint Rust sources with Clippy. +# +# Usage : +# make lint [warnings=(no|yes)] [manifest_path=(|[path])] + +lint : + cargo clippy --all-features \ + $(if $(call eq,$(manifest_path),),--manifest-path ./Cargo.toml,--manifest-path $(manifest_path)) \ + $(if $(call eq,$(warnings),no),-- -D warnings,) + +# Check Rust sources `check`. +# +# Usage : +# make check [manifest_path=(|[path])] + +check : + cargo check \ + $(if $(call eq,$(manifest_path),),--manifest-path ./Cargo.toml,--manifest-path $(manifest_path)) + +# Format and lint Rust sources. +# +# Usage : +# make normalize + +normalize : fmt lint + +# Perform common checks on the module. +# +# Usage : +# make checkmate + +checkmate : doc lint check + +# Format Rust sources with rustfmt. +# +# Usage : +# make fmt [check=(no|yes)] + +fmt : + { find -L module -name *.rs -print0 ; } | xargs -0 rustfmt +nightly $(if $(call eq,$(check),yes),-- --check,) + +# cargo +nightly fmt --all $(if $(call eq,$(check),yes),-- --check,) + +# Run project Rust sources with Cargo. +# +# Usage : +# make up + +up : + cargo up + +# Run project Rust sources with Cargo. +# +# Usage : +# make clean + +clean : + cargo clean && rm -rf Cargo.lock && cargo cache -a && cargo update + +# Run Rust tests of project. +# +# Usage : +# make test + +test : + cargo test --all-features + +# Run format link test and tests. +# +# Usage : +# make all + +all : fmt lint test + +# +# === .PHONY section +# + +.PHONY : \ + all \ + audit \ + docs \ + lint \ + check \ + fmt \ + normalize \ + checkmate \ + test \ + up \ + doc diff --git a/module/move/willbe/template/workspace/Readme.md b/module/move/willbe/template/workspace/Readme.md new file mode 100644 index 0000000000..483a8178d7 --- /dev/null +++ b/module/move/willbe/template/workspace/Readme.md @@ -0,0 +1,5 @@ + + + + + diff --git a/module/move/willbe/template/workspace/module/module1/Cargo.toml.x b/module/move/willbe/template/workspace/module/module1/Cargo.toml.x new file mode 100644 index 0000000000..9cf134e518 --- /dev/null +++ b/module/move/willbe/template/workspace/module/module1/Cargo.toml.x @@ -0,0 +1,16 @@ +[package] +name = "example_module" +version = "0.2.0" +edition = "2021" +license = "MIT" +readme = "Readme.md" +repository = "{{repository url}}" + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] diff --git a/module/move/willbe/template/workspace/module/module1/Readme.md b/module/move/willbe/template/workspace/module/module1/Readme.md new file mode 100644 index 0000000000..7adaa950f4 --- /dev/null +++ b/module/move/willbe/template/workspace/module/module1/Readme.md @@ -0,0 +1,2 @@ + + diff --git a/module/move/willbe/template/workspace/module/module1/examples/module1_example.rs b/module/move/willbe/template/workspace/module/module1/examples/module1_example.rs new file mode 100644 index 0000000000..1ce8bc56f8 --- /dev/null +++ b/module/move/willbe/template/workspace/module/module1/examples/module1_example.rs @@ -0,0 +1,12 @@ +//! docs + +use example_module::hello; + +// example + +///test +fn main() +{ + let h = hello(); + println!( "{}", h ); +} diff --git a/module/move/willbe/template/workspace/module/module1/src/lib.rs b/module/move/willbe/template/workspace/module/module1/src/lib.rs new file mode 100644 index 0000000000..d7b38faf6c --- /dev/null +++ b/module/move/willbe/template/workspace/module/module1/src/lib.rs @@ -0,0 +1,7 @@ +//! Example function + +/// Example +pub fn hello() -> String +{ + "hello world!".into() +} diff --git a/module/move/willbe/template/workspace/module/module1/tests/hello_test.rs b/module/move/willbe/template/workspace/module/module1/tests/hello_test.rs new file mode 100644 index 0000000000..7ea32f1cba --- /dev/null +++ b/module/move/willbe/template/workspace/module/module1/tests/hello_test.rs @@ -0,0 +1,9 @@ +use example_module::*; + +/// Tests + +#[ test ] +fn example_test() +{ + assert_eq!( "hello world!".to_string(), hello() ); +} diff --git a/module/move/willbe/tests/asset/chain_of_packages/Cargo.toml b/module/move/willbe/tests/asset/chain_of_packages/Cargo.toml new file mode 100644 index 0000000000..8d9b5aeb62 --- /dev/null +++ b/module/move/willbe/tests/asset/chain_of_packages/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +resolver = "2" +members = [ + "*", +] diff --git a/module/move/willbe/tests/asset/chain_of_packages/a/Cargo.toml b/module/move/willbe/tests/asset/chain_of_packages/a/Cargo.toml new file mode 100644 index 0000000000..7699212375 --- /dev/null +++ b/module/move/willbe/tests/asset/chain_of_packages/a/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "_chain_of_packages_a" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +_chain_of_packages_b = { path = "../b" } \ No newline at end of file diff --git a/module/move/willbe/tests/asset/chain_of_packages/a/src/lib.rs b/module/move/willbe/tests/asset/chain_of_packages/a/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/chain_of_packages/a/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/chain_of_packages/b/Cargo.toml b/module/move/willbe/tests/asset/chain_of_packages/b/Cargo.toml new file mode 100644 index 0000000000..d30cb960e1 --- /dev/null +++ b/module/move/willbe/tests/asset/chain_of_packages/b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "_chain_of_packages_b" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +_chain_of_packages_c = { path = "../c" } diff --git a/module/move/willbe/tests/asset/chain_of_packages/b/src/lib.rs b/module/move/willbe/tests/asset/chain_of_packages/b/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/chain_of_packages/b/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/chain_of_packages/c/Cargo.toml b/module/move/willbe/tests/asset/chain_of_packages/c/Cargo.toml new file mode 100644 index 0000000000..dce39f24d7 --- /dev/null +++ b/module/move/willbe/tests/asset/chain_of_packages/c/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "_chain_of_packages_c" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/chain_of_packages/c/src/lib.rs b/module/move/willbe/tests/asset/chain_of_packages/c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/chain_of_packages/c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/err_out_test/err_out_err.rs b/module/move/willbe/tests/asset/err_out_test/err_out_err.rs new file mode 100644 index 0000000000..d6bc10ff45 --- /dev/null +++ b/module/move/willbe/tests/asset/err_out_test/err_out_err.rs @@ -0,0 +1,8 @@ +fn main() +{ + eprintln!( "This is stderr text" ); + + println!( "This is stdout text" ); + + eprintln!( "This is stderr text" ); +} diff --git a/module/move/willbe/tests/asset/err_out_test/out_err_out.rs b/module/move/willbe/tests/asset/err_out_test/out_err_out.rs new file mode 100644 index 0000000000..eeb47d28bf --- /dev/null +++ b/module/move/willbe/tests/asset/err_out_test/out_err_out.rs @@ -0,0 +1,9 @@ +//! need for tests +fn main() +{ + println!( "This is stdout text" ); + + eprintln!( "This is stderr text" ); + + println!( "This is stdout text" ); +} diff --git a/module/move/willbe/tests/asset/full_config/Cargo.toml b/module/move/willbe/tests/asset/full_config/Cargo.toml new file mode 100644 index 0000000000..53a777a0e9 --- /dev/null +++ b/module/move/willbe/tests/asset/full_config/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +resolver = "2" +members = [ + "*", +] + +[workspace.metadata] +repo_url = "https://github.com/SomeName/SomeCrate/C" +branches = [ "test_branch1", "test_branch2" ] \ No newline at end of file diff --git a/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/Cargo.toml b/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/Cargo.toml new file mode 100644 index 0000000000..4df78cb6f0 --- /dev/null +++ b/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "_willbe_variadic_tag_configurations_c" +version = "0.1.0" +edition = "2021" + +[package.metadata] +stability = "deprecated" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/examples/_willbe_variadic_tag_configurations_c_trivial.rs b/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/examples/_willbe_variadic_tag_configurations_c_trivial.rs new file mode 100644 index 0000000000..cda3d7e96f --- /dev/null +++ b/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/examples/_willbe_variadic_tag_configurations_c_trivial.rs @@ -0,0 +1,4 @@ +fn main() +{ + print!( "example" ); +} \ No newline at end of file diff --git a/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/src/lib.rs b/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/full_config/_willbe_variadic_tag_configurations_c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/full_config/readme.md b/module/move/willbe/tests/asset/full_config/readme.md new file mode 100644 index 0000000000..d50fc2462a --- /dev/null +++ b/module/move/willbe/tests/asset/full_config/readme.md @@ -0,0 +1,2 @@ + + diff --git a/module/move/willbe/tests/asset/package_with_remote_dependency/Cargo.toml b/module/move/willbe/tests/asset/package_with_remote_dependency/Cargo.toml new file mode 100644 index 0000000000..8d9b5aeb62 --- /dev/null +++ b/module/move/willbe/tests/asset/package_with_remote_dependency/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +resolver = "2" +members = [ + "*", +] diff --git a/module/move/willbe/tests/asset/package_with_remote_dependency/a/Cargo.toml b/module/move/willbe/tests/asset/package_with_remote_dependency/a/Cargo.toml new file mode 100644 index 0000000000..a45560a3c5 --- /dev/null +++ b/module/move/willbe/tests/asset/package_with_remote_dependency/a/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "_package_with_remote_dep_a" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +foo = "*" +_package_with_remote_dep_b = { path = "../b" } \ No newline at end of file diff --git a/module/move/willbe/tests/asset/package_with_remote_dependency/a/src/lib.rs b/module/move/willbe/tests/asset/package_with_remote_dependency/a/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/package_with_remote_dependency/a/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/package_with_remote_dependency/b/Cargo.toml b/module/move/willbe/tests/asset/package_with_remote_dependency/b/Cargo.toml new file mode 100644 index 0000000000..32202f18f4 --- /dev/null +++ b/module/move/willbe/tests/asset/package_with_remote_dependency/b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "_package_with_remote_dep_b" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/package_with_remote_dependency/b/src/lib.rs b/module/move/willbe/tests/asset/package_with_remote_dependency/b/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/package_with_remote_dependency/b/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/single_module/Cargo.toml b/module/move/willbe/tests/asset/single_module/Cargo.toml new file mode 100644 index 0000000000..7e5912d446 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module/Cargo.toml @@ -0,0 +1,11 @@ +[workspace] +resolver = "2" +members = [ + "test_module", +] + +[workspace.metadata] +master_branch = "test_branch" +project_name = "test" +repo_url = "https://github.com/Username/test" +discord_url = "https://discord.gg/m3YfbXpUUY" diff --git a/module/move/willbe/tests/asset/single_module/Readme.md b/module/move/willbe/tests/asset/single_module/Readme.md new file mode 100644 index 0000000000..60f5ba4c5f --- /dev/null +++ b/module/move/willbe/tests/asset/single_module/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module/test_module/Cargo.toml b/module/move/willbe/tests/asset/single_module/test_module/Cargo.toml new file mode 100644 index 0000000000..64eeb328e8 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module/test_module/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "test_module" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/test_module" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module/test_module/Readme.md b/module/move/willbe/tests/asset/single_module/test_module/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module/test_module/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module/test_module/src/lib.rs b/module/move/willbe/tests/asset/single_module/test_module/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/single_module/test_module/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/single_module_with_example/Cargo.toml b/module/move/willbe/tests/asset/single_module_with_example/Cargo.toml new file mode 100644 index 0000000000..5ae4c90b46 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_with_example/Cargo.toml @@ -0,0 +1,11 @@ +[workspace] +resolver = "2" +members = [ + "module/test_module", +] + +[workspace.metadata] +master_branch = "test_branch" +project_name = "test" +repo_url = "https://github.com/Username/test" +discord_url = "https://discord.gg/m3YfbXpUUY" diff --git a/module/move/willbe/tests/asset/single_module_with_example/Readme.md b/module/move/willbe/tests/asset/single_module_with_example/Readme.md new file mode 100644 index 0000000000..60f5ba4c5f --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_with_example/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module_with_example/module/test_module/Cargo.toml b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/Cargo.toml new file mode 100644 index 0000000000..64eeb328e8 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "test_module" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/test_module" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module_with_example/module/test_module/Readme.md b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module_with_example/module/test_module/examples/test_module_trivial.rs b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/examples/test_module_trivial.rs new file mode 100644 index 0000000000..17c0499e55 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/examples/test_module_trivial.rs @@ -0,0 +1,4 @@ +fn main() +{ + println!( "example" ); +} \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module_with_example/module/test_module/src/lib.rs b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_with_example/module/test_module/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Cargo.toml b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Cargo.toml new file mode 100644 index 0000000000..dd022be806 --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +resolver = "2" +members = [ + "test_module", +] + +[workspace.metadata] +project_name = "test" +repo_url = "https://github.com/Username/test" \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Readme.md b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Readme.md new file mode 100644 index 0000000000..60f5ba4c5f --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/Cargo.toml b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/Cargo.toml new file mode 100644 index 0000000000..6f4364e11f --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "test_module" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html \ No newline at end of file diff --git a/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/src/lib.rs b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/single_module_without_master_branch_and_discord/test_module/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/three_packages/Cargo.toml b/module/move/willbe/tests/asset/three_packages/Cargo.toml new file mode 100644 index 0000000000..49f36c395b --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +resolver = "2" +members = [ + "*", +] + +[workspace.metadata] +discord_url = "https://discord.gg/123456789" diff --git a/module/move/willbe/tests/asset/three_packages/b/Cargo.toml b/module/move/willbe/tests/asset/three_packages/b/Cargo.toml new file mode 100644 index 0000000000..f460a5fc09 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "_chain_of_packages_b" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Username/test/b" + +[package.metadata] +stability = "stable" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +_chain_of_packages_c = { path = "../c" } diff --git a/module/move/willbe/tests/asset/three_packages/b/Readme.md b/module/move/willbe/tests/asset/three_packages/b/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/b/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/three_packages/b/src/lib.rs b/module/move/willbe/tests/asset/three_packages/b/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/b/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/three_packages/c/Cargo.toml b/module/move/willbe/tests/asset/three_packages/c/Cargo.toml new file mode 100644 index 0000000000..4d263a19f3 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/c/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "_chain_of_packages_c" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Username/test/c" + +[package.metadata] +discord_url = "https://discord.gg/m3YfbXpUUY" +stability = "stable" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/three_packages/c/Readme.md b/module/move/willbe/tests/asset/three_packages/c/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/c/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/three_packages/c/src/lib.rs b/module/move/willbe/tests/asset/three_packages/c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/three_packages/d/Cargo.toml b/module/move/willbe/tests/asset/three_packages/d/Cargo.toml new file mode 100644 index 0000000000..3fc29d91b6 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/d/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "_chain_of_packages_d" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Username/test/c" + +[package.metadata] +stability = "stable" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/three_packages/d/Readme.md b/module/move/willbe/tests/asset/three_packages/d/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/d/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/three_packages/d/src/lib.rs b/module/move/willbe/tests/asset/three_packages/d/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages/d/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/three_packages_with_features/Cargo.toml b/module/move/willbe/tests/asset/three_packages_with_features/Cargo.toml new file mode 100644 index 0000000000..49f36c395b --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +resolver = "2" +members = [ + "*", +] + +[workspace.metadata] +discord_url = "https://discord.gg/123456789" diff --git a/module/move/willbe/tests/asset/three_packages_with_features/b/Cargo.toml b/module/move/willbe/tests/asset/three_packages_with_features/b/Cargo.toml new file mode 100644 index 0000000000..b9c97a9443 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/b/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "_chain_of_packages_b" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Username/test/b" + +[package.metadata] +stability = "stable" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +_chain_of_packages_c = { path = "../c", optional = true } + +[features] +enabled = [] +default = ["boo"] +boo = ["_chain_of_packages_c"] diff --git a/module/move/willbe/tests/asset/three_packages_with_features/b/Readme.md b/module/move/willbe/tests/asset/three_packages_with_features/b/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/b/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/three_packages_with_features/b/src/lib.rs b/module/move/willbe/tests/asset/three_packages_with_features/b/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/b/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/three_packages_with_features/c/Cargo.toml b/module/move/willbe/tests/asset/three_packages_with_features/c/Cargo.toml new file mode 100644 index 0000000000..0bcd46b4e3 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/c/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "_chain_of_packages_c" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Username/test/c" + +[package.metadata] +discord_url = "https://discord.gg/m3YfbXpUUY" +stability = "stable" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[features] +enabled = [] +default = ["foo"] +foo = [] \ No newline at end of file diff --git a/module/move/willbe/tests/asset/three_packages_with_features/c/Readme.md b/module/move/willbe/tests/asset/three_packages_with_features/c/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/c/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/three_packages_with_features/c/src/lib.rs b/module/move/willbe/tests/asset/three_packages_with_features/c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/three_packages_with_features/d/Cargo.toml b/module/move/willbe/tests/asset/three_packages_with_features/d/Cargo.toml new file mode 100644 index 0000000000..a6e5f08b8f --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/d/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "_chain_of_packages_d" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Username/test/c" + +[package.metadata] +stability = "stable" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[features] +enabled = [] diff --git a/module/move/willbe/tests/asset/three_packages_with_features/d/Readme.md b/module/move/willbe/tests/asset/three_packages_with_features/d/Readme.md new file mode 100644 index 0000000000..8c938fa512 --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/d/Readme.md @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module/move/willbe/tests/asset/three_packages_with_features/d/src/lib.rs b/module/move/willbe/tests/asset/three_packages_with_features/d/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/three_packages_with_features/d/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/variadic_tag_configurations/Cargo.toml b/module/move/willbe/tests/asset/variadic_tag_configurations/Cargo.toml new file mode 100644 index 0000000000..53a777a0e9 --- /dev/null +++ b/module/move/willbe/tests/asset/variadic_tag_configurations/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +resolver = "2" +members = [ + "*", +] + +[workspace.metadata] +repo_url = "https://github.com/SomeName/SomeCrate/C" +branches = [ "test_branch1", "test_branch2" ] \ No newline at end of file diff --git a/module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/Cargo.toml b/module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/Cargo.toml new file mode 100644 index 0000000000..4df78cb6f0 --- /dev/null +++ b/module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "_willbe_variadic_tag_configurations_c" +version = "0.1.0" +edition = "2021" + +[package.metadata] +stability = "deprecated" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/src/lib.rs b/module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/variadic_tag_configurations/_willbe_variadic_tag_configurations_c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/variadic_tag_configurations/readme.md b/module/move/willbe/tests/asset/variadic_tag_configurations/readme.md new file mode 100644 index 0000000000..e5c5fc0e7e --- /dev/null +++ b/module/move/willbe/tests/asset/variadic_tag_configurations/readme.md @@ -0,0 +1,18 @@ + + +### + + +### + + +### + + +### + + +### + + + diff --git a/module/move/willbe/tests/asset/without_any_toml_configurations/Cargo.toml b/module/move/willbe/tests/asset/without_any_toml_configurations/Cargo.toml new file mode 100644 index 0000000000..1e87895cbb --- /dev/null +++ b/module/move/willbe/tests/asset/without_any_toml_configurations/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +resolver = "2" +members = [ + "*", +] \ No newline at end of file diff --git a/module/move/willbe/tests/asset/without_any_toml_configurations/c/Cargo.toml b/module/move/willbe/tests/asset/without_any_toml_configurations/c/Cargo.toml new file mode 100644 index 0000000000..774cfba612 --- /dev/null +++ b/module/move/willbe/tests/asset/without_any_toml_configurations/c/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "_willbe_without_any_toml_configurations_c" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/without_any_toml_configurations/c/src/lib.rs b/module/move/willbe/tests/asset/without_any_toml_configurations/c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/without_any_toml_configurations/c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/without_any_toml_configurations/readme.md b/module/move/willbe/tests/asset/without_any_toml_configurations/readme.md new file mode 100644 index 0000000000..a0a487c98c --- /dev/null +++ b/module/move/willbe/tests/asset/without_any_toml_configurations/readme.md @@ -0,0 +1,3 @@ + + + diff --git a/module/move/willbe/tests/asset/without_module_toml_configurations/Cargo.toml b/module/move/willbe/tests/asset/without_module_toml_configurations/Cargo.toml new file mode 100644 index 0000000000..2f895ca5d0 --- /dev/null +++ b/module/move/willbe/tests/asset/without_module_toml_configurations/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +resolver = "2" +members = [ + "*", +] + +[workspace.metadata] +repo_url = "https://github.com/Username/test" +branches = [ "test_branch1", "test_branch2" ] \ No newline at end of file diff --git a/module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/Cargo.toml b/module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/Cargo.toml new file mode 100644 index 0000000000..5e27a88ea5 --- /dev/null +++ b/module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "_willbe_without_module_toml_configurations_c" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/src/lib.rs b/module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/without_module_toml_configurations/_willbe_without_module_toml_configurations_c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/without_module_toml_configurations/readme.md b/module/move/willbe/tests/asset/without_module_toml_configurations/readme.md new file mode 100644 index 0000000000..a0a487c98c --- /dev/null +++ b/module/move/willbe/tests/asset/without_module_toml_configurations/readme.md @@ -0,0 +1,3 @@ + + + diff --git a/module/move/willbe/tests/asset/without_workspace_toml_configurations/Cargo.toml b/module/move/willbe/tests/asset/without_workspace_toml_configurations/Cargo.toml new file mode 100644 index 0000000000..1e87895cbb --- /dev/null +++ b/module/move/willbe/tests/asset/without_workspace_toml_configurations/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +resolver = "2" +members = [ + "*", +] \ No newline at end of file diff --git a/module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/Cargo.toml b/module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/Cargo.toml new file mode 100644 index 0000000000..f6888d8ef0 --- /dev/null +++ b/module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "_willbe_without_workspace_toml_configurations_c" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Testusername/TestProject/tree/alpha/module/core/test" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[package.metadata] +stability = "stable" + +[dependencies] diff --git a/module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/src/lib.rs b/module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/without_workspace_toml_configurations/_willbe_without_workspace_toml_configurations_c/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/without_workspace_toml_configurations/readme.md b/module/move/willbe/tests/asset/without_workspace_toml_configurations/readme.md new file mode 100644 index 0000000000..a0a487c98c --- /dev/null +++ b/module/move/willbe/tests/asset/without_workspace_toml_configurations/readme.md @@ -0,0 +1,3 @@ + + + diff --git a/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/Cargo.toml b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/Cargo.toml new file mode 100644 index 0000000000..8d9b5aeb62 --- /dev/null +++ b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +resolver = "2" +members = [ + "*", +] diff --git a/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/Cargo.toml b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/Cargo.toml new file mode 100644 index 0000000000..f07b8b7b5d --- /dev/null +++ b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "_workspace_with_cyclic_dep_a" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +_workspace_with_cyclic_dep_b = { path = "../b" } diff --git a/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/src/lib.rs b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/a/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/Cargo.toml b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/Cargo.toml new file mode 100644 index 0000000000..f80f6e75bc --- /dev/null +++ b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "_workspace_with_cyclic_dep_b" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +_workspace_with_cyclic_dep_a = { path = "../a" } diff --git a/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/src/lib.rs b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/move/willbe/tests/asset/workspace_with_cyclic_dependency/b/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/move/willbe/tests/inc/action/cicd_renew.rs b/module/move/willbe/tests/inc/action/cicd_renew.rs new file mode 100644 index 0000000000..4f9b0bc17b --- /dev/null +++ b/module/move/willbe/tests/inc/action/cicd_renew.rs @@ -0,0 +1,120 @@ +use super::*; +use assert_fs::prelude::*; +use the_module::action; + +// + +// aaa : for Petro : rid off redundant namespace. ask +// aaa : remove +use std:: +{ + fs::File, + io::Read, + collections::HashMap +}; +use std::fs::create_dir_all; +use serde::Deserialize; + +fn arrange( sample_dir : &str ) -> assert_fs::TempDir +{ + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( sample_dir ), &[ "**" ] ).unwrap(); + create_dir_all( temp.path().join( ".github" ).join( "workflows") ).unwrap(); + temp +} + +#[ derive( Debug, PartialEq, Deserialize ) ] +struct Workflow +{ + name : String, + on : HashMap>>, + env : HashMap< String, String >, + jobs : HashMap< String, Job >, +} + +#[ derive( Debug, PartialEq, Deserialize ) ] +struct Job +{ + uses : String, + with : With, +} + +#[ derive( Debug, PartialEq, Deserialize ) ] +struct With +{ + manifest_path : String, + module_name : String, + commit_message : String, +} + +#[ test ] +fn default_case() +{ + // Arrange + let temp = arrange( "single_module" ); + let base_path = temp.path().join( ".github" ).join( "workflows" ); + let file_path = base_path.join( "module_test_module_push.yml" ); + let with = With + { + manifest_path : "test_module/Cargo.toml".into(), + module_name : "test_module".into(), + commit_message : "${{ github.event.head_commit.message }}".into() + }; + let job = Job + { + uses : "Username/test/.github/workflows/standard_rust_push.yml@alpha".into(), + with + }; + let expected = Workflow + { + name : "test_module".into(), + on : + { + let mut map = HashMap::new(); + let mut push_map = HashMap::new(); + push_map.insert + ( + "branches".to_string(), + vec![ "alpha".to_string(), "beta".to_string(), "master".to_string() ], + ); + map.insert( "push".to_string(), push_map ); + map + }, + env : HashMap::from_iter( [ ( "CARGO_TERM_COLOR".to_string(), "always".to_string() ) ] ), + jobs : HashMap::from_iter( [ ( "test".to_string(), job ) ] ), + }; + + // Act + _ = action::cicd_renew( &temp ).unwrap(); + + // Assert + let mut file = File::open( file_path ).unwrap(); + let mut content = String::new(); + _ = file.read_to_string( &mut content ).unwrap(); + let actual: Workflow = serde_yaml::from_str( &content ).unwrap(); + assert_eq!( expected, actual ); + + assert!( base_path.join( "appropriate_branch.yml" ).exists() ); + assert!( base_path.join( "appropriate_branch_beta.yml" ).exists() ); + assert!( base_path.join( "appropriate_branch_master.yml" ).exists() ); + assert!( base_path.join( "auto_merge_to_beta.yml" ).exists() ); + assert!( base_path.join( "auto_pr.yml" ).exists() ); + assert!( base_path.join( "auto_pr_to_alpha.yml" ).exists() ); + assert!( base_path.join( "auto_pr_to_beta.yml" ).exists() ); + assert!( base_path.join( "auto_pr_to_master.yml" ).exists() ); + assert!( base_path.join( "runs_clean.yml" ).exists() ); + assert!( base_path.join( "standard_rust_pull_request.yml" ).exists() ); + assert!( base_path.join( "standard_rust_push.yml" ).exists() ); + assert!( base_path.join( "for_pr_rust_push.yml" ).exists() ); + assert!( base_path.join( "standard_rust_scheduled.yml" ).exists() ); + assert!( base_path.join( "standard_rust_status.yml" ).exists() ); + assert!( base_path.join( "status_checks_rules_update.yml" ).exists() ); + assert!( base_path.join( "Readme.md" ).exists() ); +} + +// aaa : for Petro : fix styles +// aaa : ✅ diff --git a/module/move/willbe/tests/inc/action/features.rs b/module/move/willbe/tests/inc/action/features.rs new file mode 100644 index 0000000000..c27e99c3b4 --- /dev/null +++ b/module/move/willbe/tests/inc/action/features.rs @@ -0,0 +1,183 @@ +use super::*; +use assert_fs::prelude::*; + +fn arrange( source : &str ) -> assert_fs::TempDir +{ + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( source ), &[ "**" ] ).unwrap(); + + temp +} + +#[ test ] +fn package_no_features() +{ + // Arrange + let temp = arrange( "three_packages/b" ); + let options = willbe::action::features::FeaturesOptions::former() + .manifest_dir( willbe::_path::AbsolutePath::try_from( temp.path().to_owned() ).unwrap() ) + .form(); + + // Act + let report = willbe::action::features( options ).unwrap().to_string(); + + // Assert + assert!( report.contains( +"\ +Package _chain_of_packages_b:\ +" ) ); +} + +#[ test ] +fn package_features() +{ + // Arrange + let temp = arrange( "three_packages_with_features/b" ); + let options = willbe::action::features::FeaturesOptions::former() + .manifest_dir( willbe::_path::AbsolutePath::try_from( temp.path().to_owned() ).unwrap() ) + .form(); + + // Act + let report = willbe::action::features( options ).unwrap().to_string(); + + // Assert + assert!( report.contains( +"\ +Package _chain_of_packages_b: +\t_chain_of_packages_c +\tboo +\tdefault +\tenabled\ +" ) ); +} + +#[ test ] +fn package_features_with_features_deps() +{ + let temp = arrange( "three_packages_with_features/b" ); + let options = willbe::action::features::FeaturesOptions::former() + .manifest_dir( willbe::_path::AbsolutePath::try_from( temp.path().to_owned() ).unwrap() ) + .with_features_deps( true ) + .form(); + + // Act + let report = willbe::action::features( options ).unwrap().to_string(); + + // Assert + assert!( report.contains( +"\ +Package _chain_of_packages_b: +\t_chain_of_packages_c: [dep:_chain_of_packages_c] +\tboo: [_chain_of_packages_c] +\tdefault: [boo] +\tenabled: []\ +" ) ); +} + +#[ test ] +fn workspace_no_features() +{ + // Arrange + let temp = arrange( "three_packages" ); + let options = willbe::action::features::FeaturesOptions::former() + .manifest_dir( willbe::_path::AbsolutePath::try_from( temp.path().to_owned() ).unwrap() ) + .form(); + + // Act + let report = willbe::action::features( options ).unwrap().to_string(); + + // Assert + assert!( report.contains( +"\ +Package _chain_of_packages_b:\ +" ) ); + + assert!( report.contains( +"\ +Package _chain_of_packages_c:\ +" ) ); + + assert!( report.contains( +"\ +Package _chain_of_packages_d:\ +" ) ); +} + +#[ test ] +fn workspace_features() +{ + // Arrange + let temp = arrange( "three_packages_with_features" ); + let options = willbe::action::features::FeaturesOptions::former() + .manifest_dir( willbe::_path::AbsolutePath::try_from( temp.path().to_owned() ).unwrap() ) + .form(); + + // Act + let report = willbe::action::features( options ).unwrap().to_string(); + + // Assert + assert!( report.contains( +"\ +Package _chain_of_packages_b: +\t_chain_of_packages_c +\tboo +\tdefault +\tenabled\ +" ) ); + + assert!( report.contains( +"\ +Package _chain_of_packages_c: +\tdefault +\tenabled +\tfoo\ +" ) ); + + assert!( report.contains( +"\ +Package _chain_of_packages_d: +\tenabled\ +" ) ); +} + +#[ test ] +fn workspace_features_with_features_deps() +{ + // Arrange + let temp = arrange( "three_packages_with_features" ); + let options = willbe::action::features::FeaturesOptions::former() + .manifest_dir( willbe::_path::AbsolutePath::try_from( temp.path().to_owned() ).unwrap() ) + .with_features_deps( true ) + .form(); + + // Act + let report = willbe::action::features( options ).unwrap().to_string(); + + // Assert + assert!( report.contains( +"\ +Package _chain_of_packages_b: +\t_chain_of_packages_c: [dep:_chain_of_packages_c] +\tboo: [_chain_of_packages_c] +\tdefault: [boo] +\tenabled: []\ +" ) ); + + assert!( report.contains( +"\ +Package _chain_of_packages_c: +\tdefault: [foo] +\tenabled: [] +\tfoo: []\ +" ) ); + + assert!( report.contains( +"\ +Package _chain_of_packages_d: +\tenabled: []\ +" ) ); +} diff --git a/module/move/willbe/tests/inc/action/list.rs b/module/move/willbe/tests/inc/action/list.rs new file mode 100644 index 0000000000..6164586dd7 --- /dev/null +++ b/module/move/willbe/tests/inc/action/list.rs @@ -0,0 +1,4 @@ +use super::*; + +mod data; +mod format; \ No newline at end of file diff --git a/module/move/willbe/tests/inc/action/list/data.rs b/module/move/willbe/tests/inc/action/list/data.rs new file mode 100644 index 0000000000..17fc6230b6 --- /dev/null +++ b/module/move/willbe/tests/inc/action/list/data.rs @@ -0,0 +1,314 @@ +use super::*; + +use assert_fs::prelude::*; +use the_module::action::{ self, list::* }; +use willbe::CrateDir; +use willbe::_path::AbsolutePath; + + +// + +fn crate_dir( path : &std::path::Path ) -> CrateDir +{ + let absolut = AbsolutePath::try_from( path ).unwrap(); + CrateDir::try_from( absolut ).unwrap() +} + +// a -> b -> c +mod chain_of_three_packages +{ + use super::*; + + fn arrange() -> assert_fs::TempDir + { + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( "chain_of_packages" ), &[ "**" ] ).unwrap(); + + temp + } + + #[ test ] + fn tree_format_for_single_package() + { + // Arrange + let temp = arrange(); + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Tree ) + .dependency_sources([ DependencySource::Local ]) + .dependency_categories([ DependencyCategory::Primary ]) + .form(); + + // Act + let output = action::list( args ).unwrap(); + + // Assert + let ListReport::Tree( trees ) = &output else { panic!( "Expected `Tree` format, but found another" ) }; + + assert_eq!( 1, trees.len() ); + let tree = &trees[ 0 ]; + assert_eq!( "_chain_of_packages_a", tree.name.as_str() ); + + assert_eq!( 1, tree.normal_dependencies.len() ); + assert!( tree.dev_dependencies.is_empty() ); + assert!( tree.build_dependencies.is_empty() ); + + let sub_tree = &tree.normal_dependencies[ 0 ]; + assert_eq!( "_chain_of_packages_b", sub_tree.name.as_str() ); + + assert_eq!( 1, sub_tree.normal_dependencies.len() ); + assert!( sub_tree.dev_dependencies.is_empty() ); + assert!( sub_tree.build_dependencies.is_empty() ); + + let mega_sub_tree = &sub_tree.normal_dependencies[ 0 ]; + assert_eq!( "_chain_of_packages_c", mega_sub_tree.name.as_str() ); + + assert!( mega_sub_tree.normal_dependencies.is_empty() ); + assert!( mega_sub_tree.dev_dependencies.is_empty() ); + assert!( mega_sub_tree.build_dependencies.is_empty() ); + } + + #[ test ] + fn list_format_for_single_package() + { + // Arrange + let temp = arrange(); + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Topological ) + .dependency_sources([ DependencySource::Local ]) + .dependency_categories([ DependencyCategory::Primary ]) + .form(); + + // Act + let output = action::list( args ).unwrap(); + + // Assert + let ListReport::List( names ) = &output else { panic!("Expected `Topological` format, but found another") }; + + assert_eq!( &[ "_chain_of_packages_c".to_string(), "_chain_of_packages_b".to_string(), "_chain_of_packages_a".to_string() ], names.as_slice() ); + } + + #[ test ] + fn list_format_for_whole_workspace() + { + // Arrange + let temp = arrange(); + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp ) ) + .format( ListFormat::Topological ) + .dependency_sources([ DependencySource::Local ]) + .dependency_categories([ DependencyCategory::Primary ]) + .form(); + + // Act + let output = action::list( args ).unwrap(); + + // Assert + let ListReport::List( names ) = &output else { panic!( "Expected `Topological` format, but found another" ) }; + + assert_eq!( &[ "_chain_of_packages_c".to_string(), "_chain_of_packages_b".to_string(), "_chain_of_packages_a".to_string() ], names.as_slice() ); + } +} + +// a -> ( remote, b ) +mod package_with_remote_dependency +{ + use super::*; + + fn arrange() -> assert_fs::TempDir + { + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( "package_with_remote_dependency" ), &[ "**" ] ).unwrap(); + + temp + } + + #[ test ] + fn tree_format_for_single_package() + { + // Arrange + let temp = arrange(); + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Tree ) + .dependency_sources([ DependencySource::Local, DependencySource::Remote ]) + .dependency_categories([ DependencyCategory::Primary ]) + .form(); + + // Act + let output = action::list( args ).unwrap(); + + // Assert + let ListReport::Tree( trees ) = &output else { panic!( "Expected `Tree` format, but found another" ) }; + + assert_eq!( 1, trees.len() ); + let tree = &trees[ 0 ]; + assert_eq!( "_package_with_remote_dep_a", tree.name.as_str() ); + + assert_eq!( 2, tree.normal_dependencies.len() ); + assert!( tree.dev_dependencies.is_empty() ); + assert!( tree.build_dependencies.is_empty() ); + + let [ sub_tree_1, sub_tree_2, .. ] = tree.normal_dependencies.as_slice() else { unreachable!() }; + assert_eq!( "_package_with_remote_dep_b", sub_tree_1.name.as_str() ); + assert!( sub_tree_1.normal_dependencies.is_empty() ); + assert!( sub_tree_1.dev_dependencies.is_empty() ); + assert!( sub_tree_1.build_dependencies.is_empty() ); + + assert_eq!( "foo", sub_tree_2.name.as_str() ); + assert!( sub_tree_2.normal_dependencies.is_empty() ); + assert!( sub_tree_2.dev_dependencies.is_empty() ); + assert!( sub_tree_2.build_dependencies.is_empty() ); + } + + #[ test ] + fn list_format_for_single_package() + { + // Arrange + let temp = arrange(); + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Topological ) + .dependency_sources([ DependencySource::Local, DependencySource::Remote ]) + .dependency_categories([ DependencyCategory::Primary ]) + .form(); + + // Act + let output = action::list( args ).unwrap(); + + // Assert + let ListReport::List( names ) = &output else { panic!( "Expected `Topological` format, but found another" ) }; + + assert_eq!( 3, names.len() ); + // `a` must be last + assert_eq!( "_package_with_remote_dep_a", &names[ 2 ] ); + // can be in any order + assert!( ( "_package_with_remote_dep_b" == &names[ 0 ] && "foo" == &names[ 1 ] ) || ( "_package_with_remote_dep_b" == &names[ 1 ] && "foo" == &names[ 0 ] ) ); + } + + #[ test ] + fn only_local_dependency_filter() + { + // Arrange + let temp = arrange(); + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Topological ) + .dependency_sources([ DependencySource::Local ]) + .dependency_categories([ DependencyCategory::Primary ]) + .form(); + + // Act + let output = action::list( args ).unwrap(); + + // Assert + let ListReport::List( names ) = &output else { panic!( "Expected `Topological` format, but found another" ) }; + + assert_eq!( &[ "_package_with_remote_dep_b".to_string(), "_package_with_remote_dep_a".to_string() ], names.as_slice() ); + } +} + +// a -> b -> a +mod workspace_with_cyclic_dependency +{ + use super::*; + + #[ test ] + fn tree_format() + { + // Arrange + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( "workspace_with_cyclic_dependency" ), &[ "**" ] ).unwrap(); + + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Tree ) + .info([ PackageAdditionalInfo::Version ]) + .dependency_sources([ DependencySource::Local, DependencySource::Remote ]) + .dependency_categories([ DependencyCategory::Primary, DependencyCategory::Dev ]) + .form(); + + // Act + let output = action::list( args ).unwrap(); + + // Assert + let ListReport::Tree( trees ) = &output else { panic!( "Expected `Tree` format, but found another" ) }; + dbg!( trees ); + + assert_eq!( 1, trees.len() ); + let tree = &trees[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_a", tree.name.as_str() ); + assert_eq!( "0.1.0", tree.version.as_ref().unwrap().as_str() ); + + assert_eq!( 1, tree.normal_dependencies.len() ); + assert!( tree.dev_dependencies.is_empty() ); + assert!( tree.build_dependencies.is_empty() ); + + let sub_tree = &tree.normal_dependencies[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_b", sub_tree.name.as_str() ); + assert_eq!( "*", sub_tree.version.as_ref().unwrap().as_str() ); + + assert_eq!( 1, sub_tree.normal_dependencies.len() ); + assert!( sub_tree.dev_dependencies.is_empty() ); + assert!( sub_tree.build_dependencies.is_empty() ); + + let mega_sub_tree = &sub_tree.normal_dependencies[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_a", mega_sub_tree.name.as_str() ); + assert_eq!( "*", mega_sub_tree.version.as_ref().unwrap().as_str() ); + + assert_eq!( 1, mega_sub_tree.normal_dependencies.len() ); + assert!( mega_sub_tree.dev_dependencies.is_empty() ); + assert!( mega_sub_tree.build_dependencies.is_empty() ); + + // (*) - means duplication + let ultra_sub_tree = &mega_sub_tree.normal_dependencies[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_b", ultra_sub_tree.name.as_str() ); + assert_eq!( "*", sub_tree.version.as_ref().unwrap().as_str() ); + assert!( ultra_sub_tree.duplicate ); + assert_eq!( "*", ultra_sub_tree.version.as_ref().unwrap().as_str() ); + + assert!( ultra_sub_tree.normal_dependencies.is_empty() ); + assert!( ultra_sub_tree.dev_dependencies.is_empty() ); + assert!( ultra_sub_tree.build_dependencies.is_empty() ); + } + + #[ test ] + fn can_not_show_list_with_cyclic_dependencies() + { + // Arrange + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( "workspace_with_cyclic_dependency" ), &[ "**" ] ).unwrap(); + + let args = ListOptions::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Topological ) + .dependency_sources([ DependencySource::Local, DependencySource::Remote ]) + .dependency_categories([ DependencyCategory::Primary, DependencyCategory::Dev ]) + .form(); + + // Act + let output = action::list( args ); + + // Assert + + // can not process topological sorting for cyclic dependencies + assert!( output.is_err() ); + } +} diff --git a/module/move/willbe/tests/inc/action/list/format.rs b/module/move/willbe/tests/inc/action/list/format.rs new file mode 100644 index 0000000000..42d492cf9d --- /dev/null +++ b/module/move/willbe/tests/inc/action/list/format.rs @@ -0,0 +1,448 @@ +use super::*; + +use the_module::action::list::ListNodeReport; + +#[ test ] +fn node_with_depth_two_leaves_stop_spacer() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec! + [ + ListNodeReport + { + name : "sub_node1".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![ ListNodeReport + { + name : "sub_sub_node1".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }], + dev_dependencies : vec![], + build_dependencies : vec![], + }, + ListNodeReport + { + name : "sub_node2".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![ ListNodeReport + { + name : "sub_sub_node2".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }], + dev_dependencies : vec![], + build_dependencies : vec![], + } + ], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + let expected = r#" +node +├─ sub_node1 +│ └─ sub_sub_node1 +└─ sub_node2 + └─ sub_sub_node2 +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_depth_two_leaves() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec! + [ + ListNodeReport + { + name : "sub_node1".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![ ListNodeReport + { + name : "sub_sub_node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }], + dev_dependencies : vec![], + build_dependencies : vec![], + }, + ListNodeReport + { + name : "sub_node2".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + } + ], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + let expected = r#" +node +├─ sub_node1 +│ └─ sub_sub_node +└─ sub_node2 +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_depth_one_leaf() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![ ListNodeReport + { + name : "sub_node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![ ListNodeReport + { + name : "sub_sub_node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }], + dev_dependencies : vec![], + build_dependencies : vec![], + }], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + let expected = r#" +node +└─ sub_node + └─ sub_sub_node +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_build_dependencies_tree_with_two_leaves() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec! + [ + ListNodeReport + { + name : "build_sub_node1".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }, + ListNodeReport + { + name : "build_sub_node2".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + } + ], + }; + let expected = r#" +node +[build-dependencies] +├─ build_sub_node1 +└─ build_sub_node2 +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_build_dependencies_tree_with_one_leaf() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![ + ListNodeReport + { + name : "build_sub_node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + } + ], + }; + let expected = r#" +node +[build-dependencies] +└─ build_sub_node +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_dev_dependencies_tree_with_two_leaves() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec! + [ + ListNodeReport + { + name : "dev_sub_node1".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }, + ListNodeReport + { + name : "dev_sub_node2".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + } + ], + build_dependencies : vec![], + }; + let expected = r#" +node +[dev-dependencies] +├─ dev_sub_node1 +└─ dev_sub_node2 +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_dev_dependencies_tree_with_one_leaf() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![ + ListNodeReport + { + name : "dev_sub_node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + } + ], + build_dependencies : vec![], + }; + let expected = r#" +node +[dev-dependencies] +└─ dev_sub_node +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_dependencies_tree_with_two_leaves() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec! + [ + ListNodeReport + { + name : "sub_node1".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }, + ListNodeReport + { + name : "sub_node2".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + } + ], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + let expected = r#" +node +├─ sub_node1 +└─ sub_node2 +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn node_with_dependency_tree_with_one_leaf() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![ ListNodeReport + { + name : "sub_node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + let expected = r#" +node +└─ sub_node +"#.trim(); + + let actual = node.display_with_spacer( "" ).unwrap(); + let actual = actual.trim(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} + +#[ test ] +fn one_node_one_line() +{ + let node = ListNodeReport + { + name : "node".into(), + version : None, + path : None, + duplicate : false, + normal_dependencies : vec![], + dev_dependencies : vec![], + build_dependencies : vec![], + }; + let expected = "node\n"; + + let actual = node.display_with_spacer( "" ).unwrap(); + println!("{actual}"); + + assert_eq!( expected, actual ); +} diff --git a/module/move/willbe/tests/inc/action/main_header.rs b/module/move/willbe/tests/inc/action/main_header.rs new file mode 100644 index 0000000000..abc3e492d4 --- /dev/null +++ b/module/move/willbe/tests/inc/action/main_header.rs @@ -0,0 +1,168 @@ +use crate::*; +use assert_fs::prelude::*; +use the_module::action; + +use std::io::Read; +use willbe::_path::AbsolutePath; + + +fn arrange( source : &str ) -> assert_fs::TempDir +{ + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( source ), &[ "**" ] ).unwrap(); + + temp +} + +#[ test ] +fn tag_shout_stay() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "" ) ); + assert!( actual.contains( "" ) ); +} + +#[ test ] +fn branch_cell() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![test_branch](https://img.shields.io/github/actions/workflow/status/Username/test/StandardRustScheduled.yml?branch=master&label=test_branch&logo=github)](https://github.com/Username/test/actions/workflows/StandardRustStatus.yml)" ) ); +} + +#[ test ] +fn discord_cell() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY)" ) ); +} + +#[ test ] +fn gitpod_cell() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2Ftest_trivial%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20test_trivial/https://github.com/Username/test)" ) ); +} + +#[ test ] +fn docs_cell() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/test)" ) ); +} + +#[ test ] +fn without_fool_config() +{ + // Arrange + let temp = arrange( "single_module_without_master_branch_and_discord" ); + + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[master]" ) );// master by default + assert!( !actual.contains( "[discord]" ) );// without discord +} + +#[ test ] +fn idempotency() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + let mut actual1 = String::new(); + _ = file.read_to_string( &mut actual1 ).unwrap(); + drop( file ); + + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "Readme.md" ) ).unwrap(); + let mut actual2 = String::new(); + _ = file.read_to_string( &mut actual2 ).unwrap(); + drop( file ); + + // Assert + assert_eq!( actual1, actual2 ); +} + +#[ test ] +#[ should_panic ] +fn without_needed_config() +{ + // Arrange + let temp = arrange( "variadic_tag_configurations" ); + // Act + _ = action::readme_header_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); +} \ No newline at end of file diff --git a/module/move/willbe/tests/inc/action/mod.rs b/module/move/willbe/tests/inc/action/mod.rs new file mode 100644 index 0000000000..ae10e6d259 --- /dev/null +++ b/module/move/willbe/tests/inc/action/mod.rs @@ -0,0 +1,12 @@ +use super::*; + +pub mod features; +pub mod list; +pub mod readme_health_table_renew; +pub mod readme_modules_headers_renew; +pub mod test; +pub mod cicd_renew; +pub mod workspace_renew; + +// aaa : for Petro : sort +// aaa : sorted & renamed \ No newline at end of file diff --git a/module/move/willbe/tests/inc/action/readme_health_table_renew.rs b/module/move/willbe/tests/inc/action/readme_health_table_renew.rs new file mode 100644 index 0000000000..58a745148e --- /dev/null +++ b/module/move/willbe/tests/inc/action/readme_health_table_renew.rs @@ -0,0 +1,201 @@ +use super::*; +use assert_fs::prelude::*; +use the_module::action; +use std::io::Read; + +fn arrange( source : &str ) -> assert_fs::TempDir +{ + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( source ), &[ "**" ] ).unwrap(); + + temp +} + +#[ test ] +#[ should_panic ] +// should panic, because the url to the repository is not in Cargo.toml of the workspace or in Cargo.toml of the module. +fn without_any_toml_configurations_test() +{ + // Arrange + let temp = arrange( "without_any_toml_configurations" ); + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); +} + +#[ test ] +fn tags_should_stay() +{ + // Arrange + let temp = arrange( "without_module_toml_configurations" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + assert!( actual.contains( "" ) ); + assert!( actual.contains( "" ) ); +} + +#[ test ] +// url to repository and list of branches should be taken from workspace Cargo.toml, stability - experimental by default +fn stability_experimental_by_default() +{ + // Arrange + let temp = arrange( "without_module_toml_configurations" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + assert!( actual.contains( "[![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) |" ) ); +} + +#[ test ] +// url to repository and stability should be taken from module Cargo.toml, branches should not be awarded because they are not listed in the workspace Cargo.toml +fn stability_and_repository_from_module_toml() +{ + // Arrange + let temp = arrange( "without_workspace_toml_configurations" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + assert!( actual.contains( "[![stability-stable](https://img.shields.io/badge/stability-stable-green.svg)](https://github.com/emersion/stability-badges#stable)" ) ); +} + +#[ test ] +fn variadic_tag_configuration_test() +{ + // Arrange + let explicit_all_true_flag = + "-->\r| Module | Stability | test_branch1 | test_branch2 | Docs | Sample |\n|--------|-----------|--------|--------|:----:|:------:|\n"; + let all_true_flag = + "-->\r| Module | Stability | test_branch1 | test_branch2 | Docs | Sample |\n|--------|-----------|--------|--------|:----:|:------:|\n"; + let with_stability_only = + "-->\r| Module | Stability |\n|--------|-----------|\n"; + let with_branches_only = + "-->\r| Module | test_branch1 | test_branch2 |\n|--------|--------|--------|\n"; + let with_docs_only = + "-->\r| Module | Docs |\n|--------|:----:|\n"; + let with_gitpod_only = + "-->\r| Module | Sample |\n|--------|:------:|\n"; + + let expected = vec![ explicit_all_true_flag, all_true_flag, with_stability_only, with_branches_only, with_docs_only, with_gitpod_only ]; + let temp = arrange( "variadic_tag_configurations" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut content = String::new(); + _ = file.read_to_string( &mut content ).unwrap(); + for ( index, actual ) in content.split( "###" ).into_iter().enumerate() + { + assert!( actual.trim().contains( expected[ index ] ) ); + } +} + +// " | Sample |\n|--------|-----------|--------|--------|:----:|:------:|\n| | | \n"; +#[ test ] +fn module_cell() +{ + // Arrange + let temp = arrange( "full_config" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + assert!( actual.contains( "[_willbe_variadic_tag_configurations_c](./_willbe_variadic_tag_configurations_c)" ) ); +} + +#[ test ] +fn stability_cell() +{ + // Arrange + let temp = arrange( "full_config" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + dbg!( &actual ); + assert!( actual.contains( "[![stability-deprecated](https://img.shields.io/badge/stability-deprecated-red.svg)](https://github.com/emersion/stability-badges#deprecated)" ) ); +} + +#[ test ] +fn branches_cell() +{ + // Arrange + let temp = arrange( "full_config" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + assert!( actual.contains( "[![rust-status](https://img.shields.io/github/actions/workflow/status/SomeCrate/C/module_willbe_variadic_tag_configurations_c_push.yml?label=&branch=test_branch1)](https://github.com/SomeName/SomeCrate/C/actions/workflows/module_willbe_variadic_tag_configurations_c_push.yml?query=branch%3Atest_branch1) | [![rust-status](https://img.shields.io/github/actions/workflow/status/SomeCrate/C/module_willbe_variadic_tag_configurations_c_push.yml?label=&branch=test_branch2)](https://github.com/SomeName/SomeCrate/C/actions/workflows/module_willbe_variadic_tag_configurations_c_push.yml?query=branch%3Atest_branch2)" ) ); +} + +#[ test ] +fn docs_cell() +{ + // Arrange + let temp = arrange( "full_config" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + assert!( actual.contains( "[![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/_willbe_variadic_tag_configurations_c)" ) ); +} + +#[ test ] +fn sample_cell() +{ + // Arrange + let temp = arrange( "full_config" ); + + // Act + _ = action::readme_health_table_renew( &temp ).unwrap(); + + // Assert + let mut file = std::fs::File::open( temp.path().join( "readme.md" ) ).unwrap(); + let mut actual = String::new(); + _ = file.read_to_string( &mut actual ).unwrap(); + + assert!( actual.contains( " [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=.%2F_willbe_variadic_tag_configurations_c%2Fexamples%2F_willbe_variadic_tag_configurations_c_trivial.rs,RUN_POSTFIX=--example%20_willbe_variadic_tag_configurations_c_trivial/https://github.com/SomeName/SomeCrate/C)" ) ); +} diff --git a/module/move/willbe/tests/inc/action/readme_modules_headers_renew.rs b/module/move/willbe/tests/inc/action/readme_modules_headers_renew.rs new file mode 100644 index 0000000000..8fe71df94a --- /dev/null +++ b/module/move/willbe/tests/inc/action/readme_modules_headers_renew.rs @@ -0,0 +1,207 @@ +use super::*; +use assert_fs::prelude::*; +use the_module::action; +use std::io::Read; +use willbe::_path::AbsolutePath; + +fn arrange( source : &str ) -> assert_fs::TempDir +{ + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( source ), &[ "**" ] ).unwrap(); + + temp +} + +// [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) +// [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleTestModulePush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleTestModulePush.yml) +// [![docs.rs](https://img.shields.io/docsrs/test_module?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_module) +// [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2Ftest_module_trivial%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20test_module_trivial/https://github.com/Wandalen/wTools) +// [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +#[ test ] +fn tags_should_stay() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "test_module" ).join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "" ) ); + assert!( actual.contains( "" ) ); +} + +#[ test ] +fn default_stability() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "test_module" ).join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental)" ) ); + assert!( !actual.contains( "|" ) ); +} + +#[ test ] +fn docs() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "test_module" ).join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![docs.rs](https://img.shields.io/docsrs/test_module?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_module)" ) ); +} + +#[ test ] +fn no_gitpod() +{ + // Arrange + let temp = arrange("single_module"); + + // Act + _ = action::readme_modules_headers_renew(AbsolutePath::try_from(temp.path()).unwrap()).unwrap(); + let mut file = std::fs::File::open(temp.path().join("test_module").join("Readme.md")).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string(&mut actual).unwrap(); + + // Assert + // no example - no gitpod + assert!(!actual.contains("[Open in Gitpod]")); +} +#[ test ] +fn with_gitpod() +{ + let temp = arrange( "single_module_with_example" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "module" ).join( "test_module" ).join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + dbg!(&actual); + assert!( actual.contains( "[Open in Gitpod]" ) ); +} + +#[ test ] +fn discord() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "test_module" ).join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY)" ) ); +} + +#[ test ] +fn status() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "test_module" ).join( "Readme.md" ) ).unwrap(); + + let mut actual = String::new(); + + _ = file.read_to_string( &mut actual ).unwrap(); + + // Assert + assert!( actual.contains( "[![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_test_module_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_test_module_push.yml)" ) ); +} + +#[ test ] +fn idempotency() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "test_module" ).join( "Readme.md" ) ).unwrap(); + let mut actual1 = String::new(); + _ = file.read_to_string( &mut actual1 ).unwrap(); + drop( file ); + + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + let mut file = std::fs::File::open( temp.path().join( "test_module" ).join( "Readme.md" ) ).unwrap(); + let mut actual2 = String::new(); + _ = file.read_to_string( &mut actual2 ).unwrap(); + drop( file ); + + // Assert + assert_eq!( actual1, actual2 ); +} + +#[ test ] +fn with_many_members_and_varius_config() +{ + let temp = arrange( "three_packages" ); + + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); + + let mut file_b = std::fs::File::open( temp.path().join( "b" ).join( "Readme.md" ) ).unwrap(); + let mut file_c = std::fs::File::open( temp.path().join( "c" ).join( "Readme.md" ) ).unwrap(); + let mut file_d = std::fs::File::open( temp.path().join( "d" ).join( "Readme.md" ) ).unwrap(); + + let mut actual_b = String::new(); + let mut actual_c = String::new(); + let mut actual_d = String::new(); + + _ = file_b.read_to_string( &mut actual_b ).unwrap(); + _ = file_c.read_to_string( &mut actual_c ).unwrap(); + _ = file_d.read_to_string( &mut actual_d ).unwrap(); + + assert!( actual_b.contains( "[![stability-stable]" ) ); + assert!( actual_c.contains( "(https://discord.gg/m3YfbXpUUY)" ) ); + assert!( actual_d.contains( "(https://discord.gg/123456789)" ) ); +} + +#[ test ] +#[ should_panic ] +fn without_needed_config() +{ + // Arrange + let temp = arrange( "variadic_tag_configurations" ); + + // Act + _ = action::readme_modules_headers_renew( AbsolutePath::try_from( temp.path() ).unwrap() ).unwrap(); +} diff --git a/module/move/willbe/tests/inc/action/test.rs b/module/move/willbe/tests/inc/action/test.rs new file mode 100644 index 0000000000..1233017b05 --- /dev/null +++ b/module/move/willbe/tests/inc/action/test.rs @@ -0,0 +1,326 @@ +use std::collections::BTreeSet; +use std::fs::{self, File }; +use std::io::Write; +use std::path::{ Path, PathBuf }; +use assert_fs::TempDir; + +use crate::the_module::*; +use action::test::{test, TestsCommandOptions}; +use _path::AbsolutePath; +use channel::*; +use optimization::*; +use willbe::test::TestVariant; + +#[ test ] +// if the test fails => the report is returned as an error ( Err(Report) ) +fn fail_test() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let project = ProjectBuilder::new( "fail_test" ) + .toml_file( "[features]\nenabled = []" ) + .test_file( r#" + #[test] + fn should_fail() + { + panic!() + } + "#) + .build( temp ) + .unwrap(); + let abs = AbsolutePath::try_from( project ).unwrap(); + + let args = TestsCommandOptions::former() + .dir( abs ) + .channels([ Channel::Stable ]) + .optimizations([ Optimization::Debug ]) + .with_none_features( true ) + .form(); + + let rep = test( args, false ).unwrap_err().0; + println!( "========= OUTPUT =========\n{}\n==========================", rep ); + + let no_features = rep + .failure_reports[ 0 ] + .tests.get( &TestVariant::former().optimization( Optimization::Debug ).channel( Channel::Stable ).features( BTreeSet::default() ).form() ) + .unwrap(); + + assert!( no_features.is_err() ); + assert!( no_features.clone().unwrap_err().out.contains( "failures" ) ); +} + +#[ test ] +// if a compilation error occurred => the report is returned as an error ( Err(Report) ) +fn fail_build() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let project = ProjectBuilder::new( "fail_build" ) + .lib_file( "compile_error!( \"achtung\" );" ) + .toml_file( "[features]\nenabled = []" ) + .test_file( r#" + #[test] + fn should_pass() { + assert!(true); + } + "#) + .build( temp ) + .unwrap(); + let abs = AbsolutePath::try_from( project ).unwrap(); + + let args = TestsCommandOptions::former() + .dir( abs ) + .channels([ Channel::Stable ]) + .optimizations([ Optimization::Debug ]) + .with_none_features( true ) + .form(); + + let rep = test( args, false ).unwrap_err().0; + println!( "========= OUTPUT =========\n{}\n==========================", rep ); + + let no_features = rep + .failure_reports[ 0 ] + .tests.get( &TestVariant::former().optimization( Optimization::Debug ).channel( Channel::Stable ).features( BTreeSet::default() ).form() ) + .unwrap(); + + assert!( no_features.clone().unwrap_err().out.contains( "error" ) && no_features.clone().unwrap_err().out.contains( "achtung" ) ); +} + +#[ test ] +// if there are 3 members in the workspace (two of them pass the tests and one of them fails) => the global report will contain 2 successful reports and 1 defeats +fn call_from_workspace_root() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let fail_project = ProjectBuilder::new( "fail_test" ) + .toml_file( "[features]\nenabled = []" ) + .test_file( r#" + #[test] + fn should_fail123() { + panic!() + } + "#); + + let pass_project = ProjectBuilder::new( "apass_test" ) + .toml_file( "[features]\nenabled = []" ) + .test_file( r#" + #[test] + fn should_pass() { + assert_eq!(1,1); + } + "#); + + let pass_project2 = ProjectBuilder::new( "pass_test2" ) + .toml_file( "[features]\nenabled = []" ) + .test_file( r#" + #[test] + fn should_pass() { + assert_eq!(1,1); + } + "#); + + let workspace = WorkspaceBuilder::new() + .member( fail_project ) + .member( pass_project ) + .member( pass_project2 ) + .build( temp ); + + // from workspace root + let abs = AbsolutePath::try_from( workspace.clone() ).unwrap(); + + let args = TestsCommandOptions::former() + .dir( abs ) + .concurrent( 1u32 ) + .channels([ Channel::Stable ]) + .optimizations([ optimization::Optimization::Debug ]) + .with_none_features( true ) + .form(); + + + let rep = test( args, false ); + let rep = rep.unwrap_err().0; + + + assert_eq!( rep.failure_reports.len(), 1 ); + assert_eq!( rep.success_reports.len(), 2 ); +} + +#[ test ] +fn plan() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let project = ProjectBuilder::new( "plan_test" ) + .toml_file( "[features]\nenabled = []" ) + .test_file( r#" + #[test] + fn should_pass() { + assert!(true); + } + "#) + .build( temp ) + .unwrap(); + let abs = AbsolutePath::try_from( project ).unwrap(); + + let args = TestsCommandOptions::former() + .dir( abs ) + .channels([ Channel::Stable, Channel::Nightly ]) + .optimizations([ Optimization::Debug, Optimization::Release ]) + .with_none_features( true ) + .with_progress( false ) + .form(); + + let rep = test( args, true ).unwrap().success_reports[ 0 ].clone().tests; + + assert!( rep.get( &TestVariant::former().optimization( Optimization::Debug ).channel( Channel::Stable ).features( BTreeSet::default() ).form() ).is_some() ); + assert!( rep.get( &TestVariant::former().optimization( Optimization::Debug ).channel( Channel::Nightly ).features( BTreeSet::default() ).form() ).is_some() ); + assert!( rep.get( &TestVariant::former().optimization( Optimization::Release ).channel( Channel::Stable ).features( BTreeSet::default() ).form() ).is_some() ); + assert!( rep.get( &TestVariant::former().optimization( Optimization::Release ).channel( Channel::Nightly ).features( BTreeSet::default() ).form() ).is_some() ); +} + +#[ test ] +fn backtrace_should_be() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let project = ProjectBuilder::new( "fail_build" ) + .toml_file( "[features]\nenabled = []" ) + .test_file( r#" + #[test] + fn fail() { + assert!(false); + } + "#) + .build( temp ) + .unwrap(); + let abs = AbsolutePath::try_from( project ).unwrap(); + + let args = TestsCommandOptions::former() + .dir( abs ) + .channels([ Channel::Stable ]) + .optimizations([ Optimization::Debug ]) + .with_none_features( true ) + .form(); + + let rep = test( args, false ).unwrap_err().0; + println!( "========= OUTPUT =========\n{}\n==========================", rep ); + + let no_features = rep + .failure_reports[ 0 ] + .tests.get( &TestVariant::former().optimization( Optimization::Debug ).channel( Channel::Stable ).features( BTreeSet::default() ).form() ) + .unwrap(); + + assert!( !no_features.clone().unwrap_err().out.contains( "RUST_BACKTRACE" ) ); + assert!( no_features.clone().unwrap_err().out.contains( "stack backtrace" ) ); +} + +#[ derive( Debug ) ] +pub struct ProjectBuilder +{ + name : String, + lib_content : Option< String >, + test_content : Option< String >, + toml_content : Option< String >, +} + +impl ProjectBuilder +{ + pub fn new( name : &str ) -> Self + { + Self + { + name : String::from( name ), + lib_content : None, + test_content : None, + toml_content : None, + } + } + + pub fn lib_file< S : Into< String > >( mut self, content : S ) -> Self + { + self.lib_content = Some( content.into() ); + self + } + + pub fn test_file< S : Into< String > >( mut self, content : S ) -> Self + { + self.test_content = Some( content.into() ); + self + } + + pub fn toml_file( mut self, content : &str ) -> Self + { + self.toml_content = Some( format!( "[package]\nname = \"{}\"\nversion = \"0.1.0\"\nedition = \"2021\"\n{}", self.name, content ) ); + self + } + + pub fn build< P : AsRef< Path > >( &self, path : P ) -> std::io::Result< PathBuf > + { + let project_path = path.as_ref(); + + fs::create_dir_all( project_path.join( "src" ) )?; + fs::create_dir_all( project_path.join( "tests" ) )?; + + if let Some( content ) = &self.toml_content + { + let mut file = File::create( project_path.join( "Cargo.toml" ) )?; + write!( file, "{}", content )?; + } + + let mut file = File::create( project_path.join( "src/lib.rs" ) )?; + if let Some( content ) = &self.lib_content + { + write!( file, "{}", content )?; + } + + if let Some( content ) = &self.test_content + { + let mut file = File::create( project_path.join( "tests/tests.rs" ) )?; + write!( file, "{}", content )?; + } + + Ok( project_path.to_path_buf() ) + } +} + +struct WorkspaceBuilder +{ + members : Vec< ProjectBuilder >, + toml_content : String, +} + +impl WorkspaceBuilder +{ + fn new() -> Self + { + Self + { + members : vec![], + toml_content : "[workspace]\nresolver = \"2\"\nmembers = [\n \"modules/*\",\n]\n".to_string(), + } + } + + fn member( mut self, project : ProjectBuilder ) -> Self + { + self.members.push( project ); + self + } + + fn build< P : AsRef< Path > >( self, path : P ) -> PathBuf + { + let project_path = path.as_ref(); + fs::create_dir_all( project_path.join( "modules" ) ).unwrap(); + let mut file = File::create( project_path.join( "Cargo.toml" ) ).unwrap(); + write!( file, "{}", self.toml_content ).unwrap(); + for member in self.members + { + member.build( project_path.join( "modules" ).join( &member.name ) ).unwrap(); + } + project_path.into() + } +} diff --git a/module/move/willbe/tests/inc/action/workspace_renew.rs b/module/move/willbe/tests/inc/action/workspace_renew.rs new file mode 100644 index 0000000000..9dbfcea23d --- /dev/null +++ b/module/move/willbe/tests/inc/action/workspace_renew.rs @@ -0,0 +1,64 @@ +use assert_fs::prelude::*; + +use super::*; +use std::fs; +use std::fs::create_dir; +use the_module::action::workspace_renew; +use the_module::action::WorkspaceTemplate; + +fn arrange( sample_dir : &str ) -> assert_fs::TempDir +{ + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( sample_dir ), &[ "**" ] ).unwrap(); + temp +} + +#[ test ] +fn default_case() +{ + // Arrange + let temp = assert_fs::TempDir::new().unwrap(); + let temp_path = temp.join( "test_project_name" ); + create_dir(temp.join("test_project_name" )).unwrap(); + + // Act + _ = workspace_renew( &temp.path().join( "test_project_name" ), WorkspaceTemplate::default(), "https://github.con/Username/TestRepository".to_string(), vec![ "master".to_string() ] ).unwrap(); + + // Assets + assert!( temp_path.join( "module" ).exists() ); + assert!( temp_path.join( "Readme.md" ).exists() ); + assert!( temp_path.join( ".gitattributes" ).exists() ); + assert!( temp_path.join( ".gitignore" ).exists() ); + assert!( temp_path.join( ".gitpod.yml" ).exists() ); + assert!( temp_path.join( "Cargo.toml" ).exists() ); + + let actual = fs::read_to_string(temp_path.join( "Cargo.toml" ) ).unwrap(); + + let name = "project_name = \"test_project_name\""; + let repo_url = "repo_url = \"https://github.con/Username/TestRepository\""; + let branches = "branches = [\"master\"]"; + assert!( actual.contains( &name) ); + assert!( actual.contains( &repo_url) ); + assert!( actual.contains( &branches) ); + + assert!( temp_path.join( "Makefile" ).exists() ); + assert!( temp_path.join( ".cargo" ).exists() ); + assert!( temp_path.join( ".cargo/config.toml" ).exists() ); +} + +#[ test ] +fn non_empty_dir() +{ + // Arrange + let temp = arrange( "single_module" ); + + // Act + let r = workspace_renew( temp.path(), WorkspaceTemplate::default(), "".to_string(), vec![] ); + + // Assert + assert!( r.is_err() ); +} diff --git a/module/move/willbe/tests/inc/command/mod.rs b/module/move/willbe/tests/inc/command/mod.rs new file mode 100644 index 0000000000..eb3d58e715 --- /dev/null +++ b/module/move/willbe/tests/inc/command/mod.rs @@ -0,0 +1,3 @@ +use super::*; + +mod tests_run; diff --git a/module/move/willbe/tests/inc/command/tests_run.rs b/module/move/willbe/tests/inc/command/tests_run.rs new file mode 100644 index 0000000000..c540c285d5 --- /dev/null +++ b/module/move/willbe/tests/inc/command/tests_run.rs @@ -0,0 +1,84 @@ +use super::*; +// use the_module::*; +use assert_cmd::Command; +use inc:: +{ + action::test::ProjectBuilder, + // aaa : for Petro : move to helper. don't reuse test-rs files in command and endpoints + // aaa : move to helper module + helpers::BINARY_NAME, +}; + +use assert_fs::TempDir; + +#[ test ] +fn status_code_1_on_failure() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let project = ProjectBuilder::new( "status_code" ) + .toml_file( "" ) + .test_file( r#" + #[test] + fn should_fail() { + panic!(); + } + "#) + .build( temp ) + .unwrap(); + + Command::cargo_bin( BINARY_NAME ).unwrap() + .args([ ".tests.run", "with_nightly :0" ]) + .current_dir( project ) + .assert() + .failure(); +} + +#[ test ] +fn status_code_not_zero_on_failure() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let project = ProjectBuilder::new( "status_code" ) + .toml_file( "" ) + .test_file( r#" + #[test] + fn should_fail() { + panic!(); + } + "#) + .build( temp ) + .unwrap(); + + Command::cargo_bin( BINARY_NAME ).unwrap() + .args([ ".tests.run", "with_nightly :0" ]) + .current_dir( project ) + .assert() + .failure(); +} + +#[ test ] +fn status_code_not_zero_on_compile_error() +{ + let temp = TempDir::new().unwrap(); + let temp = &temp; + + let project = ProjectBuilder::new( "status_code" ) + .toml_file( "" ) + .test_file( r#" + #[test] + fn should_fail() { + compile_error!("=-="); + } + "#) + .build( temp ) + .unwrap(); + + Command::cargo_bin( BINARY_NAME ).unwrap() + .args([ ".tests.run", "with_nightly :0" ]) + .current_dir( project ) + .assert() + .failure(); +} diff --git a/module/move/willbe/tests/inc/entity/dependencies.rs b/module/move/willbe/tests/inc/entity/dependencies.rs new file mode 100644 index 0000000000..28f393d4f5 --- /dev/null +++ b/module/move/willbe/tests/inc/entity/dependencies.rs @@ -0,0 +1,128 @@ +use super::*; + +use assert_fs::prelude::*; +use assert_fs::TempDir; +use the_module::Workspace; +use the_module::package::{ dependencies, DependenciesOptions, DependenciesSort }; +use willbe::CrateDir; +use willbe::package::Package; +use willbe::_path::AbsolutePath; + +// + +fn arrange( asset_name : &str ) -> ( TempDir, Workspace ) +{ + let path = CrateDir::try_from( AbsolutePath::try_from( std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ) ).unwrap() ).unwrap(); + let mut metadata = Workspace::with_crate_dir( path ).unwrap(); + + let root_path = metadata.load().unwrap().workspace_root().unwrap(); + let assets_relative_path = std::path::Path::new( ASSET_PATH ); + let assets_path = root_path.join( "module" ).join( "move" ).join( "willbe" ).join( assets_relative_path ); + let temp = TempDir::new().unwrap(); + temp.copy_from( assets_path.join( asset_name ), &[ "**" ] ).unwrap(); + + let temp_crate_dir = CrateDir::try_from( AbsolutePath::try_from( temp.to_path_buf() ).unwrap() ).unwrap(); + let metadata = Workspace::with_crate_dir( temp_crate_dir ).unwrap(); + + ( temp, metadata ) +} + +// a -> b -> c +#[ test ] +fn chain_of_three_packages() +{ + // Arrange + let ( temp, mut metadata ) = arrange( "chain_of_packages" ); + + let a = Package::try_from( AbsolutePath::try_from( temp.join( "a" ) ).unwrap() ).unwrap(); + let b = Package::try_from( AbsolutePath::try_from( temp.join( "b" ) ).unwrap() ).unwrap(); + let c = Package::try_from( AbsolutePath::try_from( temp.join( "c" ) ).unwrap() ).unwrap(); + + // Act + let output = dependencies( &mut metadata, &a, DependenciesOptions::default() ).unwrap(); + let output : Vec< _ > = output.iter().filter_map( | o | o.path.as_ref() ).map( | x | x.as_ref() ).collect(); + + // Assert + assert_eq!( 2, output.len() ); + assert!( ( c.crate_dir().as_ref() == output[ 0 ] && b.crate_dir().as_ref() == output[ 1 ] ) || ( c.crate_dir().as_ref() == output[ 1 ] && b.crate_dir().as_ref() == output[ 0 ] ) ); + + let output = dependencies( &mut metadata, &b, DependenciesOptions::default() ).unwrap(); + let output : Vec< _ > = output.iter().filter_map( | o | o.path.as_ref() ).map( | x | x.as_ref() ).collect(); + assert_eq!( 1, output.len() ); + assert_eq!( c.crate_dir().as_ref(), output[ 0 ] ); + + let output = dependencies( &mut metadata, &c, DependenciesOptions::default() ).unwrap(); + assert!( output.is_empty() ); +} + +// a -> b -> c +#[ test ] +fn chain_of_three_packages_topologically_sorted() +{ + // Arrange + let ( temp, mut metadata ) = arrange( "chain_of_packages" ); + + let a = Package::try_from( AbsolutePath::try_from( temp.join( "a" ) ).unwrap() ).unwrap(); + let b = Package::try_from( AbsolutePath::try_from( temp.join( "b" ) ).unwrap() ).unwrap(); + let c = Package::try_from( AbsolutePath::try_from( temp.join( "c" ) ).unwrap() ).unwrap(); + + // Act + let output = dependencies( &mut metadata, &a, DependenciesOptions { sort : DependenciesSort::Topological, ..Default::default() } ).unwrap(); + let output : Vec< _ > = output.iter().filter_map( | o | o.path.as_ref() ).map( | x | x.as_ref() ).collect(); + + // Assert + assert_eq!( &[ c.crate_dir().as_ref(), b.crate_dir().as_ref() ], output.as_slice() ); + + let output = dependencies( &mut metadata, &b, DependenciesOptions { sort : DependenciesSort::Topological, ..Default::default() } ).unwrap(); + let output : Vec< _ > = output.iter().filter_map( | o | o.path.as_ref() ).map( | x | x.as_ref() ).collect(); + assert_eq!( &[ c.crate_dir().as_ref() ], output.as_slice() ); + + let output = dependencies( &mut metadata, &c, DependenciesOptions { sort : DependenciesSort::Topological, ..Default::default() } ).unwrap(); + assert!( output.is_empty() ); +} + +// a -> ( remote, b ) +#[ test ] +fn package_with_remote_dependency() +{ + // Arrange + let ( temp, mut metadata ) = arrange( "package_with_remote_dependency" ); + + let a = Package::try_from( AbsolutePath::try_from( temp.join( "a" ) ).unwrap() ).unwrap(); + let b = Package::try_from( AbsolutePath::try_from( temp.join( "b" ) ).unwrap() ).unwrap(); + + // Act + let output = dependencies( &mut metadata, &a, DependenciesOptions::default() ).unwrap(); + let output : Vec< _ > = output.iter().filter_map( | o | o.path.as_ref() ).map( | x | x.as_ref() ).collect(); + + // Assert + assert_eq!( 1, output.len() ); + assert_eq!( b.crate_dir().as_ref(), output[ 0 ] ); +} + +// a -> b -> a +#[ test ] +fn workspace_with_cyclic_dependency() +{ + // Arrange + let ( temp, mut metadata ) = arrange( "workspace_with_cyclic_dependency" ); + + let a = Package::try_from( AbsolutePath::try_from( temp.join( "a" ) ).unwrap() ).unwrap(); + let b = Package::try_from( AbsolutePath::try_from( temp.join( "b" ) ).unwrap() ).unwrap(); + + // Act + let output = dependencies( &mut metadata, &a, DependenciesOptions::default() ).unwrap(); + let output : Vec< _ > = output.iter().filter_map( | o | o.path.as_ref() ).map( | x | x.as_ref() ).collect(); + + // Assert + assert_eq!( 1, output.len() ); + assert!( b.crate_dir().as_ref() == output[ 0 ] ); + + // Act + let output = dependencies( &mut metadata, &b, DependenciesOptions::default() ).unwrap(); + let output : Vec< _ > = output.iter().filter_map( | o | o.path.as_ref() ).map( | x | x.as_ref() ).collect(); + + // Assert + assert_eq!( 1, output.len() ); + assert!( a.crate_dir().as_ref() == output[ 0 ] ); +} \ No newline at end of file diff --git a/module/move/willbe/tests/inc/entity/diff.rs b/module/move/willbe/tests/inc/entity/diff.rs new file mode 100644 index 0000000000..b3362ee64d --- /dev/null +++ b/module/move/willbe/tests/inc/entity/diff.rs @@ -0,0 +1,98 @@ +use crate::*; + +use std::path::{ Path, PathBuf }; +use assert_fs::{ TempDir, prelude::* }; +use crates_tools::CrateArchive; +use the_module::*; +use _path::AbsolutePath; +use package::Package; +use diff::crate_diff; +use the_module::version::{ Version, BumpOptions, version_bump }; + +const TEST_MODULE_PATH : &str = "../../test/"; + +#[ test ] +fn no_changes() +{ + let tmp = &TempDir::new().unwrap(); + let package_path = package_path( "c" ); + + let left = prepare( tmp, "left", &package_path ); + let left_crate = crate_file_path( &left ); + let left_archive = CrateArchive::read( &left_crate ).unwrap(); + + let right = prepare( tmp, "right", &package_path ); + let right_crate = crate_file_path( &right ); + let right_archive = CrateArchive::read( &right_crate ).unwrap(); + + let has_changes = crate_diff( &left_archive, &right_archive ).exclude( diff::PUBLISH_IGNORE_LIST ).has_changes(); + + assert!( !has_changes ); +} + +#[ test ] +fn with_changes() +{ + let tmp = &TempDir::new().unwrap(); + let package_path = package_path( "c" ); + + let left = + { + let left = prepare( tmp, "left", &package_path ); + let left_crate = crate_file_path( &left ); + CrateArchive::read( &left_crate ).unwrap() + }; + + let right = + { + let right = prepare( tmp, "right", &package_path ); + + let absolute = AbsolutePath::try_from( right.as_path() ).unwrap(); + let right_package = Package::try_from( absolute ).unwrap(); + let right_version = Version::try_from( &right_package.version().unwrap() ).unwrap(); + + let bump_options = BumpOptions + { + crate_dir : CrateDir::try_from( right.clone() ).unwrap(), + old_version : right_version.clone(), + new_version : right_version.bump(), + dependencies : vec![], + dry : false, + }; + version_bump( bump_options ).unwrap(); + + let right_crate = crate_file_path( &right ); + CrateArchive::read( &right_crate ).unwrap() + }; + + let has_changes = crate_diff( &left, &right ).exclude( diff::PUBLISH_IGNORE_LIST ).has_changes(); + + assert!( has_changes ); +} + +fn package_path< P : AsRef< Path > >( path : P ) -> PathBuf +{ + let root_path = Path::new( env!( "CARGO_MANIFEST_DIR" ) ).join( TEST_MODULE_PATH ); + root_path.join( path ) +} + +fn prepare( tmp : &TempDir, name : &str, manifest_dir_path : &Path ) -> PathBuf +{ + let dir = tmp.child( name ); + dir.create_dir_all().unwrap(); + dir.copy_from( manifest_dir_path, &[ "**" ] ).unwrap(); + + dir.to_path_buf() +} + +fn crate_file_path( manifest_dir_path : &Path ) -> PathBuf +{ + _ = cargo::pack( cargo::PackOptions::former().path( manifest_dir_path ).dry( false ).form() ).expect( "Failed to package a package" ); + + let absolute = AbsolutePath::try_from( manifest_dir_path ).unwrap(); + let package = Package::try_from( absolute ).unwrap(); + manifest_dir_path + .join( "target" ) + .join( "package" ) + .join( format!( "{}-{}.crate", package.name().unwrap(), package.version().unwrap() ) ) +} diff --git a/module/move/willbe/tests/inc/entity/features.rs b/module/move/willbe/tests/inc/entity/features.rs new file mode 100644 index 0000000000..0eaf8e7c75 --- /dev/null +++ b/module/move/willbe/tests/inc/entity/features.rs @@ -0,0 +1,268 @@ +use super::*; + +// use the_module::*; +use the_module::features::features_powerset; + +use std::collections::HashMap; +use serde::Deserialize; +use the_module::workspace::WorkspacePackage; +use willbe::features::estimate_with; + +/// Constructs a mock `Package` with specified features for testing. +fn mock_package( features : Vec< ( &str, Vec< &str > ) > ) -> WorkspacePackage +{ + let mut features_map : HashMap< String, Vec< _ > > = HashMap::new(); + for ( feature, deps ) in features + { + features_map.insert( feature.to_string(), deps.iter().map( | &dep | dep.to_string() ).collect() ); + } + + let json = serde_json::json! + ( + { + "name" : "mock_package", + "version" : "0.1.0", + "id" : "mock_package 0.1.0", + "dependencies" : [], + "targets" : [], + "features" : features_map, + "manifest_path" : "".to_string(), + "authors" : [], + "categories" : [], + "keywords" : [], + "edition" : "2018", + } + ); + + WorkspacePackage::deserialize( json ).unwrap() +} + +#[ test ] +fn case_1() +{ + let package = mock_package + ( + vec! + [ + ( "f1", vec![] ), + ( "f2", vec![] ), + ( "f3", vec![] ), + ] + ); + + let power = 1; + + let exclude_features = vec![]; + let include_features = vec![]; + let enabled_features = vec![ "f2".to_string() ]; + let result = features_powerset + ( + &package, + power, + &exclude_features, + &include_features, + &enabled_features, + false, + false, + 100, + ).unwrap(); + dbg!(&result); + + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string(), "f3".to_string() ].into_iter().collect()) ); + assert_eq!( result.len(), 3 ); +} + +#[ test ] +fn case_2() +{ + let package = mock_package + ( + vec! + [ + ( "f1", vec![] ), + ( "f2", vec![] ), + ( "f3", vec![] ), + ] + ); + + let power = 2; + let exclude_features = vec![]; + let include_features = vec![]; + let enabled_features = vec![ "f2".to_string() ]; + let result = features_powerset + ( + &package, + power, + &exclude_features, + &include_features, + &enabled_features, + false, + false, + 100, + ).unwrap(); + dbg!( &result ); + + assert!( result.contains( &vec![ "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string(), "f3".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string(), "f3".to_string() ].into_iter().collect()) ); + assert_eq!( result.len(), 4 ); +} + +#[ test ] +fn case_3() +{ + let package = mock_package + ( + vec! + [ + ( "f1", vec![] ), + ( "f2", vec![] ), + ( "f3", vec![] ), + ] + ); + + let power = 1; + let exclude_features = vec![]; + let include_features = vec![]; + let enabled_features = vec![ "f2".to_string() ]; + let result = features_powerset + ( + &package, + power, + &exclude_features, + &include_features, + &enabled_features, + false, + true, + 100, + ).unwrap(); + dbg!( &result ); + + assert!( result.contains( &vec![].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string(), "f3".to_string() ].into_iter().collect()) ); + assert_eq!( result.len(), 4 ); +} + +#[ test ] +fn case_4() +{ + let package = mock_package + ( + vec! + [ + ( "f1", vec![] ), + ( "f2", vec![] ), + ( "f3", vec![] ), + ] + ); + + let power = 1; + let exclude_features = vec![]; + let include_features = vec![]; + let enabled_features = vec![ "f2".to_string() ]; + let result = features_powerset + ( + &package, + power, + &exclude_features, + &include_features, + &enabled_features, + true, + false, + 100, + ).unwrap(); + dbg!( &result ); + + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string(), "f3".to_string(), ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string(), "f3".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string(), "f3".to_string() ].into_iter().collect()) ); + assert_eq!( result.len(), 4 ); +} + +#[ test ] +fn case_5() +{ + let package = mock_package + ( + vec! + [ + ( "f1", vec![] ), + ( "f2", vec![] ), + ( "f3", vec![] ), + ] + ); + + let power = 1; + let exclude_features = vec![]; + let include_features = vec![ "f1".to_string(), "f2".to_string() ]; + let enabled_features = vec![ "f2".to_string() ]; + let result = features_powerset + ( + &package, + power, + &exclude_features, + &include_features, + &enabled_features, + false, + false, + 100, + ).unwrap(); + dbg!( &result ); + + assert!( result.contains( &vec![ "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string() ].into_iter().collect()) ); + assert_eq!( result.len(), 2 ); +} + +#[ test ] +fn case_6() +{ + let package = mock_package + ( + vec! + [ + ( "f1", vec![] ), + ( "f2", vec![] ), + ( "f3", vec![] ), + ] + ); + + let power = 1; + let exclude_features = vec![ "f3".to_string() ]; + let include_features = vec![]; + let enabled_features = vec![ "f2".to_string() ]; + let result = features_powerset + ( + &package, + power, + &exclude_features, + &include_features, + &enabled_features, + false, + false, + 100, + ).unwrap(); + dbg!( &result ); + + assert!( result.contains( &vec![ "f1".to_string(), "f2".to_string() ].into_iter().collect()) ); + assert!( result.contains( &vec![ "f2".to_string() ].into_iter().collect()) ); + + assert_eq!( result.len(), 2 ); +} + +#[ test ] +fn estimate() +{ + assert_eq!( estimate_with( 5, 2, false, false, &[], 0 ), 16 ); + assert_eq!( estimate_with( 5, 2, true, false, &[], 0 ), 17 ); + assert_eq!( estimate_with( 5, 2, false, true, &[], 0 ), 17 ); + assert_eq!( estimate_with( 5, 2, false, false, &[ "feature1".to_string(), "feature2".to_string() ], 2 ), 20 ); + assert_eq!( estimate_with( 5, 2, true, true, &[ "feature1".to_string(), "feature2".to_string() ], 2 ), 22 ); +} diff --git a/module/move/willbe/tests/inc/entity/mod.rs b/module/move/willbe/tests/inc/entity/mod.rs new file mode 100644 index 0000000000..58ee035a97 --- /dev/null +++ b/module/move/willbe/tests/inc/entity/mod.rs @@ -0,0 +1,6 @@ +use super::*; + +pub mod dependencies; +pub mod diff; +pub mod features; +pub mod version; diff --git a/module/move/willbe/tests/inc/entity/version.rs b/module/move/willbe/tests/inc/entity/version.rs new file mode 100644 index 0000000000..6ae36602ce --- /dev/null +++ b/module/move/willbe/tests/inc/entity/version.rs @@ -0,0 +1,227 @@ +use crate::*; + +use std::path::{ Path, PathBuf }; +use std::str::FromStr; +use std::io::Write; +use assert_fs::prelude::*; +use the_module:: +{ + CrateDir, + Manifest, + version::Version, + _path::AbsolutePath, + package::Package, + version::{ BumpOptions, version_bump, version_revert }, +}; + +const TEST_MODULE_PATH : &str = "../../test/"; + +fn package_path< P : AsRef< Path > >( path : P ) -> PathBuf +{ + let root_path = Path::new( env!( "CARGO_MANIFEST_DIR" ) ).join( TEST_MODULE_PATH ); + root_path.join( path ) +} + +#[ test ] +fn patch() +{ + // Arrange + let version = Version::from_str( "0.0.0" ).unwrap(); + + // Act + let new_version = version.bump(); + + // Assert + assert_eq!( "0.0.1", &new_version.to_string() ); +} + +#[ test ] +fn minor_without_patches() +{ + // Arrange + let version = Version::from_str( "0.1.0" ).unwrap(); + + // Act + let new_version = version.bump(); + + // Assert + assert_eq!( "0.2.0", &new_version.to_string() ); +} + +#[ test ] +fn minor_with_patch() +{ + // Arrange + let version = Version::from_str( "0.1.1" ).unwrap(); + + // Act + let new_version = version.bump(); + + // Assert + assert_eq!( "0.2.0", &new_version.to_string() ); +} + +#[ test ] +fn major_without_patches() +{ + // Arrange + let version = Version::from_str( "1.0.0" ).unwrap(); + + // Act + let new_version = version.bump(); + + // Assert + assert_eq!( "1.1.0", &new_version.to_string() ); +} + +#[ test ] +fn major_with_minor() +{ + // Arrange + let version = Version::from_str( "1.1.0" ).unwrap(); + + // Act + let new_version = version.bump(); + + // Assert + assert_eq!( "1.2.0", &new_version.to_string() ); +} + +#[ test ] +fn major_with_patches() +{ + // Arrange + let version = Version::from_str( "1.1.1" ).unwrap(); + + // Act + let new_version = version.bump(); + + // Assert + assert_eq!( "1.2.0", &new_version.to_string() ); +} + +#[ test ] +fn package_version_bump() +{ + // Arrange + let c = package_path( "c" ); + let temp = assert_fs::TempDir::new().unwrap(); + let temp_module = temp.child( "module" ); + std::fs::create_dir( &temp_module ).unwrap(); + temp_module.child( "c" ).copy_from( &c, &[ "**" ] ).unwrap(); + let c_temp_path = temp_module.join( "c" ); + let c_temp_absolute_path = AbsolutePath::try_from( c_temp_path ).unwrap(); + let c_temp_crate_dir = CrateDir::try_from( c_temp_absolute_path.clone() ).unwrap(); + let c_package = Package::try_from( c_temp_absolute_path.clone() ).unwrap(); + let version = c_package.version().unwrap(); + + let root_manifest_path = temp.join( "Cargo.toml" ); + let mut cargo_toml = std::fs::File::create( &root_manifest_path ).unwrap(); + let root_manifest_absolute_path = AbsolutePath::try_from( root_manifest_path.as_path() ).unwrap(); + write!( cargo_toml, r#" +[workspace] +resolver = "2" +members = [ + "module/*", +] +[workspace.dependencies.test_experimental_c] +version = "{version}" +path = "module/c" +default-features = true +"# ).unwrap(); + let version = Version::try_from( &version ).unwrap(); + let bumped_version = version.clone().bump(); + + // Act + let options = BumpOptions + { + crate_dir : c_temp_crate_dir, + old_version : version.clone(), + new_version : bumped_version.clone(), + dependencies : vec![ CrateDir::try_from( root_manifest_absolute_path.parent().unwrap() ).unwrap() ], + dry : false, + }; + let bump_report = version_bump( options ).unwrap(); + + // Assert + assert_eq!( Some( version.to_string() ), bump_report.old_version ); + assert_eq!( Some( bumped_version.to_string() ), bump_report.new_version ); + assert_eq! + ( + { + let mut v = vec![ root_manifest_absolute_path.clone(), c_temp_absolute_path.join( "Cargo.toml" ) ]; + v.sort(); + v + }, + { + let mut v = bump_report.changed_files; + v.sort(); + v + } + ); + let c_package = Package::try_from( c_temp_absolute_path.clone() ).unwrap(); + let name = c_package.name().unwrap(); + assert_eq!( bumped_version.to_string(), c_package.version().unwrap() ); + let mut root_manifest = Manifest::try_from( root_manifest_absolute_path ).unwrap(); + root_manifest.load().unwrap(); + let data = root_manifest.data(); + let current_version_item = data.get( "workspace" ).and_then( | w | w.get( "dependencies" ) ).and_then( | d | d.get( &name ) ).and_then( | p | p.get( "version" ) ).unwrap(); + let current_version = current_version_item.as_str().unwrap(); + assert_eq!( &bumped_version.to_string(), current_version ); +} + +#[ test ] +fn package_version_bump_revert() +{ + // Arrange + let c = package_path( "c" ); + let temp = assert_fs::TempDir::new().unwrap(); + let temp_module = temp.child( "module" ); + std::fs::create_dir( &temp_module ).unwrap(); + temp_module.child( "c" ).copy_from( &c, &[ "**" ] ).unwrap(); + let c_temp_path = temp_module.join( "c" ); + let c_temp_absolute_path = AbsolutePath::try_from( c_temp_path ).unwrap(); + let c_temp_crate_dir = CrateDir::try_from( c_temp_absolute_path.clone() ).unwrap(); + let c_package = Package::try_from( c_temp_absolute_path.clone() ).unwrap(); + let version = c_package.version().unwrap(); + + let root_manifest_path = temp.join( "Cargo.toml" ); + let mut cargo_toml = std::fs::File::create( &root_manifest_path ).unwrap(); + let root_manifest_absolute_path = AbsolutePath::try_from( root_manifest_path.as_path() ).unwrap(); + write!( cargo_toml, r#" +[workspace] +resolver = "2" +members = [ + "module/*", +] +[workspace.dependencies.test_experimental_c] +version = "{version}" +path = "module/c" +default-features = true +"# ).unwrap(); + let version = Version::try_from( &version ).unwrap(); + let bumped_version = version.clone().bump(); + + // Act + let options = BumpOptions + { + crate_dir : c_temp_crate_dir, + old_version : version.clone(), + new_version : bumped_version.clone(), + dependencies : vec![ CrateDir::try_from( root_manifest_absolute_path.parent().unwrap() ).unwrap() ], + dry : false, + }; + let bump_report = version_bump( options ).unwrap(); + version_revert( &bump_report ).unwrap(); + + // Assert + let c_package = Package::try_from( c_temp_absolute_path.clone() ).unwrap(); + let name = c_package.name().unwrap(); + assert_eq!( version.to_string(), c_package.version().unwrap() ); + let mut root_manifest = Manifest::try_from( root_manifest_absolute_path ).unwrap(); + root_manifest.load().unwrap(); + let data = root_manifest.data(); + let current_version_item = data.get( "workspace" ).and_then( | w | w.get( "dependencies" ) ).and_then( | d | d.get( &name ) ).and_then( | p | p.get( "version" ) ).unwrap(); + let current_version = current_version_item.as_str().unwrap(); + assert_eq!( &version.to_string(), current_version ); +} diff --git a/module/move/willbe/tests/inc/helpers.rs b/module/move/willbe/tests/inc/helpers.rs new file mode 100644 index 0000000000..c2c1ded1d5 --- /dev/null +++ b/module/move/willbe/tests/inc/helpers.rs @@ -0,0 +1 @@ +pub const BINARY_NAME : &'static str = "will"; diff --git a/module/move/willbe/tests/inc/mod.rs b/module/move/willbe/tests/inc/mod.rs new file mode 100644 index 0000000000..b7a5680237 --- /dev/null +++ b/module/move/willbe/tests/inc/mod.rs @@ -0,0 +1,10 @@ +use super::*; + +mod action; +mod package; +mod command; +mod entity; +mod tool; +mod helpers; + +// qqq : for Petro : for Bohdan : sort out test files to be consistent with src files diff --git a/module/move/willbe/tests/inc/package.rs b/module/move/willbe/tests/inc/package.rs new file mode 100644 index 0000000000..935069b5e6 --- /dev/null +++ b/module/move/willbe/tests/inc/package.rs @@ -0,0 +1,172 @@ +// use super::*; +// use the_module:: +// { +// Workspace, +// _path::AbsolutePath, +// package::PublishPlan, +// }; +// use willbe::package::perform_packages_publish; +// +// #[ test ] +// fn plan_publish_many_packages() +// { +// let workspace = Workspace::from_current_path().unwrap(); +// let package = workspace.package_find_by_manifest( /* AbsolutePath::try_from( "../wca/Cargo.toml" ).unwrap() */ ).unwrap().to_owned(); +// let mega_plan = PublishPlan::former() +// .workspace( workspace ) +// .base_temp_dir( "temp" ) +// .packages([ package ]) +// .form(); +// dbg!( &mega_plan.plans ); +// // [module\move\willbe\tests\inc\package.rs:21:3] &mega_plan.plans = [ +// // PackagePublishInstruction { +// // pack: PackOptions { +// // path: ".../wTools/module/move/wca", +// // temp_path: Some( +// // "temp", +// // ), +// // dry: true, +// // }, +// // version_bump: BumpOptions { +// // crate_dir: CrateDir( +// // AbsolutePath( +// // ".../wTools/module/move/wca", +// // ), +// // ), +// // old_version: Version( +// // Version { +// // major: 0, +// // minor: 14, +// // patch: 0, +// // }, +// // ), +// // new_version: Version( +// // Version { +// // major: 0, +// // minor: 15, +// // patch: 0, +// // }, +// // ), +// // dependencies: [ +// // CrateDir( +// // AbsolutePath( +// // ".../wTools", +// // ), +// // ), +// // ], +// // dry: true, +// // }, +// // git_things: GitThingsOptions { +// // git_root: AbsolutePath( +// // ".../wTools", +// // ), +// // items: [ +// // AbsolutePath( +// // ".../wTools/Cargo.toml", +// // ), +// // AbsolutePath( +// // ".../wTools/module/move/wca/Cargo.toml", +// // ), +// // ], +// // message: "wca-v0.15.0", +// // dry: true, +// // }, +// // publish: PublishOptions { +// // path: ".../wTools/module/move/wca", +// // temp_path: Some( +// // "temp", +// // ), +// // dry: true, +// // }, +// // dry: true, +// // }, +// // ] +// let mega_plan = perform_packages_publish( mega_plan ); +// dbg!( mega_plan ); +// // [module\move\willbe\tests\inc\package.rs:89:3] mega_plan = Ok( +// // [ +// // PublishReport { +// // get_info: Some( +// // Report { +// // command: "cargo package --target-dir temp", +// // current_path: ".../wTools/module/move/wca", +// // out: "", +// // err: "", +// // error: Ok( +// // (), +// // ), +// // }, +// // ), +// // publish_required: true, +// // bump: Some( +// // ExtendedBumpReport { +// // base: BumpReport { +// // name: Some( +// // "wca", +// // ), +// // old_version: Some( +// // "0.14.0", +// // ), +// // new_version: Some( +// // "0.15.0", +// // ), +// // }, +// // changed_files: [ +// // AbsolutePath( +// // ".../wTools/module/move/wca/Cargo.toml", +// // ), +// // AbsolutePath( +// // ".../wTools/Cargo.toml", +// // ), +// // ], +// // }, +// // ), +// // add: Some( +// // Report { +// // command: "git add Cargo.toml module/move/wca/Cargo.toml", +// // current_path: ".../wTools", +// // out: "", +// // err: "", +// // error: Ok( +// // (), +// // ), +// // }, +// // ), +// // commit: Some( +// // Report { +// // command: "git commit -m wca-v0.15.0", +// // current_path: ".../wTools", +// // out: "", +// // err: "", +// // error: Ok( +// // (), +// // ), +// // }, +// // ), +// // push: Some( +// // Report { +// // command: "git push", +// // current_path: ".../wTools", +// // out: "", +// // err: "", +// // error: Ok( +// // (), +// // ), +// // }, +// // ), +// // publish: Some( +// // Report { +// // command: "cargo publish --target-dir temp", +// // current_path: ".../wTools/module/move/wca", +// // out: "", +// // err: "", +// // error: Ok( +// // (), +// // ), +// // }, +// // ), +// // }, +// // ], +// // ) +// panic!() +// } diff --git a/module/move/willbe/tests/inc/tool/graph.rs b/module/move/willbe/tests/inc/tool/graph.rs new file mode 100644 index 0000000000..28c08d7b75 --- /dev/null +++ b/module/move/willbe/tests/inc/tool/graph.rs @@ -0,0 +1,217 @@ +mod toposort +{ + use crate::the_module::*; + use graph::toposort; + use std::collections::HashMap; + use petgraph::Graph; + use willbe::graph::topological_sort_with_grouping; + + struct IndexMap< T >( HashMap< T, usize > ); + + impl< T > IndexMap< T > + where + T : std::hash::Hash + Eq, + { + pub fn new( elements : Vec< T > ) -> Self + { + let index_map = elements.into_iter().enumerate().map( |( index, value )| ( value, index ) ).collect(); + Self( index_map ) + } + + pub fn position( &self, element : &T ) -> usize + { + self.0[ element ] + } + } + + #[ test ] + fn no_dependency() + { + let mut graph = Graph::new(); + + let _node1 = graph.add_node( &"A" ); + let _node2 = graph.add_node( &"B" ); + + let sorted = toposort( graph ).unwrap(); + + let index_map = IndexMap::new( sorted ); + let node1_position = index_map.position( &"A" ); + let node2_position = index_map.position( &"B" ); + + assert!( node1_position < node2_position ); + } + + #[ test ] + fn a_depends_on_b() + { + let mut graph = Graph::new(); + + let node1 = graph.add_node( &"A" ); + let node2 = graph.add_node( &"B" ); + + graph.add_edge( node1, node2, &"" ); + + let sorted = toposort( graph ).unwrap(); + + let index_map = IndexMap::new( sorted ); + let node1_position = index_map.position( &"A" ); + let node2_position = index_map.position( &"B" ); + + assert!( node1_position > node2_position ); + } + + #[ test ] + fn multiple_dependencies() + { + let mut graph = Graph::new(); + + let a = graph.add_node( &"A" ); + let b = graph.add_node( &"B" ); + let c = graph.add_node( &"C" ); + + graph.add_edge( a, b, &"" ); + graph.add_edge( a, c, &"" ); + + let sorted = toposort( graph ).unwrap(); + + let index_map = IndexMap::new( sorted ); + let a_position = index_map.position( &"A" ); + let b_position = index_map.position( &"B" ); + let c_position = index_map.position( &"C" ); + + assert!( a_position > b_position ); + assert!( a_position > c_position ); + } + + #[ test ] + fn transitive_dependencies() + { + let mut graph = Graph::new(); + + let a = graph.add_node( &"A" ); + let b = graph.add_node( &"B" ); + let c = graph.add_node( &"C" ); + + graph.add_edge( a, b, &"" ); + graph.add_edge( b, c, &"" ); + + let sorted = toposort( graph ).unwrap(); + + let index_map = IndexMap::new( sorted ); + let a_position = index_map.position( &"A" ); + let b_position = index_map.position( &"B" ); + let c_position = index_map.position( &"C" ); + + assert!( a_position > b_position ); + assert!( b_position > c_position ); + } + + #[ test ] + #[ should_panic( expected = "Cycle" ) ] + fn cycle() + { + let mut graph = Graph::new(); + + let node1 = graph.add_node( &"A" ); + let node2 = graph.add_node( &"B" ); + + graph.add_edge( node1, node2, &"" ); + graph.add_edge( node2, node1, &"" ); + + let _sorted = toposort( graph ).unwrap(); + } + + // input + // B -> A + // C -> A + // output + // [A], [B,C] + #[ test ] + fn simple_case() + { + let mut graph = Graph::new(); + + let a_node = graph.add_node( &"A" ); + let b_node = graph.add_node( &"B" ); + let c_node = graph.add_node( &"C" ); + + graph.add_edge( b_node, a_node, &"B->A"); + graph.add_edge( c_node, a_node, &"C->A"); + + let groups = topological_sort_with_grouping( graph ); + + assert_eq!( groups[ 0 ], vec![ "A" ] ); + assert_eq!( groups[1].len(), 2 ); + assert!( groups[ 1 ].contains( &"C" ) ); + assert!( groups[ 1 ].contains( &"B" ) ); + } + + // input + // digraph { + // 0 [ label = "0" ] + // 1 [ label = "1" ] + // 2 [ label = "2" ] + // 3 [ label = "3" ] + // 4 [ label = "4" ] + // 5 [ label = "5" ] + // 6 [ label = "6" ] + // 7 [ label = "7" ] + // 4 -> 0 [ label = "" ] + // 5 -> 0 [ label = "" ] + // 6 -> 0 [ label = "" ] + // 1 -> 3 [ label = "" ] + // 2 -> 3 [ label = "" ] + // 7 -> 6 [ label = "" ] + // 3 -> 4 [ label = "" ] + // 3 -> 5 [ label = "" ] + // 3 -> 6 [ label = "" ] + // } + // visualization : https://viz-js.com/?dot=ZGlncmFwaCB7CiAgICAwIFsgbGFiZWwgPSAiMCIgXQogICAgMSBbIGxhYmVsID0gIjEiIF0KICAgIDIgWyBsYWJlbCA9ICIyIiBdCiAgICAzIFsgbGFiZWwgPSAiMyIgXQogICAgNCBbIGxhYmVsID0gIjQiIF0KICAgIDUgWyBsYWJlbCA9ICI1IiBdCiAgICA2IFsgbGFiZWwgPSAiNiIgXQogICAgNyBbIGxhYmVsID0gIjciIF0KICAgIDQgLT4gMCBbIGxhYmVsID0gIiIgXQogICAgNSAtPiAwIFsgbGFiZWwgPSAiIiBdCiAgICA2IC0-IDAgWyBsYWJlbCA9ICIiIF0KICAgIDEgLT4gMyBbIGxhYmVsID0gIiIgXQogICAgMiAtPiAzIFsgbGFiZWwgPSAiIiBdCiAgICA3IC0-IDYgWyBsYWJlbCA9ICIiIF0KICAgIDMgLT4gNCBbIGxhYmVsID0gIiIgXQogICAgMyAtPiA1IFsgbGFiZWwgPSAiIiBdCiAgICAzIC0-IDYgWyBsYWJlbCA9ICIiIF0KfQo~ + // output + // [0], [6,5,4], [3], [1,2,7] + #[ test ] + fn complicated_test() + { + let mut graph = Graph::new(); + + let n = graph.add_node( &"0" ); + let n_1 = graph.add_node( &"1" ); + let n_2 = graph.add_node( &"2" ); + let n_3 = graph.add_node( &"3" ); + let n_4 = graph.add_node( &"4" ); + let n_5 = graph.add_node( &"5" ); + let n_6 = graph.add_node( &"6" ); + let n_7 = graph.add_node( &"7" ); + + graph.add_edge( n_1, n_3, &"" ); + graph.add_edge( n_2, n_3, &"" ); + graph.add_edge( n_7, n_6, &"" ); + + graph.add_edge( n_3, n_4, &"" ); + graph.add_edge( n_3, n_5, &"" ); + graph.add_edge( n_3, n_6, &"" ); + + graph.add_edge( n_4, n, &"" ); + graph.add_edge( n_5, n, &"" ); + graph.add_edge( n_6, n, &"" ); + + let groups = topological_sort_with_grouping( graph ); + + dbg!(&groups); + + assert_eq!( groups[ 0 ], vec![ "0" ] ); + + assert_eq!( groups[1].len(), 3 ); + assert!( groups[ 1 ].contains( &"6" ) ); + assert!( groups[ 1 ].contains( &"5" ) ); + assert!( groups[ 1 ].contains( &"4" ) ); + + assert_eq!( groups[ 2 ], vec![ "3" ] ); + + assert_eq!( groups[3].len(), 3 ); + assert!( groups[ 3 ].contains( &"1" ) ); + assert!( groups[ 3 ].contains( &"2" ) ); + assert!( groups[ 3 ].contains( &"7" ) ); + } + +} \ No newline at end of file diff --git a/module/move/willbe/tests/inc/tool/mod.rs b/module/move/willbe/tests/inc/tool/mod.rs new file mode 100644 index 0000000000..5766a1e126 --- /dev/null +++ b/module/move/willbe/tests/inc/tool/mod.rs @@ -0,0 +1,7 @@ +// use super::*; + +// pub mod process; + +pub mod graph; + +pub mod query; \ No newline at end of file diff --git a/module/move/willbe/tests/inc/tool/process.rs b/module/move/willbe/tests/inc/tool/process.rs new file mode 100644 index 0000000000..8d718c38d9 --- /dev/null +++ b/module/move/willbe/tests/inc/tool/process.rs @@ -0,0 +1,65 @@ +// use super::*; +// +// use process_tools::process::*; +// +// use std::env::consts::EXE_EXTENSION; +// use std::ffi::OsString; +// use std::path::{ Path, PathBuf }; +// use std::process::Command; +// +// pub fn path_to_exe( name : &Path, temp_path : &Path ) -> PathBuf +// { +// _ = Command::new("rustc") +// .current_dir( temp_path ) +// .arg( name ) +// .status() +// .unwrap(); +// +// PathBuf::from( temp_path ) +// .join( name.file_name().unwrap() ) +// .with_extension( EXE_EXTENSION ) +// } +// +// #[ test ] +// fn err_out_err() +// { +// let temp = assert_fs::TempDir::new().unwrap(); +// let root_path = Path::new( env!( "CARGO_MANIFEST_DIR" ) ); +// let assets_relative_path = Path::new( ASSET_PATH ); +// let assets_path = root_path.join( assets_relative_path ); +// +// let args : [ OsString ; 0 ] = []; +// +// let options = process::Run::former() +// .bin_path( path_to_exe( &assets_path.join( "err_out_test" ).join( "err_out_err.rs" ), temp.path() ) ) +// .args( args.to_vec() ) +// .current_path( temp.to_path_buf() ) +// .joining_streams( true ) +// .form(); +// +// let report = process::run( options ).unwrap().out; +// +// assert_eq!( "This is stderr text\nThis is stdout text\nThis is stderr text\n", report ); +// } +// +// #[ test ] +// fn out_err_out() +// { +// let temp = assert_fs::TempDir::new().unwrap(); +// let root_path = Path::new( env!( "CARGO_MANIFEST_DIR" ) ); +// let assets_relative_path = Path::new( ASSET_PATH ); +// let assets_path = root_path.join( assets_relative_path ); +// +// let args : [ OsString ; 0 ] = []; +// +// let options = process::Run::former() +// .bin_path( path_to_exe( &assets_path.join( "err_out_test" ).join( "out_err_out.rs" ), temp.path() ) ) +// .args( args.to_vec() ) +// .current_path( temp.to_path_buf() ) +// .joining_streams( true ) +// .form(); +// let report = process::run( options ).unwrap().out; +// +// assert_eq!( "This is stdout text\nThis is stderr text\nThis is stdout text\n", report ); +// } +// diff --git a/module/move/willbe/tests/inc/tool/query.rs b/module/move/willbe/tests/inc/tool/query.rs new file mode 100644 index 0000000000..49c23b0946 --- /dev/null +++ b/module/move/willbe/tests/inc/tool/query.rs @@ -0,0 +1,139 @@ +use crate::the_module::query:: +{ + parse, + ParseResult, + Value, +}; +use std::collections::HashMap; +use std::str::FromStr; + +#[ test ] +fn value_from_str() +{ + assert_eq!( Value::from_str( "123" ).unwrap(), Value::Int( 123 ) ); + assert_eq!( Value::from_str( "true" ).unwrap(), Value::Bool( true ) ); + assert_eq!( Value::from_str( "'hello'" ).unwrap(), Value::String( "hello".to_string() ) ); +} + +#[ test ] +fn bool_from_value() +{ + assert_eq!( bool::from( &Value::Bool( true ) ), true ); + assert_eq!( bool::from( &Value::String( "true".to_string() ) ), true ); + assert_eq!( bool::from( &Value::Int( 1 ) ), true ); + assert_eq!( bool::from( &Value::Int( 0 ) ), false); + assert_eq!( bool::from( &Value::String( "test".to_string() ) ), false); +} + +#[ test ] +fn parse_result_convert() +{ + let params = vec![ Value::Int( 1 ), Value::Int( 2 ), Value::Int( 3 ) ]; + let result = ParseResult::Positioning( params ); + + let named_map = result.clone().into_map(vec!["var0".into(), "var1".into(),"var2".into() ]); + let unnamed_map = result.clone().into_map( vec![] ); + let mixed_map = result.clone().into_map( vec![ "var0".into() ] ); + let vec = result.into_vec(); + + assert_eq!( HashMap::from( [( "var0".to_string(),Value::Int( 1 )), ( "var1".to_string(),Value::Int( 2 )), ( "var2".to_string(),Value::Int( 3 )) ]), named_map ); + assert_eq!( HashMap::from( [( "1".to_string(),Value::Int( 1 )), ( "2".to_string(),Value::Int( 2 )), ( "3".to_string(),Value::Int( 3 )) ]), unnamed_map ); + assert_eq!( HashMap::from( [( "var0".to_string(),Value::Int( 1 )), ( "1".to_string(),Value::Int( 2 )), ( "2".to_string(),Value::Int( 3 )) ]), mixed_map ); + assert_eq!( vec![ Value::Int( 1 ), Value::Int( 2 ), Value::Int( 3 ) ], vec ); +} + +#[ test ] +fn parse_empty_string() +{ + assert_eq!( parse( "()" ).unwrap().into_vec(), vec![] ); +} + +#[test] +fn parse_single_value() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "1".to_string(), Value::String( "test/test".to_string() ) ); + assert_eq!( parse( "('test/test')" ).unwrap().into_map(vec![]), expected_map ); +} + +#[ test ] +fn parse_multiple_values() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "key1".to_string(), Value::Int( 123 ) ); + expected_map.insert( "key2".to_string(), Value::Bool( true ) ); + assert_eq!( parse( "{key1 : 123, key2 : true}" ).unwrap().into_map(vec![]), expected_map ); +} + +#[ test ] +fn parse_with_quotes() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "key".to_string(), Value::String( "hello world".to_string() ) ); + assert_eq!( parse( "{key : 'hello world'}" ).unwrap().into_map(vec![]), expected_map ); +} + +#[ test ] +fn parse_with_special_characters() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "key".to_string(), Value::String( "!@#$%^&*(),".to_string() ) ); + assert_eq!( parse( "{key : '!@#$%^&*(),'}" ).unwrap().into_map(vec![]), expected_map ); +} + + +#[ test ] +fn parse_with_colon_in_value() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "key".to_string(), Value::String( "hello :world".to_string() ) ); + assert_eq!( parse( "{key : 'hello :world'}" ).unwrap().into_map(vec![]), expected_map ); +} + +#[ test ] +fn with_comma_in_value() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "key".to_string(), Value::String( "hello,world".to_string() ) ); + assert_eq!( parse( "{key : 'hello,world'}" ).unwrap().into_map(vec![]), expected_map ); +} + +#[ test ] +fn with_single_quote_escape() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "key".to_string(), Value::String( r#"hello\'test\'test"#.into() ) ); + assert_eq!( parse( r#"{ key : 'hello\'test\'test' }"# ).unwrap().into_map(vec![]), expected_map ); +} + +#[ test ] +fn with_multiple_spaces() +{ + let mut expected_map = HashMap::new(); + expected_map.insert( "key".to_string(), Value::String( "test ".into() ) ); + expected_map.insert( "key2".to_string(), Value::String( "test".into() ) ); + assert_eq!( parse( r#"{ key : 'test ', key2 : test }"# ).unwrap().into_map(vec![]), expected_map ); +} + +#[ test ] +fn many_unnamed() +{ + let expected : HashMap< _, _ > = HashMap::from_iter + ( [ + ( "1".to_string(), Value::Int( 123 ) ), + ( "2".to_string(), Value::String( "test_aboba".to_string() ) ), + ] ); + assert_eq!( parse( "( 123, 'test_aboba' )").unwrap().into_map(vec![]), expected ); +} + +#[ test ] +fn named_and_unnamed() +{ + let expected : HashMap< _, _ > = HashMap::from_iter + ( [ + ( "1".to_string(), Value::Int( 123 ) ), + ( "2".to_string(), Value::String( "test_aboba".to_string() ) ), + ( "3".to_string(), Value::String("test : true".to_string())) + ] ); + assert_eq!( parse( r#"(123, 'test_aboba', test : true)"#).unwrap().into_map(vec![]), expected ); +} diff --git a/module/move/willbe/tests/smoke_test.rs b/module/move/willbe/tests/smoke_test.rs new file mode 100644 index 0000000000..febf7e83a0 --- /dev/null +++ b/module/move/willbe/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/move/willbe/tests/tests.rs b/module/move/willbe/tests/tests.rs new file mode 100644 index 0000000000..87a862274b --- /dev/null +++ b/module/move/willbe/tests/tests.rs @@ -0,0 +1,11 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use willbe as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +pub const ASSET_PATH : &str = "tests/asset"; + +mod inc; diff --git a/module/move/wplot/Cargo.toml b/module/move/wplot/Cargo.toml new file mode 100644 index 0000000000..fb02fc12fa --- /dev/null +++ b/module/move/wplot/Cargo.toml @@ -0,0 +1,69 @@ +[package] +name = "wplot" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko " +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wplot" +repository = "https://github.com/Wandalen/wTools/tree/master/module/move/wplot" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/move/wplot/Readme.md" +description = """ +Plot interface. +""" +categories = [ "command-line-interface", "command-line-utilities" ] +keywords = [ "wtools", "CLI", "CUI", "user-interface" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/plot", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "wplot" +path = "src/plot/wplot_lib.rs" + +[[test]] +name = "wplot_test" +path = "tests/plot/wplot_tests.rs" + +[[test]] +name = "wplot_smoke_test" +path = "tests/smoke_test.rs" + +[dependencies] +wtools = { workspace = true } +mod_interface = { workspace = true } +meta_tools = { workspace = true, features = [ "full" ] } +image = { version = "~0.24" } +open = { version = "~3.0" } +wmath = { version = "~0.3" } +rgb = { version = "~0.8" } +once_cell = { version = "*" } +dashmap = { version = "~5.3" } +num-traits = { version = "~0.2" } + +# total_float_wrap = { version = "~0.1" } + +[dev-dependencies] +test_tools = { workspace = true } + diff --git a/module/move/wplot/License b/module/move/wplot/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/move/wplot/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/move/wplot/Readme.md b/module/move/wplot/Readme.md new file mode 100644 index 0000000000..7819424b13 --- /dev/null +++ b/module/move/wplot/Readme.md @@ -0,0 +1,31 @@ + + +# Module :: wplot + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wplot_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wplot_push.yml) [![docs.rs](https://img.shields.io/docsrs/wplot?color=e3e8f0&logo=docs.rs)](https://docs.rs/wplot) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Plot interface. + +## Sample + + + +```rust +``` + +### To add to your project + +```sh +cargo add wplot +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/wplot_trivial +cargo run +``` + diff --git a/module/move/wplot/src/plot/abs/change.rs b/module/move/wplot/src/plot/abs/change.rs new file mode 100644 index 0000000000..3d05cbcdbf --- /dev/null +++ b/module/move/wplot/src/plot/abs/change.rs @@ -0,0 +1,37 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + use core::fmt; + + use crate::abs::changer::private::ChangerInterface; + + /// Context. + // #[ clone_dyn ] + pub trait ChangeInterface + where + Self : + fmt::Debug + + , + { + + /// Add change to queue of events. + fn add_to< C : ChangerInterface >( self, changer : &mut C ) -> &mut C + where + Self : Sized + 'static, + { + changer.change_add( self ) + } + + } + + // + +} + +::meta_tools::mod_interface! +{ + + prelude use ChangeInterface; + +} diff --git a/module/move/wplot/src/plot/abs/changer.rs b/module/move/wplot/src/plot/abs/changer.rs new file mode 100644 index 0000000000..8af8e00f03 --- /dev/null +++ b/module/move/wplot/src/plot/abs/changer.rs @@ -0,0 +1,61 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + use core::fmt; + + use crate::abs::change::private::ChangeInterface; + + /// Context. + pub trait ChangerInterface + where + Self : + fmt::Debug + + // Clone + + , + { + /// Type of root changer. + type Root : ChangerInterface; + /// Type of parent changer. + type Parent : ChangerInterface; + + /// Get root. + #[ inline ] + fn root( &mut self ) -> &mut Self::Root + { + // Safaty : that's safe becuase root type is the same for all nodes. + unsafe + { + core::mem::transmute::< _, _ >( self.parent().root() ) + } + } + + /// Get back to root changer. + fn context( self ) -> Self::Root; + + /// Get parent. + fn parent( &mut self ) -> &mut Self::Parent; + + /// Get back to parent changer. + fn end( self ) -> Self::Parent; + + /// Add change. + #[ inline ] + fn change_add< Change >( &mut self, change : Change ) -> &mut Self + where + Change : ChangeInterface + 'static, + { + self.root().change_add( change ); + self + } + + } + +} + +::meta_tools::mod_interface! +{ + + prelude use ChangerInterface; + +} diff --git a/module/move/wplot/src/plot/abs/context.rs b/module/move/wplot/src/plot/abs/context.rs new file mode 100644 index 0000000000..4c2716661d --- /dev/null +++ b/module/move/wplot/src/plot/abs/context.rs @@ -0,0 +1,40 @@ +/// Internal namespace. +#[ cfg( not( feature = "no_std" ) ) ] +pub( crate ) mod private +{ + // use crate::protected::*; + use core::fmt; + + // use wtools::From_0; + + use crate::abs::{identity::private::HasIdInterface, changer::private::ChangerInterface}; + // use crate::abs::*; + // use once_cell::sync::Lazy; + // use std::sync::Mutex; + // use dashmap::DashMap; + // use std::sync::Arc; + + /// Registry of contexts. + pub trait ContextInterface + where + Self : + HasIdInterface + + // From_0 + + fmt::Debug + + , + { + /// Type of changer of the context. + type Changer : ChangerInterface; + /// Get changer of the context. + fn changer( &mut self ) -> Self::Changer; + } + +} + +#[ cfg( not( feature = "no_std" ) ) ] +::meta_tools::mod_interface! +{ + + prelude use ContextInterface; + +} diff --git a/module/move/wplot/src/plot/abs/identity.rs b/module/move/wplot/src/plot/abs/identity.rs new file mode 100644 index 0000000000..4a181d63fe --- /dev/null +++ b/module/move/wplot/src/plot/abs/identity.rs @@ -0,0 +1,88 @@ +/// Internal namespace. +#[ cfg( not( feature = "no_std" ) ) ] +pub( crate ) mod private +{ + // use crate::protected::*; + use once_cell::sync::Lazy; + use std::sync::Mutex; + use core::{hash::Hash, fmt}; + // use core::any::TypeId; + + static mut COUNTER : Lazy< Mutex< i64 > > = Lazy::new( || + { + Mutex::new( 0 ) + }); + + /// ID interface. + pub trait IdInterface + where + Self : + fmt::Debug + + Clone + + Copy + + PartialEq + + Eq + + Hash + + , + { + } + + /// Has id. + pub trait HasIdInterface + where + Self : + fmt::Debug + + { + /// Get id. + fn id( &self ) -> Id; + } + + /// Reference on context. + #[ derive( Clone, Copy, PartialEq, Eq, Hash ) ] + pub struct Id + { + // #[ allow( dead_code ) ] + // tp_id : core::any::TypeId, + #[ allow( dead_code ) ] + in_id : i64, + } + + impl Id + { + /// Construct a new id increasing counter. + pub fn new< T >() -> Self + where + T : core::any::Any, + { + // SAFETY : mutex guard it + let mut c = unsafe { COUNTER.lock().unwrap() }; + *c += 1; + Self + { + in_id : *c, + } + } + } + + impl IdInterface for Id + { + } + + impl fmt::Debug for Id + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "id::{:?}", self.in_id ) ) + } + } + +} + +#[ cfg( not( feature = "no_std" ) ) ] +::meta_tools::mod_interface! +{ + + exposed use Id; + prelude use { IdInterface, HasIdInterface }; + +} diff --git a/module/move/wplot/src/plot/abs/mod.rs b/module/move/wplot/src/plot/abs/mod.rs new file mode 100644 index 0000000000..d3777cde04 --- /dev/null +++ b/module/move/wplot/src/plot/abs/mod.rs @@ -0,0 +1,21 @@ +::meta_tools::mod_interface! +{ + + /// Describe change. + layer change; + /// Describe changer. + layer changer; + /// Describe system. + #[ cfg( not( feature = "no_std" ) ) ] + layer context; + + /// Identity of resource. + #[ cfg( not( feature = "no_std" ) ) ] + layer identity; + /// Registry. + #[ cfg( not( feature = "no_std" ) ) ] + layer registry; + + // exposed use Drawing; + +} \ No newline at end of file diff --git a/module/move/wplot/src/plot/abs/registry.rs b/module/move/wplot/src/plot/abs/registry.rs new file mode 100644 index 0000000000..af48a2062d --- /dev/null +++ b/module/move/wplot/src/plot/abs/registry.rs @@ -0,0 +1,86 @@ +/// Internal namespace. +#[ cfg( not( feature = "no_std" ) ) ] +pub( crate ) mod private +{ + // use crate::protected::*; + // use crate::abs::*; + use once_cell::sync::Lazy; + // use wtools::from; + use std::sync::Mutex; + use dashmap::DashMap; + use std::sync::Arc; + use crate::abs::identity::private::Id; + + use crate::abs::context::private::ContextInterface; + + /// Registry of contexts. + #[ derive( Debug ) ] + pub struct Registry< Context > + where + Context : ContextInterface, + { + contexts : DashMap< Id, Context >, + contexts_with_name : DashMap< String, Id >, + current_context_name : Option< String >, + } + + impl< Context > Registry< Context > + where + Context : ContextInterface, + { + + /// Static constructor. + pub const fn new() -> Lazy< Arc< Mutex< Registry< Context > > > > + { + Lazy::new( || + { + let contexts = DashMap::new(); + let contexts_with_name = DashMap::new(); + let current_context_name = None; + Arc::new( Mutex::new( Registry::< Context > + { + contexts, + contexts_with_name, + current_context_name, + })) + }) + } + + /// Construct a new context. + pub fn current( _registry : &mut Lazy< Arc< Mutex< Registry< Context > > > > ) -> Context::Changer + { + let registry = _registry.lock().unwrap(); + let mut current_name : Option< String > = registry.current_context_name.clone(); + if current_name.is_none() + { + current_name = Some( "default".into() ) + } + let current_name = current_name.unwrap(); + if registry.contexts_with_name.contains_key( ¤t_name ) + { + let id = *registry.contexts_with_name.get( ¤t_name ).unwrap().value(); + registry.contexts.get_mut( &id ).unwrap().value_mut().changer() + } + else + { + // let context : Context = from!(); + // let id = context.id(); + // registry.contexts_with_name.insert( current_name, context.id() ); + // registry.contexts.insert( id, context ); + // registry.contexts.get_mut( &id ).unwrap().value_mut().changer() + let id = *registry.contexts_with_name.get( ¤t_name ).unwrap().value(); + registry.contexts.get_mut( &id ).unwrap().value_mut().changer() + } + } + + } + +} + +#[ cfg( not( feature = "no_std" ) ) ] +::meta_tools::mod_interface! +{ + + orphan use Registry; + +} diff --git a/module/move/wplot/src/plot/color.rs b/module/move/wplot/src/plot/color.rs new file mode 100644 index 0000000000..9ded69bdfc --- /dev/null +++ b/module/move/wplot/src/plot/color.rs @@ -0,0 +1,104 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + use core::fmt; + use num_traits::{ Zero }; /* zzz : consider as submodule for wtools */ + + /// Convertable into RGBA. + pub trait RgbaInterface< T > + where + T : Zero + fmt::Debug + Clone + Copy, + { + /// Convert into RGBA. + fn into_rgba( self ) -> Rgba< T >; + } + + // zzz : use type_constructor::Enumberable for indexed access to color components + + /// RGBA + #[ derive( Debug, Clone ) ] + pub struct Rgba< T = f32 > + where + T : Zero + fmt::Debug + Clone + Copy, + { + /// Red. + pub r : T, + /// Green. + pub g : T, + /// Blue. + pub b : T, + /// Alpha. + pub a : T, + } + + impl< T > Default for Rgba< T > + where + T : Zero + fmt::Debug + Clone + Copy, + { + fn default() -> Self + { + Self + { + r : Zero::zero(), + g : Zero::zero(), + b : Zero::zero(), + a : Zero::zero(), + } + } + } + + impl< T > RgbaInterface< T > for Rgba< T > + where + T : Zero + fmt::Debug + Clone + Copy, + { + fn into_rgba( self ) -> Rgba< T > + { + self + } + } + + impl RgbaInterface< f32 > + for [ f32 ; 3 ] + { + fn into_rgba( self ) -> Rgba< f32 > + { + Rgba::< f32 > + { + r : self[ 0 ], + g : self[ 1 ], + b : self[ 2 ], + a : 1.0, + } + } + } + + impl RgbaInterface< f32 > + for [ f32 ; 4 ] + { + fn into_rgba( self ) -> Rgba< f32 > + { + Rgba::< f32 > + { + r : self[ 0 ], + g : self[ 1 ], + b : self[ 2 ], + a : self[ 3 ], + } + } + } + +} + +::meta_tools::mod_interface! +{ + + protected use ::rgb::*; + + #[ cfg( not( feature = "no_std" ) ) ] + exposed use Rgba; + + #[ cfg( not( feature = "no_std" ) ) ] + prelude use RgbaInterface; + +} diff --git a/module/move/wplot/src/plot/plot_interface_lib.rs b/module/move/wplot/src/plot/plot_interface_lib.rs new file mode 100644 index 0000000000..0f2bd16dd0 --- /dev/null +++ b/module/move/wplot/src/plot/plot_interface_lib.rs @@ -0,0 +1,19 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/plot_interface/latest/plot_interface/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] + +//! +//! Plot interface. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use wplot::*; diff --git a/module/move/wplot/src/plot/sys/context.rs b/module/move/wplot/src/plot/sys/context.rs new file mode 100644 index 0000000000..8a7ed41bc9 --- /dev/null +++ b/module/move/wplot/src/plot/sys/context.rs @@ -0,0 +1,95 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::abs::registry::private::Registry; + use crate::protected::*; + // use crate::abs::*; + + use once_cell::sync::Lazy; + use std::sync::Mutex; + use std::sync::Arc; + use crate::abs::identity::private::Id; + use crate::abs::identity::private::HasIdInterface; + use crate::sys::context_changer::private::ContextChanger; + use crate::sys::stroke_brush::private::StrokeBrush; + + /// Context. + #[ derive( Debug, Clone ) ] + pub struct Context + { + id : Id, + stroke : Option< StrokeBrush >, + drawing : Option< Drawing >, + } + + impl Context + { + } + + impl From_0 for Context + { + fn from_0() -> Self + { + let id = Id::new::< Self >(); + let stroke = None; + let drawing = None; + Self + { + id, + stroke, + drawing, + } + } + } + + impl ContextInterface for Context + { + + type Changer = ContextChanger; + + fn changer( &mut self ) -> Self::Changer + { + let id = self.id(); + let stroke = self.stroke.as_ref().map( | stroke | stroke.id() ); + let drawing = self.drawing.as_ref().map( | drawing | drawing.id() ); + let changes = Vec::new(); + ContextChanger + { + id, + stroke, + drawing, + changes, + } + } + + } + + impl HasIdInterface for Context + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + + /// Registry of contexts. + pub static mut REGISTRY : Lazy< Arc< Mutex< Registry< Context > > > > = Registry::< Context >::new(); + + /// Get current context. + pub fn current() -> ContextChanger + { + // Safety : under mutex. + unsafe + { + Registry::< Context >::current( &mut REGISTRY ) + } + } + +} + +crate::mod_interface! +{ + protected use { REGISTRY, current }; + exposed use { Context, current as context }; +} diff --git a/module/move/wplot/src/plot/sys/context_changer.rs b/module/move/wplot/src/plot/sys/context_changer.rs new file mode 100644 index 0000000000..202be58c58 --- /dev/null +++ b/module/move/wplot/src/plot/sys/context_changer.rs @@ -0,0 +1,107 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + use core::fmt; + + use crate::{abs::{identity::private::{Id, HasIdInterface}, change::private::ChangeInterface, changer::private::ChangerInterface}, StrokeBrushChanger, sys::drawing::changer::private::DrawChanger}; + + /// Context. + #[ allow( dead_code ) ] + // #[ derive( Clone ) ] + pub struct ContextChanger + { + /// Id. + pub( crate ) id : Id, + /// Stroke brush. + pub( crate ) stroke : Option< Id >, + /// Drawing. + pub( crate ) drawing : Option< Id >, + /// Queue of changes. + pub changes : Vec< Box< dyn ChangeInterface > >, + } + + impl ContextChanger + { + /// Parameters of stroke. + #[ inline ] + pub fn stroke( self ) -> StrokeBrushChanger + { + StrokeBrushChanger::_new( self ) + } + /// Draw. + #[ inline ] + pub fn draw( self ) -> DrawChanger + { + DrawChanger::_new( self ) + } + } + + impl fmt::Debug for ContextChanger + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_str( "ContextChanger" )?; + for ( _i, e ) in self.changes.iter().enumerate() + { + f.write_str( &wtools::string::indentation( " ", format!( "\n{:?}", e ), "" ) )?; + } + Ok( () ) + } + } + + impl ChangerInterface for ContextChanger + { + type Parent = ContextChanger; + type Root = ContextChanger; + + #[ inline ] + fn root( &mut self ) -> &mut Self::Root + { + self + } + + #[ inline ] + fn context( self ) -> Self::Root + { + self + } + + #[ inline ] + fn parent( &mut self ) -> &mut Self::Parent + { + self + } + + #[ inline ] + fn end( self ) -> Self::Parent + { + self + } + + #[ inline ] + fn change_add< Change >( &mut self, change : Change ) -> &mut Self + where + Change : ChangeInterface + 'static, + { + self.changes.push( Box::new( change ) ); + self + } + + } + + impl HasIdInterface for ContextChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +crate::mod_interface! +{ + exposed use ContextChanger; +} diff --git a/module/move/wplot/src/plot/sys/drawing.rs b/module/move/wplot/src/plot/sys/drawing.rs new file mode 100644 index 0000000000..0c997329c8 --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing.rs @@ -0,0 +1,61 @@ +pub(crate) mod changer; + +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + + use crate::abs::identity::private::{Id, HasIdInterface}; + + /// Drawing. + #[ derive( Debug, Clone ) ] + pub struct Drawing + { + pub( crate ) id : Id, + } + + impl Drawing + { + /// Constructor. + pub fn new() -> Self + { + let id = Id::new::< Self >(); + Self + { + id, + } + } + } + + impl HasIdInterface for Drawing + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +::meta_tools::mod_interface! +{ + + /// Draw changer. + // layer changer; + /// ChangeInterface for drawing constructor. + layer change_new; + /// Draw command. + layer command; + /// Draw queue. + layer queue; + /// New shape : rectangle. + layer rect_change_new; + /// Change region of the rectangle. + layer rect_change_region; + /// Rectangle change. + layer rect_changer; + + exposed use Drawing; + +} diff --git a/module/move/wplot/src/plot/sys/drawing/change_new.rs b/module/move/wplot/src/plot/sys/drawing/change_new.rs new file mode 100644 index 0000000000..44d47fd981 --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing/change_new.rs @@ -0,0 +1,33 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + use crate::abs::{change::private::ChangeInterface, identity::private::Id}; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct DrawingChangeNew + { + id : Id, + } + + impl DrawingChangeNew + { + /// Constructor. + pub fn new( id : Id ) -> Self + { + Self{ id } + } + } + + impl ChangeInterface for DrawingChangeNew + { + } + +} + +::meta_tools::mod_interface! +{ + exposed use DrawingChangeNew; +} diff --git a/module/move/wplot/src/plot/sys/drawing/changer.rs b/module/move/wplot/src/plot/sys/drawing/changer.rs new file mode 100644 index 0000000000..5ddb3e5f3a --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing/changer.rs @@ -0,0 +1,84 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + + use crate::{abs::{identity::private::{Id, HasIdInterface}, changer::private::ChangerInterface}, ContextChanger, sys::drawing::{rect_changer::private::RectChanger, change_new::private::DrawingChangeNew}}; + use crate::abs::change::private::ChangeInterface; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug ) ] + pub struct DrawChanger + { + pub( crate ) id : Id, + pub( crate ) context_changer : ContextChanger, + } + + impl DrawChanger + { + /// Constructor. + #[ inline ] + pub( crate ) fn _new( mut context_changer : ContextChanger ) -> Self + { + let id = &mut context_changer.drawing; + if id.is_none() + { + *id = Some( Id::new::< Self >() ); + DrawingChangeNew::new( id.unwrap() ).add_to( &mut context_changer ); + } + let id = context_changer.drawing.unwrap(); + Self + { + id, + context_changer, + } + } + /// ChangeInterface color. + #[ inline ] + pub fn rect( self ) -> RectChanger + { + RectChanger::_new( self ) + } + } + + impl ChangerInterface for DrawChanger + { + type Parent = ContextChanger; + type Root = ContextChanger; + + #[ inline ] + fn context( self ) -> Self::Root + { + self.context_changer + } + + #[ inline ] + fn parent( &mut self ) -> &mut Self::Parent + { + &mut self.context_changer + } + + #[ inline ] + fn end( self ) -> Self::Parent + { + self.context_changer + } + + } + + impl HasIdInterface for DrawChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.context_changer.id() + } + } + +} + +::meta_tools::mod_interface! +{ + exposed use DrawChanger; +} diff --git a/module/move/wplot/src/plot/sys/drawing/command.rs b/module/move/wplot/src/plot/sys/drawing/command.rs new file mode 100644 index 0000000000..8108cbcf17 --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing/command.rs @@ -0,0 +1,18 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + + // /// Interface of command to draw something. + // pub trait DrawCommandInterface + // where + // Self : fmt::Debug, + // { + // } + +} + +crate::mod_interface! +{ + // exposed use DrawCommandInterface; +} diff --git a/module/move/wplot/src/plot/sys/drawing/queue.rs b/module/move/wplot/src/plot/sys/drawing/queue.rs new file mode 100644 index 0000000000..6b9ba83b3c --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing/queue.rs @@ -0,0 +1,30 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; +// use crate::drawing_changer::*; +// +// /// Queue of draw commands. +// #[ derive( Debug ) ] +// pub struct Queue +// { +// /// Container to store commands. +// pub container : Vec< Box< dyn DrawCommandInterface > >, +// } +// +// impl Queue +// { +// /// Constructor. +// pub fn new() -> Self +// { +// let container = Vec::new(); +// Self { container } +// } +// } + +} + +crate::mod_interface! +{ + // exposed use Queue; +} diff --git a/module/move/wplot/src/plot/sys/drawing/rect_change_new.rs b/module/move/wplot/src/plot/sys/drawing/rect_change_new.rs new file mode 100644 index 0000000000..c7af894d1c --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing/rect_change_new.rs @@ -0,0 +1,36 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + use crate::abs::{identity::private::Id, change::private::ChangeInterface}; + + /// Command to draw rectangle. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct RectChangeNew + { + /// Id. + pub( crate ) id : Id, + } + + impl RectChangeNew + { + + /// Constructor + pub fn new( id : Id ) -> Self + { + Self{ id } + } + + } + + impl ChangeInterface for RectChangeNew + { + } + +} + +::meta_tools::mod_interface! +{ + exposed use RectChangeNew; +} diff --git a/module/move/wplot/src/plot/sys/drawing/rect_change_region.rs b/module/move/wplot/src/plot/sys/drawing/rect_change_region.rs new file mode 100644 index 0000000000..aa70c4947f --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing/rect_change_region.rs @@ -0,0 +1,51 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use crate::abs::change::private::ChangeInterface; + use crate::abs::identity::private::Id; + + /// Command to draw rectangle. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct RectChangeRegion + { + /// Id. + pub( crate ) id : Id, + /// Left-top corner. + pub( crate ) left_top : X2< f32 >, + /// Right-bottom corner. + pub( crate ) right_bottom : X2< f32 >, + } + + impl RectChangeRegion + { + + /// Constructor + pub fn new( id : Id ) -> Self + { + let left_top = X2::make( -1.0, -1.0 ); + let right_bottom = X2::make( 1.0, 1.0 ); + Self{ left_top, right_bottom, id } + } + + /// Constructor + pub fn region( mut self, left_top : X2< f32 >, right_bottom : X2< f32 > ) -> Self + { + self.left_top = left_top; + self.right_bottom = right_bottom; + self + } + + } + + impl ChangeInterface for RectChangeRegion + { + } + +} + +::meta_tools::mod_interface! +{ + exposed use RectChangeRegion; +} diff --git a/module/move/wplot/src/plot/sys/drawing/rect_changer.rs b/module/move/wplot/src/plot/sys/drawing/rect_changer.rs new file mode 100644 index 0000000000..f3ac913f77 --- /dev/null +++ b/module/move/wplot/src/plot/sys/drawing/rect_changer.rs @@ -0,0 +1,100 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use crate::abs::identity::private::Id; + use crate::sys::context_changer::private::ContextChanger; + use crate::sys::drawing::changer::private::DrawChanger; + use crate::abs::changer::private::ChangerInterface; + use crate::sys::drawing::rect_change_region::private::RectChangeRegion; + use crate::sys::drawing::rect_change_new::private::RectChangeNew; + use crate::abs::identity::private::HasIdInterface; + + /// Command to draw rectangle. + #[ allow( dead_code ) ] + #[ derive( Debug ) ] + pub struct RectChanger + { + /// Id. + pub( crate ) id : Id, + /// Draw changer. + pub( crate ) draw : DrawChanger, + } + + impl RectChanger + { + + /// Constructor. + #[ inline ] + pub fn _new( draw : DrawChanger ) -> Self + { + let id = Id::new::< Self >(); + let change = RectChangeNew::new( id ); + let mut result = Self{ id, draw }; + change.add_to( &mut result ); + result + } + + /// ChangeInterface region. + #[ inline ] + pub fn region( mut self, left_top : X2< f32 >, right_bottom : X2< f32 > ) -> Self + { + let change = RectChangeRegion::new( self.id() ).region( left_top, right_bottom ); + self.change_add( change ); + self + } + + /// Get back to draw. + #[ inline ] + pub fn draw( self ) -> DrawChanger + { + self.draw + } + + /// Get back to context. + #[ inline ] + pub fn context( self ) -> ContextChanger + { + self.draw.context_changer + } + + } + + impl ChangerInterface for RectChanger + { + + type Parent = DrawChanger; + type Root = ContextChanger; + + fn context( self ) -> Self::Root + { + self.draw.context_changer + } + + fn parent( &mut self ) -> &mut Self::Parent + { + &mut self.draw + } + + fn end( self ) -> Self::Parent + { + self.draw + } + + } + + impl HasIdInterface for RectChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.draw.id() + } + } + +} + +::meta_tools::mod_interface! +{ + exposed use RectChanger; +} \ No newline at end of file diff --git a/module/move/wplot/src/plot/sys/mod.rs b/module/move/wplot/src/plot/sys/mod.rs new file mode 100644 index 0000000000..ed936bce06 --- /dev/null +++ b/module/move/wplot/src/plot/sys/mod.rs @@ -0,0 +1,18 @@ +// ::meta_tools::mod_interface! +// { + +// /// Main aggregating object. +// layer context; +// /// Context changer. +// layer context_changer; + +// /// Draw changer. +// layer drawing; +// /// Brush stroke. +// layer stroke_brush; +// /// Target to draw. +// layer target; + +// // exposed use Drawing; + +// } diff --git a/module/move/wplot/src/plot/sys/stroke_brush.rs b/module/move/wplot/src/plot/sys/stroke_brush.rs new file mode 100644 index 0000000000..8cfe8c0b10 --- /dev/null +++ b/module/move/wplot/src/plot/sys/stroke_brush.rs @@ -0,0 +1,84 @@ +mod change_width; +mod change_new; + +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use crate::abs::identity::private::Id; + use crate::abs::identity::private::HasIdInterface; + + /// StrokeBrush. + #[ derive( Debug, Clone ) ] + pub struct StrokeBrush + { + pub( crate ) id : Id, + pub( crate ) color : Rgba, + pub( crate ) width : f32, + } + + impl Default for StrokeBrush + { + fn default() -> Self + { + let id = Id::new::< Self >(); + let color = Default::default(); + let width = 1.0; + Self { id, color, width } + } + } + + impl StrokeBrush + { + + /// Constructor. + pub fn new() -> Self + { + Default::default() + } + + /// ChangeInterface color. + #[ inline ] + pub fn color< Color >( mut self, val : Color ) -> Self + where + Color : RgbaInterface< f32 >, + { + self.color = val.into_rgba(); + self + } + + /// ChangeInterface color. + #[ inline ] + pub fn width( mut self, val : f32 ) -> Self + { + self.width = val; + self + } + + } + + impl HasIdInterface for StrokeBrush + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +// ::meta_tools::mod_interface! +// { +// exposed use StrokeBrush; + +// /// ChangerInterface of brush stroke. +// layer changer; +// /// ChangeInterface of brush stroke constructor. +// layer change_new; +// /// ChangeInterface of brush stroke to change color. +// layer change_color; +// /// ChangeInterface of brush stroke to change width. +// layer change_width; + +// } diff --git a/module/move/wplot/src/plot/sys/stroke_brush/change_color.rs b/module/move/wplot/src/plot/sys/stroke_brush/change_color.rs new file mode 100644 index 0000000000..98d55ffbaa --- /dev/null +++ b/module/move/wplot/src/plot/sys/stroke_brush/change_color.rs @@ -0,0 +1,35 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct StrokeBrushChangeColor + { + pub( crate ) id : Id, + pub( crate ) val : Rgba< f32 >, + } + + impl StrokeBrushChangeColor + { + /// Constructor. + pub fn new< Color >( id : Id, val : Color ) -> Self + where + Color : RgbaInterface< f32 >, + { + Self{ id, val : val.into_rgba() } + } + } + + impl ChangeInterface for StrokeBrushChangeColor + { + } + +} + +crate::mod_interface! +{ + exposed use StrokeBrushChangeColor; +} diff --git a/module/move/wplot/src/plot/sys/stroke_brush/change_new.rs b/module/move/wplot/src/plot/sys/stroke_brush/change_new.rs new file mode 100644 index 0000000000..1a1160de67 --- /dev/null +++ b/module/move/wplot/src/plot/sys/stroke_brush/change_new.rs @@ -0,0 +1,34 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + + use crate::abs::{identity::private::Id, change::private::ChangeInterface}; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct StrokeBrushChangeNew + { + pub( crate ) id : Id, + } + + impl StrokeBrushChangeNew + { + /// Constructor. + pub fn new( id : Id ) -> Self + { + Self{ id } + } + } + + impl ChangeInterface for StrokeBrushChangeNew + { + } + +} + +::meta_tools::mod_interface! +{ + exposed use StrokeBrushChangeNew; +} diff --git a/module/move/wplot/src/plot/sys/stroke_brush/change_width.rs b/module/move/wplot/src/plot/sys/stroke_brush/change_width.rs new file mode 100644 index 0000000000..1a6fa4aeed --- /dev/null +++ b/module/move/wplot/src/plot/sys/stroke_brush/change_width.rs @@ -0,0 +1,35 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::protected::*; + +use crate::abs::{change::private::ChangeInterface, identity::private::Id}; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug, Clone ) ] + pub struct StrokeBrushChangeWidth + { + pub( crate ) id : Id, + pub( crate ) val : f32, + } + + impl StrokeBrushChangeWidth + { + /// Constructor. + pub fn new( id : Id, val : f32 ) -> Self + { + Self { id, val } + } + } + + impl ChangeInterface for StrokeBrushChangeWidth + { + } + +} + +::meta_tools::mod_interface! +{ + exposed use StrokeBrushChangeWidth; +} diff --git a/module/move/wplot/src/plot/sys/stroke_brush/changer.rs b/module/move/wplot/src/plot/sys/stroke_brush/changer.rs new file mode 100644 index 0000000000..33ef3969e1 --- /dev/null +++ b/module/move/wplot/src/plot/sys/stroke_brush/changer.rs @@ -0,0 +1,104 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + + /// ChangerInterface of brush stroke. + #[ allow( dead_code ) ] + #[ derive( Debug ) ] + pub struct StrokeBrushChanger + { + pub( crate ) id : Id, + pub( crate ) context_changer : ContextChanger, + } + + impl StrokeBrushChanger + { + + /// Constructor. + #[ inline ] + pub( crate ) fn _new( mut context_changer : ContextChanger ) -> Self + { + let id = &mut context_changer.stroke; + if id.is_none() + { + *id = Some( Id::new::< StrokeBrush >() ); + StrokeBrushChangeNew::new( context_changer.stroke.unwrap() ).add_to( &mut context_changer ); + } + let id = context_changer.stroke.unwrap(); + Self + { + id, + context_changer, + } + } + + // /// Get back to context. + // #[ inline ] + // pub fn context( self ) -> ContextChanger + // { + // self.context_changer + // } + + /// ChangeInterface color. + #[ inline ] + pub fn color< Color >( mut self, color : Color ) -> Self + where + Color : RgbaInterface< f32 >, + { + let id = self.id; + let change = StrokeBrushChangeColor::new( id, color.into_rgba() ); + self.change_add( change ); + self + } + + /// Width. + #[ inline ] + pub fn width( mut self, val : f32 ) -> Self + { + let id = self.id; + let change = StrokeBrushChangeWidth::new( id, val ); + self.change_add( change ); + self + } + + } + + impl ChangerInterface for StrokeBrushChanger + { + + type Parent = ContextChanger; + type Root = ContextChanger; + + fn context( self ) -> Self::Root + { + self.context_changer + } + + fn parent( &mut self ) -> &mut Self::Parent + { + &mut self.context_changer + } + + fn end( self ) -> Self::Parent + { + self.context_changer + } + + } + + impl HasIdInterface for StrokeBrushChanger + { + #[ inline ] + fn id( &self ) -> Id + { + self.id + } + } + +} + +::meta_tools::mod_interface! +{ + exposed use StrokeBrushChanger; +} diff --git a/module/move/wplot/src/plot/sys/target.rs b/module/move/wplot/src/plot/sys/target.rs new file mode 100644 index 0000000000..3433e953fb --- /dev/null +++ b/module/move/wplot/src/plot/sys/target.rs @@ -0,0 +1,13 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::prelude::*; + + + +} + +::meta_tools::mod_interface! +{ + // exposed use StrokeBrush; +} diff --git a/module/move/wplot/src/plot/wplot_lib.rs b/module/move/wplot/src/plot/wplot_lib.rs new file mode 100644 index 0000000000..c33e8463dd --- /dev/null +++ b/module/move/wplot/src/plot/wplot_lib.rs @@ -0,0 +1,52 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wplot/latest/wplot/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] + +//! +//! Plot interface. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// pub use ::wmath as math; +// use ::wtools::prelude::*; +// use ::wtools::mod_interface; + +mod abs; + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::image; + pub use ::open; + pub use ::wmath; + pub use ::rgb; +} + +// use mod_interface::mod_interface; + +::meta_tools::mod_interface! +{ + + /// Describe colors. + #[ cfg( not( feature = "no_std" ) ) ] + layer color; + // /// Abstraction. + // #[ cfg( not( feature = "no_std" ) ) ] + // layer abs; + // /// Concrete system. + // #[ cfg( not( feature = "no_std" ) ) ] + // layer sys; + + use super::math; + protected use ::wmath as math; + protected( crate ) use ::wtools::prelude::*; + +} diff --git a/module/move/wplot/test.png b/module/move/wplot/test.png new file mode 100644 index 0000000000000000000000000000000000000000..b103830d96a4361e65c4d0f6053d4faa1cdcc33b GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj{$|z{uz6;uuoF`1S$g1QpLoDxN~! zt7h(YcX3HeOA8AHf^rb}eufsH1Y~r0ILMZ?G&eVwmff>wa-H`{3okD%FZVwWveGBX z^qIY&sK6up_QI$3;#2>}g#0TG{CVD$>KsvnXZGCxIZpGj)jm776ckJhp00i_>zopr E075&e?f?J) literal 0 HcmV?d00001 diff --git a/module/move/wplot/tests/plot/inc.rs b/module/move/wplot/tests/plot/inc.rs new file mode 100644 index 0000000000..7ca3cf7dd6 --- /dev/null +++ b/module/move/wplot/tests/plot/inc.rs @@ -0,0 +1,5 @@ + +#[ allow( unused_imports ) ] +use super::*; +#[ cfg( not( feature = "no_std" ) ) ] +mod basic_test; diff --git a/module/move/wplot/tests/plot/inc/basic_test.rs b/module/move/wplot/tests/plot/inc/basic_test.rs new file mode 100644 index 0000000000..0ebcd427dc --- /dev/null +++ b/module/move/wplot/tests/plot/inc/basic_test.rs @@ -0,0 +1,91 @@ +use super::*; + +// zzz : remove +// pub use wmath::X2; +// pub use wmath::X2BasicInterface; + +// + +tests_impls! +{ + + // #[ignore] + fn without() + { + use the_module::math::X2; + use the_module::prelude::*; + + let file_name = "./test.png"; + let dims = X2::make( 32, 32 ); + let mut imgbuf = image::ImageBuffer::new( dims.0, dims.1 ); + + for x in 0 ..= 30 + { + let y = 0; + *imgbuf.get_pixel_mut( x, y ) = image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + for x in 1 ..= 31 + { + let y = 31; + *imgbuf.get_pixel_mut( x, y ) = image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + for y in 0 ..= 30 + { + let x = 31; + *imgbuf.get_pixel_mut( x, y ) = image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + for y in 1 ..= 31 + { + let x = 0; + *imgbuf.get_pixel_mut( x, y ) = image::Rgb( [ 255_u8, 0_u8, 255_u8 ] ); + } + + imgbuf.save( file_name ).unwrap(); + // open::that( file_name ).unwrap(); + + } + + // + + // #[ignore] +// fn basic() +// { +// use the_module::math::X2; +// use the_module::prelude::*; + +// // let c = the_module::context::make(); +// let mut c = the_module::context(); +// // let c = the_module::context().new(); + +// // c.canvas.size( from!( 32, 32 ) ); +// let c = c +// // .stroke().color( [ 1.0, 0.0, 1.0 ] ).end() +// .stroke().width( 2.0 ).color( [ 1.0, 0.0, 1.0 ] ).context() +// // c.draw().begin(); +// // c.draw().name( "drawing1" ); +// .draw().rect().context() +// // c.draw().rect().region( from!( 0.0, 0.0 ), from!( 1.0, 1.0 ) ).context(); +// // c.draw().end(); +// // c.draw().now(); +// ; + +// // // c.canvas().storing_to_file_path( file_name ); +// // // c.canvas().showing_file( true ); +// // c.canvas().store_to_file(); + +// println!( "{:?}", c ); + +// } + +} + +// + +tests_index! +{ + without, + // basic, +} diff --git a/module/move/wplot/tests/plot/plot_interface_tests.rs b/module/move/wplot/tests/plot/plot_interface_tests.rs new file mode 100644 index 0000000000..38cfac27df --- /dev/null +++ b/module/move/wplot/tests/plot/plot_interface_tests.rs @@ -0,0 +1,7 @@ + +#[ allow( unused_imports ) ] +use plot_interface as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/move/wplot/tests/plot/wplot_tests.rs b/module/move/wplot/tests/plot/wplot_tests.rs new file mode 100644 index 0000000000..aa6bf266fa --- /dev/null +++ b/module/move/wplot/tests/plot/wplot_tests.rs @@ -0,0 +1,7 @@ + +#[ allow( unused_imports ) ] +use wplot as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/move/wplot/tests/smoke_test.rs b/module/move/wplot/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/move/wplot/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/_video_experiment/Cargo.toml b/module/postponed/_video_experiment/Cargo.toml new file mode 100644 index 0000000000..b167ebec39 --- /dev/null +++ b/module/postponed/_video_experiment/Cargo.toml @@ -0,0 +1,69 @@ +[package] +name = "video_experiment" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/video_experiment" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/video_experiment" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/video_experiment" +description = """ +___ +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/_blank", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] +mp4_ratio_conversion = [] + +[lib] +name = "video_experiment" +path = "src/video/video_experiment_lib.rs" + +[[test]] +name = "video_experiment_test" +path = "tests/video/video_experiment_tests.rs" + +# [[test]] +# name = "video_experiment_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +# [[example]] +# name = "video_experiment_trivial" +# path = "examples/video_experiment_trivial/src/main.rs" + +[dependencies] +wtools = { workspace = true } +wmath = "~0.3" +gif = "~0.11" +apng = "~0.2.0" +png = "~0.16.3" +ac-ffmpeg = "~0.17" +openh264 = "~0.2" + +[dev-dependencies] +image = "~0.24" +test_tools = { workspace = true } diff --git a/module/postponed/_video_experiment/License b/module/postponed/_video_experiment/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/_video_experiment/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/_video_experiment/Readme.md b/module/postponed/_video_experiment/Readme.md new file mode 100644 index 0000000000..3f840bda54 --- /dev/null +++ b/module/postponed/_video_experiment/Readme.md @@ -0,0 +1,28 @@ + + +# Module :: video_experiment + + +Video generation example. + +### Basic use-case + + + +```rust +use video_experiment::*; + +fn main() +{ +} +``` + +### To add to your project + +```bash +``` + +### Try out from the repository + +``` shell test +``` diff --git a/module/postponed/_video_experiment/src/video/common.rs b/module/postponed/_video_experiment/src/video/common.rs new file mode 100644 index 0000000000..042fa4c998 --- /dev/null +++ b/module/postponed/_video_experiment/src/video/common.rs @@ -0,0 +1,73 @@ +/// Private namespace. +pub( crate ) mod private +{ + + /// Select strategy for the output format. + #[ derive( Debug, PartialEq, Eq ) ] + pub enum EncoderType + { + /// Convert to gif. + Gif, + /// Convert to apng. + Png, + /// Convert to mp4. + Mp4, + } + + impl Default for EncoderType + { + fn default() -> Self + { + EncoderType::Mp4 + } + } + + /// Select color encoding. + #[ derive( Debug, Clone, PartialEq, Eq ) ] + pub enum ColorType + { + /// RGB color encoding. + Rgb, + /// RGB color encoding. + Rgba, + /// Y′UV444 color encoding. + Yuv444, + /// Y′UV422(also known as YUYV or YUY2) color encoding. + Yuv422, + /// Y′UV420p(also known as YV12) color encoding. + Yuv420p, + /// Y′VU420p(also known as YU12) color encoding. + Yvu420p, + /// Y′UV422p color encoding. + Yuv422p, + /// Greyscale color encoding. + Grayscale, + } + + impl Default for ColorType + { + fn default() -> Self + { + ColorType::Rgb + } + } + + /// Trait for encoders. + pub trait EncodeData + { + /// Encode bytes buffer to output. + fn encode( &mut self, data : &[ u8 ] ) -> Result< (), Box >; + /// Finish encoding. It is recommended to flush data at the end of encoding, because the data can be loosed. + fn flush( &mut self ) -> Result< (), Box >; + } + +} + +// + +wtools::meta::mod_interface! +{ + prelude use EncoderType; + prelude use ColorType; + prelude use EncodeData; +} diff --git a/module/postponed/_video_experiment/src/video/encoder_strategy.rs b/module/postponed/_video_experiment/src/video/encoder_strategy.rs new file mode 100644 index 0000000000..3b2c39b4ad --- /dev/null +++ b/module/postponed/_video_experiment/src/video/encoder_strategy.rs @@ -0,0 +1,160 @@ +/// Private namespace. +pub( crate ) mod private +{ + use std::fmt::{ Debug, Formatter }; + use crate::common::prelude::*; + use crate::encoders::{ Gif, Png, Mp4 }; + use wtools::error::BasicError; + #[ allow( unused_imports ) ] + use wtools::prelude::former::Former; + use wmath::X2; + + /// Encoder for the buffer. + + /* rrr : for Dmytro : add former macro when attributes and documentation comments handling will be implemented */ + // #[ derive( Former ) ] + pub struct Encoder + { + /// Frame width and height. + dims : wmath::X2< usize >, + /// Frame rate. + frame_rate : usize, + /// Color encoding. + color_type : ColorType, + /// Repeat animation. For animated images formats. + repeat : Option< usize >, + + /// Type of output format. + encoder_type : EncoderType, + /// Encoder for the output format. + encoder : Box< dyn EncodeData >, + + /// Output filename. + output_filename : std::path::PathBuf, + } + + impl Debug for Encoder + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + f.debug_struct( "Encoder" ) + .field( "width", &self.dims.0 ) + .field( "height", &self.dims.0 ) + .field( "frame_rate", &self.frame_rate ) + .field( "color_type", &self.color_type ) + .field( "encoder_type", &self.encoder_type ) + .field( "output_filename", &self.output_filename ) + .finish() + } + } + + impl EncodeData for Encoder + { + /// Encode bytes buffer to output. + fn encode( &mut self, data : &[ u8 ] ) -> Result< (), Box< dyn std::error::Error > > + { + self.encoder.encode( data ) + } + /// Finish encoding. + fn flush( &mut self ) -> Result< (), Box > + { + self.encoder.flush() + } + } + + impl Encoder + { + /// Create an instance. + pub fn new + ( + encoder_type : EncoderType, + dims : X2< usize >, + frame_rate : usize, + repeat : Option< usize >, + color_type : ColorType, + filename : impl AsRef< str > + ) -> Result< Self, Box< dyn std::error::Error > > + { + let encoder = Encoder::encoder_make( &encoder_type, &dims, frame_rate, repeat, &color_type, filename.as_ref() )?; + + let instance = Self + { + dims, + frame_rate, + color_type, + repeat, + encoder_type, + encoder, + output_filename : std::path::PathBuf::from( filename.as_ref() ), + }; + Ok( instance ) + } + + // + + fn encoder_make + ( + encoder_type : &EncoderType, + dims : &X2< usize >, + frame_rate : usize, + repeat : Option< usize >, + color_type : &ColorType, + filename : &str + ) -> Result< Box< dyn EncodeData >, Box< dyn std::error::Error > > + { + if encoder_type == &EncoderType::Gif + { + let encoder = Gif::new( *dims, frame_rate, repeat, color_type, filename )?; + return Ok( Box::new( encoder ) ); + } + if encoder_type == &EncoderType::Png + { + let encoder = Png::new( *dims, frame_rate, repeat, color_type, filename )?; + return Ok( Box::new( encoder ) ); + } + if encoder_type == &EncoderType::Mp4 + { + let encoder = Mp4::new( *dims, frame_rate, repeat, color_type, filename )?; + return Ok( Box::new( encoder ) ); + } + + Err( Box::new( BasicError::new( format!( "unknown encoder type \"{:?}\"", encoder_type ) ) ) ) + } + + // + + /// Change type of encoder. + pub fn type_change( &mut self, encoder_type : EncoderType ) -> Result< (), Box< dyn std::error::Error > > + { + let changed = match encoder_type + { + EncoderType::Gif => self.output_filename.set_extension( "gif" ), + EncoderType::Png => self.output_filename.set_extension( "png" ), + EncoderType::Mp4 => self.output_filename.set_extension( "mp4" ), + }; + + if !changed + { + return Err( Box::new( BasicError::new( "cannot update extension" ) ) ); + } + + let encoder = Encoder::encoder_make + ( + &encoder_type, + &self.dims, + self.frame_rate, + self.repeat, + &self.color_type, + self.output_filename.to_str().ok_or_else( | | BasicError::new( "cannot form filename" ) )? + )?; + self.encoder = encoder; + Ok( () ) + } + } + +} + +wtools::meta::mod_interface! +{ + prelude use Encoder; +} diff --git a/module/postponed/_video_experiment/src/video/encoders/gif.rs b/module/postponed/_video_experiment/src/video/encoders/gif.rs new file mode 100644 index 0000000000..de33ed3666 --- /dev/null +++ b/module/postponed/_video_experiment/src/video/encoders/gif.rs @@ -0,0 +1,151 @@ +/// Private namespace. +pub( crate ) mod private +{ + use std::fmt::{ Debug, Formatter }; + use crate::common::prelude::*; + use crate::yuv; + use wmath::X2; + use ::gif::{ Encoder, Frame, Repeat }; + + /// Encoder for the buffer. + // #[ derive( Former ) ] + pub struct Gif + { + /// Frame width and height. + dims : X2< usize >, + /// Frame rate. + frame_rate : usize, + /// Delay for frame. + frame_delay : u16, + /// Color encoding. + color_type : ColorType, + /// Encoder for the gif. + encoder : Encoder< std::fs::File >, + /// Output filename. + output_filename : std::path::PathBuf, + } + + impl Debug for Gif + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + f.debug_struct( "Gif" ) + .field( "width", &self.dims.0 ) + .field( "height", &self.dims.1 ) + .field( "frame_rate", &self.frame_rate ) + .field( "color_type", &self.color_type ) + .field( "output_filename", &self.output_filename ) + .finish() + } + } + + impl EncodeData for Gif + { + /// Encode bytes buffer to output. + fn encode( &mut self, data : &[ u8 ] ) -> Result< (), Box > + { + let mut buf = match self.color_type + { + ColorType::Rgb => + { + Frame::from_rgb( self.dims.0 as u16, self.dims.1 as u16, data ) + }, + ColorType::Rgba => + { + let mut cloned_data = data.to_vec(); + /* routine accepts mutable slice */ + Frame::from_rgba( self.dims.0 as u16, self.dims.1 as u16, cloned_data.as_mut_slice() ) + }, + ColorType::Yuv444 => + { + let rgb = yuv::yuv444_to_rgb( data ); + Frame::from_rgb( self.dims.0 as u16, self.dims.1 as u16, &rgb ) + }, + ColorType::Yuv422 => + { + let rgb = yuv::yuv422_to_rgb( data ); + Frame::from_rgb( self.dims.0 as u16, self.dims.1 as u16, &rgb ) + }, + ColorType::Yuv420p => + { + let rgb = yuv::yuv420p_to_rgb( data, self.dims.0, self.dims.1 ); + Frame::from_rgb( self.dims.0 as u16, self.dims.1 as u16, &rgb ) + }, + ColorType::Yvu420p => + { + let rgb = yuv::yvu420p_to_rgb( data, self.dims.0, self.dims.1 ); + Frame::from_rgb( self.dims.0 as u16, self.dims.1 as u16, &rgb ) + }, + ColorType::Yuv422p => + { + let rgb = yuv::yuv422p_to_rgb( data, self.dims.0, self.dims.1 ); + Frame::from_rgb( self.dims.0 as u16, self.dims.1 as u16, &rgb ) + }, + ColorType::Grayscale => + { + let rgb = yuv::grayscale_to_rgb( data ); + Frame::from_rgb( self.dims.0 as u16, self.dims.1 as u16, &rgb ) + }, + }; + buf.delay = self.frame_delay; + + self.encoder.write_frame( &buf )?; + Ok( () ) + } + /// Finish encoding. + fn flush( &mut self ) -> Result< (), Box > + { + Ok( () ) + } + } + + impl Gif + { + /// Create an instance. + pub fn new + ( + dims : X2< usize >, + frame_rate : usize, + repeat : Option< usize >, + color_type : &ColorType, + filename : impl AsRef< str > + ) -> Result< Self, Box< dyn std::error::Error > > + { + let image = std::fs::File::create( filename.as_ref() )?; + let mut encoder = Encoder::new( image, dims.0 as u16, dims.1 as u16, &[] )?; + if let Some( n ) = repeat + { + match n + { + 0 => encoder.set_repeat( Repeat::Infinite )?, + x => encoder.set_repeat( Repeat::Finite( x as u16 ) )?, + } + } + else + { + encoder.set_repeat( Repeat::Finite( 0 ) )?; + } + + let gif_time_step = 10; // library allow write images with time step equal to 10 ms + let frame_delay = ( 1000 / gif_time_step / frame_rate ) as u16; + + let instance = Self + { + dims, + frame_rate, + frame_delay, + color_type : color_type.clone(), + encoder, + output_filename : std::path::PathBuf::from( filename.as_ref() ), + }; + Ok( instance ) + } + } +} + +// + +wtools::meta::mod_interface! +{ + prelude use Gif; +} diff --git a/module/postponed/_video_experiment/src/video/encoders/mod.rs b/module/postponed/_video_experiment/src/video/encoders/mod.rs new file mode 100644 index 0000000000..d494143f8a --- /dev/null +++ b/module/postponed/_video_experiment/src/video/encoders/mod.rs @@ -0,0 +1,10 @@ + +wtools::meta::mod_interface! +{ + /// Gif encoder. + layer gif; + /// Png encoder. + layer png; + /// Mp4 encoder. + layer mp4; +} diff --git a/module/postponed/_video_experiment/src/video/encoders/mp4.rs b/module/postponed/_video_experiment/src/video/encoders/mp4.rs new file mode 100644 index 0000000000..5f43ba35ff --- /dev/null +++ b/module/postponed/_video_experiment/src/video/encoders/mp4.rs @@ -0,0 +1,291 @@ +/// Private namespace. +pub( crate ) mod private +{ + use std::fmt::{ Debug, Formatter }; + use crate::common::prelude::*; + use crate::yuv; + use wmath::X2; + use ::ac_ffmpeg:: + { + packet::PacketMut, + codec::{ CodecParameters, VideoCodecParameters }, + format:: + { + io::IO, + muxer::{ Muxer, OutputFormat }, + }, + time::{ TimeBase, Timestamp }, + Error, + }; + use openh264::encoder::{ Encoder, EncoderConfig }; + use openh264::formats::YUVSource; + + // + + /// Encoder for the buffer. + // #[ derive( Former ) ] + pub struct Mp4 + { + /// Frame width and height. + dims : X2< usize >, + /// Frame rate. + frame_rate : usize, + #[ cfg( feature = "mp4_ratio_conversion" ) ] + /// Frame rate multiplier. + #[ cfg( feature = "mp4_ratio_conversion" ) ] + frame_rate_ratio : usize, + /// Frame index. + frame_idx : i64, + /// Time base of video. + time_base : TimeBase, + /// Color encoding. + color_type : ColorType, + /// Config for color format encoder. + config : EncoderConfig, + /// Muxer for the mp4. + muxer : Muxer< std::fs::File >, + /// Output filename. + output_filename : std::path::PathBuf, + } + + impl Debug for Mp4 + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + f.debug_struct( "Mp4" ) + .field( "width", &self.dims.0 ) + .field( "height", &self.dims.1 ) + .field( "frame_rate", &self.frame_rate ) + .field( "color_type", &self.color_type ) + .field( "output_filename", &self.output_filename ) + .finish() + } + } + + impl EncodeData for Mp4 + { + /// Encode bytes buffer to output. + fn encode( &mut self, data : &[ u8 ] ) -> Result< (), Box > + { + let rgb = match self.color_type + { + ColorType::Rgb => + { + Some( data.to_vec() ) + }, + ColorType::Rgba => + { + /* skip alpha channel */ + let data = data.iter().enumerate() + .filter_map( | ( i, v ) | if ( i + 1 ) % 4 == 0 { None } else { Some( *v ) } ) + .collect::>(); + Some( data ) + }, + ColorType::Yuv444 => + { + Some( yuv::yuv444_to_rgb( data ) ) + }, + ColorType::Yuv422 => + { + Some( yuv::yuv422_to_rgb( data ) ) + }, + ColorType::Yuv420p => + { + None + }, + ColorType::Yvu420p => + { + Some( yuv::yvu420p_to_rgb( data, self.dims.0, self.dims.1 ) ) + }, + ColorType::Yuv422p => + { + Some( yuv::yuv422p_to_rgb( data, self.dims.0, self.dims.1 ) ) + }, + ColorType::Grayscale => + { + Some( yuv::grayscale_to_rgb( data ) ) + }, + }; + + let frame_timestamp = Timestamp::new( self.frame_idx, self.time_base ); + self.frame_idx += 1; + + /* the initialization of new instance is required for correct conversion */ + let mut encoder = Encoder::with_config( self.config.clone() ).unwrap(); + + let bitstream = if let Some( rgb ) = rgb + { + let mut yuv = openh264::formats::RBGYUVConverter::new( self.dims.0, self.dims.1 ); + yuv.convert( rgb.as_slice() ); + encoder.encode( &yuv )? + } + else + { + let yuv = RawYuv420pSource { yuv: data, dims: self.dims }; + encoder.encode( &yuv )? + }; + + let buf = bitstream.to_vec(); + + #[ cfg( feature = "mp4_ratio_conversion" ) ] + { + let mut frame_timestamp = frame_timestamp; + for _i in 0..self.frame_rate_ratio + { + let packet = PacketMut::from( &buf ) + .with_pts( frame_timestamp ) + .with_dts( frame_timestamp ) + .freeze(); + + frame_timestamp = Timestamp::new( self.frame_idx, self.time_base ); + self.frame_idx += 1; + self.muxer.push( packet )?; + } + } + #[ cfg( not( feature = "mp4_ratio_conversion" ) ) ] + { + let packet = PacketMut::from( &buf ) + .with_pts( frame_timestamp ) + .with_dts( frame_timestamp ) + .freeze(); + self.muxer.push( packet )?; + } + + Ok( () ) + + } + /// Finish encoding. + fn flush( &mut self ) -> Result< (), Box > + { + self.muxer.flush()?; + Ok( () ) + } + } + + impl Mp4 + { + /// Create an instance. + pub fn new + ( + dims : X2< usize >, + frame_rate : usize, + _repeat : Option< usize >, + color_type : &ColorType, + filename : impl AsRef< str > + ) -> Result< Self, Box< dyn std::error::Error > > + { + let path = filename.as_ref(); + let output_format = OutputFormat::guess_from_file_name( path ) + .ok_or_else( || Error::new( format!( "unable to guess output format for file: {}", path ) ) )?; + + let output = std::fs::File::create( path ) + .map_err( | err | Error::new( format!( "unable to create output file {}: {}", path, err ) ) )?; + + let io = IO::from_seekable_write_stream( output ); + + let codec_parameters = CodecParameters::from + ( + VideoCodecParameters::builder( "libx264" ).unwrap() + .width( dims.0 ) + .height( dims.1 ) + .build() + ); + + let mut muxer_builder = Muxer::builder(); + muxer_builder.add_stream( &codec_parameters )?; + let muxer = muxer_builder.build( io, output_format )?; + + #[ cfg( not( feature = "mp4_ratio_conversion" ) ) ] + let base_frame_rate = frame_rate as u32; + + #[ cfg( feature = "mp4_ratio_conversion" ) ] + let base_frame_rate = if frame_rate < 30 + { + 30 + } + else + { + frame_rate as u32 + }; + let time_base = TimeBase::new( 1, base_frame_rate ); + + let config = EncoderConfig::new( dims.0 as _, dims.1 as _ ); + + let instance = Self + { + dims, + frame_rate, + #[ cfg( feature = "mp4_ratio_conversion" ) ] + frame_rate_ratio : ( 30 / frame_rate ) as _, + frame_idx : 0, + time_base, + color_type : color_type.clone(), + config, + muxer, + output_filename : std::path::PathBuf::from( filename.as_ref() ), + }; + Ok( instance ) + } + + } + + + struct RawYuv420pSource< 'a > + { + yuv : &'a [ u8 ], + dims : X2< usize >, + } + + impl YUVSource for RawYuv420pSource< '_ > + { + fn width( &self ) -> i32 + { + self.dims.0 as i32 + } + + fn height( &self ) -> i32 + { + self.dims.1 as i32 + } + + fn y( &self ) -> &[ u8 ] + { + &self.yuv[ 0..self.dims.0 * self.dims.0 ] + } + + fn u( &self ) -> &[ u8 ] + { + let base_u = self.dims.0 * self.dims.1; + &self.yuv[ base_u..base_u + base_u / 4 ] + } + + fn v( &self ) -> &[ u8 ] + { + let base_u = self.dims.0 * self.dims.1; + let base_v = base_u + base_u / 4; + &self.yuv[ base_v.. ] + } + + fn y_stride( &self ) -> i32 + { + self.dims.0 as i32 + } + + fn u_stride( &self ) -> i32 + { + ( self.dims.0 / 2 ) as i32 + } + + fn v_stride( &self ) -> i32 + { + ( self.dims.0 / 2 ) as i32 + } + } +} + +// + +wtools::meta::mod_interface! +{ + prelude use Mp4; +} diff --git a/module/postponed/_video_experiment/src/video/encoders/png.rs b/module/postponed/_video_experiment/src/video/encoders/png.rs new file mode 100644 index 0000000000..42487c2838 --- /dev/null +++ b/module/postponed/_video_experiment/src/video/encoders/png.rs @@ -0,0 +1,231 @@ +/// Private namespace. +pub( crate ) mod private +{ + use std::fmt::{ Debug, Formatter }; + use crate::common::prelude::*; + use crate::yuv; + use wtools::error::BasicError; + use wmath::X2; + use ::apng::{ Config, Encoder, Frame, PNGImage }; + use ::png::{ BitDepth, FilterType }; + + + /// Encoder for the buffer. + // #[ derive( Former ) ] + pub struct Png + { + /// Frame width and height. + dims : X2< usize >, + /// Frame rate. + frame_rate : usize, + /// Color encoding. + color_type : ColorType, + /// Buffer for images. + images_buffer : Vec< PNGImage >, + /// Number of repeats. + repeat : u32, + /// Output filename. + output_filename : std::path::PathBuf, + } + + impl Debug for Png + { + fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result + { + f.debug_struct( "Png" ) + .field( "width", &self.dims.0 ) + .field( "height", &self.dims.1 ) + .field( "frame_rate", &self.frame_rate ) + .field( "color_type", &self.color_type ) + .field( "output_filename", &self.output_filename ) + .finish() + } + } + + impl EncodeData for Png + { + /// Encode bytes buffer to output. + fn encode( &mut self, data : &[ u8 ] ) -> Result< (), Box > + { + let image = match self.color_type + { + ColorType::Rgb => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : data.to_vec(), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGB, + } + }, + ColorType::Rgba => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : data.to_vec(), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGBA, + } + }, + ColorType::Yuv444 => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : yuv::yuv444_to_rgb( data ), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGB, + } + }, + ColorType::Yuv422 => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : yuv::yuv422_to_rgb( data ), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGB, + } + }, + ColorType::Yuv420p => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : yuv::yuv420p_to_rgb( data, self.dims.0, self.dims.1 ), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGB, + } + }, + ColorType::Yvu420p => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : yuv::yvu420p_to_rgb( data, self.dims.0, self.dims.1 ), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGB, + } + }, + ColorType::Yuv422p => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : yuv::yuv422p_to_rgb( data, self.dims.0, self.dims.1 ), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGB, + } + }, + ColorType::Grayscale => + { + PNGImage + { + width : self.dims.0 as _, + height : self.dims.1 as _, + data : yuv::grayscale_to_rgb( data ), + bit_depth : BitDepth::Eight, + color_type : ::png::ColorType::RGB, + } + }, + }; + + self.images_buffer.push( image ); + Ok( () ) + } + + /// Finish encoding. + fn flush( &mut self ) -> Result< (), Box > + { + let mut out = std::io::BufWriter::new( std::fs::File::create( &self.output_filename )? ); + + let config = Config + { + width : self.dims.0 as _, + height : self.dims.1 as _, + num_frames : self.images_buffer.len() as _, + num_plays : self.repeat, + color : self.images_buffer[ 0 ].color_type, + depth : BitDepth::Eight, + filter : FilterType::NoFilter, + }; + let encoder_res = Encoder::new( &mut out, config ); + if encoder_res.is_err() + { + return Err( Box::new( BasicError::new( "cannot build encoder" ) ) ); + } + let mut encoder = encoder_res.unwrap(); + + let frame = Frame + { + delay_num : Some( 1 ), + delay_den : Some( self.frame_rate as _ ), + ..Default::default() + }; + + for image in &self.images_buffer + { + let encoded = encoder.write_frame( image, frame.clone() ); + if encoded.is_err() + { + return Err( Box::new( BasicError::new( "cannot write frame" ) ) ); + } + } + let finished = encoder.finish_encode(); + if finished.is_err() + { + return Err( Box::new( BasicError::new( "cannot write image" ) ) ); + } + + Ok( () ) + } + } + + impl Png + { + /// Create an instance. + pub fn new + ( + dims : X2< usize >, + frame_rate : usize, + repeat : Option< usize >, + color_type : &ColorType, + filename : impl AsRef< str > + ) -> Result< Self, Box< dyn std::error::Error > > + { + let repeat = match repeat + { + Some( 0 ) => u32::MAX, + Some( n ) => n as u32, + None => 1_u32, + }; + + let instance = Self + { + dims, + frame_rate, + color_type : color_type.clone(), + images_buffer : vec![], + repeat, + output_filename : std::path::PathBuf::from( filename.as_ref() ), + }; + Ok( instance ) + } + } +} + +// + +wtools::meta::mod_interface! +{ + prelude use Png; +} diff --git a/module/postponed/_video_experiment/src/video/video_experiment_lib.rs b/module/postponed/_video_experiment/src/video/video_experiment_lib.rs new file mode 100644 index 0000000000..0dde9e5692 --- /dev/null +++ b/module/postponed/_video_experiment/src/video/video_experiment_lib.rs @@ -0,0 +1,49 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/video_experiment/latest/video_experiment/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Aggregates animation modules and provide common strategy to convert byte buffers to animated +//! formats. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::gif; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::apng; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::png; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::ac_ffmpeg; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::openh264; +} + +// + +wtools::meta::mod_interface! +{ + /// Common types and interfaces. + layer common; + /// Encoders. + layer encoders; + /// Universal interface for animation. + layer encoder_strategy; + /// Yuv tools + layer yuv; +} diff --git a/module/postponed/_video_experiment/src/video/yuv.rs b/module/postponed/_video_experiment/src/video/yuv.rs new file mode 100644 index 0000000000..ad00d6847d --- /dev/null +++ b/module/postponed/_video_experiment/src/video/yuv.rs @@ -0,0 +1,118 @@ +/// Private namespace. +pub( crate ) mod private +{ + /// Convert one Y'UV444 frame to RGB888 + pub fn yuv444_to_rgb( buffer : &[ u8 ] ) -> Vec< u8 > + { + buffer.chunks_exact( 3 ) + .flat_map(| yuv | yuv_to_rgb( yuv[ 0 ], yuv[ 1 ], yuv[ 2 ] ) ) + .collect() + } + + /// Convert one Y'UV422(also known as YUYV or YUY2) frame to RGB888 + pub fn yuv422_to_rgb( buffer : &[ u8 ] ) -> Vec< u8 > + { + buffer.chunks_exact( 4 ) + .flat_map( | yuv | + [ + yuv_to_rgb( yuv[ 0 ], yuv[ 1 ], yuv[ 3 ] ), + yuv_to_rgb( yuv[ 2 ], yuv[ 1 ], yuv[ 3 ] ), + ] ) + .flatten() + .collect() + } + + /// Convert one Y'VU420p(also known as YV12) frame to RGB888 + pub fn yvu420p_to_rgb( frame : &[ u8 ], width : usize, height : usize ) -> Vec< u8 > + { + let pixels = width * height; + let ( y_plane, remainder ) = frame.split_at( pixels ); + let ( v_plane, u_plane ) = remainder.split_at( pixels / 4 ); + convert_square_planar( y_plane, u_plane, v_plane, width, 2 ) + } + + /// Convert one Y'UV420p(also known as YU12) frame to RGB888 + pub fn yuv420p_to_rgb( frame: &[ u8 ], width : usize, height : usize ) -> Vec< u8 > + { + let pixels = width * height; + let ( y_plane, remainder ) = frame.split_at( pixels ); + let ( u_plane, v_plane ) = remainder.split_at( pixels / 4 ); + convert_square_planar( y_plane, u_plane, v_plane, width, 2 ) + } + + /// Convert one Y'UV422p frame to RGB888 + pub fn yuv422p_to_rgb( frame : &[ u8 ], width : usize, height : usize ) -> Vec< u8 > + { + let pixels = width * height; + let ( y_plane, remainder ) = frame.split_at( pixels ); + let ( u_plane, v_plane ) = remainder.split_at( pixels / 2 ); + convert_consecutive_planar( y_plane, u_plane, v_plane, 2 ) + } + + /// Convert one Grayscale frame to RGB888 + pub fn grayscale_to_rgb( buffer : &[ u8 ] ) -> Vec< u8 > + { + let mut rgb = Vec::with_capacity( buffer.len() * 3 ); + for &y in buffer + { + rgb.push( y ); + rgb.push( y ); + rgb.push( y ); + } + rgb + } + + fn yuv_to_rgb( y : u8, u : u8, v : u8 ) -> [ u8; 3 ] + { + let y = ( y as f32 ) - 16.0; + let u = ( u as f32 ) - 128.0; + let v = ( v as f32 ) - 128.0; + let r = 1.164 * y + 1.596 * v; + let g = 1.164 * y - 0.392 * u - 0.813 * v; + let b = 1.164 * y + 2.017 * u; + [ + r.clamp( 0.0, 255.0 ) as u8, + g.clamp( 0.0, 255.0 ) as u8, + b.clamp( 0.0, 255.0 ) as u8, + ] + } + + /// Convert "square" planes. + /// Each U/V belongs to 'shared_count' number of Y's in one row. + fn convert_square_planar( y_plane : &[ u8 ], u_plane : &[ u8 ], v_plane : &[ u8 ], width : usize, shared_count : usize ) -> Vec< u8 > + { + y_plane.chunks_exact( width * 2 ) + .zip( u_plane.chunks_exact( width / shared_count).zip( v_plane.chunks_exact( width / shared_count) ) ) + .flat_map( | ( rows, ( u, v ) ) | + { + let ( first, second ) = rows.split_at( width ); + let mut result = convert_consecutive_planar( first, u, v, shared_count ); + result.append( &mut convert_consecutive_planar( second, u, v, shared_count ) ); + result + }) + .collect() + } + + /// Convert planes with the horizontal sampling only. + /// Each U/V belongs to 'shared_count' number of Y's. + fn convert_consecutive_planar(y_plane : &[ u8 ], u_plane : &[ u8 ], v_plane : &[ u8 ], shared_count : usize ) -> Vec< u8 > + { + y_plane.chunks_exact( shared_count ) + .zip( u_plane.iter().zip( v_plane.iter() ) ) + .flat_map(| ( lums, ( u, v ) ) | [ yuv_to_rgb( lums[ 0 ], *u, *v ), yuv_to_rgb( lums[ 1 ], *u, *v ) ] ) + .flatten() + .collect() + } +} + +// + +wtools::meta::mod_interface! +{ + prelude use yuv444_to_rgb; + prelude use yuv422_to_rgb; + prelude use yvu420p_to_rgb; + prelude use yuv420p_to_rgb; + prelude use yuv422p_to_rgb; + prelude use grayscale_to_rgb; +} diff --git a/module/postponed/_video_experiment/tests/smoke_test.rs b/module/postponed/_video_experiment/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/_video_experiment/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/_video_experiment/tests/video/_asset/img/rust_logo1.png b/module/postponed/_video_experiment/tests/video/_asset/img/rust_logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..41ccc813c927aa4c4ca3b03a61db2092fa622e28 GIT binary patch literal 23420 zcmeFYbyQr-)-SpmcXw@^5Zs-{CAf#+?(PI=+%2^o*G$AYOI*KxEOqB%)8u3+O|aRFNxT_6 z5DBjOes_2`_sRFy{nw=6?jNTo2Uq0z9Egt?Qv#PkkDhrA6($nuJNMULA5O~0Z}_h} zlkdGv$USWy9v%z>IS77UdEGpA+nrBc-|l;DYzB2@268;!|N7WxT03wZDiDNB%=)XY zU~(<4)%` z?>69FH(57JgJAZXK}W10mED}H`0s8rY)k8I_m4vBd$=W=T^AKMb5Zv#WU($mNGg)^ z96m2m*;w&eJb1GC`b2N1Y}{_TPB&aSM)NXvUv0Q?`Ph7KGdZZ>cr*zLG(Mt;sP||M zN+g`xC*%{2v{wDKucaI4OukLXkOpy$gf`mM>UgL1T(&{{$ zm?H3zIC&M^h0)B38$<9!Sp_|BB$f+TfJ}<|OPUT&EdrZxI2i`cgUu@jCwZ^E+1KwrPcr#a2ZiIxlli4-$dd=+ ziStbIUa>Y!^50)RWt|P)*BP&_sq0#2O!Ho|J2diMce;_T&2!yRWGZk!wyOx9ToI|+ zw3&F|_XsZFyP3?fX5E-dH)$Hme0J9!j-N|ELCSMbVlfnF4TXNs;dx;cZ_HC6)P#A2 z+?vIg$tyHwH9&%bYzqo#1C)XqnPoti{c;HrQ z$1i1_&suQ>_{HY~_f0NtIfBnLt({jtzWg$tUXzp~Z4c44A171fn>66pMN0pQgG3>o zzq2RyF#Rmd^I}+uJtF63EnPq&i2D7cCG^E659vnmyR2K=*Fh?-Z&nO4EcU$hn+EU& zf>GD`*k3$F)%VzwM1e9NxHsWBQ(jDowWS}YqLI){H9Jwoh6rU%b72>(S8#WHUhYrN zXuG>@%(T!vjepbLIe|yoaj@H3vBV?L?sQW1`cu}(cMIw9p#6SUuv)BYhtg>)nI?M0q-FYe5r?88)mwW= z=AR4h_~80;>Z-jGM0s;FP8YsL()(ue>yxND5|q374)5WTx~+GsmxBXCtlaMs?I>Fq zE?s5Z5Q&rGzk^7k%X+7;1#}|9%%H9m>*=NI+)}ItF z$A?SKu;ID0;QU@y(Hhb>a;RsiOZL3+l5@M3sI}n2CM*bszPrj=v)mXt zm4`zC(5kmogvN+Ed?-d=#o16dBegl~!orU1kz}?mv#o+^op7aa?iC+&sU(Zz2>B_$ z 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%0D7pbYo&eyp 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 X4wwfGzZ#6@qaoO{+sjq#!b|%%yBet9 literal 0 HcmV?d00001 diff --git a/module/postponed/_video_experiment/tests/video/_asset/img/rust_logo3.png b/module/postponed/_video_experiment/tests/video/_asset/img/rust_logo3.png new file mode 100644 index 0000000000000000000000000000000000000000..c622a2cc1735464e8c792b9f9ac9a3004cb37576 GIT binary patch literal 22454 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 literal 0 HcmV?d00001 diff --git a/module/postponed/_video_experiment/tests/video/inc.rs b/module/postponed/_video_experiment/tests/video/inc.rs new file mode 100644 index 0000000000..0f73fa7264 --- /dev/null +++ b/module/postponed/_video_experiment/tests/video/inc.rs @@ -0,0 +1,7 @@ + +use super::*; +mod apng_test; +mod gif_test; +mod mp4_test; +mod encoder_strategy_test; +mod yuv; diff --git a/module/postponed/_video_experiment/tests/video/inc/apng_test.rs b/module/postponed/_video_experiment/tests/video/inc/apng_test.rs new file mode 100644 index 0000000000..c49c1c5e22 --- /dev/null +++ b/module/postponed/_video_experiment/tests/video/inc/apng_test.rs @@ -0,0 +1,153 @@ +use super::*; + + +tests_impls! +{ + fn basic_rgb() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Png::new( X2( 100, 100 ), 30, None, &ColorType::Rgb, "../../../target/out_rgb.png" )?; + let mut buf = [ 255u8; 30_000 ]; + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) * 3 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 1 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 2 + ( i - 1 ) * 300 ] = 255; + + buf[ i * 3 + i * 300 ] = 0; + buf[ i * 3 + 1 + i * 300 ] = 0; + buf[ i * 3 + 2 + i * 300 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_rgb.png" ); + a_id!( path.exists(), true ); + + let decoder = png::Decoder::new( std::fs::File::open( &path )? ); + + let mut reader = decoder.read_info().expect( "Can not read the file target/out_rgb.png" ); + let animation_info = reader.0; + let mut bytes = vec![ 0; reader.1.output_buffer_size() ]; + + let info = reader.1.next_frame( &mut bytes )?; + + a_id!( animation_info.width, 100 ); + a_id!( animation_info.height, 100 ); + a_id!( animation_info.color_type, png::ColorType::RGB ); + + // first frame + a_id!( [ 0, 0, 0 ], bytes.as_slice()[ ..3 ] ); + assert_eq!( [ 255; 30_000 - 3 ], bytes.as_slice()[ 3.. ] ); + + // all frames valid + for _ in 1..100 + { + assert!( reader.1.next_frame( &mut bytes ).is_ok() ); + } + + // last frame + assert_eq!( buf, bytes.as_slice() ); + Ok( () ) + } + + // + + fn basic_rgba() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Png::new( X2( 100, 100 ), 30, None, &ColorType::Rgba, "../../../target/out_rgba.png" )?; + let mut buf = [ 255u8; 40_000 ]; + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..50 + { + buf[ ( i - 1 ) * 4 + ( i - 1 ) * 400 ] = 255; + buf[ ( i - 1 ) * 4 + 1 + ( i - 1 ) * 400 ] = 255; + buf[ ( i - 1 ) * 4 + 2 + ( i - 1 ) * 400 ] = 255; + + buf[ i * 4 + i * 400 ] = 0; + buf[ i * 4 + 1 + i * 400 ] = 0; + buf[ i * 4 + 2 + i * 400 ] = 0; + encoder.encode( &buf )?; + } + + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_rgba.png" ); + + a_id!( path.exists(), true ); + + let decoder = png::Decoder::new( std::fs::File::open( &path )? ); + + let mut reader = decoder.read_info().expect( "Can not read the file target/out_rgba.png" ); + let animation_info = reader.0; + let mut bytes = vec![ 0; reader.1.output_buffer_size() ]; + + let info = reader.1.next_frame( &mut bytes )?; + + a_id!( animation_info.width, 100 ); + a_id!( animation_info.height, 100 ); + a_id!( animation_info.color_type, png::ColorType::RGBA ); + + // first frame + a_id!( [ 0, 0, 0 ], bytes.as_slice()[ ..3 ] ); + assert_eq!( [ 255u8; 40_000 - 3 ], bytes.as_slice()[ 3.. ] ); + + // all frames valid + for _ in 1..50 + { + assert!( reader.1.next_frame( &mut bytes ).is_ok() ); + } + + // last frame + assert_eq!( buf, bytes.as_slice() ); + + Ok( () ) + } + + // + + fn basic_yuv() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Png::new( X2( 100, 100 ), 30, None, &ColorType::Yuv444, "../../../target/out_yuv.png" )?; + let mut buf : Vec< u8 > = [ [ 255u8, 128u8, 128u8 ]; 10_000 ].into_iter().flatten().collect(); + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) * 3 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 1 + ( i - 1 ) * 300 ] = 128; + buf[ ( i - 1 ) * 3 + 2 + ( i - 1 ) * 300 ] = 128; + + buf[ i * 3 + i * 300 ] = 0; + buf[ i * 3 + 1 + i * 300 ] = 0; + buf[ i * 3 + 2 + i * 300 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_yuv.png" ); + a_id!( path.exists(), true ); + + Ok( () ) + } +} + +// + +tests_index! +{ + basic_rgb, + basic_rgba, + basic_yuv, +} diff --git a/module/postponed/_video_experiment/tests/video/inc/encoder_strategy_test.rs b/module/postponed/_video_experiment/tests/video/inc/encoder_strategy_test.rs new file mode 100644 index 0000000000..00ee89e2d2 --- /dev/null +++ b/module/postponed/_video_experiment/tests/video/inc/encoder_strategy_test.rs @@ -0,0 +1,114 @@ +use super::*; + +// + +fn animation_write( encoder : &mut super::encoder_strategy::Encoder ) -> Result< (), Box< dyn std::error::Error > > +{ + let mut buf = [ 255u8; 30_000 ]; + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) * 3 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 1 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 2 + ( i - 1 ) * 300 ] = 255; + + buf[ i * 3 + i * 300 ] = 0; + buf[ i * 3 + 1 + i * 300 ] = 0; + buf[ i * 3 + 2 + i * 300 ] = 0; + + encoder.encode( &buf )?; + } + + encoder.flush() +} + +// + +fn animation_write_from_img_rgb( encoder : &mut super::encoder_strategy::Encoder ) -> Result< (), Box< dyn std::error::Error > > +{ + for i in 1..4 + { + let path = std::path::PathBuf::from( format!( "./rust/test/video/_asset/img/rust_logo{}.png", i ) ); + let rgb_image = image::open( path )?.into_rgb8(); + let bytes = rgb_image.as_raw(); + encoder.encode( &bytes )?; + } + + encoder.flush() +} + +// + +tests_impls! +{ + fn basic() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder_gif = super::encoder_strategy::Encoder::new( EncoderType::Gif, X2( 100, 100 ), 30, None, ColorType::Rgb, "../../../target/strategy.gif" )?; + let mut encoder_png = super::encoder_strategy::Encoder::new( EncoderType::Png, X2( 100, 100 ), 30, None, ColorType::Rgb, "../../../target/strategy.png" )?; + let mut encoder_mp4 = super::encoder_strategy::Encoder::new( EncoderType::Mp4, X2( 100, 100 ), 30, None, ColorType::Rgb, "../../../target/strategy.mp4" )?; + animation_write( &mut encoder_gif )?; + animation_write( &mut encoder_png )?; + animation_write( &mut encoder_mp4 )?; + + let mut path = std::path::PathBuf::from( "../../../target/strategy.gif" ); + a_id!( path.exists(), true ); + path.set_extension( "png" ); + a_id!( path.exists(), true ); + path.set_extension( "mp4" ); + a_id!( path.exists(), true ); + + Ok( () ) + } + + // + + fn basic_with_change() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoder_strategy::Encoder::new( EncoderType::Gif, X2( 100, 100 ), 30, None, ColorType::Rgb, "../../../target/encoder_change.gif" )?; + animation_write( &mut encoder )?; + encoder.type_change( EncoderType::Mp4 )?; + animation_write( &mut encoder )?; + + let mut path = std::path::PathBuf::from( "../../../target/encoder_change.gif" ); + a_id!( path.exists(), true ); + path.set_extension( "mp4" ); + a_id!( path.exists(), true ); + + Ok( () ) + } + + // + + fn basic_with_images_rgb() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder_gif = super::encoder_strategy::Encoder::new( EncoderType::Gif, X2( 512, 512 ), 1, None, ColorType::Rgb, "../../../target/image.gif" )?; + let mut encoder_png = super::encoder_strategy::Encoder::new( EncoderType::Png, X2( 512, 512 ), 1, None, ColorType::Rgb, "../../../target/image.png" )?; + let mut encoder_mp4 = super::encoder_strategy::Encoder::new( EncoderType::Mp4, X2( 512, 512 ), 1, None, ColorType::Rgb, "../../../target/image.mp4" )?; + animation_write_from_img_rgb( &mut encoder_gif )?; + animation_write_from_img_rgb( &mut encoder_png )?; + animation_write_from_img_rgb( &mut encoder_mp4 )?; + + let mut path = std::path::PathBuf::from( "../../../target/image.gif" ); + a_id!( path.exists(), true ); + path.set_extension( "png" ); + a_id!( path.exists(), true ); + path.set_extension( "mp4" ); + a_id!( path.exists(), true ); + + Ok( () ) + } +} + +// + +tests_index! +{ + basic, + basic_with_change, + basic_with_images_rgb, +} diff --git a/module/postponed/_video_experiment/tests/video/inc/gif_test.rs b/module/postponed/_video_experiment/tests/video/inc/gif_test.rs new file mode 100644 index 0000000000..8c5f1e56ab --- /dev/null +++ b/module/postponed/_video_experiment/tests/video/inc/gif_test.rs @@ -0,0 +1,165 @@ +use super::*; + +fn rgba_to_rgb( rgba_buf : Vec< u8 > ) -> Vec< u8 > +{ + let mut result = vec![ 0; rgba_buf.len() * 3 / 4 ]; + let mut i = 0; + for chunk in rgba_buf.chunks( 4 ) + { + result[ i..i+3 ].copy_from_slice( &chunk[ 0..3 ] ); + i += 3; + } + result +} + +tests_impls! +{ + fn basic_rgb() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Gif::new( X2( 100, 100 ), 30, None, &ColorType::Rgb, "../../../target/out_rgb.gif" )?; + let mut buf = [ 255u8; 30_000 ]; + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) * 3 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 1 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 2 + ( i - 1 ) * 300 ] = 255; + + buf[ i * 3 + i * 300 ] = 0; + buf[ i * 3 + 1 + i * 300 ] = 0; + buf[ i * 3 + 2 + i * 300 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_rgb.gif" ); + a_id!( path.exists(), true ); + + let mut decoder = gif::DecodeOptions::new(); + // must be gif::ColorOuput::RGB but it has not the variant + decoder.set_color_output( gif::ColorOutput::RGBA ); + let mut reader = decoder.read_info( std::fs::File::open( &path )? ).expect( "Can not read the file target/out_rgb.gif" ); + + reader.next_frame_info()?; + let mut bytes = vec![ 0; reader.buffer_size() ]; + reader.read_into_buffer( &mut bytes )?; + bytes = rgba_to_rgb( bytes ); + + a_id!( reader.width(), 100 ); + a_id!( reader.height(), 100 ); + + // first frame + a_id!( [ 0, 0, 0 ], bytes[ ..3 ] ); + assert_eq!( [ 255u8; 30_000 - 3 ], bytes[ 3.. ] ); + + // all frames valid + for _ in 1..100 + { + assert!( reader.next_frame_info().is_ok() ); + } + + // last frame + let mut bytes = vec![ 0; reader.buffer_size() ]; + reader.read_into_buffer( &mut bytes )?; + bytes = rgba_to_rgb( bytes ); + assert_eq!( buf, bytes.as_slice() ); + Ok( () ) + } + + // + + fn basic_rgba() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Gif::new( X2( 100, 100 ), 30, None, &ColorType::Rgba, "../../../target/out_rgba.gif" )?; + let mut buf = [ 255u8; 40_000 ]; + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) * 4 + ( i - 1 ) * 400 ] = 255; + buf[ ( i - 1 ) * 4 + 1 + ( i - 1 ) * 400 ] = 255; + buf[ ( i - 1 ) * 4 + 2 + ( i - 1 ) * 400 ] = 255; + + buf[ i * 4 + i * 400 ] = 0; + buf[ i * 4 + 1 + i * 400 ] = 0; + buf[ i * 4 + 2 + i * 400 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_rgba.gif" ); + a_id!( path.exists(), true ); + + let mut decoder = gif::DecodeOptions::new(); + decoder.set_color_output( gif::ColorOutput::RGBA ); + let mut reader = decoder.read_info( std::fs::File::open( &path )? ).expect( "Can not read the file target/out_rgba.gif" ); + + reader.next_frame_info()?; + let mut bytes = vec![ 0; reader.buffer_size() ]; + reader.read_into_buffer( &mut bytes )?; + + a_id!( reader.width(), 100 ); + a_id!( reader.height(), 100 ); + + // first frame + a_id!( [ 0, 0, 0 ], bytes[ ..3 ] ); + assert_eq!( [ 255u8; 40_000 - 3 ], bytes[ 3.. ] ); + + // all frames valid + for _ in 1..100 + { + assert!( reader.next_frame_info().is_ok() ); + } + + // last frame + reader.read_into_buffer( &mut bytes )?; + assert_eq!( buf, bytes.as_slice() ); + Ok( () ) + } + + // + + fn basic_yuv() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Gif::new( X2( 100, 100 ), 30, None, &ColorType::Yuv444, "../../../target/out_yuv.gif" )?; + let mut buf : Vec< u8 > = [ [ 255u8, 128u8, 128u8 ]; 10_000 ].into_iter().flatten().collect(); + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) * 3 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 1 + ( i - 1 ) * 300 ] = 128; + buf[ ( i - 1 ) * 3 + 2 + ( i - 1 ) * 300 ] = 128; + + buf[ i * 3 + i * 300 ] = 0; + buf[ i * 3 + 1 + i * 300 ] = 0; + buf[ i * 3 + 2 + i * 300 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_yuv.gif" ); + a_id!( path.exists(), true ); + + Ok( () ) + } +} + +// + +tests_index! +{ + basic_rgb, + basic_rgba, + basic_yuv, +} diff --git a/module/postponed/_video_experiment/tests/video/inc/mp4_test.rs b/module/postponed/_video_experiment/tests/video/inc/mp4_test.rs new file mode 100644 index 0000000000..3214136673 --- /dev/null +++ b/module/postponed/_video_experiment/tests/video/inc/mp4_test.rs @@ -0,0 +1,194 @@ +use super::*; + +use std::fs::File; + +use ac_ffmpeg:: +{ + codec::{ video::VideoDecoder }, + format:: + { + demuxer::{ Demuxer, DemuxerWithStreamInfo }, + io::IO, + }, + Error, +}; + +fn open_input( path : &str ) -> Result< DemuxerWithStreamInfo< File >, Error > +{ + let input = File::open( path ) + .map_err( | err | Error::new( format!( "Unable to open input file {} : {}", path, err ) ) )?; + + let io = IO::from_seekable_read_stream( input ); + + Demuxer::builder() + .build( io )? + .find_stream_info( None ) + .map_err( | ( _, err ) | err ) +} + +tests_impls! +{ + fn basic_rgb() -> Result< (), Box< dyn std::error::Error > > + { + { + let mut encoder = super::encoders::Mp4::new( X2( 100, 100 ), 30, None, &ColorType::Rgb, "../../../target/out_rgb.mp4" )?; + let mut buf = [ 255u8; 30_000 ]; + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..50 + { + buf[ ( i - 1 ) * 3 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 1 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 2 + ( i - 1 ) * 300 ] = 255; + + buf[ i * 3 + i * 300 ] = 0; + buf[ i * 3 + 1 + i * 300 ] = 0; + buf[ i * 3 + 2 + i * 300 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + } + + let path = std::path::PathBuf::from( "../../../target/out_rgb.mp4" ); + a_id!( path.exists(), true ); + + let mut demuxer = open_input( &path.to_str().unwrap() ).unwrap(); + + let ( stream_index, ( stream, _ ) ) = demuxer + .streams() + .iter() + .map( | stream | ( stream, stream.codec_parameters() ) ) + .enumerate() + .find( | ( _, ( _, params ) ) | params.is_video_codec() ) + .ok_or_else( | | Error::new( "No video stream" ) )?; + + let mut decoder = VideoDecoder::from_stream( stream )?.build()?; + + let mut frames = 0; + while let Some( packet ) = demuxer.take()? + { + frames += 1 + } + assert_eq!( 50, frames ); + Ok( () ) + } + + // + + fn basic_rgba() -> Result< (), Box< dyn std::error::Error > > + { + { + let mut encoder = super::encoders::Mp4::new( X2( 100, 100 ), 30, None, &ColorType::Rgba, "../../../target/out_rgba.mp4" )?; + let mut buf = [ 255u8; 40_000 ]; + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..50 + { + buf[ ( i - 1 ) * 4 + ( i - 1 ) * 400 ] = 255; + buf[ ( i - 1 ) * 4 + 1 + ( i - 1 ) * 400 ] = 255; + buf[ ( i - 1 ) * 4 + 2 + ( i - 1 ) * 400 ] = 255; + + buf[ i * 4 + i * 400 ] = 0; + buf[ i * 4 + 1 + i * 400 ] = 0; + buf[ i * 4 + 2 + i * 400 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + } + + let path = std::path::PathBuf::from( "../../../target/out_rgba.mp4" ); + a_id!( path.exists(), true ); + + let mut demuxer = open_input( &path.to_str().unwrap() ).unwrap(); + + let ( stream_index, ( stream, _ ) ) = demuxer + .streams() + .iter() + .map( | stream | ( stream, stream.codec_parameters() ) ) + .enumerate() + .find( | ( _, ( _, params ) ) | params.is_video_codec() ) + .ok_or_else( | | Error::new( "No video stream" ) )?; + + let mut decoder = VideoDecoder::from_stream( stream )?.build()?; + + let mut frames = 0; + while let Some( packet ) = demuxer.take()? + { + frames += 1 + } + assert_eq!( 50, frames ); + + Ok( () ) + } + + // + + fn basic_yuv() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Mp4::new( X2( 100, 100 ), 30, None, &ColorType::Yuv444, "../../../target/out_yuv.mp4" )?; + let mut buf : Vec< u8 > = [ [ 255u8, 128u8, 128u8 ]; 10_000 ].into_iter().flatten().collect(); + buf[ 0 ] = 0; + buf[ 1 ] = 0; + buf[ 2 ] = 0; + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) * 3 + ( i - 1 ) * 300 ] = 255; + buf[ ( i - 1 ) * 3 + 1 + ( i - 1 ) * 300 ] = 128; + buf[ ( i - 1 ) * 3 + 2 + ( i - 1 ) * 300 ] = 128; + + buf[ i * 3 + i * 300 ] = 0; + buf[ i * 3 + 1 + i * 300 ] = 0; + buf[ i * 3 + 2 + i * 300 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_yuv.mp4" ); + a_id!( path.exists(), true ); + + Ok( () ) + } + + // + + fn basic_yuv420p() -> Result< (), Box< dyn std::error::Error > > + { + let mut encoder = super::encoders::Mp4::new( X2( 100, 100 ), 30, None, &ColorType::Yuv420p, "../../../target/out_yuv420p.mp4" )?; + let mut buf = [ 255u8; 15_000 ]; + buf[ 100 * 100.. ].fill( 128 ); + buf[ 0 ] = 0; + encoder.encode( &buf )?; + + for i in 1..100 + { + buf[ ( i - 1 ) + ( i - 1 ) * 100 ] = 255; + + buf[ i + i * 100 ] = 0; + encoder.encode( &buf )?; + } + encoder.flush()?; + + let path = std::path::PathBuf::from( "../../../target/out_yuv420p.mp4" ); + a_id!( path.exists(), true ); + + Ok( () ) + } +} + +// + +tests_index! +{ + basic_rgb, + basic_rgba, + basic_yuv, + basic_yuv420p, +} diff --git a/module/postponed/_video_experiment/tests/video/inc/yuv.rs b/module/postponed/_video_experiment/tests/video/inc/yuv.rs new file mode 100644 index 0000000000..654d1fef67 --- /dev/null +++ b/module/postponed/_video_experiment/tests/video/inc/yuv.rs @@ -0,0 +1,165 @@ +use super::*; + +tests_impls! +{ + fn yuv444_to_rgb_conversion() + { + let yuv = + [ + 255, 128, 128, + 0, 128, 128, + 76, 84, 255, + 149, 43, 21, + 29, 255, 107, + ]; + let rgb = + [ + 255, 255, 255, // white + 0, 0, 0, // black + 255, 0, 0, // red + 0, 255, 0, // green + 0, 0, 255, // blue + ]; + + let converted_rgb = yuv444_to_rgb( &yuv ); + + assert_eq!( converted_rgb, rgb ); + } + + fn yuv422_to_rgb_conversion() + { + let yuv = + [ + 255, 128, 255, 128, + 0, 128, 0, 128, + 76, 84, 76, 255, + 149, 43, 149, 21, + 29, 255, 29, 107, + ]; + let rgb = + [ + 255, 255, 255, 255, 255, 255, // white + 0, 0, 0, 0, 0, 0, // black + 255, 0, 0, 255, 0, 0, // red + 0, 255, 0, 0, 255, 0, // green + 0, 0, 255, 0, 0, 255, // blue + ]; + + let converted_rgb = yuv422_to_rgb( &yuv ); + + assert_eq!( converted_rgb, rgb ); + } + + fn yvu420p_to_rgb_conversion() + { + let yvu = + [ + 255, 255, 0, 0, 76, 76, 149, 149, 29, 29, + 255, 255, 0, 0, 76, 76, 149, 149, 29, 29, + 128, 128, 255, 21, 107, 128, 128, 84, 43, 255, + ]; + let rgb = + [ + 255, 255, 255, 255, 255, 255, // white + 0, 0, 0, 0, 0, 0, // black + 255, 0, 0, 255, 0, 0, // red + 0, 255, 0, 0, 255, 0, // green + 0, 0, 255, 0, 0, 255, // blue + 255, 255, 255, 255, 255, 255, + 0, 0, 0, 0, 0, 0, + 255, 0, 0, 255, 0, 0, + 0, 255, 0, 0, 255, 0, + 0, 0, 255, 0, 0, 255, + ]; + + let converted_rgb = yvu420p_to_rgb( &yvu, 10, 2 ); + + assert_eq!( converted_rgb, rgb ); + } + + fn yuv420p_to_rgb_conversion() + { + let yuv = + [ + 255, 255, 0, 0, 76, 76, 149, 149, 29, 29, + 255, 255, 0, 0, 76, 76, 149, 149, 29, 29, + 128, 128, 84, 43, 255, 128, 128, 255, 21, 107, + ]; + let rgb = + [ + 255, 255, 255, 255, 255, 255, // white + 0, 0, 0, 0, 0, 0, // black + 255, 0, 0, 255, 0, 0, // red + 0, 255, 0, 0, 255, 0, // green + 0, 0, 255, 0, 0, 255, // blue + 255, 255, 255, 255, 255, 255, + 0, 0, 0, 0, 0, 0, + 255, 0, 0, 255, 0, 0, + 0, 255, 0, 0, 255, 0, + 0, 0, 255, 0, 0, 255, + ]; + + let converted_rgb = yuv420p_to_rgb( &yuv, 10, 2 ); + + assert_eq!( converted_rgb, rgb ); + } + + fn yuv422p_to_rgb_conversion() + { + let yuv = + [ + 255, 255, 0, 0, 76, 76, 149, 149, 29, 29, + 255, 255, 0, 0, 76, 76, 149, 149, 29, 29, + 128, 128, 84, 43, 255, 128, 128, 84, 43, 255, + 128, 128, 255, 21, 107, 128, 128, 255, 21, 107, + ]; + let rgb = + [ + 255, 255, 255, 255, 255, 255, // white + 0, 0, 0, 0, 0, 0, // black + 255, 0, 0, 255, 0, 0, // red + 0, 255, 0, 0, 255, 0, // green + 0, 0, 255, 0, 0, 255, // blue + 255, 255, 255, 255, 255, 255, + 0, 0, 0, 0, 0, 0, + 255, 0, 0, 255, 0, 0, + 0, 255, 0, 0, 255, 0, + 0, 0, 255, 0, 0, 255, + ]; + + let converted_rgb = yuv422p_to_rgb( &yuv, 10, 2 ); + + assert_eq!( converted_rgb, rgb ); + } + + fn grayscale_to_rgb_conversion() + { + let yuv = + [ + 255, 0, 76, 149, 29, + ]; + let rgb = + [ + 255, 255, 255, + 0, 0, 0, + 76, 76, 76, + 149, 149, 149, + 29, 29, 29, + ]; + + let converted_rgb = grayscale_to_rgb( &yuv ); + + assert_eq!( converted_rgb, rgb ); + } +} +// + +tests_index! +{ + yuv444_to_rgb_conversion, + yuv422_to_rgb_conversion, + yvu420p_to_rgb_conversion, + yuv420p_to_rgb_conversion, + yuv422p_to_rgb_conversion, + grayscale_to_rgb_conversion, +} diff --git a/module/postponed/_video_experiment/tests/video/video_experiment_tests.rs b/module/postponed/_video_experiment/tests/video/video_experiment_tests.rs new file mode 100644 index 0000000000..8b492b4080 --- /dev/null +++ b/module/postponed/_video_experiment/tests/video/video_experiment_tests.rs @@ -0,0 +1,8 @@ +use video_experiment::encoders; +use video_experiment::encoder_strategy; +use video_experiment::prelude::*; +use wmath::X2; + +use test_tools::exposed::*; + +mod inc; diff --git a/module/postponed/automata_tools/Cargo.toml b/module/postponed/automata_tools/Cargo.toml new file mode 100644 index 0000000000..4174d08e78 --- /dev/null +++ b/module/postponed/automata_tools/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "automata_tools" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/automata_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/automata_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/automata_tools" +description = """ +Automata tools. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/postponed/automata_tools/License b/module/postponed/automata_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/automata_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/automata_tools/Readme.md b/module/postponed/automata_tools/Readme.md new file mode 100644 index 0000000000..26bc9290ff --- /dev/null +++ b/module/postponed/automata_tools/Readme.md @@ -0,0 +1,36 @@ + + +# Module :: automata_tools + +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleAutomataToolsPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleAutomataToolsPush.yml) [![docs.rs](https://img.shields.io/docsrs/automata_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/automata_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2Fautomata_tools_trivial%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20automata_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Automata tools. + +### Basic use-case + + + +```rust ignore +use automata_tools::prelude::*; +use wtools::prelude::*; +let node : automata_tools::canonical::Node = automata_tools::canonical::Node::_make_with_id( 13 ); +assert_eq!( node.id(), 13.into() ); +println!( "{:?}", node ); +/* print : node::13 */ +``` + +### To add to your project + +```bash +cargo add automata_tools +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/automata_tools_trivial +cargo run +``` diff --git a/module/postponed/automata_tools/src/lib.rs b/module/postponed/automata_tools/src/lib.rs new file mode 100644 index 0000000000..9246066d11 --- /dev/null +++ b/module/postponed/automata_tools/src/lib.rs @@ -0,0 +1,10 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/automata_tools/latest/automata_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use graphs_tools::*; +// TODO : implement diff --git a/module/postponed/automata_tools/tests/graph/automata_tools_tests.rs b/module/postponed/automata_tools/tests/graph/automata_tools_tests.rs new file mode 100644 index 0000000000..c1da6b3d4c --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/automata_tools_tests.rs @@ -0,0 +1,7 @@ + +#[ allow( unused_imports ) ] +use automata_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/postponed/automata_tools/tests/graph/graphs_tools_tests.rs b/module/postponed/automata_tools/tests/graph/graphs_tools_tests.rs new file mode 100644 index 0000000000..74cedc3fe6 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/graphs_tools_tests.rs @@ -0,0 +1,10 @@ + +// #![ feature( type_name_of_val ) ] +// #![ feature( type_alias_impl_trait ) ] + +#[ allow( unused_imports ) ] +use graphs_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/postponed/automata_tools/tests/graph/inc.rs b/module/postponed/automata_tools/tests/graph/inc.rs new file mode 100644 index 0000000000..56d3aaf445 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/inc.rs @@ -0,0 +1,15 @@ +#![ allow( unused_imports ) ] + +use super::*; +use std::collections::HashSet; +// use wtools::prelude::*; + +#[ cfg( not( feature = "no_std" ) ) ] +mod canonical_node_test; +#[ cfg( not( feature = "no_std" ) ) ] +// mod cell_factory_test; +// #[ cfg( not( feature = "no_std" ) ) ] +mod factory_test; +#[ cfg( not( feature = "no_std" ) ) ] +mod identity_test; +mod factory_impls; diff --git a/module/postponed/automata_tools/tests/graph/inc/canonical_node_test.rs b/module/postponed/automata_tools/tests/graph/inc/canonical_node_test.rs new file mode 100644 index 0000000000..b56f8cba23 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/inc/canonical_node_test.rs @@ -0,0 +1,37 @@ +// use super::*; +// +// #[ cfg( feature = "cell_factory" ) ] +// tests_impls! +// { +// +// fn node_make() +// { +// use the_module::prelude::*; +// +// let node : the_module::canonical::Node = from!( 13 ); +// a_id!( node.id(), 13.into() ); +// +// } +// +// fn nodecell_make() +// { +// use the_module::prelude::*; +// +// let node : the_module::canonical::Node = from!( 13 ); +// a_id!( node.id(), 13.into() ); +// let cellnode : the_module::NodeCell< _ > = from!( node ); +// +// } +// +// } +// +// // +// +// #[ cfg( feature = "cell_factory" ) ] +// tests_index! +// { +// +// node_make, +// nodecell_make, +// +// } diff --git a/module/postponed/automata_tools/tests/graph/inc/cell_factory_test.rs b/module/postponed/automata_tools/tests/graph/inc/cell_factory_test.rs new file mode 100644 index 0000000000..68c8609774 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/inc/cell_factory_test.rs @@ -0,0 +1,39 @@ +// use super::*; +// #[ cfg( feature = "canonical" ) ] +// use the_module::canonical::CellNodeFactory as GenerativeNodeFactory; +// +// #[ cfg( feature = "canonical" ) ] +// include!( "./factory_impls.rs" ); +// +// #[ cfg( feature = "canonical" ) ] +// tests_impls! +// { +// +// fn nodecell_make() +// { +// use the_module::prelude::*; +// +// let node : the_module::canonical::Node = from!( 13 ); +// a_id!( node.id(), 13.into() ); +// let cellnode : < the_module::canonical::CellNodeFactory as GraphNodesNominalInterface >::NodeHandle = from!( node ); +// +// } +// +// } +// +// // +// +// #[ cfg( feature = "canonical" ) ] +// tests_index! +// { +// +// node, +// basic, +// make_default, +// make_with_edge_list, +// make_with_edge_list_string, +// graph_print, +// +// nodecell_make, +// +// } diff --git a/module/postponed/automata_tools/tests/graph/inc/factory_impls.rs b/module/postponed/automata_tools/tests/graph/inc/factory_impls.rs new file mode 100644 index 0000000000..7e1f05f304 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/inc/factory_impls.rs @@ -0,0 +1,184 @@ +// tests_impls! +// { + + +// fn node() +// { +// use the_module::prelude::*; +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::make(); + +// let n1 = factory.node_making( 1 ); +// let n1b = factory.node( 1 ); +// a_id!( n1, n1b.id() ); +// dbg!( &n1 ); + +// let node1a = factory.node( 1 ); +// let node1b = factory.node( 1 ); +// a_id!( node1a, node1b ); + +// let node1a = factory.node( &1 ); +// let node1b = factory.node( &&1 ); +// a_id!( node1a, node1b ); + +// } + +// // + + +// fn make_default() +// { +// use the_module::prelude::*; + +// let mut factory : GenerativeNodeFactory::< the_module::IdentityWithInt > = from!(); +// let n1 = factory.node_making( 1 ); +// let n1b = factory.node( 1 ); +// a_id!( n1, n1b.id() ); + +// } + +// // + + +// fn basic() +// { +// use the_module::prelude::*; + +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::make(); + +// let a = factory.node_making( 1 ); +// let b = factory.node_making( 2 ); + +// factory.node_add_out_node( a, b ); +// factory.node_add_out_nodes( b, [ a, b ].into_iter() ); + +// a_id!( factory.nnodes(), 2 ); +// a_id!( factory.nedges(), 3 ); + +// dbg!( factory.node( a ) ); +// dbg!( factory.node( b ) ); + +// let got : HashSet< _ > = factory.out_nodes_ids( a ).collect(); +// let exp = hset![ b ]; +// a_id!( got, exp ); +// let got : HashSet< _ > = factory.out_nodes_ids( b ).collect(); +// let exp = hset![ a, b ]; +// a_id!( got, exp ); + +// // let got : HashSet< _ > = factory.out_nodes_ids_2( a ).collect(); +// // let exp = hset![ b ]; +// // a_id!( got, exp ); +// // let got : HashSet< _ > = factory.out_nodes_ids_2( b ).collect(); +// // let exp = hset![ a, b ]; +// // a_id!( got, exp ); + +// let got : HashSet< _ > = factory.out_edges( a ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( a, b ) ]; +// a_id!( got, exp ); +// let got : HashSet< _ > = factory.out_edges( b ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( b, a ), ( b, b ) ]; +// a_id!( got, exp ); + +// // let got = factory.out_nodes_ids_2( a ).map( | id | +// // { +// // // 13_i32 +// // ( id, factory.node( id ) ) +// // }); +// // use test_tools::inspect_type_of; +// // inspect_type_of!( got ); + +// } + +// // xxx : fix test make_with_edge_list + +// fn make_with_edge_list() +// { +// use the_module::prelude::*; + +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::make(); + +// factory.make_with_edge_list +// ([ +// 1, 2, +// 2, 1, +// 2, 2, +// ]); + +// dbg!( factory.node( 1 ) ); +// dbg!( factory.node( 2 ) ); + +// let exp = hset![ 2 ]; +// let got : HashSet< _ > = factory.out_nodes_ids( 1 ).collect(); +// a_id!( got, exp ); +// let exp = hset![ 1, 2 ]; +// let got : HashSet< _ > = factory.out_nodes_ids( 2 ).collect(); +// a_id!( got, exp ); + +// let got : HashSet< _ > = factory.out_edges( 1 ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( factory.edge_id( 1 ), factory.edge_id( 2 ) ) ]; +// a_id!( got, exp ); +// let got : HashSet< _ > = factory.out_edges( 2 ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect(); +// let exp = hset![ ( factory.edge_id( 2 ), factory.edge_id( 1 ) ), ( factory.edge_id( 2 ), factory.edge_id( 2 ) ) ]; +// // let exp = hset![ factory.edge_ids( 2, 1 ), factory.edge_ids( 2, 2 ) ]; +// // let exp : HashSet< ( the_module::IdentityWithInt, the_module::IdentityWithInt ) > = hset![ ( 2, 1 ).into(), ( 2, 2 ).into() ]; +// a_id!( got, exp ); + +// } + +// // + +// // xxx : fix it +// // +// // fn make_with_edge_list_string() +// // { +// // use the_module::prelude::*; +// // +// // let mut factory = ReadableNodeFactory::< the_module::IdentityWithName >::make(); +// // +// // factory.make_with_edge_list +// // ([ +// // "A", "B", +// // "B", "A", +// // "B", "B", +// // ]); +// // +// // dbg!( factory.node( "A" ) ); +// // dbg!( factory.node( "B" ) ); +// // +// // let exp = hset![ "B" ]; +// // let got : HashSet< _ > = factory.out_nodes_ids( "A" ).collect(); +// // a_id!( got, exp ); +// // +// // let exp = hset![ "A", "B" ]; +// // let got : HashSet< _ > = factory.out_nodes_ids( "B" ).collect(); +// // a_id!( got, exp ); +// // } + +// // + + +// fn graph_print() +// { +// use the_module::prelude::*; + +// let mut factory = GenerativeNodeFactory::< the_module::IdentityWithInt >::make(); + +// factory.make_with_edge_list +// ([ +// 1, 2, +// 2, 1, +// 2, 2, +// ]); + +// let exp = r#"GenerativeNodeFactory +// node::1 +// - 2 +// node::2 +// - 1 +// - 2"#; +// let got = format!( "{:?}", factory ); +// println!( "{}", got ); +// a_id!( got, exp ); + +// } + +// } diff --git a/module/postponed/automata_tools/tests/graph/inc/factory_test.rs b/module/postponed/automata_tools/tests/graph/inc/factory_test.rs new file mode 100644 index 0000000000..a80a1c8a47 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/inc/factory_test.rs @@ -0,0 +1,17 @@ +use super::*; +use the_module::canonical::ReadableNodeFactory as ReadableNodeFactory; +use the_module::canonical::GenerativeNodeFactory as GenerativeNodeFactory; + +include!( "./factory_impls.rs" ); + +// + +tests_index! +{ + // node, + // basic, + // make_default, + // make_with_edge_list, + // make_with_edge_list_string, + // graph_print, +} diff --git a/module/postponed/automata_tools/tests/graph/inc/identity_test.rs b/module/postponed/automata_tools/tests/graph/inc/identity_test.rs new file mode 100644 index 0000000000..57022b14d9 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/inc/identity_test.rs @@ -0,0 +1,131 @@ +// // use test_tools::exposed::*; +// use super::*; + +// // + +// tests_impls! +// { + +// fn identity_with_int() +// { +// use the_module::exposed::*; + +// /* test.case( "basic" ) */ +// { +// let src1 = IdentityWithInt::make( 3 ); +// let src2 = IdentityWithInt::make( 3 ); +// // is_identity( src1 ); +// // fn is_identity< T : IdentityInterface >( _ : T ){} +// a_true!( implements!( src1 => IdentityInterface ) ); +// a_id!( src1, src2 ); + +// let src1 = IdentityWithInt::make( 3 ); +// let src2 = IdentityWithInt::make( 1 ); +// a_not_id!( src1, src2 ); +// } + +// /* test.case( "from" ) */ +// { +// let src = IdentityWithInt::make( 3 ); +// fn check_into< Src >( src : Src ) -> IdentityWithInt +// where Src : Into< IdentityWithInt >, +// { +// src.into() +// } +// a_id!( src, check_into( 3 ) ); +// a_not_id!( src, check_into( 1 ) ); +// a_id!( src, check_into( IdentityWithInt::make( 3 ) ) ); +// a_not_id!( src, check_into( IdentityWithInt::make( 1 ) ) ); +// } + +// // zzz +// // /* test.case( "from pair" ) */ +// // { +// // let src = Pair::from_2( 1, 3 ); +// // let got : Pair< IdentityWithInt, IdentityWithInt > = src.into(); +// // let exp = Pair::from_2( IdentityWithInt::make( 1 ), IdentityWithInt::make( 3 ) ); +// // a_id!( got, exp ); +// // } + +// // /* test.case( "from x1 tupple" ) */ +// // { +// // let src = ( 1, ); +// // let got : ( IdentityWithInt, ) = src.into(); +// // let exp = ( IdentityWithInt::make( 1 ) ); +// // a_id!( got, exp ); +// // } + +// /* test.case( "from x2 tupple" ) */ +// { +// let src = ( 1, 3 ); +// let got : ( IdentityWithInt, IdentityWithInt ) = src.vectorized_into(); +// let exp = ( IdentityWithInt::make( 1 ), IdentityWithInt::make( 3 ) ); +// a_id!( got, exp ); +// } + +// // /* test.case( "from x3 tupple" ) */ +// // { +// // let src = ( 1, 2, 3 ); +// // let got : ( IdentityWithInt, IdentityWithInt, IdentityWithInt ) = src.into(); +// // let exp = ( IdentityWithInt::make( 1 ), IdentityWithInt::make( 2 ), IdentityWithInt::make( 3 ) ); +// // a_id!( got, exp ); +// // } + +// } + +// // + +// fn identity_implemented_for_identity_by_pointer() +// { +// use the_module::exposed::*; + +// let x = 1; +// let y = 1; +// let src1 = IdentityWithPointer::make( &x ); +// let src2 = IdentityWithPointer::make( &y ); +// check( src1 ); +// fn check< T : IdentityInterface >( _ : T ){} +// a_not_id!( src1, src2 ); +// } + +// // + +// fn identity_implemented_for_identity_by_name() +// { +// use the_module::exposed::*; + +// let src1 = IdentityWithName::make( "abc" ); +// let src2 = IdentityWithName::make( "abc" ); +// check( src1 ); +// fn check< T : IdentityInterface >( _ : T ){} +// assert_eq!( src1, src2 ); +// } + +// // + + +// fn identity_implemented_for_identity_by_int() +// { +// use the_module::exposed::*; + +// let src1 = IdentityWithInt::make( 3 ); +// let src2 = IdentityWithInt::make( 3 ); +// check( src1 ); +// fn check< T : IdentityInterface >( _ : T ){} +// assert_eq!( src1, src2 ); +// } + +// } + +// // + +// tests_index! +// { + +// identity_with_int, + +// identity_implemented_for_identity_by_pointer, +// identity_implemented_for_identity_by_name, +// identity_implemented_for_identity_by_int, + +// } diff --git a/module/postponed/automata_tools/tests/graph/wautomata_tests.rs b/module/postponed/automata_tools/tests/graph/wautomata_tests.rs new file mode 100644 index 0000000000..596f6b8bc1 --- /dev/null +++ b/module/postponed/automata_tools/tests/graph/wautomata_tests.rs @@ -0,0 +1,12 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] +// #![ feature( type_name_of_val ) ] + +use wautomata as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/postponed/automata_tools/tests/smoke_test.rs b/module/postponed/automata_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/automata_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/non_std/Cargo.toml b/module/postponed/non_std/Cargo.toml new file mode 100644 index 0000000000..4b9d85d843 --- /dev/null +++ b/module/postponed/non_std/Cargo.toml @@ -0,0 +1,396 @@ +[package] +name = "non_std" +version = "0.1.4" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/non_std" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/non_std" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/non_std" +description = """ +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/non_std_lib.rs", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[lib] +name = "non_std" +path = "src/non_std_lib.rs" + +[[test]] +name = "non_std_test" +path = "tests/non_std_tests.rs" + +# [[test]] +# name = "non_std_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +### features + +[features] + +# iter + +iter = [ "wtools/iter" ] +iter_default = [ + "iter", + "wtools/iter_default", +] +iter_full = [ + "wtools/iter_full", + "iter", + # "iter_no_std", +] +iter_no_std = [ "wtools/iter_no_std" ] +iter_use_alloc = [ "wtools/iter_use_alloc" ] + +# meta + +meta = [ "wtools/meta" ] +meta_default = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +meta_full = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +meta_no_std = [ "wtools/meta_no_std" ] +meta_use_alloc = [ "wtools/meta_use_alloc" ] + +meta_for_each = [ "meta", "wtools/meta_for_each" ] +meta_impls_index = [ "meta", "wtools/meta_impls_index" ] +meta_mod_interface = [ "meta", "wtools/meta_mod_interface" ] +meta_constructors = [ "meta", "wtools/meta_constructors" ] +meta_idents_concat = [ "meta", "wtools/meta_idents_concat" ] +# meta_former = [ "meta", "wtools/meta_former" ] +# meta_options = [ "meta", "wtools/meta_options" ] + +# typing + +typing = [ "wtools/typing" ] +typing_default = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_full = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_no_std = [ "wtools/typing_no_std" ] +typing_use_alloc = [ "wtools/typing_use_alloc" ] + +# typing_nightly = [ "typing", "nightly", "wtools/typing_nightly" ] +typing_inspect_type = [ "typing", "wtools/typing_inspect_type" ] +typing_is_slice = [ "typing", "wtools/typing_is_slice" ] +typing_implements = [ "typing", "wtools/typing_implements" ] + +# time + +time = [ "wtools/time" ] +time_default = [ + "time", + "time_now", +] +time_full = [ + "time", + "time_now", +] +time_no_std = [ "wtools/time_no_std" ] +time_use_alloc = [ "wtools/time_use_alloc" ] + +time_now = [ "time", "wtools/time_now" ] + +# string + +string = [ "wtools/string" ] +string_default = [ + "string", + # "string_no_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +string_full = [ + "string", + # "string_no_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +string_no_std = [ "string", "wtools/string_no_std" ] +string_use_alloc = [ "string", "wtools/string_use_alloc" ] + +string_indentation = [ "string", "wtools/string_indentation" ] +string_isolate = [ "string", "wtools/string_isolate" ] +string_parse_request = [ "string", "string_isolate", "wtools/string_parse_request" ] +string_parse_number = [ "string", "wtools/string_parse_number" ] +string_split = [ "string", "wtools/string_split" ] + +# error + +error = [ "wtools/error" ] +error_default = [ + "error", + "error_for_lib", + "error_for_app", +] +error_full = [ + "error", + "error_for_lib", + "error_for_app", +] +error_no_std = [ "error", "wtools/error_no_std" ] +error_use_alloc = [ "error", "wtools/error_use_alloc" ] + +error_for_lib = [ "error", "wtools/error_for_lib" ] +error_for_app = [ "error", "wtools/error_for_app" ] + +# derive + +derive = [ "wtools/derive" ] +derive_full = [ + + "derive", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_from_str", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_no_std", + +] +derive_default = [ + + "derive", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_from_str", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_no_std", + +] + +derive_no_std = [ "wtools/derive_no_std" ] +derive_use_alloc = [ "wtools/derive_use_alloc" ] + +# derive_nightly = [ "derive", "nightly", "wtools/derive_nightly" ] +# derive_enable_track_caller = [ "derive", "wtools/derive_enable_track_caller" ] + +# derive_more = [ "derive", "wtools/derive_more" ] +derive_add_assign = [ "derive", "wtools/derive_add_assign" ] +derive_add = [ "derive", "wtools/derive_add" ] +derive_as_mut = [ "derive", "wtools/derive_as_mut" ] +derive_as_ref = [ "derive", "wtools/derive_as_ref" ] +derive_constructor = [ "derive", "wtools/derive_constructor" ] +derive_deref = [ "derive", "wtools/derive_deref" ] +derive_deref_mut = [ "derive", "wtools/derive_deref_mut" ] +derive_error = [ "derive", "wtools/derive_error" ] +derive_from = [ "derive", "wtools/derive_from" ] +derive_index = [ "derive", "wtools/derive_index" ] +derive_index_mut = [ "derive", "wtools/derive_index_mut" ] +derive_inner_from = [ "derive", "wtools/derive_inner_from" ] +derive_into_iterator = [ "derive", "wtools/derive_into_iterator" ] +# derive_iterator = [ "derive", "wtools/derive_iterator" ] +derive_mul_assign = [ "derive", "wtools/derive_mul_assign" ] +derive_mul = [ "derive", "wtools/derive_mul" ] +derive_not = [ "derive", "wtools/derive_not" ] +derive_sum = [ "derive", "wtools/derive_sum" ] +derive_try_into = [ "derive", "wtools/derive_try_into" ] +derive_is_variant = [ "derive", "wtools/derive_is_variant" ] +derive_unwrap = [ "derive", "wtools/derive_unwrap" ] +# derive_convert_case = [ "derive", "wtools/derive_convert_case" ] + +derive_strum = [ "derive", "wtools/derive_strum" ] +derive_strum_phf = [ "derive", "wtools/derive_strum_phf" ] + +derive_display = [ "derive", "wtools/derive_display", "parse-display" ] +derive_from_str = [ "derive", "wtools/derive_from_str", "parse-display" ] + +derive_clone_dyn = [ "derive", "wtools/derive_clone_dyn" ] +# derive_clone_dyn_no_std = [ "derive_clone_dyn", "wtools/derive_clone_dyn_no_std" ] +derive_clone_dyn_use_alloc = [ "derive_clone_dyn", "wtools/derive_clone_dyn_use_alloc" ] + +# dt + +dt = [ "wtools/dt" ] +dt_default = [ + "dt", + "dt_either", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] +dt_full = [ + "dt", + "dt_either", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] +dt_no_std = [ "wtools/dt_no_std" ] +dt_use_alloc = [ "wtools/dt_use_alloc" ] + +dt_either = [ "dt", "wtools/dt_either" ] +# dt_type_constructor = [ "dt", "wtools/dt_type_constructor" ] +# dt_make = [ "dt", "wtools/dt_make" ] +# dt_vectorized_from = [ "dt", "wtools/dt_vectorized_from" ] +dt_interval = [ "dt", "wtools/dt_interval" ] + +# diagnostics + +diagnostics = [ "wtools/diagnostics" ] +diagnostics_full = [ + "diagnostics", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +diagnostics_default = [ + "diagnostics", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +diagnostics_no_std = [ "wtools/diagnostics_no_std" ] +diagnostics_use_alloc = [ "wtools/diagnostics_use_alloc" ] + +diagnostics_runtime_assertions = [ "diagnostics", "wtools/diagnostics_runtime_assertions" ] +diagnostics_compiletime_assertions = [ "diagnostics", "wtools/diagnostics_compiletime_assertions" ] + +# must be empty +nightly = [] + +default = [ + "iter_default", + "meta_default", + "typing_default", + "time_default", + "string_default", + "error_default", + "derive_default", + "dt_default", + "diagnostics_default", + # "use_std", +] +full = [ + "iter_full", + "meta_full", + "typing_full", + "time_full", + "string_full", + "error_full", + "derive_full", + "dt_full", + "diagnostics_full", + # "use_std", + "use_alloc", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +# = dependencies + +[dependencies] +wtools = { workspace = true } +# impls_index = { workspace = true } +# despite impls_index is imported by wtools it should also be imported immediatly +parse-display = { version = "~0.5", optional = true, default-features = false } +# have to be here because of problem with FromStr + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/postponed/non_std/License b/module/postponed/non_std/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/non_std/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/non_std/Readme.md b/module/postponed/non_std/Readme.md new file mode 100644 index 0000000000..4e508d9d69 --- /dev/null +++ b/module/postponed/non_std/Readme.md @@ -0,0 +1,123 @@ + + +# Module :: non_std + +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleNonStdPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleNonStdPush.yml) [![docs.rs](https://img.shields.io/docsrs/non_std?color=e3e8f0&logo=docs.rs)](https://docs.rs/non_std) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + + +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. + +### Basic Use Case :: implements + + + +```rust ignore +use non_std::prelude::*; + +fn main() +{ + println!( "implements!( 13_i32 => Copy ) : {}", implements!( 13_i32 => Copy ) ); + println!( "implements!( Box::new( 13_i32 ) => Copy ) : {}", implements!( Box::new( 13_i32 ) => Copy ) ); +} +``` + +### Basic Use Case :: type constructors + +In Rust, you often need to wrap a given type into a new one. +The role of the orphan rules in particular is basically to prevent you from implementing external traits for external types. +To overcome the restriction developer usually wrap the external type into a tuple introducing a new type. +Type constructor does exactly that and auto-implement traits From, Into, Deref and few more for the constructed type. + +Macro [types](https://docs.rs/type_constructor/latest/type_constructor/types/macro.types.html) is responsible for generating code for Single, Pair, Homopair, Many. Each type constructor has its own keyword for that, but Pair and Homopair use the same keyword difference in a number of constituent types. It is possible to define all types at once: + + + +```rust ignore +use non_std::prelude::*; + +types! +{ + + single MySingle : f32; + single SingleWithParametrized : std::sync::Arc< T : Copy >; + single SingleWithParameter : < T >; + + pair MyPair : f32; + pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pair PairWithParameter : < T1, T2 >; + + pair MyHomoPair : f32; + pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pair HomoPairWithParameter : < T >; + + many MyMany : f32; + many ManyWithParametrized : std::sync::Arc< T : Copy >; + many ManyWithParameter : < T >; + +} +``` + +### Basic Use Case :: make - variadic constructor + +Implement traits [From_0], [From_1] up to MakeN to provide the interface to construct your structure with a different set of arguments. +In this example structure, Struct1 could be constructed either without arguments, with a single argument, or with two arguments. +- Constructor without arguments fills fields with zero. +- Constructor with a single argument sets both fields to the value of the argument. +- Constructor with 2 arguments set individual values of each field. + + + +```rust ignore +use non_std::prelude::*; + +#[ derive( Debug, PartialEq ) ] +struct Struct1 +{ + a : i32, + b : i32, +} + +impl From_0 for Struct1 +{ + fn from_0() -> Self + { + Self { a : 0, b : 0 } + } +} + +impl From_1< i32 > for Struct1 +{ + fn from_1( val : i32 ) -> Self + { + Self { a : val, b : val } + } +} + +impl From_2< i32, i32 > for Struct1 +{ + fn from_2( val1 : i32, val2 : i32 ) -> Self + { + Self { a : val1, b : val2 } + } +} + +let got : Struct1 = from!(); +let exp = Struct1{ a : 0, b : 0 }; +assert_eq!( got, exp ); + +let got : Struct1 = from!( 13 ); +let exp = Struct1{ a : 13, b : 13 }; +assert_eq!( got, exp ); + +let got : Struct1 = from!( 1, 3 ); +let exp = Struct1{ a : 1, b : 3 }; +assert_eq!( got, exp ); +``` + +### To add to your project + +```sh +cargo add non_std +``` + diff --git a/module/postponed/non_std/src/non_std_lib.rs b/module/postponed/non_std/src/non_std_lib.rs new file mode 100644 index 0000000000..3584e56f02 --- /dev/null +++ b/module/postponed/non_std/src/non_std_lib.rs @@ -0,0 +1,17 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/non_std/latest/non_std/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! non_std - Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use wtools::*; diff --git a/module/postponed/non_std/tests/non_std_tests.rs b/module/postponed/non_std/tests/non_std_tests.rs new file mode 100644 index 0000000000..9a6301ee8a --- /dev/null +++ b/module/postponed/non_std/tests/non_std_tests.rs @@ -0,0 +1,19 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ allow( non_snake_case ) ] +#![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] +#[ allow( unused_imports ) ] +use non_std as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// A struct for testing purpose. +#[ derive( Debug, PartialEq ) ] +pub struct CrateStructForTesting1 +{ +} + +#[ path="../../../../module/core/wtools/tests/wtools_tests.rs" ] +mod wtools; diff --git a/module/postponed/non_std/tests/smoke_test.rs b/module/postponed/non_std/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/non_std/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/std_tools/Cargo.toml b/module/postponed/std_tools/Cargo.toml new file mode 100644 index 0000000000..e785849ad9 --- /dev/null +++ b/module/postponed/std_tools/Cargo.toml @@ -0,0 +1,397 @@ +[package] +name = "std_tools" +version = "0.1.4" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/std_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/std_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/std_tools" +description = """ +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/std_tools_lib.rs", + "/Cargo.toml", + "/Readme.md", + "/License", +] +# rustdoc-args = [] + +[lib] +name = "std_tools" +path = "src/std_tools_lib.rs" + +[[test]] +name = "std_tools_test" +path = "tests/std_tools_tests.rs" + +# [[test]] +# name = "std_tools_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +### features + +[features] + +# iter + +iter = [ "wtools/iter" ] +iter_default = [ + "iter", + "wtools/iter_default", +] +iter_full = [ + "wtools/iter_full", + "iter", + # "iter_no_std", +] +iter_no_std = [ "wtools/iter_no_std" ] +iter_use_alloc = [ "wtools/iter_use_alloc" ] + +# meta + +meta = [ "wtools/meta" ] +meta_default = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +meta_full = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +meta_no_std = [ "wtools/meta_no_std" ] +meta_use_alloc = [ "wtools/meta_use_alloc" ] + +meta_for_each = [ "meta", "wtools/meta_for_each" ] +meta_impls_index = [ "meta", "wtools/meta_impls_index" ] +meta_mod_interface = [ "meta", "wtools/meta_mod_interface" ] +meta_constructors = [ "meta", "wtools/meta_constructors" ] +meta_idents_concat = [ "meta", "wtools/meta_idents_concat" ] +# meta_former = [ "meta", "wtools/meta_former" ] +# meta_options = [ "meta", "wtools/meta_options" ] + +# typing + +typing = [ "wtools/typing" ] +typing_default = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_full = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_no_std = [ "wtools/typing_no_std" ] +typing_use_alloc = [ "wtools/typing_use_alloc" ] + +# typing_nightly = [ "typing", "nightly", "wtools/typing_nightly" ] +typing_inspect_type = [ "typing", "wtools/typing_inspect_type" ] +typing_is_slice = [ "typing", "wtools/typing_is_slice" ] +typing_implements = [ "typing", "wtools/typing_implements" ] + +# time + +time = [ "wtools/time" ] +time_default = [ + "time", + "time_now", +] +time_full = [ + "time", + "time_now", +] +time_no_std = [ "wtools/time_no_std" ] +time_use_alloc = [ "wtools/time_use_alloc" ] + +time_now = [ "time", "wtools/time_now" ] + +# string + +string = [ "wtools/string" ] +string_default = [ + "string", + # "string_no_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +string_full = [ + "string", + # "string_no_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +string_no_std = [ "string", "wtools/string_no_std" ] +string_use_alloc = [ "string", "wtools/string_use_alloc" ] + +string_indentation = [ "string", "wtools/string_indentation" ] +string_isolate = [ "string", "wtools/string_isolate" ] +string_parse_request = [ "string", "string_isolate", "wtools/string_parse_request" ] +string_parse_number = [ "string", "wtools/string_parse_number" ] +string_split = [ "string", "wtools/string_split" ] + +# error + +error = [ "wtools/error" ] +error_default = [ + "error", + "error_for_lib", + "error_for_app", +] +error_full = [ + "error", + "error_for_lib", + "error_for_app", +] +error_no_std = [ "error", "wtools/error_no_std" ] +error_use_alloc = [ "error", "wtools/error_use_alloc" ] + +error_for_lib = [ "error", "wtools/error_for_lib" ] +error_for_app = [ "error", "wtools/error_for_app" ] + +# derive + +derive = [ "wtools/derive" ] +derive_full = [ + + "derive", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_from_str", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_no_std", + +] +derive_default = [ + + "derive", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_from_str", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_no_std", + +] + +derive_no_std = [ "wtools/derive_no_std" ] +derive_use_alloc = [ "wtools/derive_use_alloc" ] + +# derive_nightly = [ "derive", "nightly", "wtools/derive_nightly" ] +# derive_enable_track_caller = [ "derive", "wtools/derive_enable_track_caller" ] + +# derive_more = [ "derive", "wtools/derive_more" ] +derive_add_assign = [ "derive", "wtools/derive_add_assign" ] +derive_add = [ "derive", "wtools/derive_add" ] +derive_as_mut = [ "derive", "wtools/derive_as_mut" ] +derive_as_ref = [ "derive", "wtools/derive_as_ref" ] +derive_constructor = [ "derive", "wtools/derive_constructor" ] +derive_deref = [ "derive", "wtools/derive_deref" ] +derive_deref_mut = [ "derive", "wtools/derive_deref_mut" ] +derive_error = [ "derive", "wtools/derive_error" ] +derive_from = [ "derive", "wtools/derive_from" ] +derive_index = [ "derive", "wtools/derive_index" ] +derive_index_mut = [ "derive", "wtools/derive_index_mut" ] +derive_inner_from = [ "derive", "wtools/derive_inner_from" ] +derive_into_iterator = [ "derive", "wtools/derive_into_iterator" ] +# derive_iterator = [ "derive", "wtools/derive_iterator" ] +derive_mul_assign = [ "derive", "wtools/derive_mul_assign" ] +derive_mul = [ "derive", "wtools/derive_mul" ] +derive_not = [ "derive", "wtools/derive_not" ] +derive_sum = [ "derive", "wtools/derive_sum" ] +derive_try_into = [ "derive", "wtools/derive_try_into" ] +derive_is_variant = [ "derive", "wtools/derive_is_variant" ] +derive_unwrap = [ "derive", "wtools/derive_unwrap" ] +# derive_convert_case = [ "derive", "wtools/derive_convert_case" ] + +derive_strum = [ "derive", "wtools/derive_strum" ] +derive_strum_phf = [ "derive", "wtools/derive_strum_phf" ] + +derive_display = [ "derive", "wtools/derive_display", "parse-display" ] +derive_from_str = [ "derive", "wtools/derive_from_str", "parse-display" ] + +derive_clone_dyn = [ "derive", "wtools/derive_clone_dyn" ] +# derive_clone_dyn_no_std = [ "derive_clone_dyn", "wtools/derive_clone_dyn_no_std" ] +derive_clone_dyn_use_alloc = [ "derive_clone_dyn", "wtools/derive_clone_dyn_use_alloc" ] + +# dt + +dt = [ "wtools/dt" ] +dt_default = [ + "dt", + "dt_either", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] +dt_full = [ + "dt", + "dt_either", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] +dt_no_std = [ "wtools/dt_no_std" ] +dt_use_alloc = [ "wtools/dt_use_alloc" ] + +dt_either = [ "dt", "wtools/dt_either" ] +# dt_type_constructor = [ "dt", "wtools/dt_type_constructor" ] +# dt_make = [ "dt", "wtools/dt_make" ] +# dt_vectorized_from = [ "dt", "wtools/dt_vectorized_from" ] +dt_interval = [ "dt", "wtools/dt_interval" ] + +# diagnostics + +diagnostics = [ "wtools/diagnostics" ] +diagnostics_full = [ + "diagnostics", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +diagnostics_default = [ + "diagnostics", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +diagnostics_no_std = [ "wtools/diagnostics_no_std" ] +diagnostics_use_alloc = [ "wtools/diagnostics_use_alloc" ] + +diagnostics_runtime_assertions = [ "diagnostics", "wtools/diagnostics_runtime_assertions" ] +diagnostics_compiletime_assertions = [ "diagnostics", "wtools/diagnostics_compiletime_assertions" ] + +# must be empty +nightly = [] + +default = [ + "iter_default", + "meta_default", + "typing_default", + "time_default", + "string_default", + "error_default", + "derive_default", + "dt_default", + "diagnostics_default", + # "use_std", +] +full = [ + "iter_full", + "meta_full", + "typing_full", + "time_full", + "string_full", + "error_full", + "derive_full", + "dt_full", + "diagnostics_full", + # "use_std", + "use_alloc", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +# = dependencies + +[dependencies] +wtools = { workspace = true } +impls_index = { workspace = true } +# despite impls_index is imported by wtools it should also be imported immediatly +parse-display = { version = "~0.5", optional = true, default-features = false } +# have to be here because of problem with FromStr + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/postponed/std_tools/License b/module/postponed/std_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/std_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/std_tools/Readme.md b/module/postponed/std_tools/Readme.md new file mode 100644 index 0000000000..a0143175af --- /dev/null +++ b/module/postponed/std_tools/Readme.md @@ -0,0 +1,119 @@ + + +# Module :: std_tools + +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleStdToolsPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleStdToolsPush.yml) [![docs.rs](https://img.shields.io/docsrs/std_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/std_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. + +### Basic Use Case :: implements + + + +```rust ignore +use std_tools::prelude::*; + +fn main() +{ + println!( "implements!( 13_i32 => Copy ) : {}", implements!( 13_i32 => Copy ) ); + println!( "implements!( Box::new( 13_i32 ) => Copy ) : {}", implements!( Box::new( 13_i32 ) => Copy ) ); +} +``` + +### Basic Use Case :: type constructors + +In Rust, you often need to wrap a given type into a new one. +The role of the orphan rules in particular is basically to prevent you from implementing external traits for external types. +To overcome the restriction developer usually wrap the external type into a tuple introducing a new type. +Type constructor does exactly that and auto-implement traits From, Into, Deref and few more for the constructed type. + +Macro [types](https://docs.rs/type_constructor/latest/type_constructor/types/macro.types.html) is responsible for generating code for Single, Pair, Homopair, Many. Each type constructor has its own keyword for that, but Pair and Homopair use the same keyword difference in a number of constituent types. It is possible to define all types at once: + + + +```rust ignore +use std_tools::prelude::*; + +// types! +// { +// +// single MySingle : f32; +// single SingleWithParametrized : std::sync::Arc< T : Copy >; +// single SingleWithParameter : < T >; +// +// pair MyPair : f32; +// pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; +// pair PairWithParameter : < T1, T2 >; +// +// pair MyHomoPair : f32; +// pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; +// pair HomoPairWithParameter : < T >; +// +// many MyMany : f32; +// many ManyWithParametrized : std::sync::Arc< T : Copy >; +// many ManyWithParameter : < T >; +// +// } +``` + + diff --git a/module/postponed/std_tools/src/std_tools_lib.rs b/module/postponed/std_tools/src/std_tools_lib.rs new file mode 100644 index 0000000000..e07809104e --- /dev/null +++ b/module/postponed/std_tools/src/std_tools_lib.rs @@ -0,0 +1,17 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/std_tools/latest/std_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! std_tools - Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use wtools::*; diff --git a/module/postponed/std_tools/tests/smoke_test.rs b/module/postponed/std_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/std_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/std_tools/tests/std_tools_tests.rs b/module/postponed/std_tools/tests/std_tools_tests.rs new file mode 100644 index 0000000000..05ea9155f5 --- /dev/null +++ b/module/postponed/std_tools/tests/std_tools_tests.rs @@ -0,0 +1,23 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ allow( non_snake_case ) ] +#![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] + +#[ allow( unused_imports ) ] +use std_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// A struct for testing purpose. +#[ derive( Debug, PartialEq ) ] +pub struct CrateStructForTesting1 +{ +} + +// #[ path = "./mod.rs" ] +// mod tests; + +#[ path="../../../../module/core/wtools/tests/wtools_tests.rs" ] +mod wtools; diff --git a/module/postponed/std_x/Cargo.toml b/module/postponed/std_x/Cargo.toml new file mode 100644 index 0000000000..4795beee5e --- /dev/null +++ b/module/postponed/std_x/Cargo.toml @@ -0,0 +1,399 @@ +[package] +name = "std_x" +version = "0.1.4" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/std_x" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/std_x" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/std_x" +description = """ +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/std_x_lib.rs", + "/Cargo.toml", + "/Readme.md", + "/License", +] +# rustdoc-args = [] + +[lib] +name = "std_x" +path = "src/std_x_lib.rs" + +[[test]] +name = "std_x_test" +path = "tests/std_x_tests.rs" + +# [[test]] +# name = "std_x_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +### features + +# {{ willbe.alias_features( "wtools" ) }} + +[features] + +# iter + +iter = [ "wtools/iter" ] +iter_default = [ + "iter", + "wtools/iter_default", +] +iter_full = [ + "wtools/iter_full", + "iter", + # "iter_no_std", +] +iter_no_std = [ "wtools/iter_no_std" ] +iter_use_alloc = [ "wtools/iter_use_alloc" ] + +# meta + +meta = [ "wtools/meta" ] +meta_default = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +meta_full = [ + "meta", + "meta_for_each", + "meta_impls_index", + "meta_mod_interface", + # "meta_former", + # "meta_options", + "meta_constructors", + "meta_idents_concat", +] +meta_no_std = [ "wtools/meta_no_std" ] +meta_use_alloc = [ "wtools/meta_use_alloc" ] + +meta_for_each = [ "meta", "wtools/meta_for_each" ] +meta_impls_index = [ "meta", "wtools/meta_impls_index" ] +meta_mod_interface = [ "meta", "wtools/meta_mod_interface" ] +meta_constructors = [ "meta", "wtools/meta_constructors" ] +meta_idents_concat = [ "meta", "wtools/meta_idents_concat" ] +# meta_former = [ "meta", "wtools/meta_former" ] +# meta_options = [ "meta", "wtools/meta_options" ] + +# typing + +typing = [ "wtools/typing" ] +typing_default = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_full = [ + "typing", + "typing_inspect_type", + "typing_is_slice", + "typing_implements", +] +typing_no_std = [ "wtools/typing_no_std" ] +typing_use_alloc = [ "wtools/typing_use_alloc" ] + +# typing_nightly = [ "typing", "nightly", "wtools/typing_nightly" ] +typing_inspect_type = [ "typing", "wtools/typing_inspect_type" ] +typing_is_slice = [ "typing", "wtools/typing_is_slice" ] +typing_implements = [ "typing", "wtools/typing_implements" ] + +# time + +time = [ "wtools/time" ] +time_default = [ + "time", + "time_now", +] +time_full = [ + "time", + "time_now", +] +time_no_std = [ "wtools/time_no_std" ] +time_use_alloc = [ "wtools/time_use_alloc" ] + +time_now = [ "time", "wtools/time_now" ] + +# string + +string = [ "wtools/string" ] +string_default = [ + "string", + # "string_no_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +string_full = [ + "string", + # "string_no_std", + "string_indentation", + "string_isolate", + "string_parse_request", + "string_parse_number", + "string_split", +] +string_no_std = [ "string", "wtools/string_no_std" ] +string_use_alloc = [ "string", "wtools/string_use_alloc" ] + +string_indentation = [ "string", "wtools/string_indentation" ] +string_isolate = [ "string", "wtools/string_isolate" ] +string_parse_request = [ "string", "string_isolate", "wtools/string_parse_request" ] +string_parse_number = [ "string", "wtools/string_parse_number" ] +string_split = [ "string", "wtools/string_split" ] + +# error + +error = [ "wtools/error" ] +error_default = [ + "error", + "error_for_lib", + "error_for_app", +] +error_full = [ + "error", + "error_for_lib", + "error_for_app", +] +error_no_std = [ "error", "wtools/error_no_std" ] +error_use_alloc = [ "error", "wtools/error_use_alloc" ] + +error_for_lib = [ "error", "wtools/error_for_lib" ] +error_for_app = [ "error", "wtools/error_for_app" ] + +# derive + +derive = [ "wtools/derive" ] +derive_full = [ + + "derive", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_from_str", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_no_std", + +] +derive_default = [ + + "derive", + + "derive_add_assign", + "derive_add", + "derive_as_mut", + "derive_as_ref", + "derive_constructor", + "derive_deref", + "derive_deref_mut", + "derive_error", + "derive_from", + "derive_from_str", + "derive_index", + "derive_index_mut", + "derive_inner_from", + "derive_into_iterator", + # "derive_iterator", + "derive_mul_assign", + "derive_mul", + "derive_not", + "derive_sum", + "derive_try_into", + "derive_is_variant", + "derive_unwrap", + # "derive_convert_case", + + "derive_strum", + "derive_strum_phf", + + "derive_display", + "derive_from_str", + + "derive_clone_dyn", + # "derive_clone_dyn_no_std", + +] + +derive_no_std = [ "wtools/derive_no_std" ] +derive_use_alloc = [ "wtools/derive_use_alloc" ] + +# derive_nightly = [ "derive", "nightly", "wtools/derive_nightly" ] +# derive_enable_track_caller = [ "derive", "wtools/derive_enable_track_caller" ] + +# derive_more = [ "derive", "wtools/derive_more" ] +derive_add_assign = [ "derive", "wtools/derive_add_assign" ] +derive_add = [ "derive", "wtools/derive_add" ] +derive_as_mut = [ "derive", "wtools/derive_as_mut" ] +derive_as_ref = [ "derive", "wtools/derive_as_ref" ] +derive_constructor = [ "derive", "wtools/derive_constructor" ] +derive_deref = [ "derive", "wtools/derive_deref" ] +derive_deref_mut = [ "derive", "wtools/derive_deref_mut" ] +derive_error = [ "derive", "wtools/derive_error" ] +derive_from = [ "derive", "wtools/derive_from" ] +derive_index = [ "derive", "wtools/derive_index" ] +derive_index_mut = [ "derive", "wtools/derive_index_mut" ] +derive_inner_from = [ "derive", "wtools/derive_inner_from" ] +derive_into_iterator = [ "derive", "wtools/derive_into_iterator" ] +# derive_iterator = [ "derive", "wtools/derive_iterator" ] +derive_mul_assign = [ "derive", "wtools/derive_mul_assign" ] +derive_mul = [ "derive", "wtools/derive_mul" ] +derive_not = [ "derive", "wtools/derive_not" ] +derive_sum = [ "derive", "wtools/derive_sum" ] +derive_try_into = [ "derive", "wtools/derive_try_into" ] +derive_is_variant = [ "derive", "wtools/derive_is_variant" ] +derive_unwrap = [ "derive", "wtools/derive_unwrap" ] +# derive_convert_case = [ "derive", "wtools/derive_convert_case" ] + +derive_strum = [ "derive", "wtools/derive_strum" ] +derive_strum_phf = [ "derive", "wtools/derive_strum_phf" ] + +derive_display = [ "derive", "wtools/derive_display", "parse-display" ] +derive_from_str = [ "derive", "wtools/derive_from_str", "parse-display" ] + +derive_clone_dyn = [ "derive", "wtools/derive_clone_dyn" ] +# derive_clone_dyn_no_std = [ "derive_clone_dyn", "wtools/derive_clone_dyn_no_std" ] +derive_clone_dyn_use_alloc = [ "derive_clone_dyn", "wtools/derive_clone_dyn_use_alloc" ] + +# dt + +dt = [ "wtools/dt" ] +dt_default = [ + "dt", + "dt_either", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] +dt_full = [ + "dt", + "dt_either", + # "dt_type_constructor", + # "dt_make", + # "dt_vectorized_from", + "dt_interval", +] +dt_no_std = [ "wtools/dt_no_std" ] +dt_use_alloc = [ "wtools/dt_use_alloc" ] + +dt_either = [ "dt", "wtools/dt_either" ] +# dt_type_constructor = [ "dt", "wtools/dt_type_constructor" ] +# dt_make = [ "dt", "wtools/dt_make" ] +# dt_vectorized_from = [ "dt", "wtools/dt_vectorized_from" ] +dt_interval = [ "dt", "wtools/dt_interval" ] + +# diagnostics + +diagnostics = [ "wtools/diagnostics" ] +diagnostics_full = [ + "diagnostics", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +diagnostics_default = [ + "diagnostics", + "diagnostics_runtime_assertions", + "diagnostics_compiletime_assertions", +] +diagnostics_no_std = [ "wtools/diagnostics_no_std" ] +diagnostics_use_alloc = [ "wtools/diagnostics_use_alloc" ] + +diagnostics_runtime_assertions = [ "diagnostics", "wtools/diagnostics_runtime_assertions" ] +diagnostics_compiletime_assertions = [ "diagnostics", "wtools/diagnostics_compiletime_assertions" ] + +# must be empty +nightly = [] + +default = [ + "iter_default", + "meta_default", + "typing_default", + "time_default", + "string_default", + "error_default", + "derive_default", + "dt_default", + "diagnostics_default", + # "use_std", +] +full = [ + "iter_full", + "meta_full", + "typing_full", + "time_full", + "string_full", + "error_full", + "derive_full", + "dt_full", + "diagnostics_full", + # "use_std", + "use_alloc", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +# = dependencies + +[dependencies] +wtools = { workspace = true } +# impls_index = { workspace = true } +# despite impls_index is imported by wtools it should also be imported immediatly +parse-display = { version = "~0.5", optional = true, default-features = false } +# have to be here because of problem with FromStr + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/postponed/std_x/License b/module/postponed/std_x/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/std_x/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/std_x/Readme.md b/module/postponed/std_x/Readme.md new file mode 100644 index 0000000000..0d18baa0cc --- /dev/null +++ b/module/postponed/std_x/Readme.md @@ -0,0 +1,121 @@ + + +# Module :: std_x + +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleStdXPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleStdXPush.yml) [![docs.rs](https://img.shields.io/docsrs/std_x?color=e3e8f0&logo=docs.rs)](https://docs.rs/std_x) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. + +### Basic Use Case :: implements + + + +```rust ignore +use std_x::prelude::*; + +fn main() +{ + println!( "implements!( 13_i32 => Copy ) : {}", implements!( 13_i32 => Copy ) ); + println!( "implements!( Box::new( 13_i32 ) => Copy ) : {}", implements!( Box::new( 13_i32 ) => Copy ) ); +} +``` + +### Basic Use Case :: type constructors + +In Rust, you often need to wrap a given type into a new one. +The role of the orphan rules in particular is basically to prevent you from implementing external traits for external types. +To overcome the restriction developer usually wrap the external type into a tuple introducing a new type. +Type constructor does exactly that and auto-implement traits From, Into, Deref and few more for the constructed type. + +Macro [types](https://docs.rs/type_constructor/latest/type_constructor/types/macro.types.html) is responsible for generating code for Single, Pair, Homopair, Many. Each type constructor has its own keyword for that, but Pair and Homopair use the same keyword difference in a number of constituent types. It is possible to define all types at once: + + + +```rust ignore +use std_x::prelude::*; + +types! +{ + + single MySingle : f32; + single SingleWithParametrized : std::sync::Arc< T : Copy >; + single SingleWithParameter : < T >; + + pair MyPair : f32; + pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pair PairWithParameter : < T1, T2 >; + + pair MyHomoPair : f32; + pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pair HomoPairWithParameter : < T >; + + many MyMany : f32; + many ManyWithParametrized : std::sync::Arc< T : Copy >; + many ManyWithParameter : < T >; + +} +``` + +### Basic Use Case :: make - variadic constructor + +Implement traits [From_0], [From_1] up to MakeN to provide the interface to construct your structure with a different set of arguments. +In this example structure, Struct1 could be constructed either without arguments, with a single argument, or with two arguments. +- Constructor without arguments fills fields with zero. +- Constructor with a single argument sets both fields to the value of the argument. +- Constructor with 2 arguments set individual values of each field. + + + +```rust ignore +use std_x::prelude::*; + +#[ derive( Debug, PartialEq ) ] +struct Struct1 +{ + a : i32, + b : i32, +} + +impl From_0 for Struct1 +{ + fn from_0() -> Self + { + Self { a : 0, b : 0 } + } +} + +impl From_1< i32 > for Struct1 +{ + fn from_1( val : i32 ) -> Self + { + Self { a : val, b : val } + } +} + +impl From_2< i32, i32 > for Struct1 +{ + fn from_2( val1 : i32, val2 : i32 ) -> Self + { + Self { a : val1, b : val2 } + } +} + +let got : Struct1 = from!(); +let exp = Struct1{ a : 0, b : 0 }; +assert_eq!( got, exp ); + +let got : Struct1 = from!( 13 ); +let exp = Struct1{ a : 13, b : 13 }; +assert_eq!( got, exp ); + +let got : Struct1 = from!( 1, 3 ); +let exp = Struct1{ a : 1, b : 3 }; +assert_eq!( got, exp ); +``` + +### To add to your project + +```sh +cargo add std_x +``` diff --git a/module/postponed/std_x/src/std_x_lib.rs b/module/postponed/std_x/src/std_x_lib.rs new file mode 100644 index 0000000000..adc8357d35 --- /dev/null +++ b/module/postponed/std_x/src/std_x_lib.rs @@ -0,0 +1,17 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/std_x/latest/std_x/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! std_x - Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use wtools::*; diff --git a/module/postponed/std_x/tests/smoke_test.rs b/module/postponed/std_x/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/std_x/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/std_x/tests/std_x_tests.rs b/module/postponed/std_x/tests/std_x_tests.rs new file mode 100644 index 0000000000..5bbb2806d3 --- /dev/null +++ b/module/postponed/std_x/tests/std_x_tests.rs @@ -0,0 +1,23 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ allow( non_snake_case ) ] +#![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ] + +#[ allow( unused_imports ) ] +use std_x as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +/// A struct for testing purpose. +#[ derive( Debug, PartialEq ) ] +pub struct CrateStructForTesting1 +{ +} + +// #[ path = "./mod.rs" ] +// mod tests; + +#[ path="../../../../module/core/wtools/tests/wtools_tests.rs" ] +mod wtools; diff --git a/module/postponed/type_constructor/Cargo.toml b/module/postponed/type_constructor/Cargo.toml new file mode 100644 index 0000000000..0c12790c65 --- /dev/null +++ b/module/postponed/type_constructor/Cargo.toml @@ -0,0 +1,118 @@ +[package] +name = "type_constructor" +version = "0.3.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/type_constructor" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/type_constructor" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/type_constructor" +description = """ +Fundamental data types and type constructors, like Single, Pair, Many. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/dt/type_constructor", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ + "enabled", + "many", + "make", + "vectorized_from", +] +full = [ + "enabled", + "use_alloc", + "many", + "make", + "vectorized_from", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] +many = [] +make = [] +vectorized_from = [] + +# [lib] +# name = "type_constructor" +# path = "src/dt/type_constructor/type_constructor_lib.rs" +# +# [[test]] +# name = "type_constructor_test" +# path = "tests/dt/type_constructor/type_constructor_tests.rs" +# +# [[test]] +# name = "type_constructor_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +# [[example]] +# name = "type_constructor_trivial" +# path = "examples/type_constructor_trivial/src/main.rs" +# +# [[example]] +# name = "type_constructor_derive_and_attr" +# path = "examples/type_constructor_derive_and_attr/src/main.rs" +# +# [[example]] +# name = "type_constructor_struct" +# path = "examples/type_constructor_struct/src/main.rs" +# +# [[example]] +# name = "type_constructor_parametrized_element" +# path = "examples/type_constructor_parametrized_element/src/main.rs" +# +# [[example]] +# name = "type_constructor_parametrized_tuple" +# path = "examples/type_constructor_parametrized_tuple/src/main.rs" +# +# [[example]] +# name = "type_constructor_multiple" +# path = "examples/type_constructor_multiple/src/main.rs" +# required-features = [ "many" ] +# +# [[example]] +# name = "type_constructor_without_macro" +# path = "examples/type_constructor_without_macro/src/main.rs" +# required-features = [ "many" ] +# +# [[example]] +# name = "type_constructor_pair" +# path = "examples/type_constructor_pair/src/main.rs" +# +# [[example]] +# name = "type_constructor_homopair" +# path = "examples/type_constructor_homopair/src/main.rs" +# +# [[example]] +# name = "type_constructor_many" +# path = "examples/type_constructor_many/src/main.rs" +# required-features = [ "many" ] + +[dependencies] +derive_tools = { workspace = true, features = [ "enabled", "type_variadic_from", "derive_variadic_from" ] } +# inspect_type = { workspace = true } +# type_constructor_make_meta = { workspace = true } +# type_constructor_derive_pair_meta = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/postponed/type_constructor/License b/module/postponed/type_constructor/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/type_constructor/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/type_constructor/Readme.md b/module/postponed/type_constructor/Readme.md new file mode 100644 index 0000000000..8d54113d04 --- /dev/null +++ b/module/postponed/type_constructor/Readme.md @@ -0,0 +1,842 @@ + + +# Module :: fundamental_data_type + +[![deprecated](https://raster.shields.io/static/v1?label=stability&message=deprecated&color=red&logoColor=eee)](https://github.com/emersion/stability-badges#deprecated) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleTypeConstructorPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleTypeConstructorPush.yml) [![docs.rs](https://img.shields.io/docsrs/type_constructor?color=e3e8f0&logo=docs.rs)](https://docs.rs/type_constructor) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2Ftype_constructor_trivial%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20type_constructor_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + + + +Fundamental data types and type constructors, like Single, Pair, Homopair, Many. + +In Rust, you often need to wrap a given type into a new one. +The role of the orphan rules in particular is basically to prevent you from implementing external traits for external types. +To overcome the restriction developer usually wrap the external type into a tuple introducing a new type. +Type constructor does exactly that and auto-implement traits From, Into, Deref and few more for the constructed type. + +Besides type constructor for single element there are type constructors for `pair`, `homopair` and `many`: + +- `Single` to wrap single element. +- `Pair` to wrap pair of distinct elements. +- `HomoPair` to wrap pair of elements with the same type. +- `Many` to wrap `Vec` of elements. + +### Macro `types` for type constructing + +Macro `types` is responsible for generating code for Single, Pair, Homopair, Many. Each type constructor has its own keyword for that, but Pair and Homopair use the same keyword difference in a number of constituent types. It is possible to define all types at once. + + + +```rust ignore +{ + use type_constructor::prelude::*; + + types! + { + + pub single MySingle : f32; + pub single SingleWithParametrized : std::sync::Arc< T : Copy >; + pub single SingleWithParameter : < T >; + + pub pair MyPair : f32; + pub pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pub pair PairWithParameter : < T1, T2 >; + + pub pair MyHomoPair : f32; + pub pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pub pair HomoPairWithParameter : < T >; + + pub many MyMany : f32; + pub many ManyWithParametrized : std::sync::Arc< T : Copy >; + pub many ManyWithParameter : < T >; + + } +} +``` + +It generates more than 1000 lines of code, which otherwise you would have to write manually. + +### Without macro + +Macro `types` is exposed to generate new types, but in some cases, it is enough to reuse already generated types of such kind. The library ships such types: Single, Pair, Homopair, Many. Note: If you avoid generating new types you will get in a position to be not able to define your own implementation of foreign traits because of orphan rule. + + + +```rust ignore + +let i32_in_tuple = type_constructor::Single::< i32 >::from( 13 ); +dbg!( i32_in_tuple ); +// i32_in_tuple = Single( 13 ) +let i32_and_f32_in_tuple = type_constructor::Pair::< i32, f32 >::from( ( 13, 13.0 ) ); +dbg!( i32_and_f32_in_tuple ); +// vec_of_i32_in_tuple = Pair( 13, 13.0 ) +let two_i32_in_tuple = type_constructor::HomoPair::< i32 >::from( ( 13, 31 ) ); +dbg!( two_i32_in_tuple ); +// vec_of_i32_in_tuple = HomoPair( 13, 31 ) +let vec_of_i32_in_tuple = type_constructor::Many::< i32 >::from( [ 1, 2, 3 ] ); +dbg!( vec_of_i32_in_tuple ); +// vec_of_i32_in_tuple = Many([ 1, 2, 3 ]) + +``` + +### Make + +Make is the variadic constructor. It's the unified interface of the arbitrary-length constructor. +After implementing several traits `From_0`, `From_1` up to `MakeN` one can use make `from!` to construct instances. + + + +```rust ignore +#[ cfg( feature = "make" ) ] +{ + use type_constructor::prelude::*; + + let instance1 : Struct1 = from!(); + let instance2 : Struct1 = from!( 13 ); + let instance3 : Struct1 = from!( 1, 3 ); + +} +``` + +### VectorizedFrom + +Standard `From` unfortunately is not autoimplemented for tuples and arrays and cant be implemented for them because of orphans restrictions. +That how pair of traits `VectorizedFrom`/`VectorizedInto` could be useful. They are implemented for tuples and arrays. +Their implementation is based on standard `From`, if `From` is implemented for elements of a tuple then `VectorizedFrom`/`VectorizedInto` implemented for collection containing them. + + + +```rust ignore +#[ cfg( feature = "vectorized_from" ) ] +{ + use type_constructor::prelude::*; + types!( single Single1 : i32 ); + let src = ( 1, 3 ); + let got = <( Single1, Single1 )>::vectorized_from( src ); +} +``` + +### Basic Use Case :: single-line single + +To define your own single-use macro `types!`. The single-line definition looks like that. + + + +```rust ignore +use type_constructor::prelude::*; + +types!( pub single MySingle : i32 ); +let x = MySingle( 13 ); +println!( "x : {}", x.0 ); +``` + +It generates code: + +```rust ignore +use type_constructor::prelude::*; + +pub struct MySingle( pub i32 ); + +impl core::ops::Deref for MySingle +{ + type Target = i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl From< i32 > for MySingle +{ + fn from( src : i32 ) -> Self + { + Self( src ) + } +} +impl From< MySingle > for i32 +{ + fn from( src : MySingle ) -> Self + { + src.0 + } +} + +/* ... */ + +let x = MySingle( 13 ); +println!( "x : {}", x.0 ); +``` + +### Basic Use Case :: single with derives and attributes + +It's possible to define attributes as well as derives. + + + +```rust ignore +use type_constructor::prelude::*; +types! +{ + /// This is also attribute and macro understands it. + #[ derive( Debug ) ] + pub single MySingle : i32; +} +let x = MySingle( 13 ); +dbg!( x ); +``` + +It generates code: + +```rust ignore +use type_constructor::prelude::*; + +/// This is also an attribute and macro understands it. +#[ derive( Debug ) ] +pub struct MySingle( pub i32 ); + +impl core::ops::Deref for MySingle +{ + type Target = i32; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl From< i32 > for MySingle +{ + fn from( src : i32 ) -> Self + { + Self( src ) + } +} +impl From< MySingle > for i32 +{ + fn from( src : MySingle ) -> Self + { + src.0 + } +} + +/* ... */ + +let x = MySingle( 13 ); +dbg!( x ); +``` + +### Basic Use Case :: single with struct instead of macro + +Sometimes it's sufficient to use a common type instead of defining a brand new one. +You may use parameterized struct `Single< T >` instead of macro `types!` if that is the case. + + + +```rust ignore +use type_constructor::prelude::*; +let x = Single::< i32 >( 13 ); +dbg!( x ); +``` + +### Basic Use Case :: single with a parametrized element + +Element of tuple could be parametrized. + + + +```rust ignore +use type_constructor::prelude::*; +types! +{ + #[ derive( Debug ) ] + pub single MySingle : std::sync::Arc< T : Copy >; +} +let x = MySingle( std::sync::Arc::new( 13 ) ); +dbg!( x ); +``` + +It generates code: + +```rust ignore +use type_constructor::*; + +#[ derive( Debug ) ] +pub struct MySingle< T : Copy >( pub std::sync::Arc< T > ); + +impl core::ops::Deref for MySingle< T > +{ + type Target = std::sync::Arc< T >; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} +impl< T : Copy > From< std::sync::Arc< T > > for MySingle< T > +{ + fn from( src : std::sync::Arc< T >) -> Self { + Self( src ) + } +} +impl< T : Copy > From< MySingle< T > > for std::sync::Arc< T > +{ + fn from(src: MySingle< T >) -> Self + { + src.0 + } +} + +/* ... */ + +let x = MySingle( std::sync::Arc::new( 13 ) ); +``` + +### Basic Use Case :: single with parametrized tuple + +Instead of parametrizing the element, it's possible to define a parametrized tuple. + + + + +```rust ignore +use type_constructor::prelude::*; +types! +{ + #[ derive( Debug ) ] + pub single MySingle : < T : Copy >; +} +let x = MySingle( 13 ); +dbg!( x ); +``` + +It generates code: + + + +```rust ignore +#[ derive( Debug ) ] +pub struct MySingle< T : Copy >( pub T ); + +impl< T : Copy > core::ops::Deref +for MySingle< T > +{ + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +impl< T : Copy > From< T > +for MySingle< T > +{ + fn from( src : T ) -> Self + { + Self( src ) + } +} + +let x = MySingle( 13 ); +dbg!( 13 ); +``` + +### Basic Use Case :: single-line pair + +Sometimes you need to wrap more than a single element into a tuple. If types of elements are different use `pair`. The same macro `types` is responsible for generating code for both `single`, `pair` and also `many`. + + + +```rust ignore +use type_constructor::prelude::*; + +types!( pub pair MyPair : i32, i64 ); +let x = MyPair( 13, 31 ); +println!( "x : ( {}, {} )", x.0, x.1 ); +// prints : x : ( 13, 31 ) +``` + +It generates code: + +```rust ignore +use type_constructor::prelude::*; + +pub struct MyPair( pub i32, pub i64 ); + +impl From< ( i32, i64 ) > for MyPair +{ + fn from( src : ( i32, i64 ) ) -> Self { Self( src.0, src.1 ) } +} + +impl From< MyPair > for ( i32, i64 ) +{ + fn from( src : MyPair ) -> Self { ( src.0, src.1 ) } +} + +#[cfg( feature = "make" ) ] +impl From_2< i32, i64 > for MyPair +{ + fn from_2( _0 : i32, _1 : i64 ) -> Self { Self( _0, _1 ) } +} + +/* ... */ + +let x = MyPair( 13, 31 ); +println!( "x : ( {}, {} )", x.0, x.1 ); +``` + +### Basic Use Case :: pair with parameters + +Just like `single`, `pair` may have parameters: + + + +```rust ignore +use type_constructor::prelude::*; + +use core::fmt; +types! +{ + #[ derive( Debug ) ] + pub pair MyPair : < T1 : fmt::Debug, T2 : fmt::Debug >; +} +let x = MyPair( 13, 13.0 ); +dbg!( x ); +// prints : x = MyPair( 13, 13.0 ) +``` + +It generates code: + +```rust ignore +use type_constructor::prelude::*; +use core::fmt; + +#[ derive( Debug ) ] +pub struct MyPair< T1, T2 >( pub T1, pub T2 ); + +impl< T1, T2 > From<( T1, T2 )> for MyPair< T1, T2 > +{ + fn from( src : ( T1, T2 ) ) -> Self { Self( src.0, src.1 ) } +} + +impl< T1, T2 > From< MyPair< T1, T2 > > for ( T1, T2 ) +{ + fn from( src : MyPair< T1, T2 > ) -> Self { ( src.0, src.1 ) } +} + +#[ cfg( feature = "make" ) ] +impl< T1, T2 > From_0 for MyPair< T1, T2 > +where + T1 : Default, + T2 : Default, +{ + fn from_0() -> Self { Self( Default::default(), Default::default() ) } +} + +#[ cfg( feature = "make" ) ] +impl< T1, T2 > From_2< T1, T2 > for MyPair< T1, T2 > +{ + fn from_2( _0 : T1, _1 : T2 ) -> Self { Self( _0, _1 ) } +} + +/* ... */ + +let x = MyPair( 13, 13.0 ); +dbg!( x ); +// prints : x = MyPair( 13, 13.0 ) +``` + +### Basic Use Case :: single-line homopair + +If you need to wrap pair of elements with the same type use the type constructor `pair`. The same type constructor `pair` for both `pair` and `homopair`, difference in number of types in definition, `homopair` has only one, because both its element has the same type. The same macro `types` is responsible for generating code for both `single`, `pair` and also `many`. + + + +```rust ignore +use type_constructor::prelude::*; + +types!( pub pair MyPair : i32, i64 ); +let x = MyPair( 13, 31 ); +println!( "x : ( {}, {} )", x.0, x.1 ); +// prints : x : ( 13, 31 ) +``` + +It generates code: + + + +```rust ignore +use type_constructor::prelude::*; + +pub struct MyPair( pub i32, pub i64 ); + +impl From< ( i32, i64 ) > for MyPair +{ + fn from( src : ( i32, i64 ) ) -> Self { Self( src.0, src.1 ) } +} + +impl From< MyPair > for ( i32, i64 ) +{ + fn from( src : MyPair ) -> Self { ( src.0, src.1 ) } +} + +#[ cfg( feature = "make" ) ] +impl From_2< i32, i64 > for MyPair +{ + fn from_2( _0 : i32, _1 : i64 ) -> Self { Self( _0, _1 ) } +} + +/* ... */ + +let x = MyPair( 13, 31 ); +println!( "x : ( {}, {} )", x.0, x.1 ); +``` + +### Basic Use Case :: homopair with parameters + +Unlike `heteropair` `homopair` has much more traits implemented for it. Among such are: `clone_as_tuple`, `clone_as_array` to clone it as either tuple or array, `as_tuple`, `as_array`, `as_slice` to reinterpret it as either tuple or array or slice, traits `From`/`Into` are implemented to convert it from/into tuple, array, slice, scalar. + + + +```rust ignore +use type_constructor::prelude::*; + +use core::fmt; +types! +{ + #[ derive( Debug ) ] + pub pair MyHomoPair : < T : fmt::Debug >; +} +let x = MyHomoPair( 13, 31 ); +dbg!( &x ); +// prints : &x = MyHomoPair( 13, 31 ) +let clone_as_array : [ i32 ; 2 ] = x.clone_as_array(); +dbg!( &clone_as_array ); +// prints : &clone_as_array = [ 13, 31 ] +let clone_as_tuple : ( i32 , i32 ) = x.clone_as_tuple(); +dbg!( &clone_as_tuple ); +// prints : &clone_as_tuple = ( 13, 31 ) +``` + +It generates code: + + + +```rust ignore +use type_constructor::prelude::*; +use core::fmt; + +#[ derive( Debug ) ] +pub struct MyHomoPair< T >( pub T, pub T ); + +impl< T > core::ops::Deref for MyHomoPair< T > +{ + type Target = ( T, T ); + + fn deref( &self ) -> &Self::Target + { + #[ cfg( debug_assertions ) ] + { + let layout1 = std::alloc::Layout::new::< Self >(); + let layout2 = std::alloc::Layout::new::< Self::Target >(); + debug_assert_eq!( layout1, layout2 ); + } + unsafe { std::mem::transmute::< _, _ >( self ) } + } +} + +impl< T > core::ops::DerefMut for MyHomoPair< T > +{ + fn deref_mut( &mut self ) -> &mut Self::Target + { + #[ cfg( debug_assertions ) ] + { + let layout1 = std::alloc::Layout::new::< Self >(); + let layout2 = std::alloc::Layout::new::< Self::Target >(); + debug_assert_eq!( layout1, layout2 ); + } + unsafe { std::mem::transmute::< _, _ >( self ) } + } +} + +impl< T > From< ( T, T ) > for MyHomoPair< T > +{ + fn from( src : ( T, T ) ) -> Self { Self( src.0, src.1 ) } +} + +impl< T > From< MyHomoPair< T >> for ( T, T ) +{ + fn from( src : MyHomoPair< T > ) -> Self { ( src.0, src.1 ) } +} + +impl< T > From< [ T; 2 ] > for MyHomoPair< T > +where + T : Clone, +{ + fn from( src : [ T; 2 ] ) -> Self { Self( src[ 0 ].clone(), src[ 1 ].clone() ) } +} + +impl< T > From< MyHomoPair< T >> for [ T; 2 ] +{ + fn from( src : MyHomoPair< T > ) -> Self { [ src.0, src.1 ] } +} + +impl< T > From< &[ T ] > for MyHomoPair< T > +where + T : Clone, +{ + fn from( src : &[ T ] ) -> Self + { + debug_assert_eq!( src.len(), 2 ); + Self( src[ 0 ].clone(), src[ 1 ].clone() ) + } +} + +impl< T > From< T > for MyHomoPair< T > +where + T : Clone, +{ + fn from( src : T ) -> Self { Self( src.clone(), src.clone() ) } +} + +impl< T > CloneAsTuple< ( T, T ) > for MyHomoPair< T > +where + T : Clone, +{ + fn clone_as_tuple( &self ) -> ( T, T ) { ( self.0.clone(), self.1.clone() ) } +} + +impl< T > CloneAsArray< T, 2 > for MyHomoPair< T > +where + T : Clone, +{ + fn clone_as_array( &self ) -> [ T; 2 ] { [ self.0.clone(), self.1.clone() ] } +} + +impl< T > AsTuple< ( T, T ) > for MyHomoPair< T > +{ + fn as_tuple( &self ) -> &( T, T ) { unsafe { std::mem::transmute::< &_, &( T, T ) >( self ) } } +} + +impl< T > AsArray< T, 2 > for MyHomoPair< T > +{ + fn as_array( &self ) -> &[ T; 2 ] { unsafe { std::mem::transmute::< &_, &[ T; 2 ] >( self ) } } +} + +impl< T > AsSlice< T > for MyHomoPair< T > +{ + fn as_slice( &self ) -> &[ T ] { &self.as_array()[ .. ] } +} + +#[ cfg( feature = "make" ) ] +impl< T > From_0 for MyHomoPair< T > +where + T : Default, +{ + fn from_0() -> Self { Self( Default::default(), Default::default() ) } +} + +#[ cfg( feature = "make" ) ] +impl< T > From_1< T > for MyHomoPair< T > +where + T : Clone, +{ + fn from_1( _0 : T ) -> Self { Self( _0.clone(), _0.clone() ) } +} + +#[ cfg( feature = "make" ) ] +impl< T > From_2< T, T > for MyHomoPair< T > +{ + fn from_2( _0 : T, _1 : T ) -> Self { Self( _0, _1 ) } +} + +/* ... */ + +let x = MyHomoPair( 13, 31 ); +dbg!( &x ); +// prints : &x = MyHomoPair( 13, 31 ) +let clone_as_array : [ i32 ; 2 ] = x.clone_as_array(); +dbg!( &clone_as_array ); +// prints : &clone_as_array = [ 13, 31 ] +let clone_as_tuple : ( i32 , i32 ) = x.clone_as_tuple(); +dbg!( &clone_as_tuple ); +// prints : &clone_as_tuple = ( 13, 31 ) +``` + +### Basic Use Case :: single-line many + +Use type constructor `many` to wrap `Vec` in a tuple. Similar to `single` it has essential traits implemented for it. + + + +```rust ignore +// #[ cfg +// ( +// all +// ( +// feature = "many", +// any( not( feature = "no_std" ), feature = "use_alloc" ), +// ) +// ) ] +// { +// use type_constructor::prelude::*; +// +// types!( pub many MyMany : i32 ); +// let x = MyMany::from( [ 1, 2, 3 ] ); +// println!( "x : {:?}", x.0 ); +// } +``` + +It generates code: + +```rust ignore +use type_constructor::prelude::*; + +pub struct MyMany( pub std::vec::Vec< i32 > ); + +impl core::ops::Deref for MyMany +{ + type Target = std::vec::Vec< i32 >; + + fn deref( &self ) -> &Self::Target { &self.0 } +} + +impl core::ops::DerefMut for MyMany +{ + fn deref_mut( &mut self ) -> &mut Self::Target { &mut self.0 } +} + +impl From< i32 > for MyMany +{ + fn from( src : i32 ) -> Self { Self( vec![ src ] ) } +} + +impl From< ( i32, ) > for MyMany +{ + fn from( src : ( i32, ) ) -> Self { Self( vec![ src.0 ] ) } +} + +impl< const N: usize > From< [ i32; N ] > for MyMany +where + i32 : Clone, +{ + fn from( src : [ i32; N ] ) -> Self { Self( std::vec::Vec::from( src ) ) } +} + +impl From< &[ i32 ] > for MyMany +where + i32 : Clone, +{ + fn from( src : &[ i32 ] ) -> Self + { + debug_assert_eq!( src.len(), 1 ); + Self( std::vec::Vec::from( src ) ) + } +} + +impl AsSlice< i32 > for MyMany +where + i32 : Clone, +{ + fn as_slice( &self ) -> &[ i32 ] { &self[ .. ] } +} + +#[ cfg( feature = "make" ) ] +impl From_0 for MyMany +{ + fn from_0() -> Self { Self( std::vec::Vec::< i32 >::new() ) } +} + +#[ cfg( feature = "make" ) ] +impl From_1< i32 > for MyMany +{ + fn from_1( _0 : i32 ) -> Self { Self( vec![ _0 ] ) } +} + +#[ cfg( feature = "make" ) ] +impl From_2< i32, i32 > for MyMany +{ + fn from_2( _0 : i32, _1 : i32 ) -> Self { Self( vec![ _0, _1 ] ) } +} + +#[ cfg( feature = "make" ) ] +impl From_3< i32, i32, i32 > for MyMany +{ + fn from_3( _0 : i32, _1 : i32, _2 : i32 ) -> Self { Self( vec![ _0, _1, _2 ] ) } +} + +/* ... */ + +let x = MyMany::from( [ 1, 2, 3 ] ); +println!( "x : {:?}", x.0 ); +``` + +### Basic Use Case :: make - variadic constructor + +Implement traits [From_0], [From_1] up to MakeN to provide the interface to construct your structure with a different set of arguments. +In this example structure, Struct1 could be constructed either without arguments, with a single argument, or with two arguments. +- Constructor without arguments fills fields with zero. +- Constructor with a single argument sets both fields to the value of the argument. +- Constructor with 2 arguments set individual values of each field. + + + +```rust ignore +#[ cfg( feature = "make" ) ] +{ + use type_constructor::prelude::*; + + #[ derive( Debug, PartialEq ) ] + struct Struct1 + { + a : i32, + b : i32, + } + + impl From_0 for Struct1 + { + fn from_0() -> Self + { + Self { a : 0, b : 0 } + } + } + + impl From_1< i32 > for Struct1 + { + fn from_1( val : i32 ) -> Self + { + Self { a : val, b : val } + } + } + + impl From_2< i32, i32 > for Struct1 + { + fn from_2( val1 : i32, val2 : i32 ) -> Self + { + Self { a : val1, b : val2 } + } + } + + let got : Struct1 = from!(); + let exp = Struct1{ a : 0, b : 0 }; + assert_eq!( got, exp ); + + let got : Struct1 = from!( 13 ); + let exp = Struct1{ a : 13, b : 13 }; + assert_eq!( got, exp ); + + let got : Struct1 = from!( 1, 3 ); + let exp = Struct1{ a : 1, b : 3 }; + assert_eq!( got, exp ); +} +``` + +### To add to your project + +``` shell ignore +cargo add type_constructor +``` + +## Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/type_constructor_trivial +cargo run +``` diff --git a/module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/Cargo.toml new file mode 100644 index 0000000000..1927df0a7e --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_derive_and_attr" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/src/main.rs new file mode 100644 index 0000000000..fe6c18a530 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_derive_and_attr_sample/src/main.rs @@ -0,0 +1,15 @@ +use type_constructor::*; + +fn main() +{ + + types! + { + /// This is also attribute and macro understands it. + #[ derive( Debug ) ] + single MySingle : i32; + } + let x = MySingle( 13 ); + dbg!( x ); + +} diff --git a/module/postponed/type_constructor/examples/type_constructor_homopair_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_homopair_sample/Cargo.toml new file mode 100644 index 0000000000..412033aa6a --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_homopair_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_homopair" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_homopair_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_homopair_sample/src/main.rs new file mode 100644 index 0000000000..ff5451d302 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_homopair_sample/src/main.rs @@ -0,0 +1,20 @@ +use type_constructor::prelude::*; + +fn main() +{ + use core::fmt; + types! + { + #[ derive( Debug ) ] + pair MyHomoPair : < T : fmt::Debug >; + } + let x = MyHomoPair( 13, 31 ); + dbg!( &x ); + // prints : &x = MyHomoPair( 13, 31 ) + let clone_as_array : [ i32 ; 2 ] = x.clone_as_array(); + dbg!( &clone_as_array ); + // prints : &clone_as_array = [ 13, 31 ] + let clone_as_tuple : ( i32 , i32 ) = x.clone_as_tuple(); + dbg!( &clone_as_tuple ); + // prints : &clone_as_tuple = ( 13, 31 ) +} diff --git a/module/postponed/type_constructor/examples/type_constructor_many_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_many_sample/Cargo.toml new file mode 100644 index 0000000000..c2b147fce5 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_many_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_many" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_many_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_many_sample/src/main.rs new file mode 100644 index 0000000000..1278c6a05e --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_many_sample/src/main.rs @@ -0,0 +1,12 @@ +#[ allow( unused_imports ) ] +use type_constructor::prelude::*; + +fn main() +{ + #[ cfg( all( feature = "many", feature = "use_std" ) ) ] + { + types!( many MyMany : i32 ); + let x = MyMany::from( [ 1, 2, 3 ] ); + println!( "x : {:?}", x.0 ); + } +} diff --git a/module/postponed/type_constructor/examples/type_constructor_multiple_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_multiple_sample/Cargo.toml new file mode 100644 index 0000000000..e6580d648e --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_multiple_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_multiple" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_multiple_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_multiple_sample/src/main.rs new file mode 100644 index 0000000000..1bde2a438f --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_multiple_sample/src/main.rs @@ -0,0 +1,46 @@ +#[ allow( unused_imports ) ] +use type_constructor::prelude::*; + +#[ cfg( all( feature = "many", feature = "use_std" ) ) ] +types! +{ + + single MySingle : f32; + single SingleWithParametrized : std::sync::Arc< T : Copy >; + single SingleWithParameter : < T >; + + pair MyPair : f32; + pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pair PairWithParameter : < T1, T2 >; + + pair MyHomoPair : f32; + pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pair HomoPairWithParameter : < T >; + + many MyMany : f32; + many ManyWithParametrized : std::sync::Arc< T : Copy >; + many ManyWithParameter : < T >; + +} + +#[ cfg( all( feature = "many", feature = "no_std" ) ) ] +types! +{ + + single MySingle : f32; + single SingleWithParametrized : std::sync::Arc< T : Copy >; + single SingleWithParameter : < T >; + + pair MyPair : f32; + pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pair PairWithParameter : < T1, T2 >; + + pair MyHomoPair : f32; + pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pair HomoPairWithParameter : < T >; + +} + +fn main() +{ +} diff --git a/module/postponed/type_constructor/examples/type_constructor_pair_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_pair_sample/Cargo.toml new file mode 100644 index 0000000000..14f0b38705 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_pair_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_pair" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_pair_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_pair_sample/src/main.rs new file mode 100644 index 0000000000..cd6523e162 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_pair_sample/src/main.rs @@ -0,0 +1,16 @@ +use type_constructor::prelude::*; + +fn main() +{ + + use core::fmt; + types! + { + #[ derive( Debug ) ] + pair MyPair : < T1 : fmt::Debug, T2 : fmt::Debug >; + } + let x = MyPair( 13, 13.0 ); + dbg!( x ); + // prints : x = MyPair( 13, 13.0 ) + +} diff --git a/module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/Cargo.toml new file mode 100644 index 0000000000..8949363292 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_parametrized_element" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/src/main.rs new file mode 100644 index 0000000000..52320a3f9a --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_parametrized_element_sample/src/main.rs @@ -0,0 +1,14 @@ +use type_constructor::*; + +fn main() +{ + + types! + { + #[ derive( Debug ) ] + single MySingle : std::sync::Arc< T : Copy >; + } + let x = MySingle( std::sync::Arc::new( 13 ) ); + dbg!( x ); + +} diff --git a/module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/Cargo.toml new file mode 100644 index 0000000000..66f78c5394 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_parametrized_tuple" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/src/main.rs new file mode 100644 index 0000000000..f7946fda7e --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_parametrized_tuple_sample/src/main.rs @@ -0,0 +1,15 @@ +use type_constructor::*; + +fn main() +{ + + types! + { + #[ derive( Debug ) ] + single MySingle : < T : Copy >; + } + let x = MySingle( 13 ); + dbg!( x ); + +} + diff --git a/module/postponed/type_constructor/examples/type_constructor_struct_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_struct_sample/Cargo.toml new file mode 100644 index 0000000000..bb9a9f8c86 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_struct_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_struct" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_struct_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_struct_sample/src/main.rs new file mode 100644 index 0000000000..d816f7594d --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_struct_sample/src/main.rs @@ -0,0 +1,9 @@ +use type_constructor::*; + +fn main() +{ + + let x = Single::< i32 >( 13 ); + dbg!( x ); + +} diff --git a/module/postponed/type_constructor/examples/type_constructor_trivial_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_trivial_sample/Cargo.toml new file mode 100644 index 0000000000..db0d985220 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_trivial_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_trivial" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_trivial_sample/Readme.md b/module/postponed/type_constructor/examples/type_constructor_trivial_sample/Readme.md new file mode 100644 index 0000000000..be4c40c148 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_trivial_sample/Readme.md @@ -0,0 +1,5 @@ +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Ftype_constructor_trivial,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/type_constructor) diff --git a/module/postponed/type_constructor/examples/type_constructor_trivial_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_trivial_sample/src/main.rs new file mode 100644 index 0000000000..54f618d0cd --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_trivial_sample/src/main.rs @@ -0,0 +1,47 @@ + +fn main() +{ + use type_constructor::*; + + mod mod1 + { + + #[ derive( Debug, Clone, PartialEq, Eq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + + } + + types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq, Eq ) ] + pair Pair : + mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >, + std::sync::Arc< T : Copy >, + ; + } + +} diff --git a/module/postponed/type_constructor/examples/type_constructor_without_macro_sample/Cargo.toml b/module/postponed/type_constructor/examples/type_constructor_without_macro_sample/Cargo.toml new file mode 100644 index 0000000000..77951ed7a8 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_without_macro_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "type_constructor_without_macro" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +type_constructor = { workspace = true } diff --git a/module/postponed/type_constructor/examples/type_constructor_without_macro_sample/src/main.rs b/module/postponed/type_constructor/examples/type_constructor_without_macro_sample/src/main.rs new file mode 100644 index 0000000000..0ee3f4d874 --- /dev/null +++ b/module/postponed/type_constructor/examples/type_constructor_without_macro_sample/src/main.rs @@ -0,0 +1,21 @@ + +fn main() +{ + + let i32_in_tuple = type_constructor::Single::< i32 >::from( 13 ); + dbg!( i32_in_tuple ); + // i32_in_tuple = Single( 13 ) + let i32_and_f32_in_tuple = type_constructor::Pair::< i32, f32 >::from( ( 13, 13.0 ) ); + dbg!( i32_and_f32_in_tuple ); + // vec_of_i32_in_tuple = Pair( 13, 13.0 ) + let two_i32_in_tuple = type_constructor::HomoPair::< i32 >::from( ( 13, 31 ) ); + dbg!( two_i32_in_tuple ); + // vec_of_i32_in_tuple = HomoPair( 13, 31 ) + #[ cfg( all( feature = "many", feature = "use_std" ) ) ] + { + let vec_of_i32_in_tuple = type_constructor::Many::< i32 >::from( [ 1, 2, 3 ] ); + dbg!( vec_of_i32_in_tuple ); + // vec_of_i32_in_tuple = Many([ 1, 2, 3 ]) + } + +} diff --git a/module/postponed/type_constructor/src/lib.rs b/module/postponed/type_constructor/src/lib.rs new file mode 100644 index 0000000000..600458bfd0 --- /dev/null +++ b/module/postponed/type_constructor/src/lib.rs @@ -0,0 +1,96 @@ + +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico")] +#![ doc( html_root_url = "https://docs.rs/type_constructor/latest/type_constructor/")] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Type constructors of fundamental data types. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +pub use derive_tools::{ From_0, From_1, From_2, From_3, from }; + +/// Temporary workaround. +#[ macro_export ] +macro_rules! _if_from +{ + ( $( $code:tt )* ) + => + { + $( $code )* + }; +} + +// #![ without_std ] + +// #[ cfg( feature = "no_std" ) ] +// extern crate core as std; +// #[ cfg( all( feature = "no_std", feature = "use_alloc" ) ) ] +// extern crate alloc; + +// #[ path = "./inc.rs" ] +// mod inc; +// pub mod type_constuctor; +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use inc::*; + + +#[ cfg( feature = "enabled" ) ] +pub mod type_constuctor; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + pub use super::type_constuctor::protected::*; +} + +/// Shared with parent namespace of the module +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + pub use super::type_constuctor::orphan::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::type_constuctor::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + pub use super::type_constuctor::prelude::*; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/enumerable.rs b/module/postponed/type_constructor/src/type_constuctor/enumerable.rs new file mode 100644 index 0000000000..31b7e3b352 --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/enumerable.rs @@ -0,0 +1,281 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + // zzz : use type_constructor::Enumberable for indexed access to color components + + /// + /// Has length and indexed access. + /// + + pub trait Enumerable + { + /// Type of an element. + type Element; + /// Length. + fn len( &self ) -> usize; + /// Get element by reference. + #[ inline ] + fn element( &self, index : usize ) -> &Self::Element + { + self.element_ref( index ) + } + /// Get element by reference. + fn element_ref( &self, index : usize ) -> &Self::Element; + /// Get element copying it. + fn element_copy( &self, index : usize ) -> Self::Element; + } + + /// + /// Has length and indexed access, including mutable access. + /// + + pub trait EnumerableMut + where + Self : Enumerable, + { + + // fn element_mut2( &mut self, index : usize ) -> &mut < Self as Enumerable >::Element; + + /// Get element by mutable reference. + // fn element_mut( &mut self, index : usize ) -> &mut < Self as Enumerable >::Element; + // where + // Self : 'static + // ; + fn element_mut< 'slf, 'element >( &'slf mut self, index : usize ) -> &'element mut < Self as Enumerable >::Element + where + 'element : 'slf + ; + + } + + /// Iterate enumerable consuming it. + pub trait IterateEnumerableConsuming + { + /// Type of an element. + type Element; + /// Type of iterator. + type Iterator : Iterator< Item = Self::Element >; + /// Iterate consuming. + fn enumerable_iterate_consuming( self ) -> Self::Iterator; + } + + /// Iterate enumerable consuming non-consuming it. + pub trait IterateEnumerable + { + /// Type of an element. + type Element; + /// Type of iterator. + type Iterator : Iterator< Item = Self::Element >; + /// Iterate non-consuming. + fn enumerable_iterate( self ) -> Self::Iterator; + } + + impl< E > IterateEnumerableConsuming for E + where + E : Enumerable, + { + type Element = < E as Enumerable >::Element; + type Iterator = EnumerableIteratorCopy< Self >; + fn enumerable_iterate_consuming( self ) -> Self::Iterator + { + EnumerableIteratorCopy::new( self ) + } + } + + impl< 'a, E > IterateEnumerable for &'a E + where + E : Enumerable, + { + type Element = &'a < E as Enumerable >::Element; + type Iterator = EnumerableIteratorRef< 'a, E >; + fn enumerable_iterate( self ) -> Self::Iterator + { + EnumerableIteratorRef::new( self ) + } + } + + /// Iterator for enumerable. + + #[ derive( Debug ) ] + pub struct EnumerableIteratorCopy< En > + where + En : Enumerable, + { + ins : En, + last_index : usize, + } + + impl< En > EnumerableIteratorCopy< En > + where + En : Enumerable, + { + /// Constructor. + pub fn new( ins : En ) -> Self + { + Self { ins, last_index : 0 } + } + } + + impl< En > Iterator + for EnumerableIteratorCopy< En > + where + En : Enumerable, + { + type Item = En::Element; + fn next( &mut self ) -> Option< Self::Item > + { + if self.last_index < self.ins.len() + { + self.last_index += 1; + Some( self.ins.element_copy( self.last_index - 1 ) ) + } + else + { + None + } + } + } + + /// + /// Ref iterator for enumerable. + /// + + #[ derive( Debug ) ] + pub struct EnumerableIteratorRef< 'a, En > + where + En : Enumerable, + { + ins : &'a En, + last_index : usize, + } + + impl< 'a, En > EnumerableIteratorRef< 'a, En > + where + En : Enumerable, + { + /// Constructor. + pub fn new( ins : &'a En ) -> Self + { + Self { ins, last_index : 0 } + } + } + + impl< 'a, En > Iterator + for EnumerableIteratorRef< 'a, En > + where + En : Enumerable, + { + type Item = &'a En::Element; + fn next( &mut self ) -> Option< Self::Item > + { + if self.last_index < self.ins.len() + { + self.last_index += 1; + Some( self.ins.element( self.last_index - 1 ) ) + } + else + { + None + } + } + } + + /// + /// Mut iterator for enumerable. + /// + + #[ derive( Debug ) ] + pub struct EnumerableIteratorMut< 'a, En > + where + En : EnumerableMut + 'static, + { + ins : &'a mut En, + last_index : usize, + } + + impl< 'a, En > EnumerableIteratorMut< 'a, En > + where + En : EnumerableMut + 'static, + { + /// Constructor. + pub fn new( ins : &'a mut En ) -> Self + { + Self { ins, last_index : 0 } + } + } + + impl< 'a, En > Iterator + for EnumerableIteratorMut< 'a, En > + where + En : EnumerableMut + 'static, + { + type Item = &'a mut < En as Enumerable >::Element; + fn next( &mut self ) -> Option< Self::Item > + // where + // Self : 'a, + { + if self.last_index < self.ins.len() + { + self.last_index += 1; + Some( self.ins.element_mut( self.last_index - 1 ) ) + } + else + { + None + } + } + } + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + EnumerableIteratorCopy, + EnumerableIteratorRef, + EnumerableIteratorMut, + }; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Enumerable, + EnumerableMut, + IterateEnumerableConsuming, + IterateEnumerable, + }; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/helper.rs b/module/postponed/type_constructor/src/type_constuctor/helper.rs new file mode 100644 index 0000000000..e671e69bbc --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/helper.rs @@ -0,0 +1,78 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::exposed::*; + + /// + /// Generate code only if feature::make is enabled. + /// + /// Do not use manually. + /// + + #[ cfg( feature = "make" ) ] + #[ macro_export ] + macro_rules! _if_make + { + ( $( $Rest : tt )* ) => + { + $( $Rest )* + }; + } + + /// + /// Generate code only if feature::make is disabled. + /// + /// Do not use manually. + /// + + #[ cfg( not( feature = "make" ) ) ] + #[ macro_export ] + macro_rules! _if_make + { + ( $( $Rest : tt )* ) => + { + }; + } + + pub use _if_make; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + _if_make, + }; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/make.rs b/module/postponed/type_constructor/src/type_constuctor/make.rs new file mode 100644 index 0000000000..17ad9add6b --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/make.rs @@ -0,0 +1,290 @@ +// /// Internal namespace. +// #[ cfg( feature = "make" ) ] +// pub( crate ) mod private +// { +// +// /// +// /// Constructor without arguments. +// /// +// +// pub trait From_0 +// where +// Self : Sized, +// { +// /// Constructor without arguments. +// fn make() -> Self +// { +// Self::from_0() +// } +// /// Constructor without arguments. +// fn from_0() -> Self; +// } +// +// // xxx : auto impl from Default, please +// +// /// +// /// Constructor with single argument. +// /// +// +// pub trait From_1< Arg > +// where +// Self : Sized, +// { +// /// Constructor without arguments. +// fn make( arg : Arg ) -> Self +// { +// Self::from_1( arg ) +// } +// /// Constructor without arguments. +// fn from_1( arg : Arg ) -> Self; +// } +// +// /// +// /// Constructor with two arguments. +// /// +// +// pub trait From_2< Arg1, Arg2 > +// where +// Self : Sized, +// { +// /// Constructor with two arguments. +// fn make( arg1 : Arg1, arg2 : Arg2 ) -> Self +// { +// Self::from_2( arg1, arg2 ) +// } +// /// Constructor with two arguments. +// fn from_2( arg1 : Arg1, arg2 : Arg2 ) -> Self; +// } +// +// /// +// /// Constructor with three arguments. +// /// +// +// pub trait From_3< Arg1, Arg2, Arg3 > +// where +// Self : Sized, +// { +// /// Constructor with three arguments. +// fn make( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3 ) -> Self +// { +// Self::from_3( arg1, arg2, arg3 ) +// } +// /// Constructor with three arguments. +// fn from_3( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3 ) -> Self; +// } +// +// // /// +// // /// Constructor with four arguments. +// // /// +// // +// // pub trait From_4< Arg1, Arg2, Arg3, Arg4 > +// // where +// // Self : Sized, +// // { +// // /// Constructor with four arguments. +// // fn make( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3, arg4 : Arg4 ) -> Self +// // { +// // Self::from_4( arg1, arg2, arg3, arg4 ) +// // } +// // /// Constructor with four arguments. +// // fn from_4( arg1 : Arg1, arg2 : Arg2, arg3 : Arg3, arg4 : Arg4 ) -> Self; +// // } +// +// /// +// /// Variadic constructor. +// /// +// /// Implement traits [From_0], [From_1] up to MakeN to provide the interface to construct your structure with a different set of arguments. +// /// In this example structure, Struct1 could be constructed either without arguments, with a single argument, or with two arguments. +// /// - Constructor without arguments fills fields with zero. +// /// - Constructor with a single argument sets both fields to the value of the argument. +// /// - Constructor with 2 arguments set individual values of each field. +// /// +// /// ```rust +// /// #[ cfg( feature = "make" ) ] +// /// { +// /// use type_constructor::prelude::*; +// /// +// /// #[ derive( Debug, PartialEq ) ] +// /// struct Struct1 +// /// { +// /// a : i32, +// /// b : i32, +// /// } +// /// +// /// impl From_0 for Struct1 +// /// { +// /// fn from_0() -> Self +// /// { +// /// Self { a : 0, b : 0 } +// /// } +// /// } +// /// +// /// impl From_1< i32 > for Struct1 +// /// { +// /// fn from_1( val : i32 ) -> Self +// /// { +// /// Self { a : val, b : val } +// /// } +// /// } +// /// +// /// impl From_2< i32, i32 > for Struct1 +// /// { +// /// fn from_2( val1 : i32, val2 : i32 ) -> Self +// /// { +// /// Self { a : val1, b : val2 } +// /// } +// /// } +// /// +// /// let got : Struct1 = from!(); +// /// let exp = Struct1{ a : 0, b : 0 }; +// /// assert_eq!( got, exp ); +// /// +// /// let got : Struct1 = from!( 13 ); +// /// let exp = Struct1{ a : 13, b : 13 }; +// /// assert_eq!( got, exp ); +// /// +// /// let got : Struct1 = from!( 1, 3 ); +// /// let exp = Struct1{ a : 1, b : 3 }; +// /// assert_eq!( got, exp ); +// /// } +// /// +// /// ``` +// /// +// /// ### To add to your project +// /// +// /// ``` shell +// /// cargo add type_constructor +// /// ``` +// /// +// /// ## Try out from the repository +// /// +// /// ``` shell test +// /// git clone https://github.com/Wandalen/wTools +// /// cd wTools +// /// cd examples/type_constructor_trivial +// /// cargo run +// /// ``` +// +// #[ macro_export ] +// macro_rules! make +// { +// +// ( +// $(,)? +// ) +// => +// { +// $crate::From_0::from_0(); +// }; +// +// ( +// $Arg1 : expr $(,)? +// ) +// => +// { +// $crate::From_1::from_1( $Arg1 ); +// }; +// +// ( +// $Arg1 : expr, $Arg2 : expr $(,)? +// ) +// => +// { +// $crate::From_2::from_2( $Arg1, $Arg2 ); +// }; +// +// ( +// $Arg1 : expr, $Arg2 : expr, $Arg3 : expr $(,)? +// ) +// => +// { +// $crate::From_3::from_3( $Arg1, $Arg2, $Arg3 ); +// }; +// +// // ( +// // $Arg1 : expr, $Arg2 : expr, $Arg3 : expr, $Arg4 : expr $(,)? +// // ) +// // => +// // { +// // $crate::From_4::from_4( $Arg1, $Arg2, $Arg3, $Arg4 ); +// // }; +// +// ( +// $( $Rest : tt )+ +// ) +// => +// { +// compile_error! +// ( +// concat! +// ( +// "Variadic constructor supports up to 3 arguments.\n", +// "Open an issue if you need more.\n", +// "You passed:\n", +// stringify! +// ( +// from!( $( $Rest )+ ) +// ) +// ) +// ); +// }; +// +// } +// +// pub use make; +// } +// +// /// Protected namespace of the module. +// pub mod protected +// { +// #[ doc( inline ) ] + // #[ allow( unused_imports ) ] +// pub use super::orphan::*; +// } +// +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use protected::*; +// +// /// Orphan namespace of the module. +// pub mod orphan +// { +// #[ doc( inline ) ] + // #[ allow( unused_imports ) ] +// pub use super::exposed::*; +// } +// +// /// Exposed namespace of the module. +// pub mod exposed +// { +// #[ doc( inline ) ] + // #[ allow( unused_imports ) ] +// pub use super::prelude::*; +// } +// +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use exposed::*; +// +// /// Prelude to use essentials: `use my_module::prelude::*`. +// pub mod prelude +// { +// #[ cfg( feature = "make" ) ] +// #[ doc( inline ) ] + // // #[ allow( unused_imports ) ] +// pub use super::private:: +// { +// +// From_0, +// From_1, +// From_2, +// From_3, +// // From_4, +// +// make, +// +// }; +// +// #[ cfg( feature = "make" ) ] +// pub use type_constructor_make_meta::VariadicFrom; +// } diff --git a/module/postponed/type_constructor/src/type_constuctor/many.rs b/module/postponed/type_constructor/src/type_constuctor/many.rs new file mode 100644 index 0000000000..0544dac8c0 --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/many.rs @@ -0,0 +1,591 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::exposed::*; + + #[ cfg( feature = "no_std" ) ] + extern crate core; + #[ cfg( all( feature = "no_std", feature = "use_alloc" ) ) ] + extern crate alloc; + + #[ cfg( any( not( feature = "no_std" ), not( feature = "use_alloc" ) ) ) ] + /// Alias of Vec for internal usage. + pub use std::vec::Vec as _Vec; + #[ cfg( all( feature = "no_std", feature = "use_alloc" ) ) ] + /// Alias of Vec for internal usage. + pub use alloc::vec::Vec as _Vec; + + /// Alias of Vec for internal usage. + #[ macro_export ] + macro_rules! _vec + { + ( $( $Rest:tt )* ) + => + {{ + let result; + #[ cfg( any( not( feature = "no_std" ), not( feature = "use_alloc" ) ) ) ] + { + result = std::vec!( $( $Rest )* ); + } + #[ cfg( all( feature = "no_std", feature = "use_alloc" ) ) ] + { + extern crate alloc; + result = alloc::vec!( $( $Rest )* ); + } + result + }} + } + + /// + /// Type constructor of many. + /// + /// Should not be used directly. Instead use macro [crate::types!]. + /// Type constructor `many` is available if eiter feature `use_std` or feature `use_alloc` is enabled. Also feature `many` should be enabled. + /// + + #[ macro_export ] + macro_rules! _many + { + + // many Many : < T >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis many $Name : ident : + < $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? > + $( ; $( $Rest : tt )* )? + ) + => + { + $( #[ $Meta ] )* + $Vis struct $Name + < $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + ( pub $crate::_Vec< $ParamName > ); + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > core::ops::Deref + for $Name + < $ParamName > + { + type Target = $crate::_Vec< $ParamName >; + #[ inline ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > core::ops::DerefMut + for $Name + < $ParamName > + { + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + // impl< Collection > From< Collection > for Polygons + // where + // Collection : IntoIterator< Item = Polygon >, + // { + // fn from( src : Collection ) -> Self + // { + // Self( src.into_iter().collect::< Vec< Polygon > >() ) + // } + // } + // zzz + + impl< Collection, IntoT, $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< Collection > + for $Name< $ParamName > + where + Collection : IntoIterator< Item = IntoT >, + IntoT : Into< $ParamName >, + { + #[ inline ] + fn from( src : Collection ) -> Self + { + Self( src.into_iter().map( | e | e.into() ).collect::< $crate::_Vec< $ParamName > >() ) + } + } + +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// From< $ParamName > +// for $Name< $ParamName > +// { +// #[ inline ] +// fn from( src : $ParamName ) -> Self +// { +// Self( $crate::_vec![ src ] ) +// } +// } +// +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// From< &$ParamName > +// for $Name +// < $ParamName > +// where +// $ParamName : Clone, +// { +// #[ inline ] +// fn from( src : &$ParamName ) -> Self +// { +// Self( $crate::_vec![ src.clone() ] ) +// } +// } +// +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// From< ( $ParamName, ) > +// for $Name +// < $ParamName > +// { +// #[ inline ] +// fn from( src : ( $ParamName, ) ) -> Self +// { +// Self( $crate::_vec![ src.0 ] ) +// } +// } +// +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )?, const N : usize > +// From< [ $ParamName ; N ] > +// for $Name +// < $ParamName > +// { +// #[ inline ] +// fn from( src : [ $ParamName ; N ] ) -> Self +// { +// Self( $crate::_Vec::from( src ) ) +// } +// } +// +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// From< &[ $ParamName ] > +// for $Name +// < $ParamName > +// where +// $ParamName : Clone, +// { +// #[ inline ] +// fn from( src : &[ $ParamName ] ) -> Self +// { +// Self( $crate::_Vec::from( src ) ) +// } +// } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + $crate::AsSlice< $ParamName > + for $Name < $ParamName > + { + #[ inline ] + fn as_slice( &self ) -> &[ $ParamName ] + { + &self[ .. ] + } + } + + $crate::_if_from! + { + +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// $crate::From_0 +// for $Name < $ParamName > +// { +// #[ inline ] +// fn from_0() -> Self +// { +// Self( $crate::_Vec::new() ) +// } +// } +// +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// $crate::From_1< $ParamName > +// for $Name < $ParamName > +// { +// #[ inline ] +// fn from_1( _0 : $ParamName ) -> Self +// { +// Self( $crate::_vec![ _0 ] ) +// } +// } + +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// $crate::From_2< $ParamName, $ParamName > +// for $Name < $ParamName > +// { +// #[ inline ] +// fn from_2( _0 : $ParamName, _1 : $ParamName ) -> Self +// { +// Self( $crate::_vec![ _0, _1 ] ) +// } +// } +// +// impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > +// $crate::From_3< $ParamName, $ParamName, $ParamName > +// for $Name < $ParamName > +// { +// #[ inline ] +// fn from_3( _0 : $ParamName, _1 : $ParamName, _2 : $ParamName ) -> Self +// { +// Self( $crate::_vec![ _0, _1, _2 ] ) +// } +// } + + } + + $crate::types!{ $( $( $Rest )* )? } + }; + + // many Many : < T1, ... >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis many $Name : ident : + < $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? , + $( $Rest : tt )* + ) + => + { + compile_error! + ( + concat! + ( + "Parametrized element should be single, because Many has only one element\n", + stringify! + ( + $( #[ $Meta ] )* + $Vis many $Name : + < $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? , + $( $Rest )* + ) + ) + ); + }; + + // many Many : Element< T1, T2, ... >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis many $Name : ident : $TypeSplit1 : ident $( :: $TypeSplitN : ident )* + $( < $( $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? ),* > )? + $( ; $( $Rest : tt )* )? + ) + => + { + $( #[ $Meta ] )* + $Vis struct $Name + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + ( pub $crate::_Vec< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > ); + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + core::ops::Deref + for $Name + $( < $( $ParamName ),* > )? + { + type Target = $crate::_Vec< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? >; + #[ inline ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + core::ops::DerefMut + for $Name + $( < $( $ParamName ),* > )? + { + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + impl + < Collection, Item, $( $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* )? > + From< Collection > + for $Name + $( < $( $ParamName ),* > )? + where + Collection : IntoIterator< Item = Item >, + Item : Into< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? >, + { + #[ inline ] + fn from( src : Collection ) -> Self + { + let src2 = src + .into_iter() + .map( | e | e.into() ) + .collect::< $crate::_Vec< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > >(); + Self( src2 ) + } + } + + // impl + // < 'a, Collection, $( $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* )? > + // From< Collection > + // for $Name + // $( < $( $ParamName ),* > )? + // where + // Collection : IntoIterator< Item = &'a $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? >, + // { + // #[ inline ] + // fn from( src : Collection ) -> Self + // { + // let src2 = src + // .into_iter() + // .map( | e | *e ) + // .collect::< $crate::_Vec< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > >(); + // Self( src2 ) + // } + // } + + // yyy +// impl +// $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? +// From +// < $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > +// for $Name +// $( < $( $ParamName ),* > )? +// { +// #[ inline ] +// fn from( src : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ) -> Self +// { +// Self( $crate::_vec![ src ] ) +// } +// } +// +// impl +// < __FromRef $( , $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* )? > +// From +// < &__FromRef > +// for $Name +// $( < $( $ParamName ),* > )? +// where +// __FromRef : Clone, +// Self : From< __FromRef >, +// { +// #[ inline ] +// fn from( src : &__FromRef ) -> Self +// { +// From::from( ( *src ).clone() ) +// } +// } +// +// impl +// $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? +// From +// < ( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? , ) > +// for $Name +// $( < $( $ParamName ),* > )? +// { +// #[ inline ] +// fn from( src : ( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? , ) ) -> Self +// { +// Self( $crate::_vec![ src.0 ] ) +// } +// } +// +// impl +// < $( $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? , )* )? const N : usize > +// From +// < [ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ; N ] > +// for $Name +// $( < $( $ParamName ),* > )? +// { +// #[ inline ] +// fn from( src : [ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ; N ] ) -> Self +// { +// Self( $crate::_Vec::from( src ) ) +// } +// } +// +// impl +// $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? +// From +// < &[ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ] > +// for $Name +// $( < $( $ParamName ),* > )? +// where +// $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? : Clone, +// { +// #[ inline ] +// fn from( src : &[ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ] ) -> Self +// { +// Self( $crate::_Vec::from( src ) ) +// } +// } + // yyy + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::AsSlice< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn as_slice( &self ) -> &[ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ] + { + &self[ .. ] + } + } + + $crate::_if_from! + { + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::From_0 + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from_0() -> Self + { + Self( $crate::_Vec::< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? >::new() ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::From_1< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from_1 + ( + _0 : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + ) + -> Self + { + Self( $crate::_vec![ _0 ] ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::From_2 + < + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from_2 + ( + _0 : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + _1 : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + ) + -> Self + { + Self( $crate::_vec![ _0, _1 ] ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::From_3 + < + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from_3 + ( + _0 : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + _1 : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + _2 : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, + ) + -> Self + { + Self( $crate::_vec![ _0, _1, _2 ] ) + } + } + + } + + $crate::types!{ $( $( $Rest )* )? } + }; + + } + + types! + { + + /// + /// Type constructor to wrap a vector. + /// + /// ### Basic use-case. + /// ```rust + /// let vec_of_i32_in_tuple = type_constructor::Many::< i32 >::from( [ 1, 2, 3 ] ); + /// dbg!( vec_of_i32_in_tuple ); + /// // vec_of_i32_in_tuple = Many([ 1, 2, 3 ]) + /// ``` + /// + + #[ derive( Debug, Clone, PartialEq, Eq, Default ) ] + pub many Many : < T >; + + } + + pub use _vec; + pub use _many; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + _many, + _vec, + _Vec, + }; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Many, + }; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/mod.rs b/module/postponed/type_constructor/src/type_constuctor/mod.rs new file mode 100644 index 0000000000..df047d149f --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/mod.rs @@ -0,0 +1,168 @@ +//! +//! Type constructors of fundamental data types. +//! + +/// Type constructor of many. +#[ cfg +( + all + ( + feature = "many", + any( not( feature = "no_std" ), feature = "use_alloc" ), + ) +)] +pub mod many; +/// Type constructor of many. +#[ cfg +( + any + ( + not( feature = "many" ), + all( feature = "no_std", not( feature = "use_alloc" ) ), + ) +)] +#[ path = "./no_many.rs" ] +pub mod many; + +/// Type constructor of pair. +pub mod pair; +/// Type constructor of single. +pub mod single; +/// Type constructors. +pub mod types; +/// Macro helpers. +pub mod helper; + +/// From/Into traits. +#[ cfg( feature = "vectorized_from" ) ] +pub mod vectorized_from; +/// Generic traits. +pub mod traits; +/// Traits Enumerable. +pub mod enumerable; +/// Variadic constructor. +#[ cfg( feature = "make" ) ] +pub mod make; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::many::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::pair::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::single::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::types::orphan::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "vectorized_from" ) ] + pub use super::vectorized_from::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::helper::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::traits::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::enumerable::orphan::*; + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // #[ cfg( feature = "make" ) ] + // pub use super::make::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::many::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::pair::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::single::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::types::exposed::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "vectorized_from" ) ] + pub use super::vectorized_from::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::helper::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::traits::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::enumerable::exposed::*; + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // #[ cfg( feature = "make" ) ] + // pub use super::make::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::many::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::pair::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::single::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::types::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( feature = "vectorized_from" ) ] + pub use super::vectorized_from::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::helper::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::traits::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::enumerable::prelude::*; + // #[ doc( inline ) ] + // #[ allow( unused_imports ) ] + // #[ cfg( feature = "make" ) ] + // pub use super::make::prelude::*; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/no_many.rs b/module/postponed/type_constructor/src/type_constuctor/no_many.rs new file mode 100644 index 0000000000..8e615be58b --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/no_many.rs @@ -0,0 +1,71 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Type constructor of many. + /// + /// Should not be used directly. Instead use macro [crate::types!]. + /// Type constructor `many` is available if eiter feature `use_std` or feature `use_alloc` is enabled. Also feature `many` should be enabled. + /// + + #[ macro_export ] + macro_rules! _many + { + ( $( $Rest:tt )* ) + => + { + compile_error! + ( + concat! + ( + "! Type constructor `many` is available if eiter feature `use_std` or feature `use_alloc` is enabled. Also feature `many` should be enabled.\n", + ) + ); + } + } + + pub use _many; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + _many, + }; + +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/postponed/type_constructor/src/type_constuctor/pair.rs b/module/postponed/type_constructor/src/type_constuctor/pair.rs new file mode 100644 index 0000000000..18dfb74a30 --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/pair.rs @@ -0,0 +1,244 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::exposed::*; + + /// + /// Pair type constructor. + /// + /// Should not be used directly. Instead use macro [crate::types!]. + /// + + #[ macro_export ] + macro_rules! _pair + { + + // pair Pair : < T1, T2 >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis pair $Name : ident : + < + $ParamName1 : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy1x2 : path )* )?, + $ParamName2 : ident $( : $ParamTy2x1 : ident $( :: $ParamTy2xN : ident )* $( + $ParamTy2x2 : path )* )? $(,)? + > + $( ; $( $Rest : tt )* )? + ) + => + { + // #[ derive( type_constructor_meta::Pair ) ] + $( #[ $Meta ] )* + $Vis struct $Name + < + $ParamName1 $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy1x2 )* )?, + $ParamName2 $( : $ParamTy2x1 $( :: $ParamTy2xN )* $( + $ParamTy2x2 )* )?, + > + ( pub $ParamName1, pub $ParamName2 ); + + // From Pair Into Element cant be implemented because of Rust restructions. + + $crate::types!{ $( $( $Rest )* )? } + }; + + // pair Pair : < T1, T2, ... >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis pair $Name : ident : + < + $ParamName1 : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy1x3 : path )* )?, + $ParamName2 : ident $( : $ParamTy2x1 : ident $( :: $ParamTy2xN : ident )* $( + $ParamTy2x3 : path )* )?, + $ParamName3 : ident + $( $Rest : tt )* + ) + => + { + compile_error! + ( + concat! + ( + "Parametrized element should be pair and have either two or single elements\n", + stringify! + ( + $( #[ $Meta ] )* + $Vis pair $Name : + < + $ParamName1 $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy1x2 )* )?, + $ParamName2 $( : $ParamTy2x1 $( :: $ParamTy2xN )* $( + $ParamTy2x2 )* )?, + $ParamName3 + $( $Rest )* + ) + ) + ); + }; + + // pair Pair : Element1< T1, T2, ... >, Element2< T1, T2, ... >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis pair $Name : ident + : + $TypeSplit1x1 : ident $( :: $TypeSplit1xN : ident )* + $( < $( $( $ParamName1 : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy1x2 : path )* )? ),+ )? > )? + , + $TypeSplit2x1 : ident $( :: $TypeSplit2xN : ident )* + $( < $( $ParamName2 : ident $( : $ParamTy2x1 : ident $( :: $ParamTy2xN : ident )* $( + $ParamTy2x2 : path )* )? ),* > )? + $(,)? + $( ; $( $Rest : tt )* )? + ) + => + { + // #[ derive( type_constructor_meta::Pair ) ] + $( #[ $Meta ] )* + $Vis struct $Name + < + $( $( $( $ParamName1 $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy1x2 )* )? ),+ , )? )? + $( $( $ParamName2 $( : $ParamTy2x1 $( :: $ParamTy2xN )* $( + $ParamTy2x2 )* )? ),* )? + > + ( + pub $TypeSplit1x1 $( :: $TypeSplit1xN )* < $( $( $( $ParamName1 ),+ )? )? >, + pub $TypeSplit2x1 $( :: $TypeSplit2xN )* < $( $( $ParamName2 ),* )? >, + ); + + $crate::types!{ $( $( $Rest )* )? } + }; + + // pair Pair : < T1 >; // homopair + + ( + $( #[ $Meta : meta ] )* + $Vis : vis pair $Name : ident : + < + $ParamName1 : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy1x2 : path )* )? $(,)? + > + $( ; $( $Rest : tt )* )? + ) + => + { + // #[ derive( type_constructor_meta::Pair ) ] + $( #[ $Meta ] )* + $Vis struct $Name + < + $ParamName1 $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy1x2 )* )? + > + ( pub $ParamName1, pub $ParamName1 ); + + $crate::types!{ $( $( $Rest )* )? } + }; + + // pair Pair : Element1< T1, T2, ... >; // homopair + + ( + $( #[ $Meta : meta ] )* + $Vis : vis pair $Name : ident + : + $TypeSplit1x1 : ident $( :: $TypeSplit1xN : ident )* + $( < $( $( $ParamName1 : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy1x2 : path )* )? ),+ )? > )? + $(,)? + $( ; $( $Rest : tt )* )? + ) + => + { + // #[ derive( type_constructor_meta::Pair ) ] + $( #[ $Meta ] )* + $Vis struct $Name + < + $( $( $( $ParamName1 $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy1x2 )* )? ),+ )? )? + > + ( + pub $TypeSplit1x1 $( :: $TypeSplit1xN )* < $( $( $( $ParamName1 ),+ )? )? >, + pub $TypeSplit1x1 $( :: $TypeSplit1xN )* < $( $( $( $ParamName1 ),+ )? )? >, + ); + + $crate::types!{ $( $( $Rest )* )? } + }; + } + + // + + // trace_macros!( true ); + types! + { + + /// + /// Type constructor to wrap two types into a tuple. + /// + /// ### Basic use-case. + /// ```ignore + /// let i32_and_f32_in_tuple = type_constructor::Pair::< i32, f32 >::from( ( 13, 13.0 ) ); + /// dbg!( i32_and_f32_in_tuple ); + /// // let vec_of_i32_in_tuple = type_constructor::Pair::< i32, f32 >::from( [ 13, 13.0 ] ); + /// ``` + /// + + #[ derive( Debug, Clone, PartialEq, Eq, Default ) ] + pub pair Pair : < T1, T2 >; + + /// + /// Type constructor to wrap pair of the same type. + /// + /// ### Basic use-case. + /// ```ignore + /// let two_i32_in_tuple = type_constructor::HomoPair::< i32 >::from( ( 13, 31 ) ); + /// dbg!( two_i32_in_tuple ); + /// let vec_of_i32_in_tuple = type_constructor::HomoPair::< i32 >::from( [ 13, 31 ] ); + /// ``` + /// + + #[ derive( Debug, Clone, PartialEq, Eq, Default ) ] + pub pair HomoPair : < T >; + + } + // trace_macros!( false ); + + pub use _pair; + // pub use type_constructor_meta; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + _pair, + }; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Pair, + HomoPair, + // type_constructor_meta, + }; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/single.rs b/module/postponed/type_constructor/src/type_constuctor/single.rs new file mode 100644 index 0000000000..23aecddbc7 --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/single.rs @@ -0,0 +1,577 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::exposed::*; + + /// + /// Type constructor of single. + /// + /// Should not be used directly. Instead use macro [crate::types!]. + /// + + #[ macro_export ] + macro_rules! _single + { + + // pub single Single : < T >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis single $Name : ident : + < $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? > + $( ; $( $Rest : tt )* )? + ) + => + { + $( #[ $Meta ] )* + $Vis struct $Name + < $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + ( pub $ParamName ); + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > core::ops::Deref + for $Name + < $ParamName > + { + type Target = $ParamName; + #[ inline ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > core::ops::DerefMut + for $Name + < $ParamName > + { + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< $ParamName > + for $Name + < $ParamName > + { + #[ inline ] + fn from( src : $ParamName ) -> Self + { + Self( src ) + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< &$ParamName > + for $Name + < $ParamName > + where + $ParamName : Clone, + { + #[ inline ] + fn from( src : &$ParamName ) -> Self + { + Self( src.clone() ) + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< ( $ParamName, ) > + for $Name + < $ParamName > + { + #[ inline ] + fn from( src : ( $ParamName, ) ) -> Self + { + Self( src.0 ) + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< $Name< $ParamName > > + for ( $ParamName, ) + { + #[ inline ] + fn from( src : $Name< $ParamName > ) -> Self + { + ( src.0, ) + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< [ $ParamName ; 1 ] > + for $Name + < $ParamName > + where + $ParamName : Clone, + { + #[ inline ] + fn from( src : [ $ParamName ; 1 ] ) -> Self + { + Self( src[ 0 ].clone() ) + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< $Name< $ParamName > > + for [ $ParamName ; 1 ] + { + #[ inline ] + fn from( src : $Name< $ParamName > ) -> Self + { + [ src.0 ] + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + From< &[ $ParamName ] > + for $Name + < $ParamName > + where + $ParamName : Clone, + { + #[ inline ] + fn from( src : &[ $ParamName ] ) -> Self + { + debug_assert_eq!( src.len(), 1 ); + Self( src[ 0 ].clone() ) + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + $crate::CloneAsTuple< ( $ParamName, ) > + for $Name < $ParamName > + where + $ParamName : Clone, + { + #[ inline ] + fn clone_as_tuple( &self ) -> ( $ParamName, ) + { + ( self.0.clone(), ) + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + $crate::CloneAsArray< $ParamName, 1 > + for $Name < $ParamName > + where + $ParamName : Clone, + { + #[ inline ] + fn clone_as_array( &self ) -> [ $ParamName ; 1 ] + { + [ self.0.clone() ; 1 ] + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + $crate::AsTuple< ( $ParamName, ) > + for $Name < $ParamName > + { + #[ inline ] + fn as_tuple( &self ) -> &( $ParamName, ) + { + // to be deprecated + /* Safety : in case of single elemet it is safe to assume that layout is the same. It does not have to have #[repr(C)]. */ + #[ allow( unsafe_code ) ] + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + $crate::AsArray< $ParamName, 1 > + for $Name < $ParamName > + { + #[ inline ] + fn as_array( &self ) -> &[ $ParamName ; 1 ] + { + // to be deprecated + /* Safety : in case of single elemet it is safe to assume that layout is the same. It does not have to have #[repr(C)]. */ + #[ allow( unsafe_code ) ] + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } + } + + impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + $crate::AsSlice< $ParamName > + for $Name < $ParamName > + { + #[ inline ] + fn as_slice( &self ) -> &[ $ParamName ] + { + &$crate::AsArray::as_array( self )[ .. ] + } + } + + // $crate::_if_from! + // { + // impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + // $crate::From_0 + // for $Name < $ParamName > + // where $ParamName : Default + // { + // #[ inline ] + // fn from_0() -> Self + // { + // Self( Default::default() ) + // } + // } + // + // + // impl< $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? > + // $crate::From_1< $ParamName > + // for $Name < $ParamName > + // { + // #[ inline ] + // fn from_1( _0 : $ParamName ) -> Self + // { + // Self( _0 ) + // } + // } + // } + + // From Single Into Element cant be implemented because of Rust restrictions. + + $crate::types!{ $( $( $Rest )* )? } + }; + + // pub single Single : < T1, ... >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis single $Name : ident : + < $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? , + $( $Rest : tt )* + ) + => + { + compile_error! + ( + concat! + ( + "Parametrized element should be single, because Single has only one element\n", + stringify! + ( + $( #[ $Meta ] )* + $Vis single $Name : + < $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? , + $( $Rest )* + ) + ) + ); + }; + + // pub single Single : Element< T1, T2, ... >; + + ( + $( #[ $Meta : meta ] )* + $Vis : vis single $Name : ident : $TypeSplit1 : ident $( :: $TypeSplitN : ident )* + $( < $( $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? ),* > )? + $( ; $( $Rest : tt )* )? + ) + => + { + $( #[ $Meta ] )* + $Vis struct $Name + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + ( pub $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ); + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + core::ops::Deref + for $Name + $( < $( $ParamName ),* > )? + { + type Target = $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?; + #[ inline ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + core::ops::DerefMut + for $Name + $( < $( $ParamName ),* > )? + { + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + From + < $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > + for $Name + $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from( src : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ) -> Self + { + Self( src ) + } + } + + impl + < __FromRef $( , $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* )? > + From + < &__FromRef > + for $Name + $( < $( $ParamName ),* > )? + where + __FromRef : Clone, + Self : From< __FromRef >, + { + #[ inline ] + fn from( src : &__FromRef ) -> Self + { + From::from( ( *src ).clone() ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + From + < $Name $( < $( $ParamName ),* > )? > + for $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from( src : $Name $( < $( $ParamName ),* > )? ) -> Self + { + src.0 + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + From + < ( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? , ) > + for $Name + $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from( src : ( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? , ) ) -> Self + { + Self( src.0 ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + From + < [ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ; 1 ] > + for $Name + $( < $( $ParamName ),* > )? + where + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? : Clone, + { + #[ inline ] + fn from( src : [ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ; 1 ] ) -> Self + { + Self( src[ 0 ].clone() ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + From + < &[ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ] > + for $Name + $( < $( $ParamName ),* > )? + where + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? : Clone, + { + #[ inline ] + fn from( src : &[ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ] ) -> Self + { + debug_assert_eq!( src.len(), 1 ); + Self( src[ 0 ].clone() ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::CloneAsTuple< ( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, ) > + for + $Name $( < $( $ParamName ),* > )? + where + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? : Clone, + { + #[ inline ] + fn clone_as_tuple( &self ) -> ( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, ) + { + ( self.0.clone(), ) + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::CloneAsArray< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? , 1 > + for + $Name $( < $( $ParamName ),* > )? + where + $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? : Clone, + { + #[ inline ] + fn clone_as_array( &self ) -> [ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ; 1 ] + { + [ self.0.clone() ] + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::AsTuple< ( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, ) > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn as_tuple( &self ) -> &( $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )?, ) + { + // to be deprecated + /* Safety : in case of single elemet it is safe to assume that layout is the same. It does not have to have #[repr(C)]. */ + #[ allow( unsafe_code ) ] + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::AsArray< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? , 1 > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn as_array( &self ) -> &[ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ; 1 ] + { + // to be deprecated + /* Safety : in case of single elemet it is safe to assume that layout is the same. It does not have to have #[repr(C)]. */ + #[ allow( unsafe_code ) ] + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } + } + + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::AsSlice< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn as_slice( &self ) -> &[ $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ] + { + &$crate::AsArray::as_array( self )[ .. ] + } + } + + $crate::_if_from! + { + impl + $( < $( $ParamName $( : $ParamTy1x1 $( :: $ParamTy1xN )* $( + $ParamTy2 )* )? ),* > )? + $crate::From_1< $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? > + for + $Name $( < $( $ParamName ),* > )? + { + #[ inline ] + fn from_1( _0 : $TypeSplit1 $( :: $TypeSplitN )* $( < $( $ParamName ),* > )? ) -> Self + { + Self( _0 ) + } + } + } + + $crate::types!{ $( $( $Rest )* )? } + }; + + } + + types! + { + + /// + /// Type constructor to wrap a another type into a tuple. + /// + /// ### Basic Use Case :: struct instead of macro. + /// + /// Sometimes it's sufficient to use common type instead of defining a brand new one. + /// You may use paramtetrized struct `fundamental_data_type::Single< T >` instead of macro `fundamental_data_type::types!` if that is the case. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// let x = Single::< i32 >( 13 ); + /// dbg!( x ); + /// ``` + /// + + #[ derive( Debug, Clone, PartialEq, Eq, Default ) ] + pub single Single : < T >; + + } + + pub use _single; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + _single, + }; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + Single, + }; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/traits.rs b/module/postponed/type_constructor/src/type_constuctor/traits.rs new file mode 100644 index 0000000000..97c74c822d --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/traits.rs @@ -0,0 +1,99 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Clone as tuple. + /// + + pub trait CloneAsTuple< Tuple > + { + /// Clone as tuple. + fn clone_as_tuple( &self ) -> Tuple; + } + + /// + /// Clone as array. + /// + + pub trait CloneAsArray< T, const N : usize > + { + /// Clone as array. + fn clone_as_array( &self ) -> [ T ; N ]; + } + + /// + /// Reinterpret as tuple. + /// + + pub trait AsTuple< Tuple > + { + /// Reinterpret as tuple. + fn as_tuple( &self ) -> &Tuple; + } + + /// + /// Reinterpret as array. + /// + + pub trait AsArray< T, const N : usize > + { + /// Reinterpret as array. + fn as_array( &self ) -> &[ T ; N ]; + } + + /// + /// Reinterpret as slice. + /// + + pub trait AsSlice< T > + { + /// Reinterpret as slice. + fn as_slice( &self ) -> &[ T ]; + } + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + CloneAsTuple, + CloneAsArray, + AsTuple, + AsArray, + AsSlice, + }; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/types.rs b/module/postponed/type_constructor/src/type_constuctor/types.rs new file mode 100644 index 0000000000..c6c3aa2224 --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/types.rs @@ -0,0 +1,851 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::exposed::*; + + // zzz : write article about the module + // zzz : extend diagnostics_tools + + /// + /// Type constructor to define tuple wrapping a given type. + /// + /// In Rust, you often need to wrap a given type into a new one. + /// The role of the orphan rules in particular is basically to prevent you from implementing external traits for external types. + /// To overcome the restriction developer usually wrap the external type into a tuple introducing a new type. + /// Type constructor does exactly that and auto-implement traits From, Into, Deref and few more for the constructed type. + /// + /// Besides type constructor for single element there are type constructors for `pair`, `homopair` and `many`: + /// + /// - `Single` to wrap single element. + /// - `Pair` to wrap pair of distinct elements. + /// - `HomoPair` to wrap pair of elements with the same type. + /// - `Many` to wrap `Vec` of elements. + /// + /// ## Macro `types` for type constructing + /// + /// Macro `types` is responsible for generating code for Single, Pair, Homopair, Many. Each type constructor has its own keyword for that, but Pair and Homopair use the same keyword difference in a number of constituent types. It is possible to define all types at once. + /// + /// ```rust ignore + /// { + /// use type_constructor::prelude::*; + /// + /// types! + /// { + /// + /// pub single MySingle : f32; + /// pub single SingleWithParametrized : std::sync::Arc< T : Copy >; + /// pub single SingleWithParameter : < T >; + /// + /// pub pair MyPair : f32; + /// pub pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + /// pub pair PairWithParameter : < T1, T2 >; + /// + /// pub pair MyHomoPair : f32; + /// pub pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + /// pub pair HomoPairWithParameter : < T >; + /// + /// pub many MyMany : f32; + /// pub many ManyWithParametrized : std::sync::Arc< T : Copy >; + /// pub many ManyWithParameter : < T >; + /// + /// } + /// } + /// ``` + /// + /// It generates more than 1000 lines of code, which otherwise you would have to write manually. + /// + /// ## Without macro + /// + /// Macro `types` is exposed to generate new types, but in some cases, it is enough to reuse already generated types of such kind. The library ships such types: Single, Pair, Homopair, Many. Note: If you avoid generating new types you will get in a position to be not able to define your own implementation of foreign traits because of orphan rule. + /// + /// ```rust ignore + /// + /// let i32_in_tuple = type_constructor::Single::< i32 >::from( 13 ); + /// dbg!( i32_in_tuple ); + /// // i32_in_tuple = Single( 13 ) + /// let i32_and_f32_in_tuple = type_constructor::Pair::< i32, f32 >::from( ( 13, 13.0 ) ); + /// dbg!( i32_and_f32_in_tuple ); + /// // vec_of_i32_in_tuple = Pair( 13, 13.0 ) + /// let two_i32_in_tuple = type_constructor::HomoPair::< i32 >::from( ( 13, 31 ) ); + /// dbg!( two_i32_in_tuple ); + /// // vec_of_i32_in_tuple = HomoPair( 13, 31 ) + /// let vec_of_i32_in_tuple = type_constructor::Many::< i32 >::from( [ 1, 2, 3 ] ); + /// dbg!( vec_of_i32_in_tuple ); + /// // vec_of_i32_in_tuple = Many([ 1, 2, 3 ]) + /// + /// ``` + /// + /// ## Make. + /// + /// Make is the variadic constructor. It's the unified interface of the arbitrary-length constructor. + /// After implementing several traits `From_0`, `From_1` up to `MakeN` one can use make `from!` to construct instances. + /// + /// ```rust ignore + /// #[ cfg( feature = "make" ) ] + /// { + /// use type_constructor::prelude::*; + /// + /// let instance1 : Struct1 = from!(); + /// let instance2 : Struct1 = from!( 13 ); + /// let instance3 : Struct1 = from!( 1, 3 ); + /// + /// } + /// ``` + /// + /// ### Basic Use Case :: single-line single. + /// + /// To define your own single-use macro `types!`. The single-line definition looks like that. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// types!( pub single MySingle : i32 ); + /// let x = MySingle( 13 ); + /// println!( "x : {}", x.0 ); + /// ``` + /// + /// It generates code: + /// + /// ```rust + /// use type_constructor::prelude::*; + /// + /// pub struct MySingle( pub i32 ); + /// + /// impl core::ops::Deref for MySingle + /// { + /// type Target = i32; + /// fn deref( &self ) -> &Self::Target + /// { + /// &self.0 + /// } + /// } + /// impl From< i32 > for MySingle + /// { + /// fn from( src : i32 ) -> Self + /// { + /// Self( src ) + /// } + /// } + /// impl From< MySingle > for i32 + /// { + /// fn from( src : MySingle ) -> Self + /// { + /// src.0 + /// } + /// } + /// + /// /* ... */ + /// + /// let x = MySingle( 13 ); + /// println!( "x : {}", x.0 ); + /// ``` + /// + /// ### Basic Use Case :: single with derives and attributes. + /// + /// It's possible to define attributes as well as derives. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// types! + /// { + /// /// This is also attribute and macro understands it. + /// #[ derive( Debug ) ] + /// pub single MySingle : i32; + /// } + /// let x = MySingle( 13 ); + /// dbg!( x ); + /// ``` + /// + /// It generates code: + /// + /// ```rust + /// use type_constructor::prelude::*; + /// + /// /// This is also an attribute and macro understands it. + /// #[ derive( Debug ) ] + /// pub struct MySingle( pub i32 ); + /// + /// impl core::ops::Deref for MySingle + /// { + /// type Target = i32; + /// fn deref( &self ) -> &Self::Target + /// { + /// &self.0 + /// } + /// } + /// impl From< i32 > for MySingle + /// { + /// fn from( src : i32 ) -> Self + /// { + /// Self( src ) + /// } + /// } + /// impl From< MySingle > for i32 + /// { + /// fn from( src : MySingle ) -> Self + /// { + /// src.0 + /// } + /// } + /// + /// /* ... */ + /// + /// let x = MySingle( 13 ); + /// dbg!( x ); + /// ``` + /// + /// ### Basic Use Case :: single with struct instead of macro. + /// + /// Sometimes it's sufficient to use a common type instead of defining a brand new one. + /// You may use parameterized struct `Single< T >` instead of macro `types!` if that is the case. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// let x = Single::< i32 >( 13 ); + /// dbg!( x ); + /// ``` + /// + /// ### Basic Use Case :: single with a parametrized element. + /// + /// Element of tuple could be parametrized. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// types! + /// { + /// #[ derive( Debug ) ] + /// pub single MySingle : std::sync::Arc< T : Copy >; + /// } + /// let x = MySingle( std::sync::Arc::new( 13 ) ); + /// dbg!( x ); + /// ``` + /// + /// It generates code: + /// + /// ```rust + /// use type_constructor::*; + /// + /// #[ derive( Debug ) ] + /// pub struct MySingle< T : Copy >( pub std::sync::Arc< T > ); + /// + /// impl core::ops::Deref for MySingle< T > + /// { + /// type Target = std::sync::Arc< T >; + /// fn deref( &self ) -> &Self::Target + /// { + /// &self.0 + /// } + /// } + /// impl< T : Copy > From< std::sync::Arc< T > > for MySingle< T > + /// { + /// fn from( src : std::sync::Arc< T >) -> Self { + /// Self( src ) + /// } + /// } + /// impl< T : Copy > From< MySingle< T > > for std::sync::Arc< T > + /// { + /// fn from(src: MySingle< T >) -> Self + /// { + /// src.0 + /// } + /// } + /// + /// /* ... */ + /// + /// let x = MySingle( std::sync::Arc::new( 13 ) ); + /// ``` + /// + /// ### Basic Use Case :: single with parametrized tuple. + /// + /// Instead of parametrizing the element, it's possible to define a parametrized tuple. + /// + /// + /// ```rust + /// use type_constructor::prelude::*; + /// types! + /// { + /// #[ derive( Debug ) ] + /// pub single MySingle : < T : Copy >; + /// } + /// let x = MySingle( 13 ); + /// dbg!( x ); + /// ``` + /// + /// It gererates code: + /// + /// ```rust + /// #[ derive( Debug ) ] + /// pub struct MySingle< T : Copy >( pub T ); + /// + /// impl< T : Copy > core::ops::Deref + /// for MySingle< T > + /// { + /// type Target = T; + /// fn deref( &self ) -> &Self::Target + /// { + /// &self.0 + /// } + /// } + /// + /// impl< T : Copy > From< T > + /// for MySingle< T > + /// { + /// fn from( src : T ) -> Self + /// { + /// Self( src ) + /// } + /// } + /// + /// let x = MySingle( 13 ); + /// dbg!( 13 ); + /// ``` + /// + /// ### Basic Use Case :: single-line pair + /// + /// Sometimes you need to wrap more than a single element into a tupдe. If types of elements are different use `pair`. The same macro `types` is responsible for generating code for both `single`, `pair` and also `many`. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// + /// types!( pub pair MyPair : i32, i64 ); + /// let x = MyPair( 13, 31 ); + /// println!( "x : ( {}, {} )", x.0, x.1 ); + /// // prints : x : ( 13, 31 ) + /// ``` + /// + /// It generates code: + /// + /// ```rust ignore + /// use type_constructor::prelude::*; + /// + /// pub struct MyPair( pub i32, pub i64 ); + /// + /// impl From< ( i32, i64 ) > for MyPair + /// { + /// fn from( src : ( i32, i64 ) ) -> Self { Self( src.0, src.1 ) } + /// } + /// + /// impl From< MyPair > for ( i32, i64 ) + /// { + /// fn from( src : MyPair ) -> Self { ( src.0, src.1 ) } + /// } + /// + /// #[cfg( feature = "make" ) ] + /// impl From_2< i32, i64 > for MyPair + /// { + /// fn from_2( _0 : i32, _1 : i64 ) -> Self { Self( _0, _1 ) } + /// } + /// + /// /* ... */ + /// + /// let x = MyPair( 13, 31 ); + /// println!( "x : ( {}, {} )", x.0, x.1 ); + /// ``` + /// + /// ### Basic Use Case :: pair with parameters + /// + /// Just like `single` `pair` may have parameters. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// + /// use core::fmt; + /// types! + /// { + /// #[ derive( Debug ) ] + /// pub pair MyPair : < T1 : fmt::Debug, T2 : fmt::Debug >; + /// } + /// let x = MyPair( 13, 13.0 ); + /// dbg!( x ); + /// // prints : x = MyPair( 13, 13.0 ) + /// ``` + /// + /// It generates code: + /// + /// ```rust ignore + /// use type_constructor::prelude::*; + /// use core::fmt; + /// + /// #[ derive( Debug ) ] + /// pub struct MyPair< T1, T2 >( pub T1, pub T2 ); + /// + /// impl< T1, T2 > From<( T1, T2 )> for MyPair< T1, T2 > + /// { + /// fn from( src : ( T1, T2 ) ) -> Self { Self( src.0, src.1 ) } + /// } + /// + /// impl< T1, T2 > From< MyPair< T1, T2 > > for ( T1, T2 ) + /// { + /// fn from( src : MyPair< T1, T2 > ) -> Self { ( src.0, src.1 ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl< T1, T2 > From_0 for MyPair< T1, T2 > + /// where + /// T1 : Default, + /// T2 : Default, + /// { + /// fn from_0() -> Self { Self( Default::default(), Default::default() ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl< T1, T2 > From_2< T1, T2 > for MyPair< T1, T2 > + /// { + /// fn from_2( _0 : T1, _1 : T2 ) -> Self { Self( _0, _1 ) } + /// } + /// + /// /* ... */ + /// + /// let x = MyPair( 13, 13.0 ); + /// dbg!( x ); + /// // prints : x = MyPair( 13, 13.0 ) + /// ``` + /// + /// ### Basic Use Case :: single-line homopair + /// + /// If you need to wrap pair of elements with the same type use the type constructor `pair`. The same type constructor `pair` for both `pair` and `homopair`, difference in number of types in definition, `homopair` has only one, because both its element has the same type. The same macro `types` is responsible for generating code for both `single`, `pair` and also `many`. + /// + /// ```rust + /// use type_constructor::prelude::*; + /// + /// types!( pub pair MyPair : i32, i64 ); + /// let x = MyPair( 13, 31 ); + /// println!( "x : ( {}, {} )", x.0, x.1 ); + /// // prints : x : ( 13, 31 ) + /// ``` + /// + /// It gererates code: + /// + /// ```rust ignore + /// use type_constructor::prelude::*; + /// + /// pub struct MyPair( pub i32, pub i64 ); + /// + /// impl From< ( i32, i64 ) > for MyPair + /// { + /// fn from( src : ( i32, i64 ) ) -> Self { Self( src.0, src.1 ) } + /// } + /// + /// impl From< MyPair > for ( i32, i64 ) + /// { + /// fn from( src : MyPair ) -> Self { ( src.0, src.1 ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl From_2< i32, i64 > for MyPair + /// { + /// fn from_2( _0 : i32, _1 : i64 ) -> Self { Self( _0, _1 ) } + /// } + /// + /// /* ... */ + /// + /// let x = MyPair( 13, 31 ); + /// println!( "x : ( {}, {} )", x.0, x.1 ); + /// ``` + /// + /// ### Basic Use Case :: homopair with parameters + /// + /// Unlike `heteropair` `homopair` has much more traits implemented for it. Among such are: `clone_as_tuple`, `clone_as_array` to clone it as either tuple or array, `as_tuple`, `as_array`, `as_slice` to reinterpret it as either tuple or array or slice, traits `From`/`Into` are implemented to convert it from/into tuple, array, slice, scalar. + /// + /// ```rust ignore + /// use type_constructor::prelude::*; + /// + /// use core::fmt; + /// types! + /// { + /// #[ derive( Debug ) ] + /// pub pair MyHomoPair : < T : fmt::Debug >; + /// } + /// let x = MyHomoPair( 13, 31 ); + /// dbg!( &x ); + /// // prints : &x = MyHomoPair( 13, 31 ) + /// let clone_as_array : [ i32 ; 2 ] = x.clone_as_array(); + /// dbg!( &clone_as_array ); + /// // prints : &clone_as_array = [ 13, 31 ] + /// let clone_as_tuple : ( i32 , i32 ) = x.clone_as_tuple(); + /// dbg!( &clone_as_tuple ); + /// // prints : &clone_as_tuple = ( 13, 31 ) + /// ``` + /// + /// It gererates code: + /// + /// ```rust ignore + /// use type_constructor::prelude::*; + /// use core::fmt; + /// + /// #[ derive( Debug ) ] + /// pub struct MyHomoPair< T >( pub T, pub T ); + /// + /// impl< T > core::ops::Deref for MyHomoPair< T > + /// { + /// type Target = ( T, T ); + /// + /// fn deref( &self ) -> &Self::Target + /// { + /// #[ cfg( debug_assertions ) ] + /// { + /// let layout1 = core::alloc::Layout::new::< Self >(); + /// let layout2 = core::alloc::Layout::new::< Self::Target >(); + /// debug_assert_eq!( layout1, layout2 ); + /// } + /// unsafe { core::mem::transmute::< _, _ >( self ) } + /// } + /// } + /// + /// impl< T > core::ops::DerefMut for MyHomoPair< T > + /// { + /// fn deref_mut( &mut self ) -> &mut Self::Target + /// { + /// #[ cfg( debug_assertions ) ] + /// { + /// let layout1 = core::alloc::Layout::new::< Self >(); + /// let layout2 = core::alloc::Layout::new::< Self::Target >(); + /// debug_assert_eq!( layout1, layout2 ); + /// } + /// unsafe { core::mem::transmute::< _, _ >( self ) } + /// } + /// } + /// + /// impl< T > From< ( T, T ) > for MyHomoPair< T > + /// { + /// fn from( src : ( T, T ) ) -> Self { Self( src.0, src.1 ) } + /// } + /// + /// impl< T > From< MyHomoPair< T >> for ( T, T ) + /// { + /// fn from( src : MyHomoPair< T > ) -> Self { ( src.0, src.1 ) } + /// } + /// + /// impl< T > From< [ T; 2 ] > for MyHomoPair< T > + /// where + /// T : Clone, + /// { + /// fn from( src : [ T; 2 ] ) -> Self { Self( src[ 0 ].clone(), src[ 1 ].clone() ) } + /// } + /// + /// impl< T > From< MyHomoPair< T >> for [ T; 2 ] + /// { + /// fn from( src : MyHomoPair< T > ) -> Self { [ src.0, src.1 ] } + /// } + /// + /// impl< T > From< &[ T ] > for MyHomoPair< T > + /// where + /// T : Clone, + /// { + /// fn from( src : &[ T ] ) -> Self + /// { + /// debug_assert_eq!( src.len(), 2 ); + /// Self( src[ 0 ].clone(), src[ 1 ].clone() ) + /// } + /// } + /// + /// impl< T > From< T > for MyHomoPair< T > + /// where + /// T : Clone, + /// { + /// fn from( src : T ) -> Self { Self( src.clone(), src.clone() ) } + /// } + /// + /// impl< T > CloneAsTuple< ( T, T ) > for MyHomoPair< T > + /// where + /// T : Clone, + /// { + /// fn clone_as_tuple( &self ) -> ( T, T ) { ( self.0.clone(), self.1.clone() ) } + /// } + /// + /// impl< T > CloneAsArray< T, 2 > for MyHomoPair< T > + /// where + /// T : Clone, + /// { + /// fn clone_as_array( &self ) -> [ T; 2 ] { [ self.0.clone(), self.1.clone() ] } + /// } + /// + /// impl< T > AsTuple< ( T, T ) > for MyHomoPair< T > + /// { + /// fn as_tuple( &self ) -> &( T, T ) { unsafe { core::mem::transmute::< &_, &( T, T ) >( self ) } } + /// } + /// + /// impl< T > AsArray< T, 2 > for MyHomoPair< T > + /// { + /// fn as_array( &self ) -> &[ T; 2 ] { unsafe { core::mem::transmute::< &_, &[ T; 2 ] >( self ) } } + /// } + /// + /// impl< T > AsSlice< T > for MyHomoPair< T > + /// { + /// fn as_slice( &self ) -> &[ T ] { &self.as_array()[ .. ] } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl< T > From_0 for MyHomoPair< T > + /// where + /// T : Default, + /// { + /// fn from_0() -> Self { Self( Default::default(), Default::default() ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl< T > From_1< T > for MyHomoPair< T > + /// where + /// T : Clone, + /// { + /// fn from_1( _0 : T ) -> Self { Self( _0.clone(), _0.clone() ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl< T > From_2< T, T > for MyHomoPair< T > + /// { + /// fn from_2( _0 : T, _1 : T ) -> Self { Self( _0, _1 ) } + /// } + /// + /// /* ... */ + /// + /// let x = MyHomoPair( 13, 31 ); + /// dbg!( &x ); + /// // prints : &x = MyHomoPair( 13, 31 ) + /// let clone_as_array : [ i32 ; 2 ] = x.clone_as_array(); + /// dbg!( &clone_as_array ); + /// // prints : &clone_as_array = [ 13, 31 ] + /// let clone_as_tuple : ( i32 , i32 ) = x.clone_as_tuple(); + /// dbg!( &clone_as_tuple ); + /// // prints : &clone_as_tuple = ( 13, 31 ) + /// ``` + /// + /// ### Basic Use Case :: single-line many + /// + /// Use type constructor `many` to wrap `Vec` in a tuple. Similar to `single` it has essential traits implemented for it. + /// + /// ```rust ignore + /// use type_constructor::prelude::*; + /// + /// types!( pub many MyMany : i32 ); + /// let x = MyMany::from( [ 1, 2, 3 ] ); + /// println!( "x : {:?}", x.0 ); + /// ``` + /// + /// It generates code: + /// + /// ```rust ignore + /// use type_constructor::prelude::*; + /// + /// pub struct MyMany( pub std::vec::Vec< i32 > ); + /// + /// impl core::ops::Deref for MyMany + /// { + /// type Target = std::vec::Vec< i32 >; + /// + /// fn deref( &self ) -> &Self::Target { &self.0 } + /// } + /// + /// impl core::ops::DerefMut for MyMany + /// { + /// fn deref_mut( &mut self ) -> &mut Self::Target { &mut self.0 } + /// } + /// + /// impl From< i32 > for MyMany + /// { + /// fn from( src : i32 ) -> Self { Self( vec![ src ] ) } + /// } + /// + /// impl From< ( i32, ) > for MyMany + /// { + /// fn from( src : ( i32, ) ) -> Self { Self( vec![ src.0 ] ) } + /// } + /// + /// impl< const N: usize > From< [ i32; N ] > for MyMany + /// where + /// i32 : Clone, + /// { + /// fn from( src : [ i32; N ] ) -> Self { Self( std::vec::Vec::from( src ) ) } + /// } + /// + /// impl From< &[ i32 ] > for MyMany + /// where + /// i32 : Clone, + /// { + /// fn from( src : &[ i32 ] ) -> Self + /// { + /// debug_assert_eq!( src.len(), 1 ); + /// Self( std::vec::Vec::from( src ) ) + /// } + /// } + /// + /// impl AsSlice< i32 > for MyMany + /// where + /// i32 : Clone, + /// { + /// fn as_slice( &self ) -> &[ i32 ] { &self[ .. ] } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl From_0 for MyMany + /// { + /// fn from_0() -> Self { Self( std::vec::Vec::< i32 >::new() ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl From_1< i32 > for MyMany + /// { + /// fn from_1( _0 : i32 ) -> Self { Self( vec![ _0 ] ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl From_2< i32, i32 > for MyMany + /// { + /// fn from_2( _0 : i32, _1 : i32 ) -> Self { Self( vec![ _0, _1 ] ) } + /// } + /// + /// #[ cfg( feature = "make" ) ] + /// impl From_3< i32, i32, i32 > for MyMany + /// { + /// fn from_3( _0 : i32, _1 : i32, _2 : i32 ) -> Self { Self( vec![ _0, _1, _2 ] ) } + /// } + /// + /// /* ... */ + /// + /// let x = MyMany::from( [ 1, 2, 3 ] ); + /// println!( "x : {:?}", x.0 ); + /// ``` + + // #[ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/Readme.md" ) ) ] + + #[ macro_export ] + macro_rules! types + { + + // No more. + + ( + ) + => + { + }; + + // No more. + + ( + ; + ) + => + { + }; + + // single + + ( + $( #[ $Meta : meta ] )* + $Vis : vis + single + $( $Rest : tt )* + ) + => + { + $crate::_single! + { + $( #[ $Meta ] )* + $Vis single + $( $Rest )* + } + }; + + // pair + + ( + $( #[ $Meta : meta ] )* + $Vis : vis + pair + $( $Rest : tt )* + ) + => + { + $crate::_pair! + { + $( #[ $Meta ] )* + $Vis pair + $( $Rest )* + } + }; + + // many + + ( + $( #[ $Meta : meta ] )* + $Vis : vis + many + $( $Rest : tt )* + ) + => + { + $crate::_many! + { + $( #[ $Meta ] )* + $Vis many + $( $Rest )* + } + }; + + // bad syntax + + ( + $( $Rest : tt )* + ) + => + { + compile_error! + ( + concat! + ( + "Bad syntax.\n", + "Expects : {kind} {name} : {type}.\n", + "For example : `pub single MySingle : std::sync::Arc< T : Copy >`.\n", + "But got:\n", + stringify! + ( + $( $Rest )* + ), + ) + ); + }; + + } + + pub use types; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + types, + }; +} diff --git a/module/postponed/type_constructor/src/type_constuctor/vectorized_from.rs b/module/postponed/type_constructor/src/type_constuctor/vectorized_from.rs new file mode 100644 index 0000000000..3621b81c7e --- /dev/null +++ b/module/postponed/type_constructor/src/type_constuctor/vectorized_from.rs @@ -0,0 +1,180 @@ +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Implementation of trait From to vectorize into/from. + /// + /// Standard `From` unfortunately is not autoimplemented for tuples and arrays and cant be implemented for them because of orphans restrictions. + /// That how pair of traits `VectorizedFrom`/`VectorizedInto` could be useful. They are implemented for tuples and arrays. + /// Their implementation is based on standard `From`, if `From` is implemented for elements of a tuple then `VectorizedFrom`/`VectorizedInto` implemented for collection containing them. + /// + /// ### Basic use-case. + /// ```rust + /// use type_constructor::prelude::*; + /// types!( single Single1 : i32 ); + /// let src = ( 1, 3 ); + /// let got = <( Single1, Single1 )>::vectorized_from( src ); + /// ``` + /// + + pub trait VectorizedFrom< T > : Sized + { + /// Performs the conversion. + fn vectorized_from( src : T ) -> Self; + } + + /// + /// Implementation of trait Into to vectorize into/from. + /// + /// Standard `From` unfortunately is not autoimplemented for tuples and arrays and cant be implemented for them because of orphans restrictions. + /// That how pair of traits `VectorizedFrom`/`VectorizedInto` could be useful. They are implemented for tuples and arrays. + /// Their implementation is based on standard `From`, if `From` is implemented for elements of a tuple then `VectorizedFrom`/`VectorizedInto` implemented for collection containing them. + /// + /// ### Basic use-case. + /// ```rust + /// use type_constructor::prelude::*; + /// types!( single Single1 : i32 ); + /// let src = ( 1, 3 ); + /// let got : ( Single1, Single1 ) = src.vectorized_into(); + /// ``` + /// + + pub trait VectorizedInto< T > : Sized + { + /// Performs the conversion. + fn vectorized_into( self ) -> T; + } + + // + + impl< Target, Original > VectorizedInto< Target > for Original + where + Target : VectorizedFrom< Original >, + { + fn vectorized_into( self ) -> Target + { + Target::vectorized_from( self ) + } + } + + // + + impl<> + VectorizedFrom< () > + for () + { + fn vectorized_from( _ : () ) -> Self + { + } + } + + // + + impl< Into1, Id1 > + VectorizedFrom< ( Into1, ) > + for ( Id1, ) + where + Into1 : Into< Id1 >, + { + fn vectorized_from( src : ( Into1, ) ) -> Self + { + ( src.0.into(), ) + } + } + + // + + impl< Into1, Into2, Id1, Id2 > + VectorizedFrom< ( Into1, Into2 ) > + for ( Id1, Id2 ) + where + Into1 : Into< Id1 >, + Into2 : Into< Id2 >, + { + fn vectorized_from( src : ( Into1, Into2 ) ) -> Self + { + ( src.0.into(), src.1.into() ) + } + } + + // + + impl< Into1, Into2, Into3, Id1, Id2, Id3 > + VectorizedFrom< ( Into1, Into2, Into3 ) > + for ( Id1, Id2, Id3 ) + where + Into1 : Into< Id1 >, + Into2 : Into< Id2 >, + Into3 : Into< Id3 >, + { + fn vectorized_from( src : ( Into1, Into2, Into3 ) ) -> Self + { + ( src.0.into(), src.1.into(), src.2.into() ) + } + } + + // + + impl< Id, Into1, const N : usize > + VectorizedFrom< [ Into1 ; N ] > + for [ Id ; N ] + where + Into1 : Into< Id > + Clone, + { + fn vectorized_from( src : [ Into1 ; N ] ) -> Self + { + // SAFETY : safe because all elements are set in the funtions + #[ allow( clippy::uninit_assumed_init ) ] + #[ allow( unsafe_code ) ] + let mut result : Self = unsafe { core::mem::MaybeUninit::zeroed().assume_init() }; + for i in 0..N + { + result[ i ] = src[ i ].clone().into(); + } + result + } + } + +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + VectorizedFrom, + VectorizedInto, + }; +} diff --git a/module/postponed/type_constructor/tests/data_type_tests.rs b/module/postponed/type_constructor/tests/data_type_tests.rs new file mode 100644 index 0000000000..517687638f --- /dev/null +++ b/module/postponed/type_constructor/tests/data_type_tests.rs @@ -0,0 +1,12 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] + +#[ allow( unused_imports ) ] +use type_constructor as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +mod inc; diff --git a/module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.rs b/module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.rs new file mode 100644 index 0000000000..672c3ee720 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.rs @@ -0,0 +1,7 @@ +use type_constructor as the_module; +use the_module::prelude::*; + +fn main() +{ + let x = from!( 0, 1, 2, 3, 4 ); +} diff --git a/module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.stderr b/module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.stderr new file mode 100644 index 0000000000..da0ff56d3a --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/make/make_too_many.stderr @@ -0,0 +1,10 @@ +error: Variadic constructor supports up to 3 arguments. + Open an issue if you need more. + You passed: + from! (0, 1, 2, 3, 4) + --> tests/dt/type_constructor/dynamic/make/make_too_many.rs:6:11 + | +6 | let x = from!( 0, 1, 2, 3, 4 ); + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in the macro `make` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.rs b/module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.rs new file mode 100644 index 0000000000..8d9fa57afb --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.rs @@ -0,0 +1,11 @@ +use type_constructor as the_module; +use the_module::prelude::*; + +types! +{ + single Single : < T1, T2 >; +} + +fn main() +{ +} diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.stderr b/module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.stderr new file mode 100644 index 0000000000..ee1f4c0eeb --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types/single_too_many_params.stderr @@ -0,0 +1,11 @@ +error: Parametrized element should be single, because Single has only one element + single Single : < T1, T2 > ; + --> tests/dt/type_constructor/dynamic/types/single_too_many_params.rs:4:1 + | +4 | / types! +5 | | { +6 | | single Single : < T1, T2 >; +7 | | } + | |_^ + | + = note: this error originates in the macro `$crate::_single` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.rs b/module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.rs new file mode 100644 index 0000000000..efcfe8188b --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.rs @@ -0,0 +1,11 @@ +use type_constructor as the_module; +use the_module::prelude::*; + +types! +{ + wrong_kind Single : std::sync::Arc< T : Copy >; +} + +fn main() +{ +} diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.stderr b/module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.stderr new file mode 100644 index 0000000000..80cb56a293 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types/wrong_kind.stderr @@ -0,0 +1,14 @@ +error: Bad syntax. + Expects : {kind} {name} : {type}. + For example : `pub single MySingle : std::sync::Arc< T : Copy >`. + But got: + wrong_kind Single : std :: sync :: Arc < T : Copy > ; + --> tests/dt/type_constructor/dynamic/types/wrong_kind.rs:4:1 + | +4 | / types! +5 | | { +6 | | wrong_kind Single : std::sync::Arc< T : Copy >; +7 | | } + | |_^ + | + = note: this error originates in the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.rs b/module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.rs new file mode 100644 index 0000000000..a8a51ef5a5 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.rs @@ -0,0 +1,11 @@ +use type_constructor as the_module; +use the_module::prelude::*; + +types! +{ + pub many Many : < T1, T2 >; +} + +fn main() +{ +} diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.stderr b/module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.stderr new file mode 100644 index 0000000000..130935e49f --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types_many_no/many_too_many_params.stderr @@ -0,0 +1,10 @@ +error: Type constructor `many` is available if eiter feature `use_std` or feature `use_alloc` is enabled. Also feature `many` should be enabled. + --> tests/dt/type_constructor/dynamic/types_many_no/many_too_many_params.rs:4:1 + | +4 | / types! +5 | | { +6 | | pub many Many : < T1, T2 >; +7 | | } + | |_^ + | + = note: this error originates in the macro `$crate::_many` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.rs b/module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.rs new file mode 100644 index 0000000000..a8a51ef5a5 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.rs @@ -0,0 +1,11 @@ +use type_constructor as the_module; +use the_module::prelude::*; + +types! +{ + pub many Many : < T1, T2 >; +} + +fn main() +{ +} diff --git a/module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.stderr b/module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.stderr new file mode 100644 index 0000000000..40d4a375b2 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/dynamic/types_many_yes/many_too_many_params.stderr @@ -0,0 +1,11 @@ +error: Parametrized element should be single, because Many has only one element + pub many Many : < T1, T2 > ; + --> tests/dt/type_constructor/dynamic/types_many_yes/many_too_many_params.rs:4:1 + | +4 | / types! +5 | | { +6 | | pub many Many : < T1, T2 >; +7 | | } + | |_^ + | + = note: this error originates in the macro `$crate::_many` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/enumerable_test.rs b/module/postponed/type_constructor/tests/inc/enumerable_test.rs new file mode 100644 index 0000000000..6e4036db52 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/enumerable_test.rs @@ -0,0 +1,264 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +macro_rules! PairDefine +{ + + () + => + { + + struct Pair1( i32, i32 ); + impl the_module::Enumerable for Pair1 + { + type Element = i32; + fn len( &self ) -> usize + { + 2 + } + fn element_ref( &self, index : usize ) -> &Self::Element + { + debug_assert!( index < 2 ); + if index == 0 + { + &self.0 + } + else + { + &self.1 + } + } + fn element_copy( &self, index : usize ) -> Self::Element + { + debug_assert!( index < 2 ); + if index == 0 + { + self.0 + } + else + { + self.1 + } + } + } + // impl the_module::EnumerableMut for Pair1 + // { + // fn element_mut< 'slf, 'element >( &'slf mut self, index : usize ) -> &'element mut Self::Element + // where + // 'element : 'slf, + // { + // debug_assert!( index < 2 ); + // if index == 0 + // { + // &mut self.0 + // } + // else + // { + // &mut self.1 + // } + // } + // } + + }; + +} + +// + +tests_impls! +{ + + fn basic() + { + use the_module::prelude::*; + PairDefine!(); + + /* test.case( "basic" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + a_id!( pair.element_copy( 0 ), 13 ); + a_id!( pair.element_copy( 1 ), 31 ); + a_id!( pair.element( 0 ), &13 ); + a_id!( pair.element( 1 ), &31 ); + + } + + // + + fn manual_into_iter() + { + use the_module::prelude::*; + PairDefine!(); + + impl IntoIterator for Pair1 + { + type Item = < Pair1 as Enumerable >::Element; + type IntoIter = the_module::EnumerableIteratorCopy< Self >; + fn into_iter( self ) -> Self::IntoIter + { + the_module::EnumerableIteratorCopy::new( self ) + } + } + + impl< 'a > IntoIterator for &'a Pair1 + { + type Item = &'a < Pair1 as Enumerable >::Element; + type IntoIter = the_module::EnumerableIteratorRef< 'a, Pair1 >; + fn into_iter( self ) -> Self::IntoIter + { + the_module::EnumerableIteratorRef::new( self ) + } + } + + /* test.case( "consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + for e in pair + { + println!( "{}", e ); + } + // a_id!( pair.len(), 2 ); + + /* test.case( "consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + let got : Vec< _ > = pair.into_iter().collect(); + let exp = vec![ 13, 31 ]; + a_id!( got, exp ); + + /* test.case( "non-consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + for e in &pair + { + println!( "{}", e ); + } + a_id!( pair.len(), 2 ); + + /* test.case( "non-consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + let got : Vec< _ > = ( &pair ).into_iter().cloned().collect(); + let exp = vec![ 13, 31 ]; + a_id!( got, exp ); + a_id!( pair.len(), 2 ); + + } + + // + + fn enumerable_iterate_trait() + { + use the_module::prelude::*; + PairDefine!(); + + /* test.case( "consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + for e in pair.enumerable_iterate_consuming() + { + println!( "{}", e ); + } + // a_id!( pair.len(), 2 ); + + /* test.case( "consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + let got : Vec< _ > = pair.enumerable_iterate_consuming().collect(); + let exp = vec![ 13, 31 ]; + a_id!( got, exp ); + + /* test.case( "non-consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + for e in pair.enumerable_iterate() + { + println!( "{}", e ); + } + a_id!( pair.len(), 2 ); + + /* test.case( "non-consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + let got : Vec< _ > = pair.enumerable_iterate().cloned().collect(); + let exp = vec![ 13, 31 ]; + a_id!( got, exp ); + a_id!( pair.len(), 2 ); + + } + + // + + fn into_iterate_enumerable_iterate_trait() + { + use the_module::prelude::*; + PairDefine!(); + + impl IntoIterator for Pair1 + { + type Item = < Pair1 as Enumerable >::Element; + type IntoIter = the_module::EnumerableIteratorCopy< Self >; + fn into_iter( self ) -> Self::IntoIter + { + the_module::EnumerableIteratorCopy::new( self ) + } + } + + impl< 'a > IntoIterator for &'a Pair1 + { + type Item = &'a < Pair1 as Enumerable >::Element; + type IntoIter = the_module::EnumerableIteratorRef< 'a, Pair1 >; + fn into_iter( self ) -> Self::IntoIter + { + the_module::EnumerableIteratorRef::new( self ) + } + } + + /* test.case( "consumable iterator" ); */ + let pair = Pair1( 13, 31 ); + a_id!( pair.len(), 2 ); + for e in pair + { + println!( "{}", e ); + } + // a_id!( pair.len(), 2 ); + +// /* test.case( "consumable iterator" ); */ +// let pair = Pair1( 13, 31 ); +// a_id!( pair.len(), 2 ); +// let got : Vec< _ > = pair.into_iter().collect(); +// let exp = vec![ 13, 31 ]; +// a_id!( got, exp ); +// +// /* test.case( "non-consumable iterator" ); */ +// let pair = Pair1( 13, 31 ); +// a_id!( pair.len(), 2 ); +// for e in &pair +// { +// println!( "{}", e ); +// } +// a_id!( pair.len(), 2 ); +// +// /* test.case( "non-consumable iterator" ); */ +// let pair = Pair1( 13, 31 ); +// a_id!( pair.len(), 2 ); +// let got : Vec< _ > = ( &pair ).into_iter().cloned().collect(); +// let exp = vec![ 13, 31 ]; +// a_id!( got, exp ); +// a_id!( pair.len(), 2 ); + + } + +} + +// + +tests_index! +{ + basic, + manual_into_iter, + enumerable_iterate_trait, + into_iterate_enumerable_iterate_trait, +} diff --git a/module/postponed/type_constructor/tests/inc/fundamental_data_type_tests.rs b/module/postponed/type_constructor/tests/inc/fundamental_data_type_tests.rs new file mode 100644 index 0000000000..ee86e8b339 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/fundamental_data_type_tests.rs @@ -0,0 +1,12 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] + +use fundamental_data_type as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ path = "./inc.rs" ] +mod inc; diff --git a/module/postponed/type_constructor/tests/inc/make_interface_test.rs b/module/postponed/type_constructor/tests/inc/make_interface_test.rs new file mode 100644 index 0000000000..0ad21ce9be --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/make_interface_test.rs @@ -0,0 +1,108 @@ +#[ allow( unused_imports ) ] +use super::*; +// use test_tools::exposed::*; +// use the_module::*; + +tests_impls! +{ + + fn max() + { + + #[ derive( Debug, PartialEq, Make ) ] + struct Struct1 + { + _0 : i32, + _1 : i32, + _2 : i32, + _3 : i32, + } + + let got : Struct1 = the_module::from!(); + let exp = Struct1{ _0 : 0, _1 : 0, _2 : 0, _3 : 0 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( 13 ); + let exp = Struct1{ _0 : 13, _1 : 13, _2 : 13, _3 : 13 }; + a_id!( got, exp ); + +// let got : Struct1 = the_module::from!( 0, 1 ); +// let exp = Struct1{ _0 : 0, _1 : 1, _2 : 1, _3 : 1 }; +// a_id!( got, exp ); +// +// let got : Struct1 = the_module::from!( 0, 1, 2 ); +// let exp = Struct1{ _0 : 0, _1 : 1, _2 : 2, _3 : 2 }; +// a_id!( got, exp ); +// +// let got : Struct1 = the_module::from!( 0, 1, 2, 3 ); +// let exp = Struct1{ _0 : 0, _1 : 1, _2 : 2, _3 : 3 }; +// a_id!( got, exp ); + + } + + // + + fn sample() + { + + #[ derive( Debug, PartialEq, Make ) ] + struct Struct1 + { + a : i32, + b : i32, + } + + let got : Struct1 = the_module::from!(); + let exp = Struct1{ a : 0, b : 0 }; + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( 13 ); + let exp = Struct1{ a : 13, b : 13 }; + a_id!( got, exp ); + + // let got : Struct1 = the_module::from!( 1, 3 ); + // let exp = Struct1{ a : 1, b : 3 }; + // a_id!( got, exp ); + + } + + // + + fn slice_like() + { + + #[ derive( Debug, PartialEq, Make ) ] + struct Struct1( i32, i32, i32, i32 ); + + let got : Struct1 = the_module::from!(); + let exp = Struct1( 0, 0, 0, 0 ); + a_id!( got, exp ); + + let got : Struct1 = the_module::from!( 13 ); + let exp = Struct1( 13, 13, 13, 13 ); + a_id!( got, exp ); + +// let got : Struct1 = the_module::from!( 0, 1 ); +// let exp = Struct1( 0, 1, 1, 1 ); +// a_id!( got, exp ); +// +// let got : Struct1 = the_module::from!( 0, 1, 2 ); +// let exp = Struct1( 0, 1, 2, 2 ); +// a_id!( got, exp ); + + // qqq : write negative test + // let got : Struct1 = the_module::from!( 0, 1, 2, 3 ); + // let exp = Struct1( 0, 1, 2, 3 ); + // a_id!( got, exp ); + + } +} + +// + +tests_index! +{ + max, + sample, + slice_like, +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.rs b/module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.rs new file mode 100644 index 0000000000..78e08ac7a6 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.rs @@ -0,0 +1,7 @@ +use type_constructor::prelude::*; + +fn main() +{ + types!( many Bad : < T > ); + Bad::from( ( 1, 2 ) ); +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.stderr b/module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.stderr new file mode 100644 index 0000000000..7372f18a51 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_from_tuple_test.stderr @@ -0,0 +1,15 @@ +error[E0277]: `({integer}, {integer})` is not an iterator + --> tests/dt/type_constructor/many/many_from_tuple_test.rs:6:3 + | +6 | Bad::from( ( 1, 2 ) ); + | ^^^ `({integer}, {integer})` is not an iterator + | + = help: the trait `Iterator` is not implemented for `({integer}, {integer})` + = help: the trait `From< Collection >` is implemented for `Bad< T >` + = note: required for `({integer}, {integer})` to implement `IntoIterator` +note: required for `Bad< _ >` to implement `From<({integer}, {integer})>` + --> tests/dt/type_constructor/many/many_from_tuple_test.rs:5:3 + | +5 | types!( many Bad : < T > ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ unsatisfied trait bound introduced here + = note: this error originates in the macro `$crate::_many` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/many/many_parameter_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/many/many_parameter_main_gen_test.rs new file mode 100644 index 0000000000..346c713033 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parameter_main_gen_test.rs @@ -0,0 +1,15 @@ +#[ allow( unused_imports ) ] +use super::*; + +// trace_macros!( true ); +// the_module::types! +// { +// #[ derive( Debug, Clone ) ] +// #[ derive( PartialEq, Default ) ] +// many Many : < T >; +// } +// trace_macros!( false ); + +// include!( "./many_parameter_main_test_only.rs" ); + +include!( "./many_parameter_main_manual_test.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/many/many_parameter_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/many/many_parameter_main_manual_test.rs new file mode 100644 index 0000000000..9237735976 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parameter_main_manual_test.rs @@ -0,0 +1,144 @@ +#[ allow( unused_imports ) ] +use super::*; + +// trace_macros!( true ); +// the_module::types! +// { +// #[ derive( Debug, Clone ) ] +// #[ derive( PartialEq, Default ) ] +// many Many : < T >; +// } +// trace_macros!( false ); + +#[ derive( Debug, Clone ) ] +#[ derive( PartialEq, Default ) ] +struct Many< T > ( pub the_module::_Vec < T > ); + +impl< T > core::ops::Deref for Many< T > +{ + type Target = the_module::_Vec < T >; + #[ inline ] + fn deref( &self) -> & Self::Target + { + &self.0 + } +} + +impl< T > core::ops::DerefMut for Many< T > +{ + #[ inline ] + fn deref_mut( &mut self) -> & mut Self::Target + { + &mut self.0 + } +} + +impl< Collection, T, IntoT > +From< Collection > +for Many< T > +where + Collection : IntoIterator< Item = IntoT >, + IntoT : Into< T >, +{ + #[ inline ] + fn from( src : Collection ) -> Self + { + Self( src.into_iter().map( | e | e.into() ).collect::< Vec< T > >() ) + } +} + +// impl< T > From < T > for Many< T > +// { +// #[ inline ] +// fn from( src : T ) -> Self +// { +// Self( the_module::_vec![ src ] ) +// } +// } +// +// impl < T > From < & T > for Many< T > +// where T : Clone, +// { +// #[ inline ] +// fn from( src : &T ) -> Self +// { +// Self( the_module::_vec![ src.clone() ] ) +// } +// } +// +// impl< T > From < ( T, ) > for Many< T > +// { +// #[ inline ] +// fn from( src : ( T, ) ) -> Self +// { +// Self( the_module::_vec![ src.0 ] ) +// } +// } +// +// impl < T, const N : usize > From < [T ; N] > for Many< T > +// { +// #[ inline ] +// fn from( src : [ T ; N ] ) -> Self +// { +// Self( the_module::_Vec::from( src ) ) +// } +// } +// +// impl< T > From < &[ T ] > for Many< T > where T : Clone, +// { +// #[ inline ] +// fn from( src : &[ T ] ) -> Self +// { +// Self( the_module::_Vec::from( src ) ) +// } +// } + +impl< T > the_module::AsSlice< T > for Many< T > +{ + #[ inline ] fn as_slice(& self) -> &[ T ] + { + &self[ .. ] + } +} + +the_module::_if_from! +{ + + // impl< T > the_module::From_0 for Many< T > + // { + // #[ inline ] + // fn from_0() -> Self + // { + // Self( the_module::_Vec::new() ) + // } + // } + + impl< T > the_module::From_1 < T > for Many< T > + { + #[ inline ] + fn from_1(_0 : T) -> Self + { + Self(the_module::_vec! [_0]) + } + } + + impl< T > the_module::From_2 < T, T > for Many< T > + { + #[ inline ] + fn from_2(_0 : T, _1 : T) -> Self + { + Self( the_module::_vec![ _0, _1 ] ) + } + } + + impl< T > the_module::From_3 < T, T, T > for Many< T > + { + #[ inline ] fn from_3(_0 : T, _1 : T, _2 : T) -> Self + { + Self( the_module::_vec![ _0, _1, _2 ] ) + } + } + +} + +include!( "./many_parameter_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/many/many_parameter_main_test_only.rs b/module/postponed/type_constructor/tests/inc/many/many_parameter_main_test_only.rs new file mode 100644 index 0000000000..bfb208c10a --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parameter_main_test_only.rs @@ -0,0 +1,156 @@ +#[ derive( PartialEq, Debug ) ] +struct MySingle +( + pub f32, +); +impl From< MySingle > +for f32 +{ + fn from( src : MySingle ) -> Self + { + src.0 + } +} + +tests_impls! +{ + fn main() + { + use core::fmt; + + #[ allow( unused_macros ) ] + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + $( $Rest )* + }; + } + + /* test.case( "basic" ) */ + let instance1 = Many::< f32 >::from( core::iter::once( 13.0_f32 ) ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( implements!( instance1 => Default ) ); + assert!( !implements!( instance1 => fmt::Display ) ); + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make0" ) */ + let got : Many< f32 > = the_module::from!(); + let exp = Many::< f32 >( std::vec::Vec::new() ); + a_id!( got, exp ); + + /* test.case( "make1" ) */ + let got : Many< f32 > = the_module::from!( mk!( 1.0 ) ); + let exp = Many::< f32 >( vec!( mk!( 1.0 ) ) ); + a_id!( got, exp ); + + /* test.case( "make2" ) */ + let got : Many< f32 > = the_module::from!( mk!( 1.0 ), mk!( 1.0 ) ); + let exp = Many::< f32 >( vec!( mk!( 1.0 ), mk!( 1.0 ) ) ); + a_id!( got, exp ); + + /* test.case( "make3" ) */ + let got : Many< f32 > = the_module::from!( mk!( 1.0 ), mk!( 1.0 ), mk!( 1.0 ) ); + let exp = Many::< f32 >( vec!( mk!( 1.0 ), mk!( 1.0 ), mk!( 1.0 ) ) ); + a_id!( got, exp ); + } + + /* test.case( "from f32 into Many" ) */ + let instance1 : Many< f32 > = ( core::iter::once( 13.0 ) ).into(); + let instance2 = Many::< f32 >::from( core::iter::once( 13.0 ) ); + a_id!( instance1.0, vec!( 13.0 ) ); + a_id!( instance2.0, vec!( 13.0 ) ); + a_id!( instance1, instance2 ); + + // /* test.case( "from &f32 into Many" ) */ + // let instance1 : Many< f32 > = ( &13.0 ).into(); + // let instance2 = Many::< f32 >::from( &13.0 ); + // a_id!( instance1.0, vec!( 13.0 ) ); + // a_id!( instance2.0, vec!( 13.0 ) ); + // a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Many< f32 > = ( Many::from( core::iter::once( 13.0 ) ) ).into(); + let instance2 = Many::< f32 >::from( Many::from( core::iter::once( 13.0 ) ) ); + a_id!( instance1.0, vec!( 13.0 ) ); + a_id!( instance2.0, vec!( 13.0 ) ); + a_id!( instance1, instance2 ); + + // /* test.case( "from tuple" ) */ + // let got : Many< f32 > = ( 13.0, ).into(); + // a_id!( got, Many::from( core::iter::once( 13.0 ) ) ); + // let got = Many::< f32 >::from( ( 13.0, ) ); + // a_id!( got, Many::from( core::iter::once( 13.0 ) ) ); + + /* test.case( "from array" ) */ + let got : Many< f32 > = [ 1.0, 3.0 ].into(); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + let got = Many::< f32 >::from( [ 1.0, 3.0 ] ); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + + /* test.case( "from array of singles" ) */ + let got : Many< f32 > = [ MySingle( 1.0 ), MySingle( 3.0 ) ].into(); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + let got = Many::< f32 >::from( [ MySingle( 1.0 ), MySingle( 3.0 ) ] ); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + + /* test.case( "from list" ) */ + let got : Many< f32 > = vec![ 1.0, 3.0 ].into(); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + let got = Many::< f32 >::from( vec![ 1.0, 3.0 ] ); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + + /* test.case( "from list of singles" ) */ + let got : Many< f32 > = vec![ MySingle( 1.0 ), MySingle( 3.0 ) ].into(); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + let got = Many::< f32 >::from( vec![ MySingle( 1.0 ), MySingle( 3.0 ) ] ); + a_id!( got, Many( vec![ 1.0, 3.0 ] ) ); + + /* test.case( "from slice" ) */ + let got : Many< f32 > = (&[ 13.0 ][ .. ]).iter().cloned().into(); + a_id!( got, Many::from( core::iter::once( 13.0 ) ) ); + let got = Many::< f32 >::from( (&[ 13.0 ][ .. ]).iter().cloned() ); + a_id!( got, Many::from( core::iter::once( 13.0 ) ) ); + + /* test.case( "from slice" ) */ + let got : Many< f32 > = (&[ 1.0, 2.0, 3.0 ][ .. ]).iter().cloned().into(); + a_id!( got, Many::from( [ 1.0, 2.0, 3.0 ] ) ); + let got = Many::< f32 >::from( (&[ 1.0, 2.0, 3.0 ][ .. ]).iter().cloned() ); + a_id!( got, Many::from( [ 1.0, 2.0, 3.0 ] ) ); + + /* test.case( "clone / eq" ) */ + let instance1 : Many< f32 > = core::iter::once( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, vec!( 13.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Many< f32 > = core::iter::once( 13.0 ).into(); + a_id!( got.len(), 1 ); + a_id!( got.pop(), Some( 13.0 ) ); + a_id!( got.0, std::vec::Vec::< f32 >::new() ); + + /* test.case( "as_slice" ) */ + let src : Many< f32 > = core::iter::once( 13.0 ).into(); + let got = src.as_slice(); + a_id!( got, &[ 13.0, ][ .. ] ); + assert!( !mem::same_ptr( &src, got ) ); + let got = &src[ .. ]; + a_id!( got, &[ 13.0, ][ .. ] ); + assert!( !mem::same_ptr( &src, got ) ); + + } +} + +// + +tests_index! +{ + main, +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_parameter_test.rs b/module/postponed/type_constructor/tests/inc/many/many_parameter_test.rs new file mode 100644 index 0000000000..85ad31aa4b --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parameter_test.rs @@ -0,0 +1,168 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + fn parameter_complex() + { + + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + many Many : < T : core::cmp::PartialEq + core::clone::Clone >; + } + + /* test.case( "from f32 into Many" ) */ + let instance1 : Many< f32 > = core::iter::once( 13.0 ).into(); + let instance2 = Many::< f32 >::from( core::iter::once( 13.0 ) ); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Many< f32 > = ( Many::from( core::iter::once( 13.0 ) ) ).into(); + let instance2 = Many::< f32 >::from( Many::from( core::iter::once( 13.0 ) ) ); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Many< f32 > = core::iter::once( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Many< f32 > = core::iter::once( 13.0 ).into(); + a_id!( got.len(), 1 ); + a_id!( got.pop(), Some( 13.0 ) ); + a_id!( got.0, std::vec::Vec::< f32 >::new() ); + + } + + // + + fn parameter_no_derives() + { + + mod mod1 + { + pub struct Floats< T1, T2 > + ( + pub T1, + pub T2, + ); + } + + // trace_macros!( true ); + the_module::types! + { + many Many : < T >; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Many( vec![ mod1::Floats( 13.0, 31.0 ) ] ); + + } + + // + + fn struct_basic() + { + + /* test.case( "from f32 into Many" ) */ + let instance1 : the_module::Many< f32 > = core::iter::once( 13.0 ).into(); + let instance2 = the_module::Many::< f32 >::from( core::iter::once( 13.0 ) ); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : the_module::Many< f32 > = ( the_module::Many::from( core::iter::once( 13.0 ) ) ).into(); + let instance2 = the_module::Many::< f32 >::from( the_module::Many::from( core::iter::once( 13.0 ) ) ); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : the_module::Many< f32 > = core::iter::once( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "default" ) */ + let instance1 : the_module::Many< f32 > = Default::default(); + a_id!( instance1.0, std::vec::Vec::< f32 >::new() ); + + /* test.case( "deref" ) */ + let mut got : the_module::Many< f32 > = core::iter::once( 13.0 ).into(); + a_id!( got.len(), 1 ); + a_id!( got.pop(), Some( 13.0 ) ); + + /* test.case( "iterate" ) */ + // let mut got : the_module::Many< f32 > = [ 1.0, 2.0, 3.0 ].into(); + // a_id!( got.len(), 3 ); + // for e in got + // { + // dbg!( e ); + // } + // a_id!( got.len(), 3 ); + + // zzz + + } + + // + + fn struct_no_derives() + { + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats( $( $Rest )* ) + }; + } + + mod mod1 + { + pub struct Floats< T >( pub T ); + impl< T > Floats< T > + { + pub fn new( src : T ) -> Self + { Self( src ) } + } + } + + /* test.case( "from f32 into Many" ) */ + let instance1 : the_module::Many< mod1::Floats< f32 > > = core::iter::once( mk!( 13.0 ) ).into(); + let instance2 = the_module::Many::< mod1::Floats< f32 > >::from( core::iter::once( mk!( 13.0 ) ) ); + a_id!( instance1.0[ 0 ].0, 13.0 ); + a_id!( instance1.len(), 1 ); + a_id!( instance2.0[ 0 ].0, 13.0 ); + a_id!( instance2.len(), 1 ); + + /* test.case( "deref" ) */ + let mut got : the_module::Many< f32 > = core::iter::once( 13.0 ).into(); + a_id!( got.len(), 1 ); + a_id!( got.pop(), Some( 13.0 ) ); + + } + +} + +// + +tests_index! +{ + parameter_complex, + parameter_no_derives, + struct_basic, + struct_no_derives, +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_gen_test.rs new file mode 100644 index 0000000000..953130ffa7 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_gen_test.rs @@ -0,0 +1,55 @@ +#[ allow( unused_imports ) ] +use super::*; + +macro_rules! mk +{ + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; +} + +mod mod1 +{ + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + +} + +// trace_macros!( true ); +the_module::types! +{ + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + many Many : mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >; +} +// trace_macros!( false ); + +include!( "./many_parametrized_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_manual_test.rs new file mode 100644 index 0000000000..ccb735b162 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_manual_test.rs @@ -0,0 +1,243 @@ +#[ allow( unused_imports ) ] +use super::*; + +macro_rules! mk +{ + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; +} + +mod mod1 +{ + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + +} + +// + +// trace_macros!( true ); +// the_module::types! +// { +// #[ derive( Debug, Clone ) ] +// #[ derive( PartialEq ) ] +// many Many : mod1::Floats< T1 : PartialEq, T2 : Default >; +// } +// trace_macros!( false ); + +// + +#[ derive( Debug, Clone ) ] +#[ derive( PartialEq ) ] +struct Many< T1 : PartialEq, T2 : Default > +( pub the_module::_Vec< mod1::Floats < T1, T2 > > ); + +impl< T1 : PartialEq, T2 : Default > core::ops::Deref +for Many < T1, T2 > +{ + type Target = the_module::_Vec < mod1::Floats < T1, T2 > >; + #[ inline ] + fn deref( & self ) -> & Self::Target + { + &self.0 + } +} + +impl < T1 : PartialEq, T2 : Default > core::ops::DerefMut +for Many < T1, T2 > +{ + #[ inline ] + fn deref_mut( & mut self ) -> & mut Self::Target + { + &mut self.0 + } +} + +impl< Collection, Item, T1 : PartialEq, T2 : Default > +From< Collection > +for Many< T1, T2 > +where + Collection : IntoIterator< Item = Item >, + Item : Into< mod1::Floats< T1, T2 > >, +{ + #[ inline ] + fn from( src : Collection ) -> Self + { + let src2 = src + .into_iter() + .map( | e | e.into() ) + .collect::< the_module::_Vec< mod1::Floats< T1, T2 > > >(); + Self( src2 ) + } +} + +// impl +// < 'a, Collection, T1 : PartialEq + 'a, T2 : Default + 'a > +// From< Collection > +// for Many +// < T1, T2 > +// where +// Collection : IntoIterator< Item = &'a mod1::Floats< T1, T2 > >, +// { +// #[ inline ] +// fn from( src : Collection ) -> Self +// { +// let src2 = src +// .into_iter() +// .map( | e | *e ) +// .collect::< the_module::_Vec< mod1::Floats< T1, T2 > > >(); +// Self( src2 ) +// } +// } + +impl < T1 : PartialEq, T2 : Default > +From < mod1::Floats < T1, T2 > > +for Many < T1, T2 > +{ + #[ inline ] + fn from( src : mod1::Floats < T1, T2 > ) -> Self + { + Self( the_module::_vec! [ src ] ) + } +} + +// yyy +// impl < __FromRef, T1 : PartialEq, T2 : Default > +// From < & __FromRef > +// for Many < T1, T2 > +// where +// __FromRef : Clone, Self : From < __FromRef >, +// { +// #[ inline ] +// fn from( src : & __FromRef ) -> Self +// { +// From::from( ( * src ).clone() ) +// } +// } + +// impl < T1 : PartialEq, T2 : Default > +// From < ( mod1::Floats < T1, T2 >, ) > +// for Many < T1, T2 > +// { +// #[ inline ] +// fn from( src : ( mod1::Floats < T1, T2 >, ) ) -> Self +// { +// Self( the_module::_vec![ src.0 ] ) +// } +// } + +// impl < T1 : PartialEq, T2 : Default, const N : usize > +// From < [ mod1::Floats < T1, T2 > ; N ] > +// for Many < T1, T2 > +// { +// #[ inline ] fn from( src : [ mod1::Floats < T1, T2 > ; N ] ) -> Self +// { +// Self( the_module::_Vec::from( src ) ) +// } +// } + +// impl < T1 : PartialEq, T2 : Default > +// From < &[ mod1::Floats < T1, T2 > ] > +// for Many < T1, T2 > +// where +// mod1::Floats < T1, T2 > : Clone, +// { +// #[ inline ] +// fn from( src : & [ mod1::Floats < T1, T2 > ] ) -> Self +// { +// Self( the_module::_Vec::from( src ) ) +// } +// } +// yyy + +impl < T1 : PartialEq, T2 : Default > +the_module::AsSlice +< mod1::Floats < T1, T2 > > +for Many < T1, T2 > +{ + #[ inline ] + fn as_slice( & self ) -> &[ mod1::Floats < T1, T2 > ] + { + &self [ .. ] + } +} + +the_module::_if_from! +{ + + impl < T1 : PartialEq, T2 : Default > the_module::From_0 + for Many < T1, T2 > + { + #[ inline ] fn from_0() -> Self + { + Self( the_module::_Vec::< mod1::Floats < T1, T2 > >::new() ) + } + } + + impl < T1 : PartialEq, T2 : Default > + the_module::From_1 < mod1::Floats < T1, T2 > > + for Many < T1, T2 > + { + #[ inline ] + fn from_1( _0 : mod1::Floats < T1, T2 >, ) -> Self + { + Self( the_module::_vec! [ _0 ] ) + } + } + + impl < T1 : PartialEq, T2 : Default > + the_module::From_2 < mod1::Floats < T1, T2 >, mod1::Floats < T1, T2 >, > + for Many < T1, T2 > + { + #[ inline ] + fn from_2( _0 : mod1::Floats < T1, T2 >, _1 : mod1::Floats < T1, T2 >, ) -> Self + { + Self( the_module::_vec! [ _0, _1 ] ) + } + } + + impl < T1 : PartialEq, T2 : Default > + the_module::From_3 < mod1::Floats < T1, T2 >, mod1::Floats < T1, T2 >, mod1::Floats < T1, T2 >, > + for Many < T1, T2 > + { + #[ inline ] + fn from_3( _0 : mod1::Floats < T1, T2 >, _1 : mod1::Floats < T1, T2 >, _2 : mod1::Floats < T1, T2 >, ) -> Self + { + Self( the_module::_vec! [ _0, _1, _2 ] ) + } + } + +} + +// + +include!( "./many_parametrized_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_test_only.rs b/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_test_only.rs new file mode 100644 index 0000000000..1caf4fde74 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parametrized_main_test_only.rs @@ -0,0 +1,151 @@ +// #[ derive( PartialEq, Debug ) ] +// struct MySingle +// ( +// pub f32, +// ); +// impl From< MySingle > +// for f32 +// { +// fn from( src : MySingle ) -> Self +// { +// src.0 +// } +// } + +tests_impls! +{ + fn main() + { + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make0" ) */ + let got : Many< f32, f64 > = the_module::from!(); + let exp = Many::< f32, f64 >( std::vec::Vec::new() ); + a_id!( got, exp ); + + /* test.case( "make1" ) */ + let got : Many< f32, f64 > = the_module::from!( mk!( 1.0 ) ); + let exp = Many::< f32, f64 >( vec!( mk!( 1.0 ) ) ); + a_id!( got, exp ); + + /* test.case( "make2" ) */ + let got : Many< f32, f64 > = the_module::from!( mk!( 1.0 ), mk!( 1.0 ) ); + let exp = Many::< f32, f64 >( vec!( mk!( 1.0 ), mk!( 1.0 ) ) ); + a_id!( got, exp ); + + /* test.case( "make3" ) */ + let got : Many< f32, f64 > = the_module::from!( mk!( 1.0 ), mk!( 1.0 ), mk!( 1.0 ) ); + let exp = Many::< f32, f64 >( vec!( mk!( 1.0 ), mk!( 1.0 ), mk!( 1.0 ) ) ); + a_id!( got, exp ); + } + + /* test.case( "from f32 into Many" ) */ + let instance1 : Many< f32, f64 > = [ mk!( 13.0 ) ].into(); + let instance2 = Many::< f32, f64 >::from([ mk!( 13.0 ) ]); + a_id!( instance1.0, vec![ mk!( 13.0 ) ] ); + a_id!( instance2.0, vec![ mk!( 13.0 ) ] ); + a_id!( instance1, instance2 ); + + // /* test.case( "from &f32 into Many" ) */ + // let instance1 : Many< f32, f64 > = ( &mk!( 13.0 ) ).into(); + // let instance2 = Many::< f32, f64 >::from( &mk!( 13.0 ) ); + // a_id!( instance1.0, vec![ mk!( 13.0 ) ] ); + // a_id!( instance2.0, vec![ mk!( 13.0 ) ] ); + // a_id!( instance1, instance2 ); + // yyy + + /* test.case( "from itself into itself" ) */ + let instance1 : Many< f32, f64 > = ( Many::from([ mk!( 13.0 ) ]) ).into(); + let instance2 = Many::< f32, f64 >::from( Many::from([ mk!( 13.0 ) ]) ); + a_id!( instance1.0, vec![ mk!( 13.0 ) ] ); + a_id!( instance2.0, vec![ mk!( 13.0 ) ] ); + a_id!( instance1, instance2 ); + + // /* test.case( "from tuple" ) */ + // let got : Many< f32, f64 > = ( mk!( 13.0 ), ).into(); + // let exp : Many< f32, f64 > = Many::from([ mk!( 13.0 ) ]); + // a_id!( got, exp ); + // let got = Many::< f32, f64 >::from( ( mk!( 13.0 ), ) ); + // let exp : Many< f32, f64 > = Many::from([ mk!( 13.0 ) ]); + // a_id!( got, exp ); + // yyy + + /* test.case( "from array" ) */ + let got : Many< f32, f64 > = [ mk!( 13.0 ), ].into(); + let exp : Many< f32, f64 > = Many::from([ mk!( 13.0 ) ]); + a_id!( got, exp ); + let got = Many::< f32, f64 >::from( [ mk!( 13.0 ), ] ); + let exp : Many< f32, f64 > = Many::from([ mk!( 13.0 ) ]); + a_id!( got, exp ); + + /* test.case( "from array" ) */ + let got : Many< f32, f64 > = [ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ), ].into(); + let exp : Many< f32, f64 > = Many::from( [ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ) ] ); + a_id!( got, exp ); + let got = Many::< f32, f64 >::from( [ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ) ] ); + let exp : Many< f32, f64 > = Many::from( [ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ) ] ); + a_id!( got, exp ); + + /* test.case( "from array of singles" ) */ + let got : Many< f32, f64 > = [ 1.0, 3.0 ].into(); + a_id!( got, Many( vec![ mk!( 1.0 ), mk!( 3.0 ) ] ) ); + let got = Many::< f32, f64 >::from( [ 1.0, 3.0 ] ); + a_id!( got, Many( vec![ mk!( 1.0 ), mk!( 3.0 ) ] ) ); + + /* test.case( "from list" ) */ + let got : Many< f32, f64 > = vec![ mk!( 1.0 ), mk!( 3.0 ) ].into(); + a_id!( got, Many( vec![ mk!( 1.0 ), mk!( 3.0 ) ] ) ); + let got = Many::< f32, f64 >::from( vec![ mk!( 1.0 ), mk!( 3.0 ) ] ); + a_id!( got, Many( vec![ mk!( 1.0 ), mk!( 3.0 ) ] ) ); + + /* test.case( "from list of singles" ) */ + let got : Many< f32, f64 > = vec![ 1.0, 3.0 ].into(); + a_id!( got, Many( vec![ mk!( 1.0 ), mk!( 3.0 ) ] ) ); + let got = Many::< f32, f64 >::from( vec![ 1.0, 3.0 ] ); + a_id!( got, Many( vec![ mk!( 1.0 ), mk!( 3.0 ) ] ) ); + + /* test.case( "from slice" ) */ + let got : Many< f32, f64 > = ( ( &[ mk!( 13.0 ), ][ .. ] ).iter().cloned() ).into(); + let exp : Many< f32, f64 > = Many::from([ mk!( 13.0 ) ]); + a_id!( got, exp ); + let got = Many::< f32, f64 >::from( ( &[ mk!( 13.0 ), ][ .. ] ).iter().cloned() ); + let exp : Many< f32, f64 > = Many::from([ mk!( 13.0 ) ]); + a_id!( got, exp ); + + /* test.case( "from slice" ) */ + let got : Many< f32, f64 > = ( &[ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ) ][ .. ] ).iter().cloned().into(); + let exp : Many< f32, f64 > = Many::from( [ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ) ] ); + a_id!( got, exp ); + let got = Many::< f32, f64 >::from( ( &[ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ) ][ .. ] ).iter().cloned() ); + let exp : Many< f32, f64 > = Many::from( [ mk!( 1.0 ), mk!( 2.0 ), mk!( 3.0 ) ] ); + a_id!( got, exp ); + + /* test.case( "clone / eq" ) */ + let instance1 : Many< f32, f64 > = [ mk!( 13.0 ) ].into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, vec![ mk!( 13.0 ) ] ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Many< f32, f64 > = [ mk!( 13.0 ) ].into(); + a_id!( got.len(), 1 ); + a_id!( got.pop(), Some( mk!( 13.0 ) ) ); + + /* test.case( "as_slice" ) */ + let src : Many< f32, f64 > = Many::from([ mk!( 13.0 ) ]); + let got = src.as_slice(); + a_id!( got, &[ mk!( 13.0 ), ][ .. ] ); + let got = &src[ .. ]; + a_id!( got, &[ mk!( 13.0 ), ][ .. ] ); + + } + +} + +// + +tests_index! +{ + main, +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_parametrized_test.rs b/module/postponed/type_constructor/tests/inc/many/many_parametrized_test.rs new file mode 100644 index 0000000000..ae811f10ca --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_parametrized_test.rs @@ -0,0 +1,318 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + + // + + fn basic() + { + use core::fmt; + + mod mod1 + { + pub use f32; + } + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + many Many : mod1::f32; + + } + // trace_macros!( false ); + + /* test.case( "from f32 into Many" ) */ + let instance1 : Many = [ 13.0 ].into(); + let instance2 = Many::from([ 13.0 ]); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Many = ( Many::from([ 13.0 ]) ).into(); + let instance2 = Many::from( Many::from([ 13.0 ]) ); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Many = [ 13.0 ].into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Many = [ 13.0 ].into(); + a_id!( got.len(), 1 ); + a_id!( got.pop(), Some( 13.0 ) ); + + } + + // + + fn empty_parameter() + { + + mod mod1 + { + pub use f32; + } + + // trace_macros!( true ); + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + many Many : mod1::f32<>; + } + // trace_macros!( false ); + + /* test.case( "from f32 into Many" ) */ + let instance1 : Many = [ 13.0 ].into(); + let instance2 = Many::from([ 13.0 ]); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + } + + // + + fn no_parameter_no_derive() + { + + mod mod1 + { + #[ derive( Clone ) ] + pub struct Float + ( + pub f32, + ); + } + + // trace_macros!( true ); + the_module::types! + { + many Many : mod1::Float; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Many( vec![ mod1::Float( 13.0 ) ] ); + + } + + // + + fn parametrized_no_derives() + { + + mod mod1 + { + pub struct Floats< T1, T2 > + ( + pub T1, + pub T2, + ); + } + + // trace_macros!( true ); + the_module::types! + { + many Many : mod1::Floats< T1, T2 >; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Many::< f32, f64 >( vec![ mod1::Floats( 13.0, 31.0 ) ] ); + + } + + // zzz + +// fn problem1() +// { +// +// // #[ derive( Clone ) ] +// pub struct Struct +// { +// } +// +// // trace_macros!( true ); +// // the_module::types! +// // { +// // pub many Structs : Struct; +// // } +// // trace_macros!( false ); +// +// pub struct Structs (pub the_module :: _Vec < Struct >) ; +// +// impl core :: ops :: Deref for Structs +// { +// type Target = the_module :: _Vec < Struct > ; #[ inline ] fn deref(& self) -> & +// Self :: Target { & self.0 } +// } +// +// impl core :: ops :: DerefMut for Structs +// { +// #[ inline ] fn deref_mut(& mut self) -> & mut Self :: Target +// { & mut self.0 } +// } +// +// impl From < Struct > for Structs +// { #[ inline ] fn from(src : Struct) -> Self { Self(the_module :: _vec! [src]) } } +// +// impl < __FromRef > From < & __FromRef > for Structs where __FromRef : Clone, +// Self : From < __FromRef >, +// { +// #[ inline ] fn from(src : & __FromRef) -> Self +// { From :: from((* src).clone()) } +// } +// +// impl From < (Struct,) > for Structs +// { +// #[ inline ] fn from(src : (Struct,)) -> Self +// { Self(the_module :: _vec! [src.0]) } +// } +// +// impl < const N : usize > From < [Struct ; N] > +// for Structs +// // where Struct : Clone, +// { +// #[ inline ] fn from(src : [Struct ; N]) -> Self +// { Self(the_module :: _Vec :: from(src)) } +// } +// +// impl From < & [Struct] > for Structs +// where Struct : Clone, +// { +// // #[ inline ] +// fn from(src : & [Struct]) -> Self +// { Self(the_module :: _Vec :: from(src)) } +// } +// +// impl the_module :: AsSlice < Struct > for Structs +// // where Struct : Clone, +// { #[ inline ] fn as_slice(& self) -> & [Struct] { & self [..] } } +// +// impl the_module :: From_0 for Structs +// { +// #[ inline ] fn from_0() -> Self +// { Self(the_module :: _Vec :: < Struct > :: new()) } +// } +// +// impl the_module :: From_1 < Struct > for Structs +// { +// #[ inline ] fn from_1(_0 : Struct,) -> Self +// { Self(the_module :: _vec! [_0]) } +// } +// +// impl the_module :: From_2 < Struct, Struct, > for Structs +// { +// #[ inline ] fn from_2(_0 : Struct, _1 : Struct,) -> Self +// { Self(the_module :: _vec! [_0, _1]) } +// } +// +// impl the_module :: From_3 < Struct, Struct, Struct, > for Structs +// { +// #[ inline ] fn from_3(_0 : Struct, _1 : Struct, _2 : Struct,) -> Self +// { Self(the_module :: _vec! [_0, _1, _2]) } +// } +// +// } + + // + + + // + + fn multiple() + { + use core::fmt; + + the_module::types! + { + + many Many1 : f32; + + #[ derive( Debug ) ] + #[ derive( PartialEq, Clone ) ] + many Many2 : f32; + + } + + /* test.case( "from f32 into Many2" ) */ + let instance1 : Many1 = [ 13.0 ].into(); + let instance2 = Many1::from( core::iter::once( 13.0 ) ); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + assert!( !implements!( instance1 => PartialEq ) ); + assert!( !implements!( instance1 => Clone ) ); + assert!( !implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from f32 into Many2" ) */ + let instance1 : Many2 = [ 13.0 ].into(); + let instance2 = Many2::from( core::iter::once( 13.0 ) ); + a_id!( instance1.0, vec![ 13.0 ] ); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "clone / eq" ) */ + let instance1 : Many2 = [ 13.0 ].into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, vec![ 13.0 ] ); + a_id!( instance1, instance2 ); + + } + + // + + fn samples() + { + + // let slice = &[ 1, 2, 3 ][ .. ]; + // for e in slice + // { + // inspect_type::inspect_type_of!( e ); + // // dbg!( e ); + // } + + /* test.case( "single-line" ) */ + { + the_module::types!( many MyMany : i32 ); + let x = MyMany::from( [ 1, 2, 3 ] ); + println!( "x : {:?}", x.0 ); + } + + } +} + +// + +tests_index! +{ + basic, + empty_parameter, + no_parameter_no_derive, + parametrized_no_derives, + multiple, + samples, +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.rs b/module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.rs new file mode 100644 index 0000000000..7ef7c2ff1b --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.rs @@ -0,0 +1,6 @@ +use type_constructor::prelude::*; + +fn main() +{ + types!( many Bad : < T1, T2 > ); +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.stderr b/module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.stderr new file mode 100644 index 0000000000..2eea7b62fe --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_with_two_args_test.stderr @@ -0,0 +1,8 @@ +error: Parametrized element should be single, because Many has only one element + many Bad : < T1, T2 > + --> tests/dt/type_constructor/many/many_with_two_args_test.rs:5:3 + | +5 | types!( many Bad : < T1, T2 > ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in the macro `$crate::_many` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/many/many_without_args_test.rs b/module/postponed/type_constructor/tests/inc/many/many_without_args_test.rs new file mode 100644 index 0000000000..7c9d0bf386 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_without_args_test.rs @@ -0,0 +1,6 @@ +use type_constructor::prelude::*; + +fn main() +{ + types!( many Bad : < > ); +} diff --git a/module/postponed/type_constructor/tests/inc/many/many_without_args_test.stderr b/module/postponed/type_constructor/tests/inc/many/many_without_args_test.stderr new file mode 100644 index 0000000000..39a62ac586 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/many/many_without_args_test.stderr @@ -0,0 +1,11 @@ +error: no rules expected the token `>` + --> tests/dt/type_constructor/many/many_without_args_test.rs:5:25 + | +5 | types!( many Bad : < > ); + | ^ no rules expected this token in macro call + | +note: while trying to match meta-variable `$ParamName:ident` + --> rust/impl/dt/type_constructor/many.rs + | + | < $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? > + | ^^^^^^^^^^^^^^^^^^ diff --git a/module/postponed/type_constructor/tests/inc/mod.rs b/module/postponed/type_constructor/tests/inc/mod.rs new file mode 100644 index 0000000000..199b42411a --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/mod.rs @@ -0,0 +1,88 @@ + +#[ allow( unused_imports ) ] +use super::*; + +// #[ cfg( any( feature = "type_constructor", feature = "dt_type_constructor" ) ) ] +// #[ cfg( any( feature = "type_constructor", feature = "dt_type_constructor" ) ) ] +// #[ cfg( feature = "enabled" ) ] +// mod type_constructor; + +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( feature = "prelude", feature = "dt_prelude" ) ) ] +mod prelude_test; + +// #[ allow( unused_imports ) ] +// use super::*; + +#[ cfg( feature = "enabled" ) ] +mod single +{ + use super::*; + + mod single_parameter_main_gen_test; + mod single_parameter_main_manual_test; + mod single_parameter_test; + mod single_parametrized_main_gen_test; + mod single_parametrized_main_manual_test; + mod single_parametrized_test; +} + +#[ cfg( feature = "enabled" ) ] +#[ cfg +( + all + ( + // feature = "make", + any( not( feature = "no_std" ), feature = "use_alloc" ), + ) +)] +mod pair +{ + use super::*; + + mod pair_parameter_main_gen_test; + mod pair_parameter_main_manual_test; + // mod pair_parameter_test; + mod pair_parametrized_main_gen_test; + mod pair_parametrized_main_manual_test; + // mod pair_parametrized_test; + + // mod homo_pair_parameter_main_gen_test; + // mod homo_pair_parameter_main_manual_test; + // mod homo_pair_parameter_test; + // mod homo_pair_parametrized_main_gen_test; + mod homo_pair_parametrized_main_manual_test; + // mod homo_pair_parametrized_test; + +} + +#[ cfg( feature = "enabled" ) ] +#[ cfg +( + all + ( + feature = "many", + any( not( feature = "no_std" ), feature = "use_alloc" ), + ) +)] +mod many +{ + use super::*; + // mod many_parameter_main_manual_test; + // mod many_parameter_main_gen_test; + mod many_parameter_test; + mod many_parametrized_main_manual_test; + mod many_parametrized_main_gen_test; + mod many_parametrized_test; +} + +// #[ cfg( feature = "enabled" ) ] +// #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] +// mod make_interface_test; + +#[ cfg( feature = "enabled" ) ] +#[ cfg( any( feature = "vectorized_from", feature = "dt_vectorized_from" ) ) ] +mod vectorized_from_test; + +#[ cfg( feature = "enabled" ) ] +mod enumerable_test; diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.rs new file mode 100644 index 0000000000..ae602b713f --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.rs @@ -0,0 +1,12 @@ +use type_constructor::prelude::*; + +fn main() +{ + types! + { + + pair Bad : i32; + pair Bad : i32; + + } +} diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.stderr b/module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.stderr new file mode 100644 index 0000000000..40e78a1035 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_double_difinition_test.stderr @@ -0,0 +1,289 @@ +error[E0428]: the name `Bad` is defined multiple times + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___`Bad` redefined here + | previous definition of the type `Bad` here + | + = note: `Bad` must be defined only once in the type namespace of this block + = note: this error originates in the macro `$crate::_pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `From` for type `(i32, i32)` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `(i32, i32)` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `From<(i32, i32)>` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `From<[i32; 2]>` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `From<&[i32]>` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `From` for type `[i32; 2]` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `[i32; 2]` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `From< i32 >` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::CloneAsTuple<(i32, i32)>` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::From_0` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::From_2` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::From_1< i32 >` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::AsTuple<(i32, i32)>` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::AsSlice< i32 >` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::AsArray` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `type_constructor::CloneAsArray` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `Deref` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `DerefMut` for type `main::Bad` + --> tests/dt/type_constructor/pair/homo_pair_double_difinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pair Bad : i32; +9 | | pair Bad : i32; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad` + | + = note: this error originates in the derive macro `type_constructor_derive_pair_meta::Pair` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.rs new file mode 100644 index 0000000000..0f91cf7574 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.rs @@ -0,0 +1,7 @@ +use type_constructor::prelude::*; + +fn main() +{ + types!( pair Bad : i32 ); + Bad( 1, "str" ); +} diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.stderr b/module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.stderr new file mode 100644 index 0000000000..08c662e9e4 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_mismatched_types_test.stderr @@ -0,0 +1,13 @@ +error[E0308]: mismatched types + --> tests/dt/type_constructor/pair/homo_pair_mismatched_types_test.rs:6:11 + | +6 | Bad( 1, "str" ); + | --- ^^^^^ expected `i32`, found `&str` + | | + | arguments to this struct are incorrect + | +note: tuple struct defined here + --> tests/dt/type_constructor/pair/homo_pair_mismatched_types_test.rs:5:16 + | +5 | types!( pair Bad : i32 ); + | ^^^ diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_gen_test.rs new file mode 100644 index 0000000000..7b2cf75d36 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_gen_test.rs @@ -0,0 +1,21 @@ +#[ allow( unused_imports ) ] +use super::*; + +// trace_macros!( true ); +// the_module::types! +// { + +// /// +// /// Attribute which is inner. +// /// + +// #[ derive( Debug, Clone ) ] +// #[ derive( PartialEq ) ] +// pair Pair : < T1 : core::cmp::PartialEq + core::clone::Clone >; + +// } +// trace_macros!( false ); + +// include!( "./homo_pair_parameter_main_test_only.rs" ); +include!( "./homo_pair_parameter_main_manual_test.rs" ); + diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_manual_test.rs new file mode 100644 index 0000000000..64acd73764 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_manual_test.rs @@ -0,0 +1,129 @@ +#[ allow( unused_imports ) ] +use super::*; + +/// +/// Attribute which is inner. +/// + +#[ derive( Debug, Clone, PartialEq ) ] +struct Pair< T1 >( pub T1, pub T1 ); +impl< T1 > core::ops::Deref for Pair< T1 > +{ + type Target = ( T1, T1 ); + + #[ inline ] + fn deref( &self ) -> &Self::Target + { + #[ cfg( debug_assertions ) ] + { + let layout1 = core::alloc::Layout::new::< Self >(); + let layout2 = core::alloc::Layout::new::< Self::Target >(); + debug_assert_eq!( layout1, layout2 ); + } + unsafe { core::mem::transmute::< _, _ >( self ) } + } +} +impl< T1 > core::ops::DerefMut for Pair< T1 > +{ + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + #[ cfg( debug_assertions ) ] + { + let layout1 = core::alloc::Layout::new::< Self >(); + let layout2 = core::alloc::Layout::new::< Self::Target >(); + debug_assert_eq!( layout1, layout2 ); + } + unsafe { core::mem::transmute::< _, _ >( self ) } + } +} +impl< T1 > From< ( T1, T1 ) > for Pair< T1 > +{ + #[ inline ] + fn from( src : ( T1, T1 ) ) -> Self { Self( src.0, src.1 ) } +} +impl< T1 > From< Pair< T1 >> for ( T1, T1 ) +{ + #[ inline ] + fn from( src : Pair< T1 > ) -> Self { ( src.0, src.1 ) } +} +impl< T1 > From< [ T1; 2 ]> for Pair< T1 > +where + T1 : Clone, +{ + #[ inline ] + fn from( src : [ T1; 2 ] ) -> Self { Self( src[ 0 ].clone(), src[ 1 ].clone() ) } +} +impl< T1 > From< Pair< T1 >> for [ T1; 2 ] +{ + #[ inline ] + fn from( src : Pair< T1 > ) -> Self { [ src.0, src.1 ] } +} +impl< T1 > From< &[ T1 ]> for Pair< T1 > +where + T1 : Clone, +{ + #[ inline ] + fn from( src : &[ T1 ] ) -> Self + { + debug_assert_eq!( src.len(), 2 ); + Self( src[ 0 ].clone(), src[ 1 ].clone() ) + } +} +impl< T1 > From< T1 > for Pair< T1 > +where + T1 : Clone, +{ + #[ inline ] + fn from( src : T1 ) -> Self { Self( src.clone(), src.clone() ) } +} +impl< T1 > the_module::CloneAsTuple< ( T1, T1 ) > for Pair< T1 > +where + T1 : Clone, +{ + #[ inline ] + fn clone_as_tuple( &self ) -> ( T1, T1 ) { ( self.0.clone(), self.1.clone() ) } +} +impl< T1 > the_module::CloneAsArray< T1, 2 > for Pair< T1 > +where + T1 : Clone, +{ + #[ inline ] + fn clone_as_array( &self ) -> [ T1; 2 ] { [ self.0.clone(), self.1.clone() ] } +} +impl< T1 > the_module::AsTuple< ( T1, T1 ) > for Pair< T1 > +{ + #[ inline ] + fn as_tuple( &self ) -> &( T1, T1 ) { unsafe { core::mem::transmute::< &_, &( T1, T1 ) >( self ) } } +} +impl< T1 > the_module::AsArray< T1, 2 > for Pair< T1 > +{ + #[ inline ] + fn as_array( &self ) -> &[ T1; 2 ] { unsafe { core::mem::transmute::< &_, &[ T1; 2 ]>( self ) } } +} +impl< T1 > the_module::AsSlice< T1 > for Pair< T1 > +{ + #[ inline ] + fn as_slice( &self ) -> &[ T1 ] { &the_module::AsArray::as_array( self )[ ..] } +} +impl< T1 > the_module::From_0 for Pair< T1 > +where + T1 : Default, +{ + #[ inline ] + fn from_0() -> Self { Self( Default::default(), Default::default() ) } +} +impl< T1 > the_module::From_1< T1 > for Pair< T1 > +where + T1 : Clone, +{ + #[ inline ] + fn from_1( _0 : T1 ) -> Self { Self( _0.clone(), _0.clone() ) } +} +impl< T1 > the_module::From_2< T1, T1 > for Pair< T1 > +{ + #[ inline ] + fn from_2( _0 : T1, _1 : T1 ) -> Self { Self( _0, _1 ) } +} + +include!( "./homo_pair_parameter_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_test_only.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_test_only.rs new file mode 100644 index 0000000000..afd2898b1f --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_main_test_only.rs @@ -0,0 +1,177 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + fn main() + { + use the_module:: + { + CloneAsTuple, + CloneAsArray, + AsTuple, + AsArray, + AsSlice, + }; + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Float( $( $Rest )* ) + }; + } + + mod mod1 + { + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Float + ( + pub f32, + ); + } + + pub trait Round { fn round( &self ) -> ( f32, f32 ); } + impl Round + for ( mod1::Float, mod1::Float ) + { + fn round( &self ) -> ( f32, f32 ) + { + ( self.0.0.round(), self.1.0.round() ) + } + } + + trait RoundInplace { fn round_inplace( &mut self ); }; + impl RoundInplace for ( mod1::Float, mod1::Float ) + { + fn round_inplace( &mut self ) + { + self.0.0 = self.0.0.round(); + self.1.0 = self.1.0.round(); + } + } + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make1" ) */ + let instance1 : Pair< mod1::Float > = the_module::from!( mk!( 13.0 ) ); + let instance2 = Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 13.0 ) ] ); + a_id!( instance1, instance2 ); + + /* test.case( "make2" ) */ + let instance1 : Pair< mod1::Float > = the_module::from!( mk!( 13.0 ), mk!( 31.0 ) ); + let instance2 = Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ); + a_id!( instance1, instance2 ); + } + + /* test.case( "from array into pair" ) */ + let instance1 : Pair< mod1::Float > = [ mk!( 13.0 ), mk!( 31.0 ) ].into(); + let instance2 = Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from pair into array" ) */ + let instance1 : [ _ ; 2 ] = ( Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ) ).into(); + let instance2 = < [ _ ; 2] >::from( Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ) ); + a_id!( instance1[ 0 ], mk!( 13.0 ) ); + a_id!( instance1[ 1 ], mk!( 31.0 ) ); + a_id!( instance2[ 0 ], mk!( 13.0 ) ); + a_id!( instance2[ 1 ], mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from slice into pair" ) */ + let instance1 : Pair< mod1::Float > = ( &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ).into(); + let instance2 = Pair::< mod1::Float >::from( ( &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = Pair::< mod1::Float >::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = Pair::< mod1::Float >::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair< mod1::Float > = ( Pair::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ) ).into(); + let instance2 = Pair::< mod1::Float >::from( Pair::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = instance1.clone(); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Pair< mod1::Float > = ( mk!( 13.5 ), mk!( 31.5 ) ).into(); + a_id!( got.round(), ( 14.0, 32.0 ) ); + got.round_inplace(); + a_id!( got.0, mk!( 14.0 ) ); + a_id!( got.1, mk!( 32.0 ) ); + + /* test.case( "clone_as_tuple" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_tuple(); + a_id!( got, ( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "clone_as_array" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_array(); + a_id!( got, [ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "as_tuple" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_tuple(); + a_id!( got, &( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_array" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_array(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_slice" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_slice(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ); + assert!( mem::same_region( &src, got ) ); + } +} + +// + +tests_index! +{ + main, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_test.rs new file mode 100644 index 0000000000..2a6215dd55 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parameter_test.rs @@ -0,0 +1,399 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + fn no_parameter_no_derive() + { + + mod mod1 + { + #[ derive( Default, Clone ) ] + pub struct Float + ( + pub f32, + ); + } + + // trace_macros!( true ); + the_module::types! + { + pair Pair : mod1::Float, mod1::Float; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Pair( mod1::Float( 13.0 ), mod1::Float( 31.0 ) ); + + } + + // + + fn parameter_with_derives() + { + use the_module:: + { + CloneAsTuple, + CloneAsArray, + AsTuple, + AsArray, + AsSlice, + }; + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Float( $( $Rest )* ) + }; + } + + mod mod1 + { + #[ derive( Debug, Default, Clone, PartialEq ) ] + pub struct Float + ( + pub f32, + ); + } + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : < T1 : core::cmp::PartialEq + core::clone::Clone >; + + } + // trace_macros!( false ); + + pub trait Round { fn round( &self ) -> ( f32, f32 ); } + impl Round + for ( mod1::Float, mod1::Float ) + { + fn round( &self ) -> ( f32, f32 ) + { + ( self.0.0.round(), self.1.0.round() ) + } + } + + trait RoundInplace { fn round_inplace( &mut self ); }; + impl RoundInplace for ( mod1::Float, mod1::Float ) + { + fn round_inplace( &mut self ) + { + self.0.0 = self.0.0.round(); + self.1.0 = self.1.0.round(); + } + } + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make1" ) */ + let instance1 : Pair< mod1::Float > = the_module::from!( mk!( 13.0 ) ); + let instance2 = Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 13.0 ) ] ); + a_id!( instance1, instance2 ); + + /* test.case( "make2" ) */ + let instance1 : Pair< mod1::Float > = the_module::from!( mk!( 13.0 ), mk!( 31.0 ) ); + let instance2 = Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ); + a_id!( instance1, instance2 ); + } + + /* test.case( "from array into pair" ) */ + let instance1 : Pair< mod1::Float > = [ mk!( 13.0 ), mk!( 31.0 ) ].into(); + let instance2 = Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from pair into array" ) */ + let instance1 : [ _ ; 2 ] = ( Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ) ).into(); + let instance2 = < [ _ ; 2] >::from( Pair::< mod1::Float >::from( [ mk!( 13.0 ), mk!( 31.0 ) ] ) ); + a_id!( instance1[ 0 ], mk!( 13.0 ) ); + a_id!( instance1[ 1 ], mk!( 31.0 ) ); + a_id!( instance2[ 0 ], mk!( 13.0 ) ); + a_id!( instance2[ 1 ], mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from slice into pair" ) */ + let instance1 : Pair< mod1::Float > = ( &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ).into(); + let instance2 = Pair::< mod1::Float >::from( ( &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = Pair::< mod1::Float >::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = Pair::< mod1::Float >::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair< mod1::Float > = ( Pair::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ) ).into(); + let instance2 = Pair::< mod1::Float >::from( Pair::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ) ); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = instance1.clone(); + a_id!( instance1.0, mk!( 13.0 ) ); + a_id!( instance1.1, mk!( 31.0 ) ); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance2.1, mk!( 31.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Pair< mod1::Float > = ( mk!( 13.5 ), mk!( 31.5 ) ).into(); + a_id!( got.round(), ( 14.0, 32.0 ) ); + got.round_inplace(); + a_id!( got.0, mk!( 14.0 ) ); + a_id!( got.1, mk!( 32.0 ) ); + + /* test.case( "clone_as_tuple" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_tuple(); + a_id!( got, ( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "clone_as_array" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_array(); + a_id!( got, [ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "as_tuple" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_tuple(); + a_id!( got, &( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_array" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_array(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_slice" ) */ + let src : Pair< mod1::Float > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_slice(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ); + assert!( mem::same_region( &src, got ) ); + + } + + // + + fn parameter_no_derives() + { + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Float( $( $Rest )* ) + }; + } + + mod mod1 + { + pub struct Float + ( + pub f32, + ); + } + + // trace_macros!( true ); + the_module::types! + { + pair Pair : < T1 >; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Pair::< mod1::Float >( mk!( 13.0 ), mk!( 13.0 ) ); + + } + + // + + fn struct_basic() + { + + trait Round { fn round( &self ) -> Self; }; + impl Round for ( f32, f32 ) + { + fn round( &self ) -> Self + { + // dbg!( &self ); + ( self.0.round(), self.1.round() ) + } + } + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make0" ) */ + let got : the_module::HomoPair< f32 > = the_module::from!(); + let exp = the_module::HomoPair::< f32 >( 0.0, 0.0 ); + a_id!( got, exp ); + + /* test.case( "make2" ) */ + let got : the_module::HomoPair< f32 > = the_module::from!( 13.0, 31.0 ); + let exp = the_module::HomoPair::< f32 >( 13.0, 31.0 ); + a_id!( got, exp ); + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : the_module::HomoPair< f32 > = ( 13.0, 31.0 ).into(); + let instance2 = the_module::HomoPair::< f32 >::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from the_module::HomoPair into tuple" ) */ + let instance1 : the_module::HomoPair< f32 > = ( 13.0, 31.0 ).into(); + let instance2 = the_module::HomoPair::< f32 >::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : the_module::HomoPair< f32 > = ( the_module::HomoPair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = the_module::HomoPair::< f32 >::from( the_module::HomoPair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from scalar into the_module::HomoPair" ) */ + let instance1 : the_module::HomoPair< f32 > = ( the_module::HomoPair::from( 13.0 ) ).into(); + let instance2 = the_module::HomoPair::< f32 >::from( the_module::HomoPair::from( 13.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : the_module::HomoPair< f32 > = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "default" ) */ + let instance1 : the_module::HomoPair< f32 > = Default::default(); + a_id!( instance1.0, 0.0 ); + a_id!( instance1.1, 0.0 ); + + /* test.case( "deref" ) */ + let got : the_module::HomoPair< f32 > = ( 13.5, 31.5 ).into(); + a_id!( got.round(), ( 14.0, 32.0 ) ); + + } + + // + + fn struct_no_derives() + { + + struct Floats< T1, T2 >( pub T1, pub T2 ); + impl< T1, T2 > Floats< T1, T2 > + { + pub fn new( src : ( T1, T2 ) ) -> Self + { Self( src.0, src.1 ) } + } + + /* test.case( "smoke test" ) */ + let instance1 = the_module::HomoPair( Floats( 13.0, 31.0 ), Floats( 13.0, 31.0 ) ); + + } + + // + + fn samples() + { + use the_module:: + { + CloneAsTuple, + CloneAsArray, + }; + + /* test.case( "single-line homopair" ) */ + { + the_module::types!( pair MyHomoPair : i32 ); + let x = MyHomoPair( 13, 31 ); + println!( "x : ( {}, {} )", x.0, x.1 ); + // prints : x : ( 13, 31 ) + } + + /* test.case( "parametrized tuple" ) */ + { + use core::fmt; + the_module::types! + { + #[ derive( Debug ) ] + pair MyHomoPair : < T : fmt::Debug >; + } + let x = MyHomoPair( 13, 31 ); + dbg!( &x ); + // prints : &x = MyHomoPair( 13, 31 ) + let clone_as_array : [ i32 ; 2 ] = x.clone_as_array(); + dbg!( &clone_as_array ); + // prints : &clone_as_array = [ 13, 31 ] + let clone_as_tuple : ( i32 , i32 ) = x.clone_as_tuple(); + dbg!( &clone_as_tuple ); + // prints : &clone_as_tuple = ( 13, 31 ) + } + } +} + +// + +tests_index! +{ + no_parameter_no_derive, + parameter_with_derives, + parameter_no_derives, + struct_basic, + struct_no_derives, + samples, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_gen_test.rs new file mode 100644 index 0000000000..22591563a3 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_gen_test.rs @@ -0,0 +1,46 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod mod1 +{ + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + +} + +// trace_macros!( true ); +the_module::types! +{ + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >, + ; +} +// trace_macros!( false ); + +include!( "./homo_pair_parametrized_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_manual_test.rs new file mode 100644 index 0000000000..fea1c25431 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_manual_test.rs @@ -0,0 +1,142 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod mod1 +{ + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } +} + +#[ derive( Debug, Clone, PartialEq ) ] +struct Pair< T1 : PartialEq + std::marker::Copy, T2 : Default >( pub mod1::Floats< T1, T2 >, pub mod1::Floats< T1, T2 > ); +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > core::ops::Deref for Pair< T1, T2 > +{ + type Target = ( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ); + + #[ inline ] + fn deref( &self ) -> &Self::Target + { + #[ cfg( debug_assertions ) ] + { + let layout1 = core::alloc::Layout::new::< Self >(); + let layout2 = core::alloc::Layout::new::< Self::Target >(); + debug_assert_eq!( layout1, layout2 ); + } + unsafe { core::mem::transmute::< _, _ >( self ) } + } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > core::ops::DerefMut for Pair< T1, T2 > +{ + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + #[ cfg( debug_assertions ) ] + { + let layout1 = core::alloc::Layout::new::< Self >(); + let layout2 = core::alloc::Layout::new::< Self::Target >(); + debug_assert_eq!( layout1, layout2 ); + } + unsafe { core::mem::transmute::< _, _ >( self ) } + } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > From< ( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ) > for Pair< T1, T2 > +{ + #[ inline ] + fn from( src : ( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ) ) -> Self { Self( src.0, src.1 ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > From< Pair< T1, T2 >> for ( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ) +{ + #[ inline ] + fn from( src : Pair< T1, T2 > ) -> Self { ( src.0, src.1 ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > From< [ mod1::Floats< T1, T2 >; 2 ]> for Pair< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn from( src : [ mod1::Floats< T1, T2 >; 2 ] ) -> Self { Self( src[ 0 ].clone(), src[ 1 ].clone() ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > From< Pair< T1, T2 >> for [ mod1::Floats< T1, T2 >; 2 ] +{ + #[ inline ] + fn from( src : Pair< T1, T2 > ) -> Self { [ src.0, src.1 ] } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > From< &[ mod1::Floats< T1, T2 > ]> for Pair< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn from( src : &[ mod1::Floats< T1, T2 > ] ) -> Self { Self( src[ 0 ].clone(), src[ 1 ].clone() ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > + the_module::CloneAsTuple< ( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ) > for Pair< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn clone_as_tuple( &self ) -> ( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ) { ( self.0.clone(), self.1.clone() ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > the_module::CloneAsArray< mod1::Floats< T1, T2 >, 2 > for Pair< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn clone_as_array( &self ) -> [ mod1::Floats< T1, T2 >; 2 ] { [ self.0.clone(), self.1.clone() ] } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > the_module::AsTuple< ( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ) > + for Pair< T1, T2 > +{ + #[ inline ] + fn as_tuple( &self ) -> &( mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 > ) { unsafe { core::mem::transmute::< _, _ >( self ) } } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > the_module::AsArray< mod1::Floats< T1, T2 >, 2 > for Pair< T1, T2 > +{ + #[ inline ] + fn as_array( &self ) -> &[ mod1::Floats< T1, T2 >; 2 ] { unsafe { core::mem::transmute::< _, _ >( self ) } } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > the_module::AsSlice< mod1::Floats< T1, T2 >> for Pair< T1, T2 > +{ + #[ inline ] + fn as_slice( &self ) -> &[ mod1::Floats< T1, T2 > ] { &the_module::AsArray::as_array( self )[ .. ] } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > the_module::From_1< mod1::Floats< T1, T2 >> for Pair< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn from_1( _0 : mod1::Floats< T1, T2 > ) -> Self { Self( _0.clone(), _0.clone() ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > the_module::From_2< mod1::Floats< T1, T2 >, mod1::Floats< T1, T2 >> + for Pair< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn from_2( _0 : mod1::Floats< T1, T2 >, _1 : mod1::Floats< T1, T2 > ) -> Self { Self( _0.clone(), _1.clone() ) } +} + + +include!( "./homo_pair_parametrized_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_test_only.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_test_only.rs new file mode 100644 index 0000000000..293c4619f4 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_main_test_only.rs @@ -0,0 +1,149 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + fn main() + { + use the_module:: + { + CloneAsTuple, + CloneAsArray, + AsTuple, + AsArray, + AsSlice, + }; + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; + } + + pub trait Round { fn round( &self ) -> Self; } + impl Round + for mod1::Floats< f32, f64 > + { + fn round( &self ) -> Self + { + mod1::Floats( self.0.round(), self.1.round() ) + } + } + impl Round + for ( mod1::Floats< f32, f64 >, mod1::Floats< f32, f64 > ) + { + fn round( &self ) -> Self + { + ( self.0.round(), self.1.round() ) + } + } + + trait RoundInplace { fn round_inplace( &mut self ); }; + impl RoundInplace for mod1::Floats< f32, f64 > + { + fn round_inplace( &mut self ) + { + self.0 = self.0.round(); + self.1 = self.1.round(); + } + } + impl RoundInplace for ( mod1::Floats< f32, f64 >, mod1::Floats< f32, f64 > ) + { + fn round_inplace( &mut self ) + { + self.0 = self.0.round(); + self.1 = self.1.round(); + } + } + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make1" ) */ + let got : Pair< f32, f64 > = the_module::from!( mk!( 13.0 ) ); + let exp = Pair::< f32, f64 >::from( ( mk!( 13.0 ), mk!( 13.0 ) ) ); + a_id!( got, exp ); + + /* test.case( "make2" ) */ + let got : Pair< f32, f64 > = the_module::from!( mk!( 13.0 ), mk!( 31.0 ) ); + let exp = Pair::< f32, f64 >::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ); + a_id!( got, exp ); + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair< f32, f64 > = + ( + mk!( 13.0 ), + mk!( 31.0 ), + ).into(); + let instance2 = Pair::< f32, f64 >::from + (( + mk!( 13.0 ), + mk!( 31.0 ), + )); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got : ( mod1::Floats< f32, f64 >, _ ) = instance1.into(); + a_id!( got.0.0, 13.0 ); + let instance1 : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = < ( mod1::Floats::< f32, f64 >, _ ) >::from( instance1 ); + a_id!( got.0.0, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Pair< f32, f64 > = ( mk!( 13.5 ), mk!( 31.5 ) ).into(); + a_id!( got.round(), ( mk!( 14.0 ), mk!( 32.0 ) ) ); + got.round_inplace(); + a_id!( got, Pair::from( ( mk!( 14.0 ), mk!( 32.0 ) ) ) ); + + /* test.case( "clone_as_tuple" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_tuple(); + a_id!( got, ( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "clone_as_array" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_array(); + a_id!( got, [ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "as_tuple" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_tuple(); + a_id!( got, &( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_array" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_array(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_slice" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_slice(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ); + assert!( mem::same_region( &src, got ) ); + } +} + +// + +tests_index! +{ + main, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_test.rs b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_test.rs new file mode 100644 index 0000000000..1810db8003 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/homo_pair_parametrized_test.rs @@ -0,0 +1,335 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + fn basic() + { + use core::fmt; + + mod mod1 + { + pub use f32; + } + + trait Round { fn round( &self ) -> Self; }; + impl Round for ( f32, f32 ) + { + fn round( &self ) -> Self + { + ( self.0.round(), self.1.round() ) + } + } + + trait RoundInplace { fn round_inplace( &mut self ); }; + impl RoundInplace for ( f32, f32 ) + { + fn round_inplace( &mut self ) + { + self.0 = self.0.round(); + self.1 = self.1.round(); + } + } + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : mod1::f32; + + } + // trace_macros!( false ); + + /* test.case( "from array into pair" ) */ + let instance1 : Pair = [ 13.0, 31.0 ].into(); + let instance2 = Pair::from( [ 13.0, 31.0 ] ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from pair into array" ) */ + let instance1 : [ _ ; 2 ] = ( Pair::from( [ 13.0, 31.0 ] ) ).into(); + let instance2 = < [ _ ; 2] >::from( Pair::from( [ 13.0, 31.0 ] ) ); + a_id!( instance1[ 0 ], 13.0 ); + a_id!( instance1[ 1 ], 31.0 ); + a_id!( instance2[ 0 ], 13.0 ); + a_id!( instance2[ 1 ], 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from slice into pair" ) */ + let instance1 : Pair = ( &[ 13.0, 31.0 ][ .. ] ).into(); + let instance2 = Pair::from( ( &[ 13.0, 31.0 ][ .. ] ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair = ( 13.0, 31.0 ).into(); + let instance2 = Pair::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from pair into tuple" ) */ + let instance1 : ( _, _ ) = ( Pair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = < ( _, _ ) >::from( Pair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair = ( Pair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = Pair::from( Pair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Pair = ( 13.5, 31.5 ).into(); + a_id!( got.round(), ( 14.0, 32.0 ) ); + got.round_inplace(); + a_id!( got, Pair::from( ( 14.0, 32.0 ) ) ); + + } + + // + + fn parametrized_multiple() + { + use the_module:: + { + CloneAsTuple, + CloneAsArray, + AsTuple, + AsArray, + AsSlice, + }; + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; + } + + mod mod1 + { + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + + } + + // trace_macros!( true ); + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >, + ; + } + // trace_macros!( false ); + + pub trait Round { fn round( &self ) -> Self; } + impl Round + for mod1::Floats< f32, f64 > + { + fn round( &self ) -> Self + { + mod1::Floats( self.0.round(), self.1.round() ) + } + } + impl Round + for ( mod1::Floats< f32, f64 >, mod1::Floats< f32, f64 > ) + { + fn round( &self ) -> Self + { + ( self.0.round(), self.1.round() ) + } + } + + trait RoundInplace { fn round_inplace( &mut self ); }; + impl RoundInplace for mod1::Floats< f32, f64 > + { + fn round_inplace( &mut self ) + { + self.0 = self.0.round(); + self.1 = self.1.round(); + } + } + impl RoundInplace for ( mod1::Floats< f32, f64 >, mod1::Floats< f32, f64 > ) + { + fn round_inplace( &mut self ) + { + self.0 = self.0.round(); + self.1 = self.1.round(); + } + } + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make1" ) */ + let got : Pair< f32, f64 > = the_module::from!( mk!( 13.0 ) ); + let exp = Pair::< f32, f64 >::from( ( mk!( 13.0 ), mk!( 13.0 ) ) ); + a_id!( got, exp ); + + /* test.case( "make2" ) */ + let got : Pair< f32, f64 > = the_module::from!( mk!( 13.0 ), mk!( 31.0 ) ); + let exp = Pair::< f32, f64 >::from( ( mk!( 13.0 ), mk!( 31.0 ) ) ); + a_id!( got, exp ); + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair< f32, f64 > = + ( + mk!( 13.0 ), + mk!( 31.0 ), + ).into(); + let instance2 = Pair::< f32, f64 >::from + (( + mk!( 13.0 ), + mk!( 31.0 ), + )); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got : ( mod1::Floats< f32, f64 >, _ ) = instance1.into(); + a_id!( got.0.0, 13.0 ); + let instance1 : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = < ( mod1::Floats::< f32, f64 >, _ ) >::from( instance1 ); + a_id!( got.0.0, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let mut got : Pair< f32, f64 > = ( mk!( 13.5 ), mk!( 31.5 ) ).into(); + a_id!( got.round(), ( mk!( 14.0 ), mk!( 32.0 ) ) ); + got.round_inplace(); + a_id!( got, Pair::from( ( mk!( 14.0 ), mk!( 32.0 ) ) ) ); + + /* test.case( "clone_as_tuple" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_tuple(); + a_id!( got, ( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "clone_as_array" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.clone_as_array(); + a_id!( got, [ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "as_tuple" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_tuple(); + a_id!( got, &( mk!( 13.0 ), mk!( 31.0 ) ) ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_array" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_array(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ] ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_slice" ) */ + let src : Pair< f32, f64 > = ( mk!( 13.0 ), mk!( 31.0 ) ).into(); + let got = src.as_slice(); + a_id!( got, &[ mk!( 13.0 ), mk!( 31.0 ) ][ .. ] ); + assert!( mem::same_region( &src, got ) ); + } + + // + + fn parametrized_no_derives() + { + mod mod1 + { + pub struct Floats< T1, T2 > + ( + pub T1, + pub T2, + ); + } + + // trace_macros!( true ); + the_module::types! + { + pair Pair : mod1::Floats< T1, T2 >; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Pair( mod1::Floats( 13.0, 31.0 ), mod1::Floats( 13.0, 31.0 ) ); + } +} + +// + +tests_index! +{ + basic, + parametrized_multiple, + parametrized_no_derives, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_gen_test.rs new file mode 100644 index 0000000000..f369f5209f --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_gen_test.rs @@ -0,0 +1,18 @@ +#[ allow( unused_imports ) ] +use super::*; + +// trace_macros!( true ); +// the_module::types! +// { + +// pair Pair1 : f64, f32; + +// #[ derive( Debug ) ] +// #[ derive( PartialEq, Clone ) ] +// pair Pair2 : f32, f64; + +// } +// trace_macros!( false ); + +// include!( "./pair_parameter_main_test_only.rs" ); +include!( "./pair_parameter_main_manual_test.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_manual_test.rs new file mode 100644 index 0000000000..057fca8913 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_manual_test.rs @@ -0,0 +1,39 @@ +#[ allow( unused_imports ) ] +use super::*; + +struct Pair1( pub f64, pub f32 ); +impl From< ( f64, f32 ) > for Pair1 +{ + #[ inline ] + fn from( src : ( f64, f32 ) ) -> Self { Self( src.0, src.1 ) } +} +impl From< Pair1 > for ( f64, f32 ) +{ + #[ inline ] + fn from( src : Pair1 ) -> Self { ( src.0, src.1 ) } +} +impl the_module::From_2< f64, f32 > for Pair1 +{ + #[ inline ] + fn from_2( _0 : f64, _1 : f32 ) -> Self { Self( _0, _1 ) } +} + +#[ derive( Debug, Clone, PartialEq ) ] +struct Pair2( pub f32, pub f64 ); +impl From<( f32, f64 )> for Pair2 +{ + #[ inline ] + fn from( src : ( f32, f64 ) ) -> Self { Self( src.0, src.1 ) } +} +impl From< Pair2 > for ( f32, f64 ) +{ + #[ inline ] + fn from( src : Pair2 ) -> Self { ( src.0, src.1 ) } +} +impl the_module::From_2< f32, f64 > for Pair2 +{ + #[ inline ] + fn from_2( _0 : f32, _1 : f64 ) -> Self { Self( _0, _1 ) } +} + +include!("./pair_parameter_main_test_only.rs"); diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_test_only.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_test_only.rs new file mode 100644 index 0000000000..a9e12f9640 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_main_test_only.rs @@ -0,0 +1,71 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + fn main() + { + use core::fmt; + + /* test.case( "from tuple into Pair2" ) */ + let instance1 : Pair1 = ( 13.0, 31.0 ).into(); + let instance2 = Pair1::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + assert!( !implements!( instance1 => PartialEq ) ); + assert!( !implements!( instance1 => Clone ) ); + assert!( !implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from tuple into Pair2" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let instance2 = Pair2::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from tuple into Pair2" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let instance2 = Pair2::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair2 = ( Pair2::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = Pair2::from( Pair2::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair2 into tuple" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let got : ( _, _ ) = instance1.into(); + a_id!( got, ( 13.0, 31.0 ) ); + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let got = <( f32, f64 )>::from( instance1 ); + a_id!( got, ( 13.0, 31.0 ) ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + // /* test.case( "deref" ) */ + // let got : Pair2 = ( 13.5, 15.5 ).into(); + // a_id!( got.round(), 14.0 ); + + } +} + +// + +tests_index! +{ + main, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parameter_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_test.rs new file mode 100644 index 0000000000..3122066008 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parameter_test.rs @@ -0,0 +1,424 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + + + fn empty_parameter() + { + + mod mod1 + { + pub use f32; + pub use f64; + } + + trait Round { fn round( &self ) -> Self; }; + impl Round for ( f32, f64 ) + { + fn round( &self ) -> Self + { + dbg!( &self ); + ( self.0.round(), self.1.round() ) + } + } + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : mod1::f32<>, mod1::f64<>; + + } + // trace_macros!( false ); + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair = ( 13.0, 31.0 ).into(); + let instance2 = Pair::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair = ( Pair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = Pair::from( Pair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + } + + // + + fn no_parameter_no_derive() + { + + mod mod1 + { + #[ derive( Default, Clone ) ] + pub struct Float + ( + pub f32, + ); + } + + // trace_macros!( true ); + the_module::types! + { + pair Pair : mod1::Float; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Pair( mod1::Float( 13.0 ), mod1::Float( 31.0 ) ); + + } + + // + + fn parameter_complex() + { + use core::fmt; + + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : < T1 : core::cmp::PartialEq + core::clone::Clone, T2 : core::cmp::PartialEq + core::clone::Clone >; + } + + /* test.case( "traits" ) */ + let instance1 : Pair< f32, f64 > = ( 13.0, 31.0 ).into(); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + assert!( !implements!( instance1 => fmt::Display ) ); + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make0" ) */ + let got : Pair< f32, f64 > = the_module::from!(); + let exp = Pair::< f32, f64 >( 0.0, 0.0 ); + a_id!( got, exp ); + + /* test.case( "make2" ) */ + let got : Pair< f32, f64 > = the_module::from!( 13.0, 31.0 ); + let exp = Pair::< f32, f64 >( 13.0, 31.0 ); + a_id!( got, exp ); + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair< f32, f64 > = ( 13.0, 31.0 ).into(); + let instance2 = Pair::< f32, f64 >::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : Pair< f32, f64 > = ( 13.0, 31.0 ).into(); + let instance2 = Pair::< f32, f64 >::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair< f32, f64 > = ( Pair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = Pair::< f32, f64 >::from( Pair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair< f32, f64 > = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + +// /* test.case( "deref" ) */ +// let got : Pair< f32, f64 > = ( 13.5 ).into(); +// a_id!( got.round(), 14.0 ); + + } + + // + + fn parameter_no_derives() + { + + mod mod1 + { + pub struct Floats< T1, T2 > + ( + pub T1, + pub T2, + ); + } + + // trace_macros!( true ); + the_module::types! + { + pair Pair : < T1, T2 >; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Pair( mod1::Floats( 13.0, 31.0 ), mod1::Floats( 13.0, 31.0 ) ); + + } + + // + + fn multiple() + { + use core::fmt; + + the_module::types! + { + + pair Pair1 : f64, f32; + + #[ derive( Debug ) ] + #[ derive( PartialEq, Clone ) ] + pair Pair2 : f32, f64; + + } + + /* test.case( "from tuple into Pair2" ) */ + let instance1 : Pair1 = ( 13.0, 31.0 ).into(); + let instance2 = Pair1::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + assert!( !implements!( instance1 => PartialEq ) ); + assert!( !implements!( instance1 => Clone ) ); + assert!( !implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from tuple into Pair2" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let instance2 = Pair2::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from tuple into Pair2" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let instance2 = Pair2::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair2 = ( Pair2::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = Pair2::from( Pair2::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair2 into tuple" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let got : ( _, _ ) = instance1.into(); + a_id!( got, ( 13.0, 31.0 ) ); + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let got = <( f32, f64 )>::from( instance1 ); + a_id!( got, ( 13.0, 31.0 ) ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair2 = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + // /* test.case( "deref" ) */ + // let got : Pair2 = ( 13.5, 15.5 ).into(); + // a_id!( got.round(), 14.0 ); + + } + + // + + fn struct_basic() + { + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make0" ) */ + let got : the_module::Pair< f32, f64 > = the_module::from!(); + let exp = the_module::Pair::< f32, f64 >( 0.0, 0.0 ); + a_id!( got, exp ); + + /* test.case( "make2" ) */ + let got : the_module::Pair< f32, f64 > = the_module::from!( 13.0, 31.0 ); + let exp = the_module::Pair::< f32, f64 >( 13.0, 31.0 ); + a_id!( got, exp ); + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : the_module::Pair< f32, f64 > = ( 13.0, 31.0 ).into(); + let instance2 = the_module::Pair::< f32, f64 >::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : the_module::Pair< f32, f64 > = ( 13.0, 31.0 ).into(); + let instance2 = the_module::Pair::< f32, f64 >::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : the_module::Pair< f32, f64 > = ( the_module::Pair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = the_module::Pair::< f32, f64 >::from( the_module::Pair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : the_module::Pair< f32, f64 > = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "default" ) */ + let instance1 : the_module::Pair< f32, f64 > = Default::default(); + a_id!( instance1.0, 0.0 ); + a_id!( instance1.1, 0.0 ); + +// /* test.case( "deref" ) */ +// let got : the_module::Pair< f32, f64 > = ( 13.5 ).into(); +// a_id!( got.round(), 14.0 ); + + } + + // + + fn struct_no_derives() + { + + struct Floats< T1, T2 >( pub T1, pub T2 ); + + impl< T1, T2 > Floats< T1, T2 > + { + pub fn new( src : ( T1, T2 ) ) -> Self + { Self( src.0, src.1 ) } + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : the_module::Pair< Floats< f32, f64 >, f32 > = ( Floats( 13.0, 31.0 ), 131.0 ).into(); + let instance2 = the_module::Pair::< Floats< f32, f64 >, f32 >::from( ( Floats( 13.0, 31.0 ), 131.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance1.0.1, 31.0 ); + a_id!( instance1.1, 131.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance2.0.1, 31.0 ); + a_id!( instance2.1, 131.0 ); + + } + + // + + fn struct_transitive_from() + { + // use the_module::{ From_2 }; + + /* test.case( "from tuple" ) */ + { + // the_module::types! + // { + // #[ derive( PartialEq, Debug ) ] + // single MySingle : i32 + // }; + #[ derive( PartialEq, Debug ) ] + struct MySingle + ( + pub i32, + ); + + impl From< i32 > + for MySingle + { + fn from( src : i32 ) -> Self + { + MySingle( src ) + } + } + + let src = ( 1, 3 ); + let got : the_module::Pair< MySingle, MySingle > = src.into(); + let exp = the_module::Pair::from( ( MySingle::from( 1 ), MySingle::from( 3 ) ) ); + a_id!( got, exp ); + } + // zzz : implement similar test for other type constructors + + // /* test.case( "from pair" ) */ + // { + // // trace_macros!( true ); + // the_module::types! + // { + // #[ derive( PartialEq, Debug ) ] + // single MySingle : i32 + // }; + // // trace_macros!( false ); + // let src = the_module::Pair::from_2( 1, 3 ); + // // let got : the_module::Pair< MySingle, MySingle > = src.into(); + // let exp = the_module::Pair::from_2( MySingle::from_1( 1 ), MySingle::from_1( 3 ) ); + // // a_id!( got, exp ); + // } + + } +} + +// + +tests_index! +{ + empty_parameter, + no_parameter_no_derive, + parameter_complex, + parameter_no_derives, + multiple, + struct_basic, + struct_no_derives, + struct_transitive_from, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_gen_test.rs new file mode 100644 index 0000000000..e472164363 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_gen_test.rs @@ -0,0 +1,47 @@ +#[ allow( unused_imports ) ] +use super::*; + +// mod mod1 +// { +// #[ derive( Debug, Clone, PartialEq ) ] +// pub struct Floats< T1 : PartialEq + Copy, T2 : Default > +// ( +// pub T1, +// pub T2, +// ); + +// impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref +// for Floats< T1, T2 > +// { +// type Target = T1; +// fn deref( &self ) -> &Self::Target +// { +// &self.0 +// } +// } + +// impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > +// for Floats< T1, T2 > +// { +// fn from( src : T1 ) -> Self +// { +// Floats::< T1, T2 >( src, T2::default() ) +// } +// } +// } + +// // trace_macros!( true ); +// the_module::types! +// { +// #[ derive( Debug, Clone ) ] +// #[ derive( PartialEq ) ] +// pair Pair : +// mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >, +// std::sync::Arc< T : Copy >, +// ; +// } +// trace_macros!( false ); + +// include!( "./pair_parametrized_main_test_only.rs" ); + +include!("./pair_parametrized_main_manual_test.rs"); diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_manual_test.rs new file mode 100644 index 0000000000..a4504f50c1 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_manual_test.rs @@ -0,0 +1,56 @@ +#[allow(unused_imports)] +use super::*; + +// + +mod mod1 +{ + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } +} + +#[ derive( Debug, Clone, PartialEq ) ] +struct Pair< T1 : PartialEq + std::marker::Copy, T2 : Default, T : Copy >( pub mod1::Floats< T1, T2 >, pub std::sync::Arc< T >); +impl< T1 : PartialEq + std::marker::Copy, T2 : Default, T : Copy > From< ( mod1::Floats< T1, T2 >, std::sync::Arc< T > ) > + for Pair< T1, T2, T > +{ + #[ inline ] + fn from( src : ( mod1::Floats< T1, T2 >, std::sync::Arc< T >) ) -> Self { Self( src.0, src.1 ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default, T : Copy > From< Pair< T1, T2, T > > + for ( mod1::Floats< T1, T2 >, std::sync::Arc< T > ) +{ + #[ inline ] + fn from( src : Pair< T1, T2, T > ) -> Self { ( src.0, src.1 ) } +} +impl< T1 : PartialEq + std::marker::Copy, T2 : Default, T : Copy > + the_module::From_2< mod1::Floats< T1, T2 >, std::sync::Arc< T > > for Pair< T1, T2, T > +{ + #[ inline ] + fn from_2( _0 : mod1::Floats< T1, T2 >, _1 : std::sync::Arc< T > ) -> Self { Self( _0, _1 ) } +} + +include!("./pair_parametrized_main_test_only.rs"); diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_test_only.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_test_only.rs new file mode 100644 index 0000000000..2316c2c72f --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_main_test_only.rs @@ -0,0 +1,84 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + fn main() + { + macro_rules! mk1 + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; + } + + macro_rules! mk2 + { + ( + $( $Rest : tt )* + ) + => + { + std::sync::Arc::new( $( $Rest )* ) + }; + } + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + ( + mk1!( $( $Rest )* ), + mk2!( 31.0 ), + ) + }; + } + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make2" ) */ + let got : Pair< f32, f64, f32 > = the_module::from!( mk1!( 13.0 ), mk2!( 31.0 ) ); + let exp = Pair::< f32, f64, f32 >( mk1!( 13.0 ), mk2!( 31.0 ) ); + a_id!( got, exp ); + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let instance2 = Pair::< f32, f64, f32 >::from( mk!( 13.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let got : ( mod1::Floats< f32, f64 >, _ ) = instance1.into(); + a_id!( got.0.0, 13.0 ); + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let got = < ( mod1::Floats::< f32, f64 >, _ ) >::from( instance1 ); + a_id!( got.0.0, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, mk1!( 13.0 ) ); + a_id!( instance1, instance2 ); + + + } +} + +// + +tests_index! +{ + main, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_test.rs new file mode 100644 index 0000000000..e3492b746c --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_parametrized_test.rs @@ -0,0 +1,449 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + fn basic() + { + use core::fmt; + + mod mod1 + { + pub use f32; + pub use f64; + } + + trait Round { fn round( &self ) -> Self; }; + impl Round for ( f32, f64 ) + { + fn round( &self ) -> Self + { + dbg!( &self ); + ( self.0.round(), self.1.round() ) + } + } + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : mod1::f32, mod1::f64; + + } + // trace_macros!( false ); + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair = ( 13.0, 31.0 ).into(); + let instance2 = Pair::from( ( 13.0, 31.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from pair into tuple" ) */ + let instance1 : ( _, _ ) = ( Pair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = < ( _, _ ) >::from( Pair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Pair = ( Pair::from( ( 13.0, 31.0 ) ) ).into(); + let instance2 = Pair::from( Pair::from( ( 13.0, 31.0 ) ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance1.1, 31.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair = ( 13.0, 31.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance2.1, 31.0 ); + a_id!( instance1, instance2 ); + + // /* test.case( "deref" ) */ + // let got : Pair = ( 13.5, 31.5 ).into(); + // a_id!( got.round(), ( 14.0, 32.0 ) ); + + } + + // + + fn parametrized_multiple() + { + + macro_rules! mk1 + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; + } + + macro_rules! mk2 + { + ( + $( $Rest : tt )* + ) + => + { + std::sync::Arc::new( $( $Rest )* ) + }; + } + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + ( + mk1!( $( $Rest )* ), + mk2!( 31.0 ), + ) + }; + } + + mod mod1 + { + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + + } + + // trace_macros!( true ); + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >, + std::sync::Arc< T : Copy >, + ; + + } + // trace_macros!( false ); + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make2" ) */ + let got : Pair< f32, f64, f32 > = the_module::from!( mk1!( 13.0 ), mk2!( 31.0 ) ); + let exp = Pair::< f32, f64, f32 >( mk1!( 13.0 ), mk2!( 31.0 ) ); + a_id!( got, exp ); + } + + /* test.case( "from tuple into pair" ) */ + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let instance2 = Pair::< f32, f64, f32 >::from( mk!( 13.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Pair into tuple" ) */ + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let got : ( mod1::Floats< f32, f64 >, _ ) = instance1.into(); + a_id!( got.0.0, 13.0 ); + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let got = < ( mod1::Floats::< f32, f64 >, _ ) >::from( instance1 ); + a_id!( got.0.0, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Pair< f32, f64, f32 > = mk!( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, mk1!( 13.0 ) ); + a_id!( instance1, instance2 ); + + + } + + // + + fn parametrized_mixed() + { + + /* test.case( "control case" ) */ + { + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + std::sync::Arc< T : Copy >, + f32<>, + ; + + } + // trace_macros!( false ); + + let instance1 : Pair< f64 > = + ( + std::sync::Arc::new( 13.0 ), + 31.0, + ).into(); + let instance2 = Pair::< f64 >::from + (( + std::sync::Arc::new( 13.0 ), + 31.0, + )); + a_id!( instance1, instance2 ); + + } + + /* test.case( "second without <> with comma" ) */ + { + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + std::sync::Arc< T : Copy >, + f32, + ; + + } + // trace_macros!( false ); + + let instance1 : Pair< f64 > = + ( + std::sync::Arc::new( 13.0 ), + 31.0, + ).into(); + let instance2 = Pair::< f64 >::from + (( + std::sync::Arc::new( 13.0 ), + 31.0, + )); + a_id!( instance1, instance2 ); + + } + + /* test.case( "second without <> without comma" ) */ + { + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + std::sync::Arc< T : Copy >, + f32 + ; + + } + // trace_macros!( false ); + + let instance1 : Pair< f64 > = + ( + std::sync::Arc::new( 13.0 ), + 31.0, + ).into(); + let instance2 = Pair::< f64 >::from + (( + std::sync::Arc::new( 13.0 ), + 31.0, + )); + a_id!( instance1, instance2 ); + + } + + /* test.case( "first without <> with comma" ) */ + { + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + f32, + std::sync::Arc< T : Copy >, + ; + + } + // trace_macros!( false ); + + let instance1 : Pair< f64 > = + ( + 31.0, + std::sync::Arc::new( 13.0 ), + ).into(); + let instance2 = Pair::< f64 >::from + (( + 31.0, + std::sync::Arc::new( 13.0 ), + )); + a_id!( instance1, instance2 ); + + } + + /* test.case( "first without <> without comma" ) */ + { + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + pair Pair : + f32, + std::sync::Arc< T : Copy > + ; + + } + // trace_macros!( false ); + + let instance1 : Pair< f64 > = + ( + 31.0, + std::sync::Arc::new( 13.0 ), + ).into(); + let instance2 = Pair::< f64 >::from + (( + 31.0, + std::sync::Arc::new( 13.0 ), + )); + a_id!( instance1, instance2 ); + + } + + } + + // + + fn parametrized_no_derives() + { + + mod mod1 + { + pub struct Floats< T1, T2 > + ( + pub T1, + pub T2, + ); + } + + // trace_macros!( true ); + the_module::types! + { + pair Pair : mod1::Floats< T1, T2 >, mod1::Floats< T3, T4 >; + } + // trace_macros!( false ); + + let instance1 : Pair< f32, f64, f32, f64 >; + + } + + // + + fn samples() + { + + /* test.case( "single-line" ) */ + { + the_module::types!( pair MyPair : i32, i64 ); + let x = MyPair( 13, 31 ); + println!( "x : ( {}, {} )", x.0, x.1 ); + // prints : x : ( 13, 31 ) + } + + /* test.case( "parametrized tuple" ) */ + { + use core::fmt; + the_module::types! + { + #[ derive( Debug ) ] + pair MyPair : < T1 : fmt::Debug, T2 : fmt::Debug >; + } + let x = MyPair( 13, 13.0 ); + dbg!( x ); + // prints : x = MyPair( 13, 13.0 ) + } + + } +} + +// + +tests_index! +{ + basic, + parametrized_multiple, + parametrized_mixed, + parametrized_no_derives, + samples, +} diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.rs new file mode 100644 index 0000000000..5055a359f5 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.rs @@ -0,0 +1,6 @@ +use type_constructor::prelude::*; + +fn main() +{ + types!( pair Bad< T1, T2, T3 > ); +} diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.stderr b/module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.stderr new file mode 100644 index 0000000000..f7c6490932 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_three_elements_test.stderr @@ -0,0 +1,11 @@ +error: no rules expected the token `<` + --> tests/dt/type_constructor/pair/pair_three_elements_test.rs:5:19 + | +5 | types!( pair Bad< T1, T2, T3 > ); + | ^ no rules expected this token in macro call + | +note: while trying to match `:` + --> rust/impl/dt/type_constructor/pair.rs + | + | $Vis : vis pair $Name : ident : + | ^ diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.rs b/module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.rs new file mode 100644 index 0000000000..5c67e4648e --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.rs @@ -0,0 +1,6 @@ +use type_constructor::prelude::*; + +fn main() +{ + types!( pair Empty : < > ); +} diff --git a/module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.stderr b/module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.stderr new file mode 100644 index 0000000000..fcc83ca134 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/pair/pair_without_args_test.stderr @@ -0,0 +1,11 @@ +error: no rules expected the token `>` + --> tests/dt/type_constructor/pair/pair_without_args_test.rs:5:27 + | +5 | types!( pair Empty : < > ); + | ^ no rules expected this token in macro call + | +note: while trying to match meta-variable `$ParamName1:ident` + --> rust/impl/dt/type_constructor/pair.rs + | + | $ParamName1 : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy1x2 : path )* )?, + | ^^^^^^^^^^^^^^^^^^^ diff --git a/module/postponed/type_constructor/tests/inc/prelude_test.rs b/module/postponed/type_constructor/tests/inc/prelude_test.rs new file mode 100644 index 0000000000..eae9511023 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/prelude_test.rs @@ -0,0 +1,68 @@ +#[ allow( unused_imports ) ] +use super::*; + +// + +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +#[ cfg( feature = "prelude" ) ] +tests_impls! +{ + fn basic() + { + use the_module::prelude::*; + + /* test.case( "Vec" ) */ + let src = Vec::< i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "DynArray" ) */ + let src = DynArray::< i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "HashMap" ) */ + let src = HashMap::< i32, i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "Map" ) */ + let src = Map::< i32, i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "HashSet" ) */ + let src = HashSet::< i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "Set" ) */ + let src = Set::< i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "BTreeMap" ) */ + let src = BTreeMap::< i32, i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "BTreeSet" ) */ + let src = BTreeSet::< i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "BinaryHeap" ) */ + let src = BinaryHeap::< i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "LinkedList" ) */ + let src = LinkedList::< i32 >::new(); + a_true!( src.is_empty() ); + + /* test.case( "VecDeque" ) */ + let src = VecDeque::< i32 >::new(); + a_true!( src.is_empty() ); + + } +} + +// + +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +#[ cfg( feature = "prelude" ) ] +tests_index! +{ + basic, +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_missing_generic.rs b/module/postponed/type_constructor/tests/inc/single/single_missing_generic.rs new file mode 100644 index 0000000000..fe7b03c161 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_missing_generic.rs @@ -0,0 +1,12 @@ +use type_constructor::prelude::*; + + +fn main() +{ + types! + { + + single Bad : Option; + + } +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_nested_type_test.rs b/module/postponed/type_constructor/tests/inc/single/single_nested_type_test.rs new file mode 100644 index 0000000000..98caacd0cd --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_nested_type_test.rs @@ -0,0 +1,12 @@ +use type_constructor::prelude::*; + + +fn main() +{ + types! + { + + single Bad : std::sync::Arc< std::sync::Mutex< T > >; + + } +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_nested_type_test.stderr b/module/postponed/type_constructor/tests/inc/single/single_nested_type_test.stderr new file mode 100644 index 0000000000..6155f46894 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_nested_type_test.stderr @@ -0,0 +1,11 @@ +error: no rules expected the token `::` + --> tests/dt/type_constructor/single/single_nested_type_test.rs:9:37 + | +9 | single Bad : std::sync::Arc< std::sync::Mutex< T > >; + | ^^ no rules expected this token in macro call + | +note: while trying to match `>` + --> rust/impl/dt/type_constructor/single.rs + | + | $( < $( $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? ),* > )? + | ^ diff --git a/module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.rs b/module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.rs new file mode 100644 index 0000000000..628cdce752 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.rs @@ -0,0 +1,11 @@ +use type_constructor::prelude::*; + +fn main() +{ + types! + { + + pub single Bad : Vec< _ >; + + } +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.stderr b/module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.stderr new file mode 100644 index 0000000000..1b2762a6e7 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_not_completed_type_test.stderr @@ -0,0 +1,11 @@ +error: no rules expected the token `_` + --> tests/dt/type_constructor/single/single_not_completed_type_test.rs:8:27 + | +8 | pub single Bad : Vec< _ >; + | ^ no rules expected this token in macro call + | +note: while trying to match `>` + --> rust/impl/dt/type_constructor/single.rs + | + | $( < $( $ParamName : ident $( : $ParamTy1x1 : ident $( :: $ParamTy1xN : ident )* $( + $ParamTy2 : path )* )? ),* > )? + | ^ diff --git a/module/postponed/type_constructor/tests/inc/single/single_parameter_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/single/single_parameter_main_gen_test.rs new file mode 100644 index 0000000000..0946ba5c33 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parameter_main_gen_test.rs @@ -0,0 +1,11 @@ +#[ allow( unused_imports ) ] +use super::*; + +the_module::types! +{ + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq, Default ) ] + single Single : < T >; +} + +include!( "./single_parameter_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/single/single_parameter_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/single/single_parameter_main_manual_test.rs new file mode 100644 index 0000000000..81b198ecfc --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parameter_main_manual_test.rs @@ -0,0 +1,217 @@ +#[ allow( unused_imports ) ] +use super::*; + +// trace_macros!( true ); +// the_module::types! +// { +// #[ derive( Debug, Clone ) ] +// #[ derive( PartialEq, Default ) ] +// single Single : < T >; +// } +// trace_macros!( false ); + +#[ derive( Debug, Clone ) ] +#[ derive( PartialEq, Default ) ] + +struct Single< T > +( pub T ); + +impl< T > core::ops::Deref +for Single< T > +{ + type Target = T ; + #[ inline ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +impl< T > core::ops::DerefMut +for Single< T > +{ + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +impl< T > From < T > +for Single< T > +{ + #[ inline ] + fn from( src : T ) -> Self + { + Self( src ) + } +} + +// impl< T > Into< T > +// for Single< T > +// { +// fn into( self ) -> T +// { +// self.0 +// } +// } + +// impl< T > From < Single< T > > +// for T +// { +// #[ inline ] +// fn from( src : Single< T > ) -> Self +// { +// src.0 +// } +// } + +impl< T > From < &T > +for Single< T > +where T : Clone, +{ + #[ inline ] + fn from( src : &T ) -> Self + { + Self( src.clone() ) + } +} + +impl< T > From< ( T, ) > +for Single< T > +{ + #[ inline ] + fn from( src : ( T, ) ) -> Self + { + Self( src.0 ) + } +} + +impl< T > From < Single< T > > +for( T, ) +{ + #[ inline ] + fn from( src : Single< T > ) -> Self + { + ( src.0, ) + } +} + +impl< T > From< [ T ; 1 ] > +for Single< T > +where T : Clone, +{ + #[ inline ] + fn from( src : [T ; 1] ) -> Self + { + Self( src[ 0 ].clone() ) + } +} + +impl< T > From< Single< T > > +for [T ; 1] +{ + #[ inline ] + fn from( src : Single< T > ) -> Self + { + [ src.0 ] + } +} + +impl< T > From< &[ T ] > +for Single< T > +where T : Clone, +{ + #[ inline ] + fn from( src : &[ T ] ) -> Self + { + debug_assert_eq!( src.len(), 1 ); + Self( src[ 0 ].clone() ) + } +} + +impl< T > the_module::CloneAsTuple < (T,) > +for Single< T > +where T : Clone, +{ + #[ inline ] + fn clone_as_tuple( &self ) -> ( T, ) + { + ( self.0.clone(), ) + } +} + +impl< T > the_module::CloneAsArray< T, 1 > +for Single< T > +where T : Clone, +{ + #[ inline ] + fn clone_as_array( &self ) -> [ T ; 1 ] + { + [ self.0.clone() ; 1 ] + } +} + +impl< T > the_module::AsTuple< ( T, ) > +for Single< T > +{ + #[ inline ] + fn as_tuple( &self ) -> &( T, ) + { + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } +} + +impl< T > the_module::AsArray< T, 1 > +for Single< T > +{ + #[ inline ] + fn as_array( &self ) -> &[ T ; 1 ] + { + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } +} + +impl< T > the_module::AsSlice < T > +for Single< T > +{ + #[ inline ] + fn as_slice( &self ) -> &[ T ] + { + &the_module::AsArray::as_array( self )[..] + } +} + +the_module::_if_from! +{ + +// impl< T > the_module::From_0 +// for Single< T > +// where T : Default +// { +// #[ inline ] +// fn from_0() -> Self +// { +// Self( Default::default() ) +// } +// } +// +// impl< T > the_module::From_1< T > +// for Single< T > +// { +// #[ inline ] +// fn from_1( _0 : T ) -> Self +// { +// Self( _0 ) +// } +// } + +} + +include!( "./single_parameter_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/single/single_parameter_main_test_only.rs b/module/postponed/type_constructor/tests/inc/single/single_parameter_main_test_only.rs new file mode 100644 index 0000000000..be7e1cb005 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parameter_main_test_only.rs @@ -0,0 +1,133 @@ +tests_impls! +{ + fn main() + { + use core::fmt; + use the_module:: + { + CloneAsTuple, + CloneAsArray, + AsTuple, + AsArray, + AsSlice, + }; + + /* test.case( "make1" ) */ + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + let got : Single< f32 > = Single::< f32 >::from( 13.0 ); + let exp = Single::< f32 >::from( 13.0 ); + a_id!( got, exp ); + } + + /* test.case( "traits" ) */ + let instance1 = Single::< f32 >::from( 13.0 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( implements!( instance1 => Default ) ); + assert!( !implements!( instance1 => fmt::Display ) ); + + /* test.case( "from f32 into Single" ) */ + let instance1 : Single< f32 > = ( 13.0 ).into(); + let instance2 = Single::< f32 >::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from &f32 into Single" ) */ + let instance1 : Single< f32 > = ( &13.0 ).into(); + let instance2 = Single::< f32 >::from( &13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single< f32 > = ( Single::from( 13.0 ) ).into(); + let instance2 = Single::< f32 >::from( Single::from( 13.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from tuple" ) */ + let got : Single< f32 > = ( 13.0, ).into(); + a_id!( got, Single( 13.0 ) ); + let got = Single::< f32 >::from( ( 13.0, ) ); + a_id!( got, Single( 13.0 ) ); + + /* test.case( "to tuple" ) */ + let got : ( f32, ) = ( Single::< f32 >::from( 13.0 ) ).into(); + a_id!( got, ( 13.0, ) ); + let got = < ( f32, ) >::from( Single::< f32 >::from( ( 13.0, ) ) ); + a_id!( got, ( 13.0, ) ); + + /* test.case( "from array" ) */ + let got : Single< f32 > = [ 13.0 ].into(); + a_id!( got, Single( 13.0 ) ); + let got = Single::< f32 >::from( [ 13.0 ] ); + a_id!( got, Single( 13.0 ) ); + + /* test.case( "to array" ) */ + let got : [ f32 ; 1 ] = ( Single::< f32 >::from( 13.0 ) ).into(); + a_id!( got, [ 13.0 ] ); + let got = < [ f32 ; 1 ] >::from( Single::< f32 >::from( 13.0 ) ); + a_id!( got, [ 13.0 ] ); + + /* test.case( "from slice" ) */ + let got : Single< f32 > = (&[ 13.0 ][ .. ]).into(); + a_id!( got, Single( 13.0 ) ); + let got = Single::< f32 >::from( (&[ 13.0 ][ .. ]) ); + a_id!( got, Single( 13.0 ) ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single< f32 > = ( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let got : Single< f32 > = ( 13.5 ).into(); + a_id!( got.round(), 14.0 ); + + /* test.case( "clone_as_tuple" ) */ + let src : Single< f32 > = ( 13.0, ).into(); + let got = src.clone_as_tuple(); + a_id!( got, ( 13.0, ) ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "clone_as_array" ) */ + let src : Single< f32 > = ( 13.0, ).into(); + let got = src.clone_as_array(); + a_id!( got, [ 13.0, ] ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "as_tuple" ) */ + let src : Single< f32 > = ( 13.0, ).into(); + let got = src.as_tuple(); + a_id!( got, &( 13.0, ) ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_array" ) */ + let src : Single< f32 > = ( 13.0, ).into(); + let got = src.as_array(); + a_id!( got, &[ 13.0, ] ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_slice" ) */ + let src : Single< f32 > = ( 13.0, ).into(); + let got = src.as_slice(); + a_id!( got, &[ 13.0, ][ .. ] ); + assert!( mem::same_region( &src, got ) ); + + } + +} + +// + +tests_index! +{ + + main, + +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_parameter_test.rs b/module/postponed/type_constructor/tests/inc/single/single_parameter_test.rs new file mode 100644 index 0000000000..b20459dda5 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parameter_test.rs @@ -0,0 +1,204 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + + fn parameter_complex() + { + + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + single Single : < T : core::cmp::PartialEq + core::clone::Clone >; + } + + /* test.case( "from f32 into Single" ) */ + let instance1 : Single< f32 > = ( 13.0 ).into(); + let instance2 = Single::< f32 >::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single< f32 > = ( Single::from( 13.0 ) ).into(); + let instance2 = Single::< f32 >::from( Single::from( 13.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single< f32 > = ( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + use core::ops::AddAssign; + let mut got : Single< f32 > = ( 13.5 ).into(); + a_id!( got.round(), 14.0 ); + got.add_assign( 1.0 ); + a_id!( got.0, 14.5 ); + + } + + // + + + fn parameter_no_derives() + { + + mod mod1 + { + pub struct Floats< T1, T2 > + ( + pub T1, + pub T2, + ); + } + + // trace_macros!( true ); + the_module::types! + { + single Single : < T >; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Single( mod1::Floats( 13.0, 31.0 ) ); + + } + + // + + + fn parameter_vis() + { + + mod mod1 + { + use super::*; + the_module::types! + { + #[ derive( Debug, Clone ) ] + pub single Public1 : < T >; + #[ derive( Debug, Clone ) ] + single Private1 : < T >; + } + } + + let instance1 : mod1::Public1< f32 > = ( 13.0 ).into(); + a_id!( instance1.0, 13.0 ); + // let instance1 : mod1::Private1< f32 > = ( 13.0 ).into(); + // a_id!( instance1.0, 13.0 ); + // qqq : add negative tests + // qqq : add negative tests for pair, homopair and many + + } + + // + + fn struct_basic() + { + + /* test.case( "from f32 into Single" ) */ + let instance1 : the_module::Single< f32 > = ( 13.0 ).into(); + let instance2 = the_module::Single::< f32 >::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : the_module::Single< f32 > = ( the_module::Single::from( 13.0 ) ).into(); + let instance2 = the_module::Single::< f32 >::from( the_module::Single::from( 13.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "clone / eq" ) */ + let instance1 : the_module::Single< f32 > = ( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "default" ) */ + let instance1 : the_module::Single< f32 > = Default::default(); + a_id!( instance1.0, 0.0 ); + + /* test.case( "deref" ) */ + use core::ops::AddAssign; + let mut got : the_module::Single< f32 > = ( 13.5 ).into(); + a_id!( got.round(), 14.0 ); + got.add_assign( 1.0 ); + a_id!( got.0, 14.5 ); + + /* test.case( "make0" ) */ + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + let got : the_module::Single< f32 > = the_module::from!(); + let exp = the_module::Single::< f32 >::from( 0.0 ); + a_id!( got, exp ); + } + + /* test.case( "make1" ) */ + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + let got : the_module::Single< f32 > = the_module::Single::< f32 >::from( 13.0 ); + let exp = the_module::Single::< f32 >::from( 13.0 ); + a_id!( got, exp ); + } + + } + + // + + + fn struct_no_derives() + { + + struct Floats< T >( pub T ); + + impl< T > Floats< T > + { + pub fn new( src : T ) -> Self + { Self( src ) } + } + + /* test.case( "from f32 into Single" ) */ + let instance1 : the_module::Single< Floats< f32 > > = ( Floats( 13.0 ) ).into(); + let instance2 = the_module::Single::< Floats< f32 > >::from( Floats( 13.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + + /* test.case( "from itself into itself" ) */ + let val = Floats::< f32 >::new( 13.0 ); + let instance1 : the_module::Single< Floats< f32 > > = ( the_module::Single::from( val ) ).into(); + let instance2 = the_module::Single::< Floats< f32 > >::from( the_module::Single::from( Floats( 13.0 ) ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + + /* test.case( "deref" ) */ + use core::ops::AddAssign; + let mut got : the_module::Single< f32 > = ( 13.5 ).into(); + a_id!( got.round(), 14.0 ); + got.add_assign( 1.0 ); + a_id!( got.0, 14.5 ); + + } + + +} + +// + +tests_index! +{ + + parameter_complex, + parameter_no_derives, + parameter_vis, + struct_basic, + struct_no_derives, + +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_gen_test.rs b/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_gen_test.rs new file mode 100644 index 0000000000..ecdcf5e665 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_gen_test.rs @@ -0,0 +1,55 @@ +#[ allow( unused_imports ) ] +use super::*; + +macro_rules! mk +{ + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; +} + +mod mod1 +{ + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + +} + +// trace_macros!( true ); +the_module::types! +{ + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + single Single : mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >; +} +// trace_macros!( false ); + +include!( "./single_parametrized_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_manual_test.rs b/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_manual_test.rs new file mode 100644 index 0000000000..de9433331d --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_manual_test.rs @@ -0,0 +1,236 @@ +#[ allow( unused_imports ) ] +use super::*; + +macro_rules! mk +{ + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; +} + +mod mod1 +{ + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T1 : PartialEq + Copy, T2 : Default > + ( + pub T1, + pub T2, + ); + + impl< T1 : PartialEq + Copy, T2 : Default > core::ops::Deref + for Floats< T1, T2 > + { + type Target = T1; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T1 : PartialEq + Copy, T2 : Default > From< T1 > + for Floats< T1, T2 > + { + fn from( src : T1 ) -> Self + { + Floats::< T1, T2 >( src, T2::default() ) + } + } + +} + +// trace_macros!( true ); +// the_module::types! +// { +// #[ derive( Debug, Clone ) ] +// #[ derive( PartialEq ) ] +// single Single : mod1::Floats< T1 : PartialEq + std::marker::Copy, T2 : Default >; +// } +// trace_macros!( false ); + +#[ derive( Debug, Clone ) ] +#[ derive( PartialEq ) ] +struct Single< T1 : PartialEq + std::marker::Copy, T2 : Default > +( pub mod1::Floats< T1, T2 > ); + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +core::ops::Deref +for Single< T1, T2 > +{ + type Target = mod1::Floats< T1, T2 >; + #[ inline ] + fn deref( &self ) -> &Self::Target + { + &self.0 + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +core::ops::DerefMut +for Single< T1, T2 > +{ + #[ inline ] + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +From< mod1::Floats< T1, T2 > > +for Single< T1, T2 > +{ + #[ inline ] + fn from( src : mod1::Floats< T1, T2 > ) -> Self + { + Self( src ) + } +} + +impl< __FromRef, T1 : PartialEq + std::marker::Copy, T2 : Default > +From< &__FromRef > +for Single< T1, T2 > +where + __FromRef : Clone, + Self : From< __FromRef >, +{ + #[ inline ] + fn from( src : &__FromRef ) -> Self + { + From::from( (*src).clone() ) + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +From< Single< T1, T2 > > +for mod1::Floats< T1, T2 > +{ + #[ inline ] + fn from( src : Single< T1, T2 > ) -> Self + { + src.0 + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +From< ( mod1::Floats< T1, T2 >, ) > +for Single< T1, T2 > +{ + #[ inline ] + fn from( src : ( mod1::Floats< T1, T2 >, ) ) -> Self + { + Self( src.0 ) + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +From< [ mod1::Floats< T1, T2 > ; 1 ] > +for Single< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn from( src : [ mod1::Floats< T1, T2 > ; 1 ] ) -> Self + { + Self( src[ 0 ].clone() ) + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +From< &[ mod1::Floats< T1, T2 > ] > +for Single< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn from( src : &[ mod1::Floats< T1, T2 > ] ) -> Self + { + debug_assert_eq!( src.len(), 1 ); + Self( src[ 0 ].clone() ) + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +the_module::CloneAsTuple < ( mod1::Floats< T1, T2 >, ) > +for Single< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn clone_as_tuple( &self ) -> ( mod1::Floats< T1, T2 >, ) + { + ( self.0.clone(), ) + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +the_module::CloneAsArray < mod1::Floats< T1, T2 >, 1 > +for Single< T1, T2 > +where + mod1::Floats< T1, T2 > : Clone, +{ + #[ inline ] + fn clone_as_array( &self ) -> [ mod1::Floats< T1, T2 > ; 1 ] + { + [ self.0.clone() ] + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +the_module::AsTuple< ( mod1::Floats< T1, T2 >, ) > +for Single< T1, T2 > +{ + #[ inline ] + fn as_tuple( &self ) -> &( mod1::Floats< T1, T2 >, ) + { + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +the_module::AsArray< mod1::Floats< T1, T2 >, 1 > +for Single< T1, T2 > +{ + #[ inline ] + fn as_array( &self ) -> &[ mod1::Floats< T1, T2 > ; 1 ] + { + unsafe + { + core::mem::transmute::< _, _ >( self ) + } + } +} + +impl< T1 : PartialEq + std::marker::Copy, T2 : Default > +the_module::AsSlice +< mod1::Floats< T1, T2 > > +for Single< T1, T2 > +{ + #[ inline ] + fn as_slice( &self ) -> &[ mod1::Floats< T1, T2 > ] + { + &the_module::AsArray::as_array( self )[ .. ] + } +} + +the_module::_if_from! +{ + impl< T1 : PartialEq + std::marker::Copy, T2 : Default > the_module::From_1< mod1::Floats< T1, T2 > > + for Single< T1, T2 > + { + #[ inline ] + fn from_1( _0 : mod1::Floats< T1, T2 > ) -> Self + { + Self( _0 ) + } + } +} + +include!( "./single_parametrized_main_test_only.rs" ); diff --git a/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_test_only.rs b/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_test_only.rs new file mode 100644 index 0000000000..9645ede043 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parametrized_main_test_only.rs @@ -0,0 +1,136 @@ +tests_impls! +{ + + fn main() + { + use core::fmt; + use the_module:: + { + CloneAsTuple, + CloneAsArray, + AsTuple, + AsArray, + AsSlice, + }; + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + { + /* test.case( "make1" ) */ + let got : Single< f32, f64 > = the_module::from!( mk!( 13.0 ) ); + let exp = Single::< f32, f64 >::from( mk!( 13.0 ) ); + a_id!( got, exp ); + } + + /* test.case( "traits" ) */ + let instance1 = Single::< f32, f64 >::from( mk!( 13.0 ) ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + assert!( !implements!( instance1 => fmt::Display ) ); + + /* test.case( "from f32 into Single" ) */ + let instance1 : Single< f32, f64 > = ( mk!( 13.0 ) ).into(); + let instance2 = Single::< f32, f64 >::from( mk!( 13.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from &f32 into Single" ) */ + let instance1 : Single< f32, f64 > = ( &mk!( 13.0 ) ).into(); + let instance2 = Single::< f32, f64 >::from( &mk!( 13.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single< f32, f64 > = ( Single::from( mk!( 13.0 ) ) ).into(); + let instance2 = Single::< f32, f64 >::from( Single::from( mk!( 13.0 ) ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Single into f32" ) */ + let instance1 : Single< f32, f64 > = ( mk!( 13.0 ) ).into(); + let got : mod1::Floats< f32, f64 > = instance1.into(); + a_id!( got.0, 13.0 ); + let instance1 : Single< f32, f64 > = ( mk!( 13.0 ) ).into(); + let got = mod1::Floats::< f32, f64 >::from( instance1 ); + a_id!( got.0, 13.0 ); + + /* test.case( "from tuple" ) */ + let got : Single< f32, f64 > = ( mk!( 13.0 ), ).into(); + let exp : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + a_id!( got, exp ); + let got = Single::< f32, f64 >::from( ( mk!( 13.0 ), ) ); + let exp : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + a_id!( got, exp ); + + /* test.case( "from array" ) */ + let got : Single< f32, f64 > = [ mk!( 13.0 ), ].into(); + let exp : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + a_id!( got, exp ); + let got = Single::< f32, f64 >::from( [ mk!( 13.0 ), ] ); + let exp : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + a_id!( got, exp ); + + /* test.case( "from slice" ) */ + let got : Single< f32, f64 > = ( &[ mk!( 13.0 ), ][ .. ] ).into(); + let exp : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + a_id!( got, exp ); + let got = Single::< f32, f64 >::from( &[ mk!( 13.0 ), ][ .. ] ); + let exp : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + a_id!( got, exp ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single< f32, f64 > = ( mk!( 13.0 ) ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let got : Single< f32, f64 > = ( mk!( 13.5 ) ).into(); + a_id!( got.round(), 14.0 ); + + /* test.case( "clone_as_tuple" ) */ + let src : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + let got = src.clone_as_tuple(); + a_id!( got, ( mk!( 13.0 ), ) ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "clone_as_array" ) */ + let src : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + let got = src.clone_as_array(); + a_id!( got, [ mk!( 13.0 ), ] ); + assert!( !mem::same_ptr( &src, &got ) ); + + /* test.case( "as_tuple" ) */ + let src : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + let got = src.as_tuple(); + a_id!( got, &( mk!( 13.0 ), ) ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_array" ) */ + let src : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + let got = src.as_array(); + a_id!( got, &[ mk!( 13.0 ), ] ); + assert!( mem::same_region( &src, got ) ); + + /* test.case( "as_slice" ) */ + let src : Single< f32, f64 > = Single::from( mk!( 13.0 ) ); + let got = src.as_slice(); + a_id!( got, &[ mk!( 13.0 ), ][ .. ] ); + assert!( mem::same_region( &src, got ) ); + + } + +} + +// + +tests_index! +{ + + main, + +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_parametrized_test.rs b/module/postponed/type_constructor/tests/inc/single/single_parametrized_test.rs new file mode 100644 index 0000000000..851b02cf56 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_parametrized_test.rs @@ -0,0 +1,603 @@ +#[ allow( unused_imports ) ] +use super::*; + +tests_impls! +{ + + // + + fn basic() + { + use core::fmt; + + mod mod1 + { + pub use f32; + } + + // trace_macros!( true ); + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + single Single : mod1::f32; + + } + // trace_macros!( false ); + + + /* test.case( "from f32 into Single" ) */ + let instance1 : Single = ( 13.0 ).into(); + let instance2 = Single::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single = ( Single::from( 13.0 ) ).into(); + let instance2 = Single::from( Single::from( 13.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Single into f32" ) */ + let instance1 : Single = ( 13.0 ).into(); + let got : f32 = instance1.into(); + a_id!( got, 13.0 ); + let instance1 : Single = ( 13.0 ).into(); + let got = f32::from( instance1 ); + a_id!( got, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single = ( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + use core::ops::AddAssign; + let mut got : Single = ( 13.5 ).into(); + a_id!( got.round(), 14.0 ); + got.add_assign( 1.0 ); + a_id!( got.0, 14.5 ); + + } + + // + + + fn vis() + { + + mod mod1 + { + use super::*; + the_module::types! + { + #[ derive( Debug, Clone ) ] + pub single Public1 : f32; + #[ derive( Debug, Clone ) ] + single Private1 : f32; + } + } + + let instance1 : mod1::Public1 = ( 13.0 ).into(); + a_id!( instance1.0, 13.0 ); + // let instance1 : mod1::Private1 = ( 13.0 ).into(); + // a_id!( instance1.0, 13.0 ); + // qqq : add negative tests + + } + + // + + + fn empty_parameter() + { + + mod mod1 + { + pub use f32; + } + + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + single Single : mod1::f32<>; + } + + /* test.case( "from f32 into Single" ) */ + let instance1 : Single = ( 13.0 ).into(); + let instance2 = Single::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single = ( Single::from( 13.0 ) ).into(); + let instance2 = Single::from( Single::from( 13.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Single into f32" ) */ + let instance1 : Single = ( 13.0 ).into(); + let got : f32 = instance1.into(); + a_id!( got, 13.0 ); + let instance1 : Single = ( 13.0 ).into(); + let got = f32::from( instance1 ); + a_id!( got, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single = ( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let got : Single = ( 13.5 ).into(); + a_id!( got.round(), 14.0 ); + + } + + // + + + fn no_parameter_no_derive() + { + + mod mod1 + { + #[ derive( Clone ) ] + pub struct Float + ( + pub f32, + ); + } + + // trace_macros!( true ); + the_module::types! + { + single Single : mod1::Float; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Single( mod1::Float( 13.0 ) ); + + } + + // + + + fn parametrized() + { + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; + } + + mod mod1 + { + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T > + ( + pub T, + ); + + impl< T > core::ops::Deref + for Floats< T > + { + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T > From< T > for Floats< T > + { + fn from( src : T ) -> Self + { + Self( src ) + } + } + + } + + the_module::types! + { + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + single Single : mod1::Floats< T >; + } + + /* test.case( "from f32 into Single" ) */ + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let instance2 = Single::< f32 >::from( mk!( 13.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single< f32 > = ( Single::from( mk!( 13.0 ) ) ).into(); + let instance2 = Single::< f32 >::from( Single::from( mk!( 13.0 ) ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Single into f32" ) */ + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let got : mod1::Floats< f32 > = instance1.into(); + a_id!( got.0, 13.0 ); + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let got = mod1::Floats::< f32 >::from( instance1 ); + a_id!( got.0, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let got : Single< f32 > = ( mk!( 13.5 ) ).into(); + a_id!( got.round(), 14.0 ); + + } + + // + + + fn parametrized_complex() + { + + macro_rules! mk + { + ( + $( $Rest : tt )* + ) + => + { + mod1::Floats::from( $( $Rest )* ) + }; + } + + mod mod1 + { + + #[ derive( Debug, Clone, PartialEq ) ] + pub struct Floats< T : PartialEq + Copy > + ( + pub T, + ); + + impl< T : PartialEq + Copy > core::ops::Deref + for Floats< T > + { + type Target = T; + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl< T : PartialEq + Copy > From< T > for Floats< T > + { + fn from( src : T ) -> Self + { + Self( src ) + } + } + + } + + the_module::types! + { + + /// + /// Attribute which is inner. + /// + + #[ derive( Debug, Clone ) ] + #[ derive( PartialEq ) ] + single Single : mod1::Floats< T : PartialEq + std::marker::Copy >; + + } + + /* test.case( "from f32 into Single" ) */ + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let instance2 = Single::< f32 >::from( mk!( 13.0 ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single< f32 > = ( Single::from( mk!( 13.0 ) ) ).into(); + let instance2 = Single::< f32 >::from( Single::from( mk!( 13.0 ) ) ); + a_id!( instance1.0.0, 13.0 ); + a_id!( instance2.0.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Single into f32" ) */ + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let got : mod1::Floats< f32 > = instance1.into(); + a_id!( got.0, 13.0 ); + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let got = mod1::Floats::< f32 >::from( instance1 ); + a_id!( got.0, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single< f32 > = ( mk!( 13.0 ) ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, mk!( 13.0 ) ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let got : Single< f32 > = ( mk!( 13.5 ) ).into(); + a_id!( got.round(), 14.0 ); + + } + + // + + fn parametrized_no_derives() + { + + mod mod1 + { + pub struct Floats< T1, T2 > + ( + pub T1, + pub T2, + ); + } + + // trace_macros!( true ); + the_module::types! + { + single Single : mod1::Floats< T1, T2 >; + } + // trace_macros!( false ); + + /* test.case( "smoke test" ) */ + let instance1 = Single::< f32, f64 >( mod1::Floats( 13.0, 31.0 ) ); + + } + + // + + fn multiple() + { + use core::fmt; + + the_module::types! + { + + single Single1 : f32; + + #[ derive( Debug ) ] + #[ derive( PartialEq, Clone ) ] + single Single2 : f32; + + } + + /* test.case( "from f32 into Single2" ) */ + let instance1 : Single1 = ( 13.0 ).into(); + let instance2 = Single1::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + assert!( !implements!( instance1 => PartialEq ) ); + assert!( !implements!( instance1 => Clone ) ); + assert!( !implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from f32 into Single2" ) */ + let instance1 : Single2 = ( 13.0 ).into(); + let instance2 = Single2::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + assert!( implements!( instance1 => PartialEq ) ); + assert!( implements!( instance1 => Clone ) ); + assert!( implements!( instance1 => fmt::Debug ) ); + assert!( !implements!( instance1 => Default ) ); + + /* test.case( "from f32 into Single2" ) */ + let instance1 : Single2 = ( 13.0 ).into(); + let instance2 = Single2::from( 13.0 ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from itself into itself" ) */ + let instance1 : Single2 = ( Single2::from( 13.0 ) ).into(); + let instance2 = Single2::from( Single2::from( 13.0 ) ); + a_id!( instance1.0, 13.0 ); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "from Single2 into f32" ) */ + let instance1 : Single2 = ( 13.0 ).into(); + let got : f32 = instance1.into(); + a_id!( got, 13.0 ); + let instance1 : Single2 = ( 13.0 ).into(); + let got = f32::from( instance1 ); + a_id!( got, 13.0 ); + + /* test.case( "clone / eq" ) */ + let instance1 : Single2 = ( 13.0 ).into(); + let instance2 = instance1.clone(); + a_id!( instance2.0, 13.0 ); + a_id!( instance1, instance2 ); + + /* test.case( "deref" ) */ + let got : Single2 = ( 13.5 ).into(); + a_id!( got.round(), 14.0 ); + + } + + // + + fn samples() + { + + /* test.case( "multiple" ) */ + { + the_module::types! + { + + single MySingle : f32; + single SingleWithParametrized : std::sync::Arc< T : Copy >; + single SingleWithParameter : < T >; + + pair MyPair : f32; + pair PairWithParametrized : std::sync::Arc< T1 : Copy >, std::sync::Arc< T2 : Copy >; + pair PairWithParameter : < T1, T2 >; + + pair MyHomoPair : f32; + pair HomoPairWithParametrized : std::sync::Arc< T : Copy >; + pair HomoPairWithParameter : < T >; + + // #[ cfg + // ( + // all + // ( + // feature = "many", + // any( not( feature = "no_std" ), feature = "use_alloc" ), + // ) + // ) ] + // many MyMany : f32; + // #[ cfg + // ( + // all + // ( + // feature = "many", + // any( not( feature = "no_std" ), feature = "use_alloc" ), + // ) + // ) ] + // many ManyWithParametrized : std::sync::Arc< T : Copy >; + // #[ cfg + // ( + // all + // ( + // feature = "many", + // any( not( feature = "no_std" ), feature = "use_alloc" ), + // ) + // ) ] + // many ManyWithParameter : < T >; + } + } + + /* test.case( "no macro" ) */ + { + let i32_in_tuple = the_module::Single::< i32 >::from( 13 ); + dbg!( i32_in_tuple ); + // i32_in_tuple = Single( 13 ) + let i32_and_f32_in_tuple = the_module::Pair::< i32, f32 >::from( the_module::Pair( 13, 13.0 ) ); + dbg!( i32_and_f32_in_tuple ); + // vec_of_i32_in_tuple = Pair( 13, 13.0 ) + let two_i32_in_tuple = the_module::HomoPair::< i32 >::from( the_module::HomoPair( 13, 31 ) ); + dbg!( two_i32_in_tuple ); + // vec_of_i32_in_tuple = HomoPair( 13, 31 ) + #[ cfg + ( + all + ( + feature = "many", + any( not( feature = "no_std" ), feature = "use_alloc" ), + ) + ) ] + { + let vec_of_i32_in_tuple = the_module::Many::< i32 >::from([ 1, 2, 3 ]); + dbg!( vec_of_i32_in_tuple ); + // vec_of_i32_in_tuple = Many([ 1, 2, 3 ]) + } + } + + /* test.case( "single-line" ) */ + { + the_module::types!( single MySingle : i32 ); + let x = MySingle( 13 ); + println!( "x : {}", x.0 ); + } + + /* test.case( "derives and attributes" ) */ + { + the_module::types! + { + /// This is also attribute and macro understands it. + #[ derive( Debug ) ] + single MySingle : i32; + } + let x = MySingle( 13 ); + dbg!( x ); + } + + /* test.case( "struct instead of macro" ) */ + { + let x = the_module::Single::< i32 >( 13 ); + dbg!( x ); + } + + /* test.case( "parametrized element" ) */ + { + the_module::types! + { + #[ derive( Debug ) ] + single MySingle : std::sync::Arc< T : Copy >; + } + let x = MySingle( std::sync::Arc::new( 13 ) ); + dbg!( x ); + } + + /* test.case( "parametrized tuple" ) */ + { + the_module::types! + { + #[ derive( Debug ) ] + single MySingle : < T : Copy >; + } + let x = MySingle( 13 ); + dbg!( x ); + } + + } + +} + +// + +tests_index! +{ + + basic, + vis, + empty_parameter, + no_parameter_no_derive, + parametrized, + parametrized_complex, + // parametrized_multiple, + parametrized_no_derives, + multiple, + samples, + +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_redefinition_test.rs b/module/postponed/type_constructor/tests/inc/single/single_redefinition_test.rs new file mode 100644 index 0000000000..f3d9f50267 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_redefinition_test.rs @@ -0,0 +1,12 @@ +use type_constructor::prelude::*; + +fn main() +{ + types! + { + + pub single Bad : std::sync::Arc< T >; + pub single Bad : std::rc::Rc< T >; + + } +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_redefinition_test.stderr b/module/postponed/type_constructor/tests/inc/single/single_redefinition_test.stderr new file mode 100644 index 0000000000..d760568510 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_redefinition_test.stderr @@ -0,0 +1,68 @@ +error[E0428]: the name `Bad` is defined multiple times + --> tests/dt/type_constructor/single/single_redefinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pub single Bad : std::sync::Arc< T >; +9 | | pub single Bad : std::rc::Rc< T >; +10 | | +11 | | } + | | ^ + | | | + | |___`Bad` redefined here + | previous definition of the type `Bad` here + | + = note: `Bad` must be defined only once in the type namespace of this block + = note: this error originates in the macro `$crate::_single` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `Deref` for type `main::Bad< _ >` + --> tests/dt/type_constructor/single/single_redefinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pub single Bad : std::sync::Arc< T >; +9 | | pub single Bad : std::rc::Rc< T >; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad< _ >` + | + = note: this error originates in the macro `$crate::_single` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `DerefMut` for type `main::Bad< _ >` + --> tests/dt/type_constructor/single/single_redefinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pub single Bad : std::sync::Arc< T >; +9 | | pub single Bad : std::rc::Rc< T >; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad< _ >` + | + = note: this error originates in the macro `$crate::_single` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0119]: conflicting implementations of trait `From<&_>` for type `main::Bad< _ >` + --> tests/dt/type_constructor/single/single_redefinition_test.rs:5:3 + | +5 | / types! +6 | | { +7 | | +8 | | pub single Bad : std::sync::Arc< T >; +9 | | pub single Bad : std::rc::Rc< T >; +10 | | +11 | | } + | | ^ + | | | + | |___first implementation here + | conflicting implementation for `main::Bad< _ >` + | + = note: this error originates in the macro `$crate::_single` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/single/single_self_containing_test.rs b/module/postponed/type_constructor/tests/inc/single/single_self_containing_test.rs new file mode 100644 index 0000000000..02eed85600 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_self_containing_test.rs @@ -0,0 +1,13 @@ +use type_constructor::prelude::*; + + +fn main() +{ + types! + { + + // struct Bad( Box< Bad > ); compiles without errors + single Bad : Box< Bad >; + + } +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.rs b/module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.rs new file mode 100644 index 0000000000..36f170537e --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.rs @@ -0,0 +1,6 @@ +use type_constructor::prelude::*; + +fn main() +{ + types!( single Bad : < T1, T2 > ); +} diff --git a/module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.stderr b/module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.stderr new file mode 100644 index 0000000000..74df22a7bb --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/single/single_with_two_args_test.stderr @@ -0,0 +1,8 @@ +error: Parametrized element should be single, because Single has only one element + single Bad : < T1, T2 > + --> tests/dt/type_constructor/single/single_with_two_args_test.rs:5:3 + | +5 | types!( single Bad : < T1, T2 > ); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in the macro `$crate::_single` which comes from the expansion of the macro `types` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/module/postponed/type_constructor/tests/inc/type_constructor_tests.rs b/module/postponed/type_constructor/tests/inc/type_constructor_tests.rs new file mode 100644 index 0000000000..d93aeb743b --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/type_constructor_tests.rs @@ -0,0 +1,50 @@ +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( trace_macros ) ] +// #![ feature( type_name_of_val ) ] + +use type_constructor as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ path = "./inc.rs" ] +mod inc; + +// zzz : move to inc after implementing macro to check presence of a dependency +#[ cfg( not( feature = "no_std" ) ) ] +#[ test_tools::nightly ] +#[ test ] +fn trybuild_tests() +{ + // use test_tools::trybuild; + println!( "current_dir : {:?}", std::env::current_dir().unwrap() ); + #[ allow( unused_variables ) ] + // let t = trybuild::TestCases::new(); + let t = test_tools::compiletime::TestCases::new(); + + #[ cfg( any( feature = "make", feature = "dt_make" ) ) ] + t.compile_fail( "tests/test/dt/type_constructor/dynamic/make/*.rs" ); + + #[ cfg( all( any( not( feature = "no_std" ), feature = "use_alloc" ), feature = "many" ) ) ] + t.compile_fail( "tests/test/dt/type_constructor/dynamic/types_many_yes/*.rs" ); + + #[ cfg( any( not( any( not( feature = "no_std" ), feature = "use_alloc" ) ), not( feature = "many" ) ) ) ] + t.compile_fail( "tests/test/dt/type_constructor/dynamic/types_many_no/*.rs" ); + + t.compile_fail( "tests/test/dt/type_constructor/single/single_nested_type_test.rs" ); + t.compile_fail( "tests/test/dt/type_constructor/single/single_with_two_args_test.rs" ); + t.compile_fail( "tests/test/dt/type_constructor/single/single_not_completed_type_test.rs" ); + t.compile_fail( "tests/test/dt/type_constructor/single/single_redefinition_test.rs" ); + + t.compile_fail( "tests/test/dt/type_constructor/pair/homo_pair_double_difinition_test.rs" ); + t.compile_fail( "tests/test/dt/type_constructor/pair/homo_pair_mismatched_types_test.rs" ); + + t.compile_fail( "tests/test/dt/type_constructor/pair/pair_without_args_test.rs" ); + t.compile_fail( "tests/test/dt/type_constructor/pair/pair_three_elements_test.rs" ); + + t.compile_fail( "tests/test/dt/type_constructor/many/many_without_args_test.rs" ); + t.compile_fail( "tests/test/dt/type_constructor/many/many_with_two_args_test.rs" ); + t.compile_fail( "tests/test/dt/type_constructor/many/many_from_tuple_test.rs" ); +} diff --git a/module/postponed/type_constructor/tests/inc/vectorized_from_test.rs b/module/postponed/type_constructor/tests/inc/vectorized_from_test.rs new file mode 100644 index 0000000000..682ec0ff53 --- /dev/null +++ b/module/postponed/type_constructor/tests/inc/vectorized_from_test.rs @@ -0,0 +1,237 @@ +#[ allow( unused_imports ) ] +use super::*; +// // use test_tools::exposed::*; + +tests_impls! +{ + fn basic() + { + use the_module::{ VectorizedInto, VectorizedFrom }; + the_module::types! + { + #[ derive( Debug, PartialEq, Clone ) ] + single Single1 : i32; + #[ derive( Debug, PartialEq, Clone ) ] + single Single2 : i32; + #[ derive( Debug, PartialEq, Clone ) ] + single Single3 : i32; + } + + /* test.case( "from/into x0 tupple" ) */ + { + let src = (); + let got : () = src.vectorized_into(); + let exp = (); + a_id!( got, exp ); + + let src = (); + let got = <()>::vectorized_from( src ); + let exp = (); + a_id!( got, exp ); + } + + /* test.case( "from itself x1 tupple" ) */ + { + let src = ( 1, ); + let got : ( i32, ) = src.vectorized_into(); + let exp = ( 1, ); + a_id!( got, exp ); + + let src = ( 1, ); + let got = <( i32, )>::vectorized_from( src ); + let exp = ( 1, ); + a_id!( got, exp ); + } + + /* test.case( "from x1 tupple" ) */ + { + let src = ( 1, ); + let got : ( Single1, ) = src.vectorized_into(); + let exp = ( Single1::from( 1 ), ); + a_id!( got, exp ); + + let src = ( 1, ); + let got = <( Single1, )>::vectorized_from( src ); + let exp = ( Single1::from( 1 ), ); + a_id!( got, exp ); + } + + /* test.case( "into x1 tupple" ) */ + { + let src = ( Single1::from( 1 ), ); + let got : ( i32, ) = src.vectorized_into(); + let exp = ( 1, ); + a_id!( got, exp ); + + let src = ( Single1::from( 1 ), ); + let got = <( i32, )>::vectorized_from( src ); + let exp = ( 1, ); + a_id!( got, exp ); + } + + /* test.case( "from x2 tupple" ) */ + { + let src = ( 1, 3 ); + let got : ( Single1, Single1 ) = src.vectorized_into(); + let exp = ( Single1::from( 1 ), Single1::from( 3 ) ); + a_id!( got, exp ); + + let src = ( 1, 3 ); + let got = <( Single1, Single1 )>::vectorized_from( src ); + let exp = ( Single1::from( 1 ), Single1::from( 3 ) ); + a_id!( got, exp ); + } + + /* test.case( "into x2 tupple" ) */ + { + let src = ( Single1::from( 1 ), Single2::from( 3 ) ); + let got : ( i32, i32 ) = src.vectorized_into(); + let exp = ( 1, 3 ); + a_id!( got, exp ); + + let src = ( Single1::from( 1 ), Single2::from( 3 ) ); + let got = <( i32, i32 )>::vectorized_from( src ); + let exp = ( 1, 3 ); + a_id!( got, exp ); + } + + /* test.case( "from x3 tupple" ) */ + { + let src = ( 1, 2, 3 ); + let got : ( Single1, Single2, Single3 ) = src.vectorized_into(); + let exp = ( Single1::from( 1 ), Single2::from( 2 ), Single3::from( 3 ) ); + a_id!( got, exp ); + + let src = ( 1, 2, 3 ); + let got = <( Single1, Single2, Single3 )>::vectorized_from( src ); + let exp = ( Single1::from( 1 ), Single2::from( 2 ), Single3::from( 3 ) ); + a_id!( got, exp ); + } + + /* test.case( "into x3 tupple" ) */ + { + let src = ( Single1::from( 1 ), Single2::from( 2 ), Single3::from( 3 ) ); + let got : ( i32, i32, i32 ) = src.vectorized_into(); + let exp = ( 1, 2, 3 ); + a_id!( got, exp ); + + let src = ( Single1::from( 1 ), Single2::from( 2 ), Single3::from( 3 ) ); + let got = <( i32, i32, i32 )>::vectorized_from( src ); + let exp = ( 1, 2, 3 ); + a_id!( got, exp ); + } + + /* test.case( "from/into x0 array" ) */ + { + let src : [ i32 ; 0 ] = []; + let got : [ i32 ; 0 ] = src.vectorized_into(); + let exp : [ i32 ; 0 ] = []; + a_id!( got, exp ); + + let src : [ i32 ; 0 ] = []; + let got = <[ i32 ; 0 ]>::vectorized_from( src ); + let exp : [ i32 ; 0 ] = []; + a_id!( got, exp ); + } + + /* test.case( "from itself x1 array" ) */ + { + let src = [ Single1::from( 1 ) ]; + let got : [ Single1 ; 1 ] = src.vectorized_into(); + let exp = [ Single1::from( 1 ) ]; + a_id!( got, exp ); + + let src = [ Single1::from( 1 ) ]; + let got = <[ Single1 ; 1 ]>::vectorized_from( src ); + let exp = [ Single1::from( 1 ) ]; + a_id!( got, exp ); + } + + /* test.case( "from x1 array" ) */ + { + let src = [ 1 ]; + let got : [ Single1 ; 1 ] = src.vectorized_into(); + let exp = [ Single1::from( 1 ) ]; + a_id!( got, exp ); + + let src = [ 1 ]; + let got = <[ Single1 ; 1 ]>::vectorized_from( src ); + let exp = [ Single1::from( 1 ) ]; + a_id!( got, exp ); + } + + /* test.case( "into x1 array" ) */ + { + let src = [ Single1::from( 1 ) ]; + let got : [ i32 ; 1 ] = src.vectorized_into(); + let exp = [ 1 ]; + a_id!( got, exp ); + + let src = [ Single1::from( 1 ) ]; + let got = <[ i32 ; 1 ]>::vectorized_from( src ); + let exp = [ 1 ]; + a_id!( got, exp ); + } + + /* test.case( "from x2 array" ) */ + { + let src = [ 1, 3 ]; + let got : [ Single1 ; 2 ] = src.vectorized_into(); + let exp = [ Single1::from( 1 ), Single1::from( 3 ) ]; + a_id!( got, exp ); + + let src = [ 1, 3 ]; + let got = <[ Single1 ; 2 ]>::vectorized_from( src ); + let exp = [ Single1::from( 1 ), Single1::from( 3 ) ]; + a_id!( got, exp ); + } + + /* test.case( "into x2 array" ) */ + { + let src = [ Single1::from( 1 ), Single1::from( 3 ) ]; + let got : [ i32 ; 2 ] = src.vectorized_into(); + let exp = [ 1, 3 ]; + a_id!( got, exp ); + + let src = [ Single1::from( 1 ), Single1::from( 3 ) ]; + let got = <[ i32 ; 2 ]>::vectorized_from( src ); + let exp = [ 1, 3 ]; + a_id!( got, exp ); + } + + /* test.case( "from x3 array" ) */ + { + let src = [ 1, 2, 3 ]; + let got : [ Single1 ; 3 ] = src.vectorized_into(); + let exp = [ Single1::from( 1 ), Single1::from( 2 ), Single1::from( 3 ) ]; + a_id!( got, exp ); + + let src = [ 1, 2, 3 ]; + let got = <[ Single1 ; 3 ]>::vectorized_from( src ); + let exp = [ Single1::from( 1 ), Single1::from( 2 ), Single1::from( 3 ) ]; + a_id!( got, exp ); + } + + /* test.case( "into x3 array" ) */ + { + let src = [ Single1::from( 1 ), Single1::from( 2 ), Single1::from( 3 ) ]; + let got : [ i32 ; 3 ] = src.vectorized_into(); + let exp = [ 1, 2, 3 ]; + a_id!( got, exp ); + + let src = [ Single1::from( 1 ), Single1::from( 2 ), Single1::from( 3 ) ]; + let got = <[ i32 ; 3 ]>::vectorized_from( src ); + let exp = [ 1, 2, 3 ]; + a_id!( got, exp ); + } + + } + +} + +// + +tests_index! +{ + basic, +} diff --git a/module/postponed/type_constructor/tests/smoke_test.rs b/module/postponed/type_constructor/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/type_constructor/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/wautomata/Cargo.toml b/module/postponed/wautomata/Cargo.toml new file mode 100644 index 0000000000..04cbe77d3c --- /dev/null +++ b/module/postponed/wautomata/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "wautomata" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wautomata" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/wautomata" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/wautomata" +description = """ +Implementation of automata. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/graph/wautomata_lib.rs", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "wautomata" +path = "src/graph/wautomata_lib.rs" + +[[test]] +name = "wautomata_test" +path = "tests/wautomata_tests.rs" + +# [[test]] +# name = "wautomata_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +# [[example]] +# name = "wautomata_trivial" +# path = "examples/wautomata_trivial/src/main.rs" + +[dependencies] +automata_tools = { workspace = true, features = [ "full" ] } + +[dev-dependencies] +test_tools = { workspace = true } +wtools = { workspace = true } diff --git a/module/postponed/wautomata/License b/module/postponed/wautomata/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/wautomata/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/wautomata/Readme.md b/module/postponed/wautomata/Readme.md new file mode 100644 index 0000000000..da03a27de9 --- /dev/null +++ b/module/postponed/wautomata/Readme.md @@ -0,0 +1,35 @@ + + +# Module :: wautomata + +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModulewAutomataPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModulewAutomataPush.yml) [![docs.rs](https://img.shields.io/docsrs/wautomata?color=e3e8f0&logo=docs.rs)](https://docs.rs/wautomata) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Implementation of automata. + +## Sample + + + +``` rust sample test +use wautomata::*; + +fn main() +{ +} +``` + +### To add to your project + +``` shell +cargo add wautomata +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/wautomata_trivial +cargo run +``` diff --git a/module/postponed/wautomata/examples/automata_tools_trivial_sample/Cargo.toml b/module/postponed/wautomata/examples/automata_tools_trivial_sample/Cargo.toml new file mode 100644 index 0000000000..8f24953c7b --- /dev/null +++ b/module/postponed/wautomata/examples/automata_tools_trivial_sample/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "automata_tools_trivial" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +automata_tools = { workspace = true } +wtools = { workspace = true } diff --git a/module/postponed/wautomata/examples/automata_tools_trivial_sample/Readme.md b/module/postponed/wautomata/examples/automata_tools_trivial_sample/Readme.md new file mode 100644 index 0000000000..5e6626f3a5 --- /dev/null +++ b/module/postponed/wautomata/examples/automata_tools_trivial_sample/Readme.md @@ -0,0 +1,5 @@ +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Fautomata_tools_trivial,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/automata_tools) diff --git a/module/postponed/wautomata/examples/automata_tools_trivial_sample/src/main.rs b/module/postponed/wautomata/examples/automata_tools_trivial_sample/src/main.rs new file mode 100644 index 0000000000..a01c41f0e5 --- /dev/null +++ b/module/postponed/wautomata/examples/automata_tools_trivial_sample/src/main.rs @@ -0,0 +1,13 @@ + +fn main() +{ + // xxx : fixme + + // use automata_tools::prelude::*; + // use wtools::prelude::*; + // let node : automata_tools::canonical::Node = from!( 13 ); + // assert_eq!( node.id(), 13.into() ); + // println!( "{:?}", node ); + /* print : node::13 */ +} + diff --git a/module/postponed/wautomata/src/graph/abs/edge.rs b/module/postponed/wautomata/src/graph/abs/edge.rs new file mode 100644 index 0000000000..62a67f83a8 --- /dev/null +++ b/module/postponed/wautomata/src/graph/abs/edge.rs @@ -0,0 +1,65 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + use core::fmt; + use core::hash::Hash; + + /// + /// Kind of a edge. + /// + + pub trait EdgeKindInterface + where + Self : + 'static + + Copy + + fmt::Debug + + PartialEq + + Hash + + Default + + , + { + } + + impl< T > EdgeKindInterface for T + where + T : + 'static + + Copy + + fmt::Debug + + PartialEq + + Hash + + Default + + , + { + } + + /// + /// No kind for edges. + /// + + #[ derive( Debug, PartialEq, Eq, Copy, Clone, Hash, Default ) ] + pub struct EdgeKindless(); + + /// + /// Edge of a graph. + /// + + pub trait EdgeBasicInterface + where + Self : + HasId + + { + } +} + +// + +crate::mod_interface! +{ + exposed use EdgeKindless; + prelude use EdgeKindInterface; + prelude use EdgeBasicInterface; +} + diff --git a/module/postponed/wautomata/src/graph/abs/factory.rs b/module/postponed/wautomata/src/graph/abs/factory.rs new file mode 100644 index 0000000000..ff63edf13d --- /dev/null +++ b/module/postponed/wautomata/src/graph/abs/factory.rs @@ -0,0 +1,443 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use core::ops::Deref; + + macro_rules! NODE_ID + { + () => { < < Self as GraphNodesNominalInterface >::NodeHandle as HasId >::Id }; + } + + macro_rules! EDGE_ID + { + () => { < < Self as GraphEdgesNominalInterface >::EdgeHandle as HasId >::Id }; + } + + /// + /// Graph which know how to iterate neighbourhood of a node and capable to convert id of a node into a node. + /// + + pub trait GraphNodesNominalInterface + { + + /// Handle of a node - entity representing a node or the node itself. + /// It's not always possible to operate a node directly, for example it it has to be wrapped by cell ref. For that use NodeHandle. + /// Otherwise NodeHandle could be &Node. + type NodeHandle : NodeBasicInterface; + + // /// Convert argument into node id. + // #[ allow( non_snake_case ) ] + // #[ inline ] + // fn NodeId< Id >( id : Id ) -> NODE_ID!() + // where + // Id : Into< NODE_ID!() > + // { + // id.into() + // } + + /// Convert argument into node id. + #[ inline ] + fn node_id< Id >( &self, id : Id ) -> NODE_ID!() + where + Id : Into< NODE_ID!() > + { + id.into() + } + + /// Get node with id. + fn node< Id >( &self, id : Id ) -> &Self::NodeHandle + where + Id : Into< NODE_ID!() > + ; + + // type NodeId; + // // type OutNodesIdsIterator : Iterator< Item = ( &'it < Graph::NodeHandle as HasId >::Id, &'it Graph::NodeHandle ) >; + // type OutNodesIdsIterator : Iterator< Item = Self::NodeId >; + // /// Iterate over all nodes. + // fn out_nodes_ids< Id >( &self, node_id : Id ) -> Self::OutNodesIdsIterator + // where + // Id : Into< NODE_ID!() > + // ; + + // type NodeId; + // type OutNodesIdsIterator : Iterator< Item = Self::NodeId >; + // /// Iterate over all nodes. + // fn out_nodes_ids_2< Id >( &self, node_id : Id ) -> Self::OutNodesIdsIterator + // where + // Id : Into< NODE_ID!() > + // ; + + /// Iterate over neighbourhood of the node. Callback gets ids of nodes in neighbourhood of a picked node. + fn out_nodes_ids< 'a, 'b, Id >( &'a self, node_id : Id ) + -> + Box< dyn Iterator< Item = NODE_ID!() > + 'b > + where + Id : Into< NODE_ID!() >, + 'a : 'b, + ; + + /// Iterate over neighbourhood of the node. Callback gets ids and reference on itself of nodes in neighbourhood of a picked node. + fn out_nodes< 'a, 'b, Id >( &'a self, node_id : Id ) + -> + Box< dyn Iterator< Item = ( NODE_ID!(), &< Self as GraphNodesNominalInterface >::NodeHandle ) > + 'b > + where + Id : Into< NODE_ID!() >, + 'a : 'b, + { + Box::new( self.out_nodes_ids( node_id ).map( | id | + { + ( id, self.node( id ) ) + })) + } + + } + +// /// +// /// Graph which know how to iterate neighbourhood of a node and capable to convert id of a node into a node. +// /// +// +// pub trait GraphNodesNominalInterface2< T > +// where +// Self : Deref< Target = T >, +// T : GraphNodesNominalInterface, +// { +// +// /// Iterator to iterate ids of nodes. +// type OutNodesIdsIterator : Iterator< Item = < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id >; +// /// Iterate over all nodes. +// fn out_nodes_ids_2< Id >( self, node_id : Id ) -> Self::OutNodesIdsIterator +// where +// Id : Into< < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id > +// ; +// +// /// Reference on a node handle. +// type RefNode; +// /// Iterator to iterate pairs id - node +// type OutNodesIterator : Iterator< Item = ( < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id, Self::RefNode ) >; +// +// // /// Iterate over neighbourhood of the node. Callback gets ids and reference on itself of nodes in neighbourhood of a picked node. +// // fn out_nodes_2< Id >( self, node_id : Id ) +// // -> +// // Self::OutNodesIdsIterator +// // where +// // Self : Sized, +// // Id : Into< < < T as GraphNodesNominalInterface >::NodeHandle as HasId >::Id > +// // ; +// +// } + + /// + /// Graph which know how to iterate neighbourhood of a node and capable to convert id of a node into a node. + /// + + pub trait GraphEdgesNominalInterface + where + Self : GraphNodesNominalInterface, + { + + /// Handle of an edge - entity representing an edge or the edge itself. + /// It's not always possible to operate an edge directly, for example it it has to be wrapped by cell ref. For that use NodeHandle. + /// Otherwise EdgeHandle could be &Node. + type EdgeHandle : EdgeBasicInterface; + + // /// Convert argument into edge id. + // #[ allow( non_snake_case ) ] + // #[ inline ] + // fn EdgeId< Id >( id : Id ) -> EDGE_ID!() + // where + // Id : Into< EDGE_ID!() > + // { + // id.into() + // } + + /// Convert argument into edge id. + #[ inline ] + fn edge_id< Id >( &self, id : Id ) -> EDGE_ID!() + where + Id : Into< EDGE_ID!() > + { + id.into() + // Self::EdgeId( id ) + } + + /// Get edge with id. + fn edge< Id >( &self, id : Id ) -> &Self::EdgeHandle + where + Id : Into< EDGE_ID!() > + ; + + /// Iterate over output edges of the node. Callback gets ids of nodes in neighbourhood of a picked node. + fn out_edges_ids< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = EDGE_ID!() > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + ; + + /// Iterate over output edges of the node. Callback gets ids and references of edges in neighbourhood of a picked node. + fn out_edges< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = ( EDGE_ID!(), &< Self as GraphEdgesNominalInterface >::EdgeHandle ) > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + { + Box::new( self.out_edges_ids( node_id ).map( | id | + { + ( id, self.edge( id ) ) + })) + } + + } + +// /// Into iterator of nodes. +// +// pub trait IntoIteratorOfNodes +// { +// type NodesIteratorItem; +// type NodesIterator : Iterator< Item = Self::NodesIteratorItem >; +// // /// Iterate over all nodes. +// // fn nodes( self ) -> Self::NodesIterator; +// } +// +// // +// +// impl< 'it, Graph > IntoIteratorOfNodes +// for &'it Graph +// where +// Graph : GraphNodesNominalInterface, +// { +// type NodesIteratorItem = ( &'it < Graph::NodeHandle as HasId >::Id, &'it Graph::NodeHandle ); +// type NodesIterator = std::collections::hash_map::Iter< 'it, < Graph::NodeHandle as HasId >::Id, Graph::NodeHandle >; +// // fn nodes( self ) -> Self::NodesIterator +// // { +// // self.map.iter() +// // } +// } + + /// + /// Graph nodes of which is possible to enumerate. + /// + + // pub trait GraphNodesEnumerableInterface< 'it, 'it2, It > + pub trait GraphNodesEnumerableInterface + where + Self : GraphNodesNominalInterface, + // It : Iterator< Item = &'it2 ( NODE_ID!(), &'it < Self as GraphNodesNominalInterface >::NodeHandle ) >, + // < Self as GraphNodesNominalInterface >::NodeHandle : 'it, + // 'it : 'it2, + { + + // type NodesIteratorItem; + // // type NodesIterator : Iterator< Item = ( &'it < Graph::NodeHandle as HasId >::Id, &'it Graph::NodeHandle ) >; + // type NodesIterator : Iterator< Item = Self::NodesIteratorItem >; + // /// Iterate over all nodes. + // fn nodes( self ) -> Self::NodesIterator; + + /// Iterate over all nodes. + fn nodes< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( NODE_ID!(), &< Self as GraphNodesNominalInterface >::NodeHandle ) > + 'b > + where + 'a : 'b, + ; + + /// Number of nodes. Order of the graph. + fn nnodes( &self ) -> usize + { + self.nodes().count() + } + + } + + /// + /// Graph edges of which is possible to enumerate. + /// + + pub trait GraphEdgesEnumerableInterface + where + Self : + GraphNodesNominalInterface + + GraphEdgesNominalInterface + + , + { + + /// Iterate over all edges. + fn edges< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( EDGE_ID!(), &< Self as GraphEdgesNominalInterface >::EdgeHandle ) > + 'b > + where + 'a : 'b, + ; + + /// Number of edges. Size of the graph. + fn nedges( &self ) -> usize + { + self.edges().count() + } + + } + + /// + /// Graph interface which allow to add more nodes. Know nothing about edges. + /// + + pub trait GraphNodesExtendableInterface + where + Self : + GraphNodesNominalInterface + + , + { + + /// Get node with id mutably. + fn node_mut< Id >( &mut self, id : Id ) -> &mut Self::NodeHandle + where + Id : Into< NODE_ID!() > + ; + + /// Add out nodes to the node. + fn node_add_out_nodes< IntoId1, IntoId2, Iter > + ( + &mut self, + node_id : IntoId1, + out_nodes_iter : Iter, + ) + where + IntoId1 : Into< NODE_ID!() >, + IntoId2 : Into< NODE_ID!() >, + Iter : IntoIterator< Item = IntoId2 >, + Iter::IntoIter : Clone, + ; + + /// Add out edges to the node. + fn node_add_out_node< IntoId1, IntoId2 > + ( + &mut self, + node_id : IntoId1, + out_node_id : IntoId2, + ) + where + IntoId1 : Into< NODE_ID!() >, + IntoId1 : Clone, + IntoId2 : Into< NODE_ID!() >, + IntoId2 : Clone, + { + self.node_add_out_nodes( node_id, core::iter::once( out_node_id ) ); + } + + /// Either make new or get existing node. + fn node_making< Id >( &mut self, id : Id ) -> NODE_ID!() + where + Id : Into< NODE_ID!() > + ; + + /// Make edges. + fn make_with_edge_list< IntoIter, Id >( &mut self, into_iter : IntoIter ) + where + Id : Into< NODE_ID!() >, + IntoIter : IntoIterator< Item = Id >, + IntoIter::IntoIter : core::iter::ExactSizeIterator< Item = Id >, + { + use wtools::iter::prelude::*; + let iter = into_iter.into_iter(); + debug_assert_eq!( iter.len() % 2, 0 ); + for mut chunk in &iter.chunks( 2 ) + { + let id1 = chunk.next().unwrap().into(); + let id2 = chunk.next().unwrap().into(); + self.node_making( id1 ); + self.node_making( id2 ); + self.node_add_out_node( id1, id2 ); + } + + } + + } + + /// + /// Graph interface which allow to add more edges. + /// + + pub trait GraphEdgesExtendableInterface + where + Self : + GraphNodesNominalInterface + + GraphEdgesNominalInterface + + GraphNodesExtendableInterface + + , + { + + // /// Either make new or get existing edge for specified nodes. + // fn _edge_id_generate( &mut self, node1 : NODE_ID!(), node2 : NODE_ID!() ) -> EDGE_ID!(); + + /// Either make new or get existing edge for specified nodes. + fn _edge_add( &mut self, node1 : NODE_ID!(), node2 : NODE_ID!() ) -> EDGE_ID!(); + + /// Either make new or get existing edge for specified nodes. + #[ inline ] + fn _edge_make_for_nodes< IntoNodeId1, IntoNodeId2 >( &mut self, node1 : IntoNodeId1, node2 : IntoNodeId2 ) -> EDGE_ID!() + where + IntoNodeId1 : Into< NODE_ID!() >, + IntoNodeId2 : Into< NODE_ID!() >, + { + let node1 = node1.into(); + let node2 = node2.into(); + // let edge = self._edge_id_generate( node1, node2 ); + let edge = self._edge_add( node1, node2 ); + edge + } + + } + +// /// +// /// Graph nodes of which has a kind. +// /// +// +// pub trait GraphNodesKindGetterInterface +// where +// Self : GraphNodesNominalInterface, +// { +// /// Enumerate kinds of the node. +// type NodeKind : crate::NodeKindInterface; +// /// Get kind of the node. +// fn node_kind( &self, node_id : NODE_ID!() ) -> Self::NodeKind; +// } +// +// /// +// /// Graph nodes of which has a kind. +// /// +// +// pub trait GraphEdgesKindGetterInterface +// where +// Self : +// GraphNodesNominalInterface + +// GraphEdgesNominalInterface + +// , +// { +// /// Enumerate kinds of the node. +// type EdgeKind : crate::EdgeKindInterface; +// /// Get kind of the node. +// fn edge_kind( &self, edge_id : EDGE_ID!() ) -> Self::EdgeKind; +// } + +} + +// + +crate::mod_interface! +{ + prelude use super::private:: + { + GraphNodesNominalInterface, + // GraphNodesNominalInterface2, + GraphEdgesNominalInterface, + GraphNodesEnumerableInterface, + GraphEdgesEnumerableInterface, + GraphNodesExtendableInterface, + GraphEdgesExtendableInterface, + // GraphNodesKindGetterInterface, + // GraphEdgesKindGetterInterface, + }; +} diff --git a/module/postponed/wautomata/src/graph/abs/id_generator.rs b/module/postponed/wautomata/src/graph/abs/id_generator.rs new file mode 100644 index 0000000000..28b1be7fc2 --- /dev/null +++ b/module/postponed/wautomata/src/graph/abs/id_generator.rs @@ -0,0 +1,52 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::prelude::*; + // use core::fmt; + // use core::hash::Hash; + // use core::cmp::{ PartialEq, Eq }; + use crate::IdentityInterface; + + /// Has ID generator. + + pub trait HasIdGenerator< Id > + where + Id : IdentityInterface, + { + /// Associated id generator. + type Generator : IdGeneratorTrait< Id >; + } + + /// Interface to generate ids. + + pub trait IdGeneratorTrait< Id > + where + Id : IdentityInterface, + Self : Default, + { + /// Generate a new id. + fn id_next( &mut self ) -> Id; + /// Check is id valid. + fn is_id_valid( &self, src : Id ) -> bool; + } + + // impl< T, G > HasIdGenerator< T > for T + // where + // G : IdGeneratorTrait< T >, + // { + // type Generator = G; + // } + +} + +// + +crate::mod_interface! +{ + prelude use super::private:: + { + HasIdGenerator, + IdGeneratorTrait, + // IdGeneratorInt, + }; +} diff --git a/module/postponed/wautomata/src/graph/abs/identity.rs b/module/postponed/wautomata/src/graph/abs/identity.rs new file mode 100644 index 0000000000..05fb1a1d05 --- /dev/null +++ b/module/postponed/wautomata/src/graph/abs/identity.rs @@ -0,0 +1,104 @@ +/// Internal namespace. +pub( crate ) mod private +{ + // use crate::prelude::*; + use core::fmt; + use core::hash::Hash; + use core::cmp::{ PartialEq, Eq }; + + /// + /// Interface to identify an instance of somthing, for exampel a node. + /// + + pub trait IdentityInterface + where + Self : + 'static + + Copy + + Hash + + fmt::Debug + + PartialEq + + Eq + , + { + } + + impl< T > IdentityInterface for T + where + T : + 'static + + Copy + + Hash + + fmt::Debug + + PartialEq + + Eq + , + { + } +// +// /// +// /// Interface to identify an instance of somthing with ability to increase it to generate a new one. +// /// +// +// pub trait IdentityGenerableInterface +// where +// // Self : Default, +// // Self : IdentityInterface + Default, +// { +// /// Generate a new identity based on the current increasing it. +// fn next( &self ) -> Self; +// /// Generate the first identity. +// fn first() -> Self +// { +// Default::default() +// } +// /// Check is the identity valid. +// fn is_valid( &self ) -> bool; +// } + + /// + /// Interface to identify an instance of somthing with ability to increase it to generate a new one. + /// + + pub trait IdentityGeneratorInterface< Id > + where + Id : IdentityInterface + Default, + // Self : Default, + // Self : IdentityInterface + Default, + { + /// Generate a new identity based on the current increasing it. + fn next( &mut self ) -> Id; + /// Generate the first identity. + fn first( &mut self ) -> Id + { + Default::default() + } + /// Check is the identity valid. + fn id_is_valid( &self, id : Id ) -> bool; + } + + /// + /// Instance has an id. + /// + + pub trait HasId + { + /// Id of the node. + type Id : IdentityInterface; + /// Get id. + fn id( &self ) -> Self::Id; + } + +} + +// + +crate::mod_interface! +{ + prelude use super::private:: + { + IdentityInterface, + IdentityGeneratorInterface, + HasId, + }; +} diff --git a/module/postponed/wautomata/src/graph/abs/mod.rs b/module/postponed/wautomata/src/graph/abs/mod.rs new file mode 100644 index 0000000000..6037ef807f --- /dev/null +++ b/module/postponed/wautomata/src/graph/abs/mod.rs @@ -0,0 +1,17 @@ +crate::mod_interface! +{ + /// Edge interface. + layer edge; + /// Factory of nodes. + layer factory; + // /// Interface of a graph. + // layer graph; + /// Simple ID generator. + layer id_generator; + /// Interface to identify an instance of somthging, for exampel a node. + layer identity; + /// Node interface. + layer node; + // /// Node in a ref counted cell. + // layer node_cell; +} diff --git a/module/postponed/wautomata/src/graph/abs/node.rs b/module/postponed/wautomata/src/graph/abs/node.rs new file mode 100644 index 0000000000..5ab8d56937 --- /dev/null +++ b/module/postponed/wautomata/src/graph/abs/node.rs @@ -0,0 +1,72 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use core::fmt; + // use core::hash::Hash; + +// /// +// /// Kind of a node. +// /// +// +// pub trait NodeKindInterface +// where +// Self : +// 'static + +// Copy + +// fmt::Debug + +// PartialEq + +// // Eq + +// // xxx +// Hash + +// Default + +// , +// { +// } +// +// impl< T > NodeKindInterface for T +// where +// T : +// 'static + +// Copy + +// fmt::Debug + +// PartialEq + +// // Eq + +// Hash + +// Default + +// , +// { +// } + +// /// +// /// No kind for nodes. +// /// +// +// #[ derive( Debug, PartialEq, Eq, Copy, Clone, Hash, Default ) ] +// pub struct NodeKindless(); + + /// + /// Node of a graph. + /// + + pub trait NodeBasicInterface + where + Self : + HasId + + { + } + +} + +// + +crate::mod_interface! +{ + + // exposed use NodeKindless; + prelude use super::private:: + { + // NodeKindInterface, + NodeBasicInterface, + }; +} diff --git a/module/postponed/wautomata/src/graph/algo/dfs.rs b/module/postponed/wautomata/src/graph/algo/dfs.rs new file mode 100644 index 0000000000..d87d69a095 --- /dev/null +++ b/module/postponed/wautomata/src/graph/algo/dfs.rs @@ -0,0 +1,29 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use core::fmt::Debug; + // use core::iter::Iterator; + + /// + /// Implementation of depth-first search algorithm. + /// + + pub trait DfsAlgorithm + where + Self : NodeBasicInterface, + { + // fn dfs( roots : Iterator< IdInterface > ) + // { + // + // } + } + +} + +// + +crate::mod_interface! +{ + prelude use DfsAlgorithm; +} diff --git a/module/postponed/wautomata/src/graph/algo/mod.rs b/module/postponed/wautomata/src/graph/algo/mod.rs new file mode 100644 index 0000000000..9c423ccbce --- /dev/null +++ b/module/postponed/wautomata/src/graph/algo/mod.rs @@ -0,0 +1,5 @@ +crate::mod_interface! +{ + /// Depth-first search. + layer dfs; +} diff --git a/module/postponed/wautomata/src/graph/automata_tools_lib.rs b/module/postponed/wautomata/src/graph/automata_tools_lib.rs new file mode 100644 index 0000000000..6f825c40ab --- /dev/null +++ b/module/postponed/wautomata/src/graph/automata_tools_lib.rs @@ -0,0 +1,20 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/automata_tools/latest/automata_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! Implementation of automata. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use graphs_tools::*; diff --git a/module/postponed/wautomata/src/graph/canonical/edge.rs b/module/postponed/wautomata/src/graph/canonical/edge.rs new file mode 100644 index 0000000000..36aec4b15c --- /dev/null +++ b/module/postponed/wautomata/src/graph/canonical/edge.rs @@ -0,0 +1,84 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + + // macro_rules! NODE_ID + // { + // () => { < Node as HasId >::Id }; + // } + + /// + /// Canonical implementation of edge. + /// + + #[ derive( Debug, Copy, Clone ) ] + pub struct Edge< EdgeId = crate::IdentityWithInt, NodeId = crate::IdentityWithInt > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + { + /// Input node. + pub in_node : NodeId, + /// Output node. + pub out_node : NodeId, + // /// Kind of the edge. + // pub kind : Kind, + /// Identifier. + pub id : EdgeId, + } + + // + + impl< EdgeId, NodeId > HasId + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + + { + type Id = EdgeId; + fn id( &self ) -> Self::Id + { + self.id + } + } + + // + + impl< EdgeId, NodeId > EdgeBasicInterface + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + { + } + + // + + impl< EdgeId, NodeId > PartialEq + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + { + fn eq( &self, other : &Self ) -> bool + { + self.id() == other.id() + } + } + + impl< EdgeId, NodeId > Eq + for Edge< EdgeId, NodeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + {} +} + +// + +crate::mod_interface! +{ + orphan use super::private::Edge; +} diff --git a/module/postponed/wautomata/src/graph/canonical/factory_generative.rs b/module/postponed/wautomata/src/graph/canonical/factory_generative.rs new file mode 100644 index 0000000000..29aa4be38c --- /dev/null +++ b/module/postponed/wautomata/src/graph/canonical/factory_generative.rs @@ -0,0 +1,200 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use crate::canonical::*; + use crate::canonical; + use wtools::prelude::*; + use core::fmt; + use indexmap::IndexMap; + use std::default::Default; + // use core::ops::Deref; + + include!( "./factory_impl.rs" ); + + /// + /// Generative node factory. + /// + + pub struct GenerativeNodeFactory< NodeId = crate::IdentityWithInt, EdgeId = crate::IdentityWithInt > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + GenerativeNodeFactory< NodeId, EdgeId > : crate::GraphNodesNominalInterface, + { + /// Map id to node. + pub id_to_node_map : IndexMap< NodeId, crate::canonical::Node< NodeId, EdgeId > >, + /// Map id to edge. + pub id_to_edge_map : IndexMap< EdgeId, crate::canonical::Edge< EdgeId, NodeId > >, + /// Generator of node ids. + pub _node_id_generator : NodeId::Generator, + /// Generator of edge ids. + pub _edge_id_generator : EdgeId::Generator, + } + + // xxx : ? + + impl< NodeId, EdgeId > + AsRef< GenerativeNodeFactory< NodeId, EdgeId > > + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + { + fn as_ref( &self ) -> &Self + { + self + } + } + + // + + impl< NodeId, EdgeId > GraphNodesNominalInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + { + type NodeHandle = crate::canonical::Node< NodeId, EdgeId >; + index! + { + node, + out_nodes_ids, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesNominalInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + + { + type EdgeHandle = crate::canonical::Edge< EdgeId, NodeId >; + index! + { + edge, + out_edges_ids, + } + } + + // + + impl< NodeId, EdgeId > GraphNodesEnumerableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + + { + index! + { + nodes, + nnodes, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesEnumerableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + + { + index! + { + edges, + nedges, + } + } + + // + + impl< NodeId, EdgeId > GraphNodesExtendableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + + { + + index! + { + node_mut, + node_add_out_nodes, + node_making, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesExtendableInterface + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + + { + + index! + { + // _edge_id_generate, + _edge_add, + } + + } + + // + + impl< NodeId, EdgeId > fmt::Debug + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + { + index!( fmt ); + } + + // + + impl< NodeId, EdgeId > From_0 + for GenerativeNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface + HasIdGenerator< NodeId >, + EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, + { + index! + { + // from_0, + } + fn from_0() -> Self + { + let id_to_node_map = IndexMap::new(); + let id_to_edge_map = IndexMap::new(); + let _node_id_generator = Default::default(); + let _edge_id_generator = Default::default(); + Self + { + id_to_node_map, + id_to_edge_map, + _node_id_generator, + _edge_id_generator, + } + } + } + +} + +// + +crate::mod_interface! +{ + orphan use GenerativeNodeFactory; +} diff --git a/module/postponed/wautomata/src/graph/canonical/factory_impl.rs b/module/postponed/wautomata/src/graph/canonical/factory_impl.rs new file mode 100644 index 0000000000..3188afd002 --- /dev/null +++ b/module/postponed/wautomata/src/graph/canonical/factory_impl.rs @@ -0,0 +1,266 @@ + +macro_rules! NODE_ID +{ + () => { < < Self as GraphNodesNominalInterface >::NodeHandle as HasId >::Id }; +} + +macro_rules! EDGE_ID +{ + () => { < < Self as GraphEdgesNominalInterface >::EdgeHandle as HasId >::Id }; +} + +impls3! +{ + + // + + fn node< IntoId >( &self, id : IntoId ) -> &Self::NodeHandle + where + IntoId : Into< NODE_ID!() >, + { + let id = id.into(); + let got = self.id_to_node_map.get( &id ); + if got.is_some() + { + let result : &Self::NodeHandle = got.unwrap(); + return result; + } + unreachable!( "No node with id {:?} found", id ); + } + + // + + fn nodes< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( NODE_ID!(), &< Self as GraphNodesNominalInterface >::NodeHandle ) > + 'b > + // core::slice::Iter< 'a, ( NODE_ID!(), &'b < Self as GraphNodesNominalInterface >::NodeHandle ) > + where + 'a : 'b, + { + Box::new( self.id_to_node_map.iter().map( | el | ( *el.0, el.1) ) ) + } + + // + + fn nnodes( &self ) -> usize + { + self.id_to_node_map.len() + } + + // + + fn edge< IntoId >( &self, id : IntoId ) -> &Self::EdgeHandle + where + IntoId : Into< EDGE_ID!() >, + { + let id = id.into(); + let got = self.id_to_edge_map.get( &id ); + if got.is_some() + { + let result : &Self::EdgeHandle = got.unwrap(); + return result; + } + unreachable!( "No edge with id {:?} found", id ); + } + + // + + fn edges< 'a, 'b >( &'a self ) + -> + Box< dyn Iterator< Item = ( EDGE_ID!(), &Self::EdgeHandle ) > + 'b > + where + 'a : 'b, + { + Box::new( self.id_to_edge_map.iter().map( | el | ( *el.0, el.1) ) ) + } + + // + + fn nedges( &self ) -> usize + { + self.id_to_edge_map.len() + } + + // + + ? fn node_mut< IntoId >( &mut self, id : IntoId ) -> &mut Self::NodeHandle + where + IntoId : Into< NODE_ID!() > + { + let id = id.into(); + let got = self.id_to_node_map.get_mut( &id ); + if got.is_some() + { + let result : &mut Self::NodeHandle = got.unwrap(); + return result; + } + unreachable!( "No node with id {:?} found", id ); + } + + // + + ? fn node_making< IntoId >( &mut self, id : IntoId ) -> NODE_ID!() + where + IntoId : Into< NODE_ID!() >, + { + let id = id.into(); + + let result = self.id_to_node_map + .entry( id ) + .or_insert_with( || canonical::Node::_make_with_id( id ).into() ) + // .or_insert_with( || canonical::Node::make_with_id( id ).into() ) + ; + result.id() + } + + // + + // fn _edge_id_generate( &mut self, _in_node : NODE_ID!(), _out_node : NODE_ID!() ) -> EDGE_ID!() + // { + // while self.id_to_edge_map.contains_key( &self._current_edge_id ) + // { + // self._current_edge_id = self._current_edge_id.next(); + // assert!( self._current_edge_id.is_valid(), "Not more space for ids" ); + // } + // self._current_edge_id + // } + + // + + fn _edge_add( &mut self, in_node : NODE_ID!(), out_node : NODE_ID!() ) -> EDGE_ID!() + { + let edge_id = self._edge_id_generator.id_next(); + + self.id_to_edge_map + .entry( edge_id ) + .and_modify( | _ | { panic!( "Edge {:?} already exists", edge_id ) } ) + .or_insert_with( || + { + canonical::Edge + { + id : edge_id, + in_node, + out_node, + // kind : Default::default(), + } + }); + + edge_id + } + + // + + // fn from_0() -> Self + // { + // let id_to_node_map = IndexMap::new(); + // let id_to_edge_map = IndexMap::new(); + // let _node_id_generator = Default::default(); + // let _edge_id_generator = Default::default(); + // // let _current_edge_id = EdgeId::first(); + // Self + // { + // id_to_node_map, + // id_to_edge_map, + // _node_id_generator, + // _edge_id_generator, + // // ..default() + // // _current_edge_id, + // // _p : core::marker::PhantomData, + // } + // } + + // + + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "GenerativeNodeFactory\n" ) )?; + let mut first = true; + for ( _id, node ) in self.nodes() + { + if !first + { + f.write_str( "\n" )?; + } + first = false; + f.write_str( &wtools::string::indentation( " ", format!( "{:?}", node ), "" ) )?; + } + f.write_str( "" ) + } + + ? + + /// + /// Iterate output nodes of the node. + /// + + fn node_add_out_nodes< IntoId1, IntoId2, Iter > + ( + &mut self, + in_node_id : IntoId1, + out_nodes_iter : Iter, + ) + where + IntoId1 : Into< NODE_ID!() >, + IntoId2 : Into< NODE_ID!() >, + Iter : IntoIterator< Item = IntoId2 >, + Iter::IntoIter : Clone, + { + + let in_node_id = in_node_id.into(); + let iter = out_nodes_iter.into_iter(); + + let out_ids : Vec< _ > = iter + .map( | out_node_id | + { + let out_node_id = out_node_id.into(); + #[ cfg( debug_assertions ) ] + let _ = self.node( out_node_id ); + let out_edge_id = self._edge_make_for_nodes( in_node_id, out_node_id ); + ( out_edge_id, out_node_id ) + }) + .collect() + ; + + let in_node = self.node_mut( in_node_id ); + + for out_id in out_ids + { + in_node.out_edges.insert( out_id.0 ); + in_node.out_nodes.insert( out_id.1 ); + } + + } + + // + + fn out_nodes_ids< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = NODE_ID!() > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + { + let node = self.node( node_id ); + let iterator + : Box< dyn Iterator< Item = NODE_ID!() > > + = Box::new( node.out_nodes.iter().cloned() ); + iterator + } + + // + + fn out_edges_ids< 'a, 'b, IntoId >( &'a self, node_id : IntoId ) + -> + Box< dyn Iterator< Item = EDGE_ID!() > + 'b > + where + IntoId : Into< NODE_ID!() >, + 'a : 'b, + { + let node = self.node( node_id ); + let iterator + : Box< dyn Iterator< Item = EDGE_ID!() > > + = Box::new( node.out_edges.iter().cloned() ); + iterator + } + +} diff --git a/module/postponed/wautomata/src/graph/canonical/factory_readable.rs b/module/postponed/wautomata/src/graph/canonical/factory_readable.rs new file mode 100644 index 0000000000..b16a1c61bd --- /dev/null +++ b/module/postponed/wautomata/src/graph/canonical/factory_readable.rs @@ -0,0 +1,162 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use crate::canonical::*; + // use crate::canonical; + use wtools::prelude::*; + use core::fmt; + use indexmap::IndexMap; + // use std::default::Default; + // use core::ops::Deref; + + include!( "./factory_impl.rs" ); + + /// + /// Radable node factory. + /// + + pub struct ReadableNodeFactory< NodeId = crate::IdentityWithInt, EdgeId = crate::IdentityWithInt > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + ReadableNodeFactory< NodeId, EdgeId > : crate::GraphNodesNominalInterface, + { + /// Map id to node. + pub id_to_node_map : IndexMap< NodeId, crate::canonical::Node< NodeId, EdgeId > >, + /// Map id to edge. + pub id_to_edge_map : IndexMap< EdgeId, crate::canonical::Edge< EdgeId, NodeId > >, + } + + // + + impl< NodeId, EdgeId > GraphNodesNominalInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + type NodeHandle = crate::canonical::Node< NodeId, EdgeId >; + index! + { + node, + out_nodes_ids, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesNominalInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + + { + type EdgeHandle = crate::canonical::Edge< EdgeId, NodeId >; + index! + { + edge, + out_edges_ids, + } + } + + // + + impl< NodeId, EdgeId > GraphNodesEnumerableInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + index! + { + nodes, + nnodes, + } + + } + + // + + impl< NodeId, EdgeId > GraphEdgesEnumerableInterface + for ReadableNodeFactory< NodeId, EdgeId > + where + EdgeId : IdentityInterface, + NodeId : IdentityInterface, + + { + index! + { + edges, + nedges, + } + } + + // + +// impl< NodeId, EdgeId > GraphNodesNominalInterface +// for ReadableNodeFactory< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// { +// } +// +// // +// +// impl< NodeId, EdgeId > GraphNodesNominalInterface +// for GenerativeNodeFactory< NodeId, EdgeId > +// where +// NodeId : IdentityInterface + HasIdGenerator< NodeId >, +// EdgeId : IdentityInterface + HasIdGenerator< EdgeId >, +// { +// } + + // + + impl< NodeId, EdgeId > fmt::Debug + for ReadableNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + index!( fmt ); + } + + // + + impl< NodeId, EdgeId > From_0 + for ReadableNodeFactory< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + index! + { + // from_0, + } + + fn from_0() -> Self + { + let id_to_node_map = IndexMap::new(); + let id_to_edge_map = IndexMap::new(); + Self + { + id_to_node_map, + id_to_edge_map, + } + } + + } + +} + +// + +crate::mod_interface! +{ + orphan use ReadableNodeFactory; +} diff --git a/module/postponed/wautomata/src/graph/canonical/identity.rs b/module/postponed/wautomata/src/graph/canonical/identity.rs new file mode 100644 index 0000000000..736f280351 --- /dev/null +++ b/module/postponed/wautomata/src/graph/canonical/identity.rs @@ -0,0 +1,196 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + use core::fmt; + use core::hash::Hash; + use core::cmp::{ PartialEq, Eq }; + use wtools::dt::prelude::*; + + // types! + // { + // /// Identify an instance by name. + // #[ derive( PartialEq, Eq, Copy, Clone, Hash, Default, Debug ) ] + // pub single IdentityWithPointer : usize; + // } + + /// + /// Identify an instance by its location in memory. + /// + + #[ derive( Debug, PartialEq, Eq, Copy, Clone, Hash, Default ) ] + pub struct IdentityWithPointer( usize ); + + impl IdentityWithPointer + { + + /// Construct from an arbitrary reference. + #[ inline ] + pub fn make< T >( src : &T ) -> Self + { + // Safety : it differentiate different instances. + let ptr = unsafe + { + core::mem::transmute::< _, usize >( src ) + }; + Self( ptr ) + } + + } + + impl< 'a, T > From< &'a T > for IdentityWithPointer + { + fn from( src : &'a T ) -> Self + { + let ptr = unsafe + { + core::mem::transmute::< _, usize >( src ) + }; + Self( ptr ) + } + } + + // + + // zzz : implement IdentityGenerableInterface for other identities. make it working + // zzz : use type constructors + + // types! + // { + // /// Identify an instance by name. + // #[ derive( PartialEq, Eq, Copy, Clone, Hash, Default ) ] + // pub single IdentityWithName : &'static str; + // } + + /// + /// Identify an instance by name. + /// + + #[ derive( PartialEq, Eq, Copy, Clone, Hash ) ] + pub struct IdentityWithName( pub &'static str ) + ; + + impl IdentityWithName + { + + /// Construct from an arbitrary reference. + #[ inline ] + pub fn make( val : &'static str ) -> Self + { + Self( val ) + } + + } + + impl From< &'static str > for IdentityWithName + { + fn from( src : &'static str ) -> Self + { + Self( src ) + } + } + + impl< Src > From< &Src > for IdentityWithName + where + Src : Clone, + IdentityWithName : From< Src >, + { + fn from( src : &Src ) -> Self + { + From::< Src >::from( src.clone() ) + } + } + + impl fmt::Debug for IdentityWithName + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "{}", self.0 ) ) + } + } + + // + // = + // + + types! + { + /// Identify an instance by integer. + #[ derive( PartialEq, Eq, Copy, Clone, Hash ) ] + pub single IdentityWithInt : isize; + } + + /// + /// Interface to to generate a new IDs for IdentityWithInt + /// + + #[ derive( Debug, Copy, Clone, Default ) ] + pub struct IdGeneratorInt + { + counter : IdentityWithInt, + } + + impl IdGeneratorTrait< IdentityWithInt > for IdGeneratorInt + { + /// Generate a new identity based on the current increasing it. + fn id_next( &mut self ) -> IdentityWithInt + { + self.counter.0 += 1; + self.counter + } + /// Check is the identity valid. + fn is_id_valid( &self, src : IdentityWithInt ) -> bool + { + src.0 >= 0 && src.0 < self.counter.0 + } + } + + impl HasIdGenerator< IdentityWithInt > for IdentityWithInt + { + type Generator = IdGeneratorInt; + } + +// impl IdentityGenerableInterface for IdentityWithInt +// { +// +// fn next( &self ) -> Self +// { +// let result = Self( self.0 + 1 ); +// assert!( self.is_valid() ); +// result +// } +// +// fn is_valid( &self ) -> bool +// { +// self.0 > 0 +// } +// +// } + + impl Default for IdentityWithInt + { + fn default() -> Self { Self( 1 ) } + } + + impl fmt::Debug for IdentityWithInt + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "{}", self.0 ) ) + } + } + +} + +// + +crate::mod_interface! +{ + exposed use super::private:: + { + IdentityWithPointer, + IdentityWithName, + IdentityWithInt, + IdGeneratorInt, + }; +} diff --git a/module/postponed/wautomata/src/graph/canonical/mod.rs b/module/postponed/wautomata/src/graph/canonical/mod.rs new file mode 100644 index 0000000000..369dd0afd8 --- /dev/null +++ b/module/postponed/wautomata/src/graph/canonical/mod.rs @@ -0,0 +1,20 @@ +crate::mod_interface! +{ + // Implements canonical factory where each node in a cell. + // #[ cfg( feature = "cell_factory" ) ] + // layer cell_factory; + /// Implements canonical edge. + layer edge; + /// Implements canonical factory. + layer factory_generative; + /// Implements canonical factory to read re. + layer factory_readable; + + /// Implements several identities. + layer identity; + /// Implements canonical node. + layer node; + // Implements node cell. + // #[ cfg( feature = "cell_factory" ) ] + // layer node_cell; +} diff --git a/module/postponed/wautomata/src/graph/canonical/node.rs b/module/postponed/wautomata/src/graph/canonical/node.rs new file mode 100644 index 0000000000..5fc2185a73 --- /dev/null +++ b/module/postponed/wautomata/src/graph/canonical/node.rs @@ -0,0 +1,187 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::prelude::*; + // use wtools::prelude::*; + use indexmap::IndexSet; + use core::fmt; + + /// + /// Canonical implementation of node. + /// + + pub struct Node< NodeId = crate::IdentityWithInt, EdgeId = crate::IdentityWithInt > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + /// Input node. + pub out_nodes : IndexSet< NodeId >, + /// Input node. + pub out_edges : IndexSet< EdgeId >, + // /// Kind of the node. + // pub kind : Kind, + /// Identifier. + pub id : NodeId, + } + + // + +// impl< NodeId, EdgeId > Node< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// // +// { +// +// /// Construct an instance of the node with id. +// pub fn make_with_id< Name >( id : Name ) ->Self +// where +// Name : Into< < Self as HasId >::Id >, +// { +// let out_nodes = IndexSet::new(); +// let out_edges = IndexSet::new(); +// Self +// { +// out_nodes, +// out_edges, +// id : id.into(), +// } +// } +// +// } + + // + + impl< NodeId, EdgeId > Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + /// Construct canonical node using id. + pub fn _make_with_id< IntoId >( id : IntoId ) -> Self + where + IntoId : Into< < Self as HasId >::Id >, + { + let out_nodes = Default::default(); + let out_edges = Default::default(); + Node { out_nodes, out_edges, id : id.into() } + // Self::make_with_id( id ) + } + } + +// impl< NodeId, EdgeId, IntoId > From_1< IntoId > +// for Node< NodeId, EdgeId > +// where +// NodeId : IdentityInterface, +// EdgeId : IdentityInterface, +// +// IntoId : Into< < Self as HasId >::Id >, +// { +// fn from_1( id : IntoId ) -> Self +// { +// let out_nodes = Default::default(); +// let in_nodes = Default::default(); +// Node { out_nodes, in_nodes, id } +// // Self::make_with_id( id ) +// } +// } + + // + + impl< NodeId, EdgeId > HasId + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + { + type Id = NodeId; + fn id( &self ) -> Self::Id + { + self.id + } + } + + // + + impl< NodeId, EdgeId > NodeBasicInterface + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + } + + // + + // impl< NodeId, EdgeId > Extend< < Self as HasId >::Id > + // for Node< NodeId, EdgeId > + // where + // NodeId : IdentityInterface, + // EdgeId : IdentityInterface, + // + // { + // fn extend< Iter >( &mut self, iter : Iter ) + // where + // Iter : IntoIterator< Item = < Self as HasId >::Id > + // { + // for node_id in iter + // { + // self.out_nodes.insert( node_id ); + // } + // } + // } + + // + + impl< NodeId, EdgeId > fmt::Debug + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + fn fmt( &self, f : &mut fmt::Formatter<'_> ) -> fmt::Result + { + f.write_fmt( format_args!( "node::{:?}", self.id() ) )?; + for e in &self.out_nodes + { + f.write_fmt( format_args!( "\n - {:?}", e ) )?; + } + f.write_fmt( format_args!( "" ) ) + } + } + + // + + impl< NodeId, EdgeId > PartialEq + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + { + fn eq( &self, other : &Self ) -> bool + { + self.id() == other.id() + } + } + + impl< NodeId, EdgeId > Eq + for Node< NodeId, EdgeId > + where + NodeId : IdentityInterface, + EdgeId : IdentityInterface, + + {} + +} + +// + +crate::mod_interface! +{ + orphan use Node; +} + diff --git a/module/postponed/wautomata/src/graph/graphs_tools_lib.rs b/module/postponed/wautomata/src/graph/graphs_tools_lib.rs new file mode 100644 index 0000000000..4f8bad6d06 --- /dev/null +++ b/module/postponed/wautomata/src/graph/graphs_tools_lib.rs @@ -0,0 +1,49 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/graphs_tools/latest/graphs_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( type_alias_impl_trait ) ] +// #![ feature( trace_macros ) ] + +//! +//! Implementation of automata. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + + +wtools::mod_interface! +{ + /// Abstract layer. + #[ cfg( not( feature = "no_std" ) ) ] + layer abs; + /// Canonical representation. + #[ cfg( not( feature = "no_std" ) ) ] + layer canonical; + /// Algorithms. + #[ cfg( not( feature = "no_std" ) ) ] + layer algo; + + protected( crate ) use ::wtools::prelude::*; +} + +// zzz : implement checks +// +// - graph is connected +// - graph is complete +// - graph is isomorphic with another graph +// - graph get regularity degree +// - graph is bipartite +// - graph decomposition on cycles +// - graph decomposition on connected components +// +// - node get open neighbourhood? +// - node get closed neighbourhood? +// - node get degree ( nodes ) +// - node get size ( edges ) +// diff --git a/module/postponed/wautomata/src/graph/wautomata_lib.rs b/module/postponed/wautomata/src/graph/wautomata_lib.rs new file mode 100644 index 0000000000..57486d9c50 --- /dev/null +++ b/module/postponed/wautomata/src/graph/wautomata_lib.rs @@ -0,0 +1,20 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/graph_logo_v1_trans.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wautomata/latest/wautomata/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! Implementation of automata. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use automata_tools::*; diff --git a/module/postponed/wautomata/tests/smoke_test.rs b/module/postponed/wautomata/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/wautomata/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/postponed/wautomata/tests/wautomata_tests.rs b/module/postponed/wautomata/tests/wautomata_tests.rs new file mode 100644 index 0000000000..f8a0dacf28 --- /dev/null +++ b/module/postponed/wautomata/tests/wautomata_tests.rs @@ -0,0 +1,3 @@ +#[ path="../../../../module/move/automata_tools/tests/graph/automata_tools_tests.rs" ] +mod automata_tools; + diff --git a/module/postponed/wpublisher/Cargo.toml b/module/postponed/wpublisher/Cargo.toml new file mode 100644 index 0000000000..720a12fc59 --- /dev/null +++ b/module/postponed/wpublisher/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "wpublisher" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wpublisher" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/wpublisher" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/wpublisher" +description = """ +Utility to publish modules on `crates.io` from a command line. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/publisher", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] +# wtools = { workspace = true } +# wca = { workspace = true } +# mod_interface = { workspace = true } +# anyhow = "~1.0" +# toml_edit = "~0.14" +# cargo_metadata = "~0.14" +# ureq = "~2.9" +# sha-1 = "~0.10" +# globwalk = "~0.8" +# petgraph = "~0.6" + +[dev-dependencies] +test_tools = { workspace = true } + diff --git a/module/postponed/wpublisher/License b/module/postponed/wpublisher/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/postponed/wpublisher/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/postponed/wpublisher/Readme.md b/module/postponed/wpublisher/Readme.md new file mode 100644 index 0000000000..86a3813fad --- /dev/null +++ b/module/postponed/wpublisher/Readme.md @@ -0,0 +1,22 @@ +# Module :: wpublisher + +[![deprecated](https://raster.shields.io/static/v1?label=stability&message=deprecated&color=red&logoColor=eee)](https://github.com/emersion/stability-badges#deprecated) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModulewPublisherPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModulewPublisherPush.yml) [![docs.rs](https://img.shields.io/docsrs/wpublisher?color=e3e8f0&logo=docs.rs)](https://docs.rs/wpublisher) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=sample%2Frust%2Fwpublisher_trivial%2Fsrc%2Fmain.rs,RUN_POSTFIX=--example%20wpublisher_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Utility to publish modules on `crates.io` from a command line. + +# Deprecated + +Instead of this use [willbe](https://crates.io/crates/willbe). + + diff --git a/module/postponed/wpublisher/src/lib.rs b/module/postponed/wpublisher/src/lib.rs new file mode 100644 index 0000000000..1801856e1f --- /dev/null +++ b/module/postponed/wpublisher/src/lib.rs @@ -0,0 +1,5 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] diff --git a/module/postponed/wpublisher/tests/smoke_test.rs b/module/postponed/wpublisher/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/postponed/wpublisher/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/step/meta/Cargo.toml b/module/step/meta/Cargo.toml new file mode 100644 index 0000000000..dd2269f048 --- /dev/null +++ b/module/step/meta/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "meta" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +publish = false diff --git a/module/step/meta/src/meta/_template_procedural_macro/front/lib.rs b/module/step/meta/src/meta/_template_procedural_macro/front/lib.rs new file mode 100644 index 0000000000..68e7399466 --- /dev/null +++ b/module/step/meta/src/meta/_template_procedural_macro/front/lib.rs @@ -0,0 +1,46 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/_template_procedural_macro/latest/_template_procedural_macro/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! Template. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use procedural_macro_runtime; + pub use procedural_macro_meta; +} + +/// Protected namespace of the module. +pub mod protected +{ + pub use super::exposed::*; + pub use procedural_macro_runtime as runtime; + pub use procedural_macro_meta as meta; +} + +pub use protected::*; + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::prelude::*; + pub use meta::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/step/meta/src/meta/_template_procedural_macro/meta/impls.rs b/module/step/meta/src/meta/_template_procedural_macro/meta/impls.rs new file mode 100644 index 0000000000..405b10f1ea --- /dev/null +++ b/module/step/meta/src/meta/_template_procedural_macro/meta/impls.rs @@ -0,0 +1,26 @@ + +// #[ allow( unused_imports ) ] +// use quote::{ quote }; +// #[ allow( unused_imports ) ] +// use syn::{ parse_quote }; + +#[ allow( unused_imports ) ] +use macro_tools::prelude::*; +#[ allow( unused_imports ) ] +use macro_tools::{ Result }; + +/// +/// Template. +/// + +pub fn name( _input : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + + // let items = syn::parse::< Items2 >( syn::Item )?; + + let result = qt! + { + }; + + Ok( result ) +} diff --git a/module/step/meta/src/meta/_template_procedural_macro/meta/lib.rs b/module/step/meta/src/meta/_template_procedural_macro/meta/lib.rs new file mode 100644 index 0000000000..29730d3c0b --- /dev/null +++ b/module/step/meta/src/meta/_template_procedural_macro/meta/lib.rs @@ -0,0 +1,33 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/_template_procedural_macro_meta/latest/_template_procedural_macro_meta/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! Template. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +mod impls; + +/// +/// Template. +/// + +#[ proc_macro ] +pub fn procedural_macro( input : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = impls::impls( input ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} diff --git a/module/step/meta/src/meta/_template_procedural_macro/runtime/lib.rs b/module/step/meta/src/meta/_template_procedural_macro/runtime/lib.rs new file mode 100644 index 0000000000..3afe6ce196 --- /dev/null +++ b/module/step/meta/src/meta/_template_procedural_macro/runtime/lib.rs @@ -0,0 +1,38 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/_template_procedural_macro_runtime/latest/_template_procedural_macro_runtime/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Template. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + pub use super::exposed::*; +} + +pub use protected::*; + +/// Exposed namespace of the module. +pub mod exposed +{ + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/step/meta/src/module/aggregating.rs b/module/step/meta/src/module/aggregating.rs new file mode 100644 index 0000000000..ba669c790d --- /dev/null +++ b/module/step/meta/src/module/aggregating.rs @@ -0,0 +1,21 @@ + +/// Mechanism to include tests only to terminal crate. +/// It exclude code in terminal module ( crate ), but include for aggregating module ( crate ). +#[ macro_export ] +macro_rules! only_for_terminal_module +{ + ( $( $Any : tt )* ) => + { + } +} + +/// Mechanism to include tests only to aggregating crate. +/// It exclude code in terminal module ( crate ), but include for aggregating module ( crate ). +#[ macro_export ] +macro_rules! only_for_aggregating_module +{ + ( $( $Any : tt )* ) => + { + $( $Any )* + } +} diff --git a/module/step/meta/src/module/terminal.rs b/module/step/meta/src/module/terminal.rs new file mode 100644 index 0000000000..93289921c5 --- /dev/null +++ b/module/step/meta/src/module/terminal.rs @@ -0,0 +1,17 @@ + +#[ macro_export ] +macro_rules! only_for_terminal_module +{ +( $( $Any : tt )* ) => + { + $( $Any )* + }; +} + +#[ macro_export ] +macro_rules! only_for_aggregating_module +{ + ( $( $Any : tt )* ) => + { + } +} diff --git a/module/step/meta/tests/_blank/tests.rs b/module/step/meta/tests/_blank/tests.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/step/meta/tests/_conditional/local_module.rs b/module/step/meta/tests/_conditional/local_module.rs new file mode 100644 index 0000000000..93289921c5 --- /dev/null +++ b/module/step/meta/tests/_conditional/local_module.rs @@ -0,0 +1,17 @@ + +#[ macro_export ] +macro_rules! only_for_terminal_module +{ +( $( $Any : tt )* ) => + { + $( $Any )* + }; +} + +#[ macro_export ] +macro_rules! only_for_aggregating_module +{ + ( $( $Any : tt )* ) => + { + } +} diff --git a/module/step/meta/tests/_conditional/wtools.rs b/module/step/meta/tests/_conditional/wtools.rs new file mode 100644 index 0000000000..e6bb553f35 --- /dev/null +++ b/module/step/meta/tests/_conditional/wtools.rs @@ -0,0 +1,17 @@ + +#[ macro_export ] +macro_rules! only_for_terminal_module +{ + ( $( $Any : tt )* ) => + { + } +} + +#[ macro_export ] +macro_rules! only_for_aggregating_module +{ + ( $( $Any : tt )* ) => + { + $( $Any )* + } +} diff --git a/module/step/meta/tests/_template_alias/lib_test.rs b/module/step/meta/tests/_template_alias/lib_test.rs new file mode 100644 index 0000000000..19f7aab1de --- /dev/null +++ b/module/step/meta/tests/_template_alias/lib_test.rs @@ -0,0 +1,2 @@ + +// include!( "../___.rs" ); diff --git a/module/step/meta/tests/_template_alias/mod.rs b/module/step/meta/tests/_template_alias/mod.rs new file mode 100644 index 0000000000..d0fc8bed1e --- /dev/null +++ b/module/step/meta/tests/_template_alias/mod.rs @@ -0,0 +1,2 @@ + +mod lib_test; diff --git a/module/step/meta/tests/_template_blank/basic_test.rs b/module/step/meta/tests/_template_blank/basic_test.rs new file mode 100644 index 0000000000..b5bfaa6416 --- /dev/null +++ b/module/step/meta/tests/_template_blank/basic_test.rs @@ -0,0 +1,19 @@ +// use test_tools::exposed::*; + +// + +tests_impls! +{ + #[ test ] + fn basic() + { + a_id!( true, true ); + } +} + +// + +tests_index! +{ + basic, +} diff --git a/module/step/meta/tests/_template_blank/lib_test.rs b/module/step/meta/tests/_template_blank/lib_test.rs new file mode 100644 index 0000000000..a7d2e6b81c --- /dev/null +++ b/module/step/meta/tests/_template_blank/lib_test.rs @@ -0,0 +1,2 @@ + +mod basic_test; diff --git a/module/step/meta/tests/_template_blank/mod.rs b/module/step/meta/tests/_template_blank/mod.rs new file mode 100644 index 0000000000..d0fc8bed1e --- /dev/null +++ b/module/step/meta/tests/_template_blank/mod.rs @@ -0,0 +1,2 @@ + +mod lib_test; diff --git a/module/step/meta/tests/smoke_test.rs b/module/step/meta/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/step/meta/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/template/layer/layer.rs b/module/template/layer/layer.rs new file mode 100644 index 0000000000..e3d184e4a0 --- /dev/null +++ b/module/template/layer/layer.rs @@ -0,0 +1,57 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use super::super::*; + + // ... all code should goes here ... + +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + // ... list all items of private which should be visible outside + }; +} + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + }; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/template/template_alias/Cargo.toml.template b/module/template/template_alias/Cargo.toml.template new file mode 100644 index 0000000000..3558c25ac2 --- /dev/null +++ b/module/template/template_alias/Cargo.toml.template @@ -0,0 +1,36 @@ +[package] +name = "{{template_alias}}" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/{{template_alias}}" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/{{template_alias}}" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/{{template_alias}}" +description = """ +___ +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/template/template_alias/License b/module/template/template_alias/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/template/template_alias/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/template/template_alias/Readme.md b/module/template/template_alias/Readme.md new file mode 100644 index 0000000000..5c07a80088 --- /dev/null +++ b/module/template/template_alias/Readme.md @@ -0,0 +1,17 @@ + + +# Module :: {{template_alias}} +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/Module{{TemplateAlias}}Push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/Module{{TemplateAlias}}Push.yml) [![docs.rs](https://img.shields.io/docsrs/{{template_alias}}?color=e3e8f0&logo=docs.rs)](https://docs.rs/{{template_alias}}) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +___ + +### Basic use-case + +``` rust +``` + +### To add to your project + +``` bash +cargo add {{template_alias}} +``` diff --git a/module/template/template_alias/src/lib.rs b/module/template/template_alias/src/lib.rs new file mode 100644 index 0000000000..df4781f926 --- /dev/null +++ b/module/template/template_alias/src/lib.rs @@ -0,0 +1,8 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +pub use original::*; diff --git a/module/template/template_alias/src/main.rs b/module/template/template_alias/src/main.rs new file mode 100644 index 0000000000..24a55f0b95 --- /dev/null +++ b/module/template/template_alias/src/main.rs @@ -0,0 +1,12 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +pub use original::*; + +pub fn main() +{ +} diff --git a/module/template/template_alias/tests/smoke_test.rs b/module/template/template_alias/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/template/template_alias/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/template/template_blank/Cargo.toml.template b/module/template/template_blank/Cargo.toml.template new file mode 100644 index 0000000000..26aa549abe --- /dev/null +++ b/module/template/template_blank/Cargo.toml.template @@ -0,0 +1,36 @@ +[package] +name = "{{template_blank}}" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/{{template_blank}}" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/{{template_blank}}" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/{{template_blank}}" +description = """ +___ +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/template/template_blank/License b/module/template/template_blank/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/template/template_blank/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/template/template_blank/Readme.md b/module/template/template_blank/Readme.md new file mode 100644 index 0000000000..1651492515 --- /dev/null +++ b/module/template/template_blank/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: {{template_blank}} +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/Module{{template_blank}}Push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/Module{{template_blank}}Push.yml) [![docs.rs](https://img.shields.io/docsrs/{{template_blank}}?color=e3e8f0&logo=docs.rs)](https://docs.rs/{{template_blank}}) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +___ + + diff --git a/module/template/template_blank/src/lib.rs b/module/template/template_blank/src/lib.rs new file mode 100644 index 0000000000..ed1c86148e --- /dev/null +++ b/module/template/template_blank/src/lib.rs @@ -0,0 +1,11 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Function description. +#[ cfg( feature = "enabled" ) ] +pub fn f1() +{ +} diff --git a/module/template/template_blank/tests/inc/basic_test.rs b/module/template/template_blank/tests/inc/basic_test.rs new file mode 100644 index 0000000000..60c9a81cfb --- /dev/null +++ b/module/template/template_blank/tests/inc/basic_test.rs @@ -0,0 +1,7 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn basic() +{ +} diff --git a/module/template/template_blank/tests/inc/mod.rs b/module/template/template_blank/tests/inc/mod.rs new file mode 100644 index 0000000000..dde9de6f94 --- /dev/null +++ b/module/template/template_blank/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic_test; diff --git a/module/template/template_blank/tests/smoke_test.rs b/module/template/template_blank/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/template/template_blank/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/template/template_blank/tests/tests.rs b/module/template/template_blank/tests/tests.rs new file mode 100644 index 0000000000..5620cb2b13 --- /dev/null +++ b/module/template/template_blank/tests/tests.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use {{template_blank}} as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/template/template_procedural_macro/Cargo.toml b/module/template/template_procedural_macro/Cargo.toml new file mode 100644 index 0000000000..520edf2b9d --- /dev/null +++ b/module/template/template_procedural_macro/Cargo.toml @@ -0,0 +1,64 @@ +[package] +name = "procedural_macro" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/procedural_macro" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro" +description = """ +Template. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/meta/procedural_macro_lib.rs", + "/rust/impl/meta/procedural_macro/front", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "procedural_macro" +path = "src/meta/procedural_macro/front/procedural_macro_lib.rs" + +[[test]] +name = "procedural_macro_test" +path = "tests/meta/procedural_macro_tests.rs" + +[[test]] +name = "procedural_macro_smoke_test" +path = "tests/_integration_test/smoke_test.rs" + +# [[example]] +# name = "procedural_macro_trivial" +# path = "examples/procedural_macro_trivial/src/main.rs" + +[dependencies] +procedural_macro_meta = { workspace = true } +procedural_macro_runtime = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } +# trybuild = { version = "~1.0", features = [ "diff" ] } diff --git a/module/template/template_procedural_macro/License b/module/template/template_procedural_macro/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/template/template_procedural_macro/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/template/template_procedural_macro/Readme.md b/module/template/template_procedural_macro/Readme.md new file mode 100644 index 0000000000..5921870676 --- /dev/null +++ b/module/template/template_procedural_macro/Readme.md @@ -0,0 +1,30 @@ + + +# Module :: procedural_macro +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleFormerPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleFormerPush.yml) [![docs.rs](https://img.shields.io/docsrs/procedural_macro?color=e3e8f0&logo=docs.rs)](https://docs.rs/procedural_macro) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +___ + +## Sample + + + +```rust +use procedural_macro::*; + +``` + +### To add to your project + +```sh +cargo add procedural_macro +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/procedural_macro_trivial +cargo run +``` diff --git a/module/template/template_procedural_macro/tests/smoke_test.rs b/module/template/template_procedural_macro/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/template/template_procedural_macro/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/template/template_procedural_macro_meta/Cargo.toml b/module/template/template_procedural_macro_meta/Cargo.toml new file mode 100644 index 0000000000..d7a9cebb47 --- /dev/null +++ b/module/template/template_procedural_macro_meta/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "procedural_macro_meta" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/procedural_macro_meta" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro_meta" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro_meta" +description = """ +___ +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/meta/procedural_macro_meta_lib.rs", + "/rust/impl/meta/procedural_macro/meta", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] + +[lib] +proc-macro = true +name = "procedural_macro_meta" +path = "src/meta/procedural_macro/meta/procedural_macro_lib.rs" + +[dependencies] +macro_tools = { workspace = true } diff --git a/module/template/template_procedural_macro_meta/License b/module/template/template_procedural_macro_meta/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/template/template_procedural_macro_meta/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/template/template_procedural_macro_meta/Readme.md b/module/template/template_procedural_macro_meta/Readme.md new file mode 100644 index 0000000000..37f86d20ce --- /dev/null +++ b/module/template/template_procedural_macro_meta/Readme.md @@ -0,0 +1,8 @@ + + +# Module :: procedural_macro_meta +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleFormerMetaPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleFormerMetaPush.yml) [![docs.rs](https://img.shields.io/docsrs/procedural_macro_meta?color=e3e8f0&logo=docs.rs)](https://docs.rs/procedural_macro_meta) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +___. + +Not intended to be used without runtime. This module and runtime is aggregate in module::procedural_macro is [here](https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro). diff --git a/module/template/template_procedural_macro_meta/tests/smoke_test.rs b/module/template/template_procedural_macro_meta/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/template/template_procedural_macro_meta/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/template/template_procedural_macro_runtime/Cargo.toml b/module/template/template_procedural_macro_runtime/Cargo.toml new file mode 100644 index 0000000000..0b5c871e58 --- /dev/null +++ b/module/template/template_procedural_macro_runtime/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "procedural_macro_runtime" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/procedural_macro_runtime" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro_runtime" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro_runtime" +description = """ +___ +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/meta/procedural_macro_runtime_lib.rs", + "/rust/impl/meta/procedural_macro/runtime", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "procedural_macro_runtime" +path = "src/meta/procedural_macro/runtime/procedural_macro_lib.rs" + +[[test]] +name = "procedural_macro_runtime_test" +path = "tests/meta/procedural_macro_runtime_tests.rs" + +[[test]] +name = "procedural_macro_runtime_smoke_test" +path = "tests/_integration_test/smoke_test.rs" + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/template/template_procedural_macro_runtime/License b/module/template/template_procedural_macro_runtime/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/template/template_procedural_macro_runtime/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/template/template_procedural_macro_runtime/Readme.md b/module/template/template_procedural_macro_runtime/Readme.md new file mode 100644 index 0000000000..34c04a5504 --- /dev/null +++ b/module/template/template_procedural_macro_runtime/Readme.md @@ -0,0 +1,6 @@ +# Module :: procedural_macro_runtime +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleFormerRuntimePush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleFormerRuntimePush.yml) [![docs.rs](https://img.shields.io/docsrs/procedural_macro_runtime?color=e3e8f0&logo=docs.rs)](https://docs.rs/procedural_macro_runtime) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +___ + +Not intended to be used without derive. This module and derive is aggregate in module::procedural_macro is [here](https://github.com/Wandalen/wTools/tree/master/module/core/procedural_macro). diff --git a/module/template/template_procedural_macro_runtime/tests/smoke_test.rs b/module/template/template_procedural_macro_runtime/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/template/template_procedural_macro_runtime/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/test/a/Cargo.toml b/module/test/a/Cargo.toml new file mode 100644 index 0000000000..19f5f8e546 --- /dev/null +++ b/module/test/a/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "test_experimental_a" +version = "0.5.0" +edition = "2021" +license = "MIT" +description = """ +Module publishing test +""" +repository = "https://github.com/Wandalen/wTools/tree/alpha/module/test/a" + +[dependencies] +test_experimental_b = { workspace = true } diff --git a/module/test/a/Readme.md b/module/test/a/Readme.md new file mode 100644 index 0000000000..15883cfdfa --- /dev/null +++ b/module/test/a/Readme.md @@ -0,0 +1,3 @@ + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_test_experimental_a_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_test_experimental_a_push.yml) [![docs.rs](https://img.shields.io/docsrs/test_experimental_a?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_experimental_a) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + diff --git a/module/test/a/src/lib.rs b/module/test/a/src/lib.rs new file mode 100644 index 0000000000..ef8c82b15a --- /dev/null +++ b/module/test/a/src/lib.rs @@ -0,0 +1,18 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/test/b/Cargo.toml b/module/test/b/Cargo.toml new file mode 100644 index 0000000000..57d5bb293a --- /dev/null +++ b/module/test/b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "test_experimental_b" +version = "0.3.0" +edition = "2021" +license = "MIT" +description = """ +Module publishing test +""" +repository = "https://github.com/Wandalen/wTools/tree/alpha/module/test/b" + +[dependencies] +test_experimental_c = { workspace = true } diff --git a/module/test/b/Readme.md b/module/test/b/Readme.md new file mode 100644 index 0000000000..2be10ffb69 --- /dev/null +++ b/module/test/b/Readme.md @@ -0,0 +1,3 @@ + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_test_experimental_b_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_test_experimental_b_push.yml) [![docs.rs](https://img.shields.io/docsrs/test_experimental_b?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_experimental_b) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + diff --git a/module/test/b/src/lib.rs b/module/test/b/src/lib.rs new file mode 100644 index 0000000000..e9b1860dae --- /dev/null +++ b/module/test/b/src/lib.rs @@ -0,0 +1,17 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/module/test/c/Cargo.toml b/module/test/c/Cargo.toml new file mode 100644 index 0000000000..8b5d415955 --- /dev/null +++ b/module/test/c/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "test_experimental_c" +version = "0.3.0" +edition = "2021" +license = "MIT" +description = """ +Module publishing test +""" +repository = "https://github.com/Wandalen/wTools/tree/alpha/module/test/c" diff --git a/module/test/c/Readme.md b/module/test/c/Readme.md new file mode 100644 index 0000000000..89ea49aafc --- /dev/null +++ b/module/test/c/Readme.md @@ -0,0 +1,3 @@ + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_test_experimental_c_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_test_experimental_c_push.yml) [![docs.rs](https://img.shields.io/docsrs/test_experimental_c?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_experimental_c) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + diff --git a/module/test/c/src/lib.rs b/module/test/c/src/lib.rs new file mode 100644 index 0000000000..4e95dd31e9 --- /dev/null +++ b/module/test/c/src/lib.rs @@ -0,0 +1,22 @@ +pub fn add( left : usize, right : usize ) -> usize +{ + left + right +} + +pub fn sub( left : usize, right : usize ) -> usize +{ + left - right +} + +#[ cfg( test ) ] +mod tests +{ + use super::*; + + #[ test ] + fn it_works() + { + let result = add( 2, 2 ); + assert_eq!( result, 4 ); + } +} diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000000..3f317033c3 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,30 @@ +# WARNING : Formatting in this project is non-standard and unfortunetely `cargo fmt` does not support "out of the box" formatting. +# Here you can find closest possible set of settings for `cargo fmt`, but it is not even close to desirable. + +edition = "2021" +hard_tabs = false +max_width = 130 +newline_style = "Unix" +use_try_shorthand = true +space_before_colon = true +space_after_colon = true +spaces_around_ranges = true +tab_spaces = 2 +type_punctuation_density = "Wide" +use_small_heuristics = "Default" +where_single_line = false +blank_lines_upper_bound = 2 +brace_style = "AlwaysNextLine" +control_brace_style = "AlwaysNextLine" +empty_item_single_line = true +fn_args_layout = "Tall" +fn_single_line = true +imports_layout = "Mixed" +match_arm_leading_pipes = "Preserve" +imports_granularity = "Preserve" +reorder_imports = false +group_imports = "Preserve" +reorder_impl_items = true + +unstable_features = true + diff --git a/step/eol.sh b/step/eol.sh new file mode 100644 index 0000000000..800a7210b6 --- /dev/null +++ b/step/eol.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Check if at least one argument is provided +if [ $# -eq 0 ]; then + echo "Usage: $0 directory [directory...]" + exit 1 +fi + +# Function to convert line endings +convert_line_endings() { + local file="$1" + # Use sed to replace CRLF with LF in-place + sed -i 's/\r$//' "$file" +} + +# Iterate over all arguments +for dir in "$@"; do + # Check if directory exists + if [ ! -d "$dir" ]; then + echo "Directory not found: $dir" + continue + fi + + # Find all .rs and .toml files, excluding .git directories, and convert line endings + find "$dir" -type d -name .git -prune -o -type f \( -name "*.rs" -o -name "*.toml" \) -print0 | while IFS= read -r -d $'\0' file; do + echo "Processing: $file" + convert_line_endings "$file" + done +done + +echo "Conversion complete." diff --git a/step/pivot.sh b/step/pivot.sh new file mode 100644 index 0000000000..f6d358c31d --- /dev/null +++ b/step/pivot.sh @@ -0,0 +1,28 @@ + +# find . -type d -name "abc" + +DIR_NAME="tests" +mapfile -t directories < <(find . -type d -name $DIR_NAME) + +# for dir in "${directories[@]}" +# do +# # echo "$dir" +# count=$(grep -o $DIR_NAME <<< "$dir" | wc -l) +# if [ "$count" -eq 1 ] +# then +# echo "rm -rf $dir" +# rm -rf $dir +# fi +# done + +for dir in "${directories[@]}" +do + # echo "$dir" + count=$(grep -o $DIR_NAME <<< "$dir" | wc -l) + if [ "$count" -eq 1 ] + then + echo "cp -R module/core/for_each/tests/smoke_test.rs $dir/" + cp -R module/core/for_each/tests/smoke_test.rs $dir/ + # break + fi +done diff --git a/step/replace.censor b/step/replace.censor new file mode 100644 index 0000000000..b32919238c --- /dev/null +++ b/step/replace.censor @@ -0,0 +1,14 @@ +(\w+) = \{.+"\.\./\.\./\.\./module/.+" \} +$1 = { workspace = true } + +(\w+)\s*=\s*\{\s*(\w+\s*=\s*"[^"]+")\s*,\s*(\w+\s*=\s*"[^"]+")\s*\} +[workspace.dependencies.$1]\n$2\n$3\n + +(\w+)\s*=\s*\{\s*(\w+\s*=\s*"[^"]+")\s*,\s*(\w+\s*=\s*"[^"]+")\s*,\s*(\w+\s*=\s*"[^"]+")\s*\} +[workspace.dependencies.$1]\n$2\n$3\n$4\n + +#![ cfg_attr( not( feature = "use_std" ), without_std ) ] +#![ cfg_attr( feature = "no_std", no_std ) ] + +use_std = [ "error_tools/use_std" ] +use_std = [ "error_tools/use_std" ] \ No newline at end of file

    Check out some of our other Faces of NASA. 

    !M^Ba@{#QT&{E6g-_+ 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 UCq`M^gx-RVhJkvysx9{a0dwl`6#xJL literal 0 HcmV?d00001 diff --git a/asset/test/file1 b/asset/test/file1 new file mode 100644 index 0000000000000000000000000000000000000000..75d6171676b5807f844d19dee34d52b967329d54 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/asset/test/file4.pdf b/asset/test/file4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f36e4cf2c2fd17676c46f875009b90a1ad012ef6 GIT binary patch literal 1024 zcmV+b1poV-kjwSNImWOIw@#{X`ymxPPGKjD<=PS?A}m_cG6<}Shcp?5kPX_D7v++92q?%g5z_&up4S^a2~=+GzcBo9PI`h90p(!T7)6ca?--m8uXH%0*}G?`ge zbh5m1K0VsU9fC{$zL#aMjro^R5fspIHmZBe*W=oQalh`8iQ?mJ3k4mx4f5Gd{UF(; z^|U|w_|?0V2NkX}<2qw^@z3fIjqqLJE~n>#jIrVFb$hOsz{ShLaSwIsRCgjTpx-Fr zToo%{;erb@2y9(bSi(hbiKCTZRp*+Deuwnb@Y1a*%gSW?Ncol}XsDf(N>X!~3pPO8TTEgM{|6z(uOv$0t#8}<;G_{t{JLIpAVu^2C_ zjA>0u9dBiI+@v%G&?Sv)Rf1R^#q7Yr`WPKkVs`)xCxFKlp%^Gc5q!I~)Z+}L$`RYm zIr=@4gPFUczg58V&pcs!LUYB?HfPBmMt4*{8GX=6#7%v?@Q+~E?)!IoI+xj#|419? zb_HFT!xJWwAVzc~?N~4>CY; zBvH(N>vgGl;Rfk5r7&7$v@myq>G$}=+WQ{N#eD@9dxm~b$Y&+x(fg92o3J+A2ePKh z%f!JQ#)LVF3uM=ElnrUPeu+^DAdokreNm-^T=uphbk&^(>1ye!`-^Y_5${HW6^S$8 zMLdA#h)h5(Sz<$vM+s=WR$Q@u;SXu3PFVl1Y6-vlE8nHCy=y9}TK=)RreFu(WX}Cy zQlQ>lY)GPIS;gFzLbfZf;wHQ$*H|<4z(V!RTx~YWoq~TFRgu4dv)giESgjrls}8Bm zjvw6KoWQY;`8FmwjD%(0jZL>>&^j+ja5*}NEbdYm7~>hFqsE51ya@YD6X?3ju(M)< zj(mPVimfbVq)1q#6V|QcN#>X2E7q#g3XWHu68%yA$CV?xaF^6kg$PCwd9_{$+DGA| z+yp_wRMVArtH{z(+Z5x%@$?{hG5WfqQ7&xMHBGt&St`1xi7luLSp!5DRfzZLcA6M7 z#jAzN*fesa@l>Zq za+M2ZiDHkG-bjJ#Mr@OiTt0Xxq(RcYU~^*Dw97ibJgv$1C|7u`Ph_cf0Hlgx0-dg+ uyqsWg!ahcjLbb(LYc}Nfw$DR>8S+Bt| literal 0 HcmV?d00001 diff --git a/asset/test/small b/asset/test/small new file mode 100644 index 0000000000..982ecfd952 --- /dev/null +++ b/asset/test/small @@ -0,0 +1 @@ +È_€ý:*¸Z!„ÊÍ…Š \ No newline at end of file diff --git a/asset/test/small2 b/asset/test/small2 new file mode 100644 index 0000000000..b31cbf4eb0 --- /dev/null +++ b/asset/test/small2 @@ -0,0 +1 @@ +/öÅ^ÇÁLù›LAð¸ \ No newline at end of file diff --git a/asset/test/small3 b/asset/test/small3 new file mode 100644 index 0000000000..4bfba580c2 --- /dev/null +++ b/asset/test/small3 @@ -0,0 +1 @@ +'€ã¶éX%¬•ø¢Œ]mL \ No newline at end of file diff --git a/asset/test/small4 b/asset/test/small4 new file mode 100644 index 0000000000..a85cdf8a04 --- /dev/null +++ b/asset/test/small4 @@ -0,0 +1 @@ +LMäs|­ra8t2¦ê \ No newline at end of file diff --git a/asset/test/small5 b/asset/test/small5 new file mode 100644 index 0000000000..51850abb51 --- /dev/null +++ b/asset/test/small5 @@ -0,0 +1 @@ +§V³̪Íà¬ö¨ËÊ \ No newline at end of file diff --git a/asset/test/small6 b/asset/test/small6 new file mode 100644 index 0000000000..2cfd3e0bf9 --- /dev/null +++ b/asset/test/small6 @@ -0,0 +1 @@ +NS2®]'ó ¸ÄÌg \ No newline at end of file diff --git a/asset/test/small7 b/asset/test/small7 new file mode 100644 index 0000000000..9888ea58c6 --- /dev/null +++ b/asset/test/small7 @@ -0,0 +1 @@ +–?•Õ츚@¬ŸBžcR' \ No newline at end of file diff --git a/asset/test/test.exe b/asset/test/test.exe new file mode 100644 index 0000000000000000000000000000000000000000..02e2d3fb7f5411cd4ccc61631c2d42bb2b737767 GIT binary patch literal 52224 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 1) Open the "Settings" app by clicking on the "Start" button and then clicking on the gear icon. +> 2) Click on "Update & Security" from the options. +> 3) Select "For developers" from the left-hand menu. +> 4) Click the "Developer mode" radio button. +> 5) If prompted, confirm the action by clicking "Yes" to allow changes to your device. + +2) `git config --global core.symlinks true` + +3) `cargo clean` and remove `Cargo.lock` + +4) Remove already loaded library. Beacause it has broken symlinks. + +By default it is on path: +- if it was git link [ E.g. `wtools = { git = "", branch = "" }` ] +> `C:\Users\\.cargo\git\checkouts\wtools-*\` +- if it was simple dependency [ E.g. `wtools = "*"` ] +> `C:\Users\\.cargo\registry\cache`
    +> `C:\Users\\.cargo\registry\src` + +5) Build it the way you do. diff --git a/doc/Readme.md b/doc/Readme.md new file mode 100644 index 0000000000..181f110f25 --- /dev/null +++ b/doc/Readme.md @@ -0,0 +1,3 @@ +## Documentation + +- [Rust](./rust/Readme.md) diff --git a/doc/modules/wca b/doc/modules/wca new file mode 120000 index 0000000000..dfe5a8f1a5 --- /dev/null +++ b/doc/modules/wca @@ -0,0 +1 @@ +../../module/move/wca/doc \ No newline at end of file diff --git a/doc/rust/Cd.md b/doc/rust/Cd.md new file mode 100644 index 0000000000..c48bb5b1e8 --- /dev/null +++ b/doc/rust/Cd.md @@ -0,0 +1,34 @@ +# Continious development of rust modules + +The CD system for rust modules consists of 3 parts : + +- common rust CD scripts for fast and full testing +- individual modules CD scripts +- CD script for pull request event + +## Module status + +The status badges on [main page](../Readme.md#rust-tools) show the last test run of individual module CD script. + +To run CD script name should have either: +- Keyword `Merge` +- Keyword `!build` +- Keyword with name of the module + +#### Keyword `Merge` + +Example : `Merge branch 'fix' into master`. + +Example : [CD script run](https://github.com/Wandalen/wTools/actions/runs/2343552303). + +#### Keyword `!build` + +Example : `!build rust modules`. + +Example : `some change in module !build`. + +#### Keyword with name of the module + +Example for module wtools : `some important changes in module 'wtools'`. + +Example for module wtools : `rust : wtools publish`. diff --git a/doc/rust/LibConventions.md b/doc/rust/LibConventions.md new file mode 100644 index 0000000000..4506aa379f --- /dev/null +++ b/doc/rust/LibConventions.md @@ -0,0 +1,274 @@ +# Conventions of writing libraries + +How to write library. + +### Content + +- [Module structure](#module-structure) +- [Convention for writing main library files](#convention-for-writing-main-library-files) +- [Writing library code with macro `mod_interface`](#writing-library-code-with-macro-mod_interface) +- [Conventions for writing common tests for several modules](#conventions-for-writing-common-tests-for-several-modules) +- [Conventions for writing samples](#conventions-for-writing-samples) + +### Module structure + +File tree of library should have : + +- file `Cargo.toml` +- file `Readme.md` +- common license file `License` +- library files in directory `./rust/impl/[module_name]`. If module name starts with `w` it can be skipped + - for module `for_each` it will be `./rust/impl/for_each` + - for module `wtools` it will be `./rust/impl/tools` +- main library file should be named `[module_name]_lib.rs` + - for module `for_each` it will be `for_each_lib.rs` + - for module `wtools` it will be `wtools_lib.rs` +- test files in directory `./rust/test/[module_name]`. If module name starts with `w` it can be skipped + - for module `for_each` it will be `./rust/test/for_each` + - for module `wtools` it will be `./rust/test/tools` +- main test file should be named `[module_name]_test.rs` + - for module `for_each` it will be `for_each_test.rs` + - for module `wtools` it will be `wtools_test.rs` +- sample in directory `./sample/rust/[sample_name]`. Convention for naming of samples see below + +File tree for module `tools` should looks like : + +``` +tools + ├── Cargo.toml + ├── License + ├── Readme.md + ├── rust + │ ├── impl + │ │ └── tools + │ │ ├── tools_lib.rs + │ │ ... + │ │ + │ └── test + │ └── tools + │ ├── tools_test.rs + │ ... + └── sample + └── rust + └── tools_trivial_sample + ├── Cargo.toml + ... +``` + +### Convention for writing main library files + +Main library file should be named `[module_name]_lib.rs`. + +Main library file consists of next parts : + +- common library headers ( __required__ ) +- crate description with included library file `Readme.md` ( __required__ ) +- module `dependencies` ( __optional__ ) +- submodules of library ( __optional__ ) +- module `private` ( __optional__ ) +- module `protected` ( __optional__ ) +- module `orphan` ( __optional__ ) +- module `exposed` ( __required__ ) +- module `prelude` ( __required__ ) + +Full template of main library file ( in comments `/* ... */` described content of the parts of the main library file, it should be removed from the real library file ) : + +```rust +/* common library headers */ +#![ warn( rust_2018_idioms ) ] /* warn if public library interfaces has no useful rust idioms like lifetime annotations */ +#![ warn( missing_debug_implementations ) ] /* warn if public library structure has no debug implementation */ +#![ warn( missing_docs ) ] /* warn if public library interfaces has no documentation */ + +/* crate description */ +/* it generates first line of library documentation after name */ +//! +//! Library description. +//! + +/* documentation from library file `Readme.md` */ +/* it includes documentation from file `Readme.md` at the root of the library, if file has examples, then its will be tested with rustdoc */ +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/Readme.md" ) ) ] + +/* dependencies module of library */ +/* optional module that reexports library dependencies */ +/// Dependencies. +pub mod dependencies +{ + /* reexported crate dependencies */ + /* example : + pub use ::[dependency_name]::*; + */ +} + +/* module of library */ +/* optional module, describes module namespace */ +/// Description of library namespace. +pub mod some_module_name; + +/* private module of library */ +/* optional module that consists of interfaces which intended for only library use */ +/// Private namespace of the module. +pub mod private +{ + /* private library exports */ +} + +/* protected module of library */ +/* optional module that consists of interfaces which intended for library use and can be reexported in external scope */ +/// Own namespace of the module. +pub mod protected +{ + /* protected library exports */ +} + +/* example of public export */ +pub use protected::*; + +/* orphan module of library */ +/* optional module that consists of interfaces which intended for library use and can be reexported in external scope */ +/// Orphan namespace of the module. +pub mod orphan +{ + /* orphan library exports */ +} + +/* exposed module of library */ +/* module that consists of common public interfaces */ +/// Exposed namespace of the module. +pub mod exposed +{ + /* exposed library exports */ +} + +/* prelude module of library */ +/* module that consists of public interfaces which intended for only public use */ +/// Prelude to use: `use [library_name]::prelude::*`. +pub mod prelude +{ + /* prelude library exports */ +} +``` + +### Writing library code with macro `mod_interface` + +To automatically generate modules and its content the macro `mod_interface` can be used. + +Macro generates modules and its submodules with code written in module files. + +Example of generating module `exposed` with submodule `inner` and routine `inner_is`. + +Part of file tree of library `tools` : + +``` +├── impl +│ └── tools +│ ├── tools_lib.rs +│ └── inner.rs +``` + +Content of file `tools_lib.rs` : + +```rust +use meta_tools::mod_interface; + +mod_interface! +{ + exposed mod inner; +} +``` + +Content of file `inner.rs` : + +```rust +pub fn inner_is() -> bool +{ + true +} +``` + +Simplest test file that tests generated library modules : + +```rust +use tools::exposed::*; + +#[ test ] +fn inner_is() +{ + assert_eq!( inner::inner_is(), true ); +} +``` + +### Conventions for writing common tests for several modules + +Some tests can be used by several modules. The reason of it is reexports or making of alias of module. + +Such tests should : + +- contain main test file for each module +- main test file of module should be named `[module_name]_test.rs` +- contain common module`inc` reused from main module test files +- import module using alias `TheModule` + +Part of file tree of files for library `wtools` and its alias `tools` : + +``` +├── test +│ └── tools +│ ├── tools_test.rs +│ ├── wtools_test.rs +│ ├── inc.rs +│ └── inc +│ ├── common1.rs +│ └── common2.rs +``` + +Content of file `tools_test.rs` : + +```rust +use tools as TheModule; +mod inc; +``` + +Content of file `wtools_test.rs` : + +```rust +use wtools as TheModule; +mod inc; +``` + +Content of file `inc.rs` : + +```rust +use super::TheModule as TheModule; +mod common1; +mod common2; +``` + +Inside modules `common*` import library using code + +```rust +use super::TheModule as TheModule; +``` + +### Conventions for writing samples + +Each sample should be a binary module that use parent library as main dependency. + +Common structure of the module is default file tree generated by utility `cargo`. You able to change default structure as you need. + +A file tree for sample `tools_trivial_sample` + +``` +tools_trivial_sample + ├── Cargo.toml + └── src + └── main.rs +``` + +The sample should be named used pattern : + +``` +[name_of_lib][content/description]_sample +``` + +The sample `tools_trivial_sample` says that it is sample of library `tools`, it simplest ( trivial ) sample. diff --git a/doc/rust/Readme.md b/doc/rust/Readme.md new file mode 100644 index 0000000000..d747381696 --- /dev/null +++ b/doc/rust/Readme.md @@ -0,0 +1,4 @@ +## Documentation + +- [Continious Development](./Cd.md) +- [Module :: wtools](https://docs.rs/wtools/latest/wtools/) diff --git a/doc/rust/WhatStdIsMissing.md b/doc/rust/WhatStdIsMissing.md new file mode 100644 index 0000000000..69a62884c7 --- /dev/null +++ b/doc/rust/WhatStdIsMissing.md @@ -0,0 +1,41 @@ +# What is missing in STD of Rust + +Rust provides very profound standard library. However it lacks few things. + +## Iteration pattern + +Iterator is a behavioral design pattern that lets you traverse elements of a collection without exposing its underlying representation. +Rust supports it. Collections expose methods [iter()](https://doc.rust-lang.org/1.56.1/std/collections/struct.HashMap.html#method.iter) and [iter_mut()](https://doc.rust-lang.org/1.56.1/std/collections/struct.HashMap.html#method.iter_mut) to iterate its elements. Method `iter()` returns something implementing abstract interface of trat [Iterator](https://doc.rust-lang.org/1.56.1/std/iter/trait.Iterator.html). Beauty of that pattern is sepeartion of data and algorithm. Hundreds of algorithms are implemented for based on the simple interface, indeed in Rust it has only one method [next()](https://doc.rust-lang.org/1.56.1/std/iter/trait.Iterator.html#tymethod.next). Having that method implemented for any particualr data type make possible to use any algorithm which is based on the interface. + +All collections implement interface of trait [IntoIterator](https://doc.rust-lang.org/1.56.1/core/iter/trait.IntoIterator.html) with help of which it's possible to convert the collection into a iterator giving up elements of it. Structures which implements interface of trait [Extend](https://doc.rust-lang.org/1.56.1/core/iter/trait.Extend.html) can consume another collection adopting its elements. Traits [ExactSizeIterator](https://doc.rust-lang.org/1.56.1/core/iter/trait.ExactSizeIterator.html) and [FusedIterator](https://doc.rust-lang.org/1.56.1/core/iter/trait.FusedIterator.html) give additional promises rectricting implementor of these interface. [Peekable](https://doc.rust-lang.org/1.56.1/std/iter/struct.Peekable.html) makes possible to iterate speculatively, looking forward the next element without advancing. Use function [repeat](https://doc.rust-lang.org/1.56.1/std/iter/fn.repeat.html) to construct an iterator which repeat the same element endlessly. Use [zip](https://doc.rust-lang.org/1.56.1/std/iter/fn.zip.html) if you want to pair elements of two collections with the same length. But there is the catch. Currently [zip](https://doc.rust-lang.org/1.56.1/std/iter/fn.zip.html) is experimental and it is not available in stable Rust. + +All that is good. But what if you need to peek more than one element forward? What if you need to repeat an element finite number of times? +At this moment you cant do anything of that easily with Rust STD library. +To speculatively peek more than one element use [multipeek](https://docs.rs/itertools/0.10.3/itertools/fn.multipeek.html). To repeat the same element `n` times use [repeat_n](https://docs.rs/itertools/0.10.3/itertools/fn.repeat_n.html). To zip more than two collection use [multizip](https://docs.rs/itertools/0.10.3/itertools/fn.multizip.html). More over all this functionality available in stable Rust! There are many more algorithm whih are based on the interface, but is not part of stable Rust STD library in [crate itertools](https://docs.rs/itertools/0.10.3/itertools/index.html). + +So why such useful algorithms is not part of STD? + +Does lack of advance algorithms and data types has positive effect on time of compilation and size of compiled executable? +I don't know. + + + + + + + + +## Derive more + +Fundamental problem of a programming language is ability to write programs on the same dialect. C++ has 3 way to express algorithms: +- statically with help of macroses +- statically with help of templates +- dynamically with help of ordinary C++ +Disadvantage is developer should often has his algorithm for 3 different domains, express each in 3 different dialects and it's not possible to have it in one dialect. +That is the biggest advantage of such language as JS nad Python over C++ and Rust, developer don't need to have 3 copies of the same algorithm. + +In Rust situation is better than in C++. [Declarative macroses](https://www.youtube.com/watch?v=q6paRBbLgNw) has its niche, but for generating code usually used [procedural macroses](https://www.youtube.com/watch?v=geovSK3wMB8). Procedural macroses are written in pure Rust. Although in Rust stage of compilation has explicit boundary and developer have to write programs which generates programs. It's called metaprogramming. + +In JS there is no boundary between stage of generation of a program and program itself and metapgram on JS looks exactly the same as ordinary program. In Rust there is several means to container a metaprogram. [Derive](https://doc.rust-lang.org/stable/reference/attributes/derive.html#derive) is the primaraly mean to do that. Derive is written on Rust and it generates Rust code from Rust code on input. + +Rust have many derives shiped with Rust in STD library. Some of them are diff --git a/module/alias/cargo_will/Cargo.toml b/module/alias/cargo_will/Cargo.toml new file mode 100644 index 0000000000..ab0ca6f6e1 --- /dev/null +++ b/module/alias/cargo_will/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "cargo_will" +version = "0.3.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/cargo-will" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/cargo-will" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/cargo-will" +description = """ +Utility to publish multi-crate and multi-workspace environments and maintain their consistency. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] +# qqq : better classification is necessary + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +# use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] +willbe = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } +assert_fs = "1.0" +serde_yaml = "0.9" +serde_json = "1.0.114" +serde = "1.0" +assert_cmd = "2.0" +petgraph = "~0.6" +cargo_metadata = "~0.14" diff --git a/module/alias/cargo_will/License b/module/alias/cargo_will/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/cargo_will/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/cargo_will/Readme.md b/module/alias/cargo_will/Readme.md new file mode 100644 index 0000000000..10c35c5726 --- /dev/null +++ b/module/alias/cargo_will/Readme.md @@ -0,0 +1,35 @@ +# Module :: cargo_will + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_cargo_will_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_cargo_will_push.yml) [![docs.rs](https://img.shields.io/docsrs/cargo_will?color=e3e8f0&logo=docs.rs)](https://docs.rs/cargo_will) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +Utility to publish multi-crate and multi-workspace environments and maintain their consistency. + +### Purpose + +1. **Multi-Workspace Consistency**: In a project setup involving multiple workspaces with shared dependencies, `willbe` maintains consistency. It ensures all workspaces are updated with compatible dependency versions. + +2. **Publishing Multi-Crate Projects**: If your project structure includes multiple crates that need simultaneous publishing, `willbe` manages the process seamlessly. It ensures the crates are published in the right order while staying in version sync. + +3. **Dependency Analysis**: `willbe` can perform a thorough analysis of your project's dependencies, providing a detailed highlight of inconsistencies or areas that need attention. + +4. **Test Execution With Varied Configurations**: `willbe` can execute tests with varying configurations, such as different combinations of crate features. This assists in ensuring comprehensive coverage of test scenarios. + +5. **Generate Health Table**: Quickly visualize important project metrics like build status for each crate, creating a single, easy-to-read table. + +6. **Automating CI/CD Workflow Generation**: Automatically generate a series of CI/CD operations suitable for the task at hand to enhance productivity and improve the development process. + +### To install + +``` bash +cargo install cargo_will +will . +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools/module/alias/cargo_will +cargo install --path . +will . +``` \ No newline at end of file diff --git a/module/alias/cargo_will/src/bin/cargo-will.rs b/module/alias/cargo_will/src/bin/cargo-will.rs new file mode 100644 index 0000000000..71af648670 --- /dev/null +++ b/module/alias/cargo_will/src/bin/cargo-will.rs @@ -0,0 +1,13 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use::willbe::*; + +fn main() -> Result< (), wtools::error::for_app::Error > +{ + let args = std::env::args().skip( 1 ).collect(); + Ok( willbe::run( args )? ) +} diff --git a/module/alias/cargo_will/src/bin/will.rs b/module/alias/cargo_will/src/bin/will.rs new file mode 100644 index 0000000000..4824eb07f4 --- /dev/null +++ b/module/alias/cargo_will/src/bin/will.rs @@ -0,0 +1,16 @@ +//! +//! Utility to publish multi-crate and multi-workspace environments and maintain their consistency. +//! + +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use::willbe::*; + +fn main() -> Result< (), wtools::error::for_app::Error > +{ + Ok( willbe::run( std::env::args().collect() )? ) +} diff --git a/module/alias/cargo_will/src/bin/willbe.rs b/module/alias/cargo_will/src/bin/willbe.rs new file mode 100644 index 0000000000..faa9c297ea --- /dev/null +++ b/module/alias/cargo_will/src/bin/willbe.rs @@ -0,0 +1,12 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use::willbe::*; + +fn main() -> Result< (), wtools::error::for_app::Error > +{ + Ok( willbe::run( std::env::args().collect() )? ) +} diff --git a/module/alias/cargo_will/src/lib.rs b/module/alias/cargo_will/src/lib.rs new file mode 100644 index 0000000000..92f29333bd --- /dev/null +++ b/module/alias/cargo_will/src/lib.rs @@ -0,0 +1,9 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use ::willbe::*; diff --git a/module/alias/cargo_will/tests/smoke_test.rs b/module/alias/cargo_will/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/cargo_will/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/cargo_will/tests/willbe_tests.rs b/module/alias/cargo_will/tests/willbe_tests.rs new file mode 100644 index 0000000000..707b105fdb --- /dev/null +++ b/module/alias/cargo_will/tests/willbe_tests.rs @@ -0,0 +1,10 @@ +#[ allow( unused_imports ) ] +use willbe as the_module; +#[ allow( unused_imports ) ] +use cargo_will::exposed::*; + +pub const ASSET_PATH : &str = "../../move/willbe/tests/assets"; + +#[ allow( unused_imports ) ] +#[ path="../../../../module/move/willbe/tests/inc/mod.rs" ] +mod inc; diff --git a/module/alias/file_tools/Cargo.toml b/module/alias/file_tools/Cargo.toml new file mode 100644 index 0000000000..aafb9e9017 --- /dev/null +++ b/module/alias/file_tools/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "file_tools" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/file_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/file_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/file_tools" +description = """ +Collection of algorithms and structures to handle files properly. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/file_tools/License b/module/alias/file_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/file_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/file_tools/Readme.md b/module/alias/file_tools/Readme.md new file mode 100644 index 0000000000..2d47fabbab --- /dev/null +++ b/module/alias/file_tools/Readme.md @@ -0,0 +1,31 @@ + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_file_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_file_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/file_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/file_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +# Module :: file_tools + +Collection of algorithms and structures to handle files properly. + + diff --git a/module/alias/file_tools/src/lib.rs b/module/alias/file_tools/src/lib.rs new file mode 100644 index 0000000000..7170d6847e --- /dev/null +++ b/module/alias/file_tools/src/lib.rs @@ -0,0 +1,11 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/file_tools/latest/file_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Function description. +#[ cfg( feature = "enabled" ) ] +pub fn f1() +{ +} diff --git a/module/alias/file_tools/tests/smoke_test.rs b/module/alias/file_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/file_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/fundamental_data_type/Cargo.toml b/module/alias/fundamental_data_type/Cargo.toml new file mode 100644 index 0000000000..05136ddd7c --- /dev/null +++ b/module/alias/fundamental_data_type/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "fundamental_data_type" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/fundamental_data_type" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/fundamental_data_type" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/fundamental_data_type" +description = """ +A collection of derive macros designed to enhance STD. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ + "derive_tools/default", +] +full = [ + "derive_tools/full", +] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +# qqq : reexport features of depdendencies + +[dependencies] +derive_tools = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/fundamental_data_type/License b/module/alias/fundamental_data_type/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/fundamental_data_type/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/fundamental_data_type/Readme.md b/module/alias/fundamental_data_type/Readme.md new file mode 100644 index 0000000000..6bc40755ec --- /dev/null +++ b/module/alias/fundamental_data_type/Readme.md @@ -0,0 +1,24 @@ + + +# Module :: fundamental_data_type + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_fundamental_data_type_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_fundamental_data_type_push.yml) [![docs.rs](https://img.shields.io/docsrs/fundamental_data_type?color=e3e8f0&logo=docs.rs)](https://docs.rs/fundamental_data_type) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +A collection of derive macros designed to enhance STD. + +### To add to your project + +``` shell +cargo add fundamental_data_type +``` + +## Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/fundamental_data_type_trivial +cargo run +``` + diff --git a/module/alias/fundamental_data_type/src/lib.rs b/module/alias/fundamental_data_type/src/lib.rs new file mode 100644 index 0000000000..2b0eec4f19 --- /dev/null +++ b/module/alias/fundamental_data_type/src/lib.rs @@ -0,0 +1,14 @@ +#![ cfg_attr( not( feature = "use_std" ), no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico")] +#![ doc( html_root_url = "https://docs.rs/fundamental_data_type/latest/fundamental_data_type/")] + +//! +//! Fundamental data types and type constructors, like Single, Pair, Many. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use ::derive_tools::*; diff --git a/module/alias/fundamental_data_type/tests/smoke_test.rs b/module/alias/fundamental_data_type/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/fundamental_data_type/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/fundamental_data_type/tests/tests.rs b/module/alias/fundamental_data_type/tests/tests.rs new file mode 100644 index 0000000000..f0a3ed9256 --- /dev/null +++ b/module/alias/fundamental_data_type/tests/tests.rs @@ -0,0 +1,8 @@ + +#[ allow( unused_imports ) ] +use fundamental_data_type as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ path="../../../../module/core/derive_tools/tests/inc/mod.rs" ] +mod tests; diff --git a/module/alias/instance_of/Cargo.toml b/module/alias/instance_of/Cargo.toml new file mode 100644 index 0000000000..d8e83700a2 --- /dev/null +++ b/module/alias/instance_of/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "instance_of" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/instance_of" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/instance_of" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/instance_of" +description = """ +Macro to answer the question: does it implement a trait? +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/typing/instance_of_lib.rs", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "instance_of" +path = "src/typing/instance_of_lib.rs" + +[[test]] +name = "instance_of_test" +path = "tests/instance_of_tests.rs" + +[[test]] +name = "instance_of_smoke_test" +path = "tests/smoke_test.rs" + +[[example]] +name = "instance_of_trivial" +path = "examples/instance_of_trivial/src/main.rs" + +[dependencies] +implements = { workspace = true } + +[dev-dependencies] +# trybuild = { version = "~1.0", features = [ "diff" ] } +test_tools = { workspace = true } diff --git a/module/alias/instance_of/License b/module/alias/instance_of/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/alias/instance_of/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/instance_of/Readme.md b/module/alias/instance_of/Readme.md new file mode 100644 index 0000000000..b926167a84 --- /dev/null +++ b/module/alias/instance_of/Readme.md @@ -0,0 +1,42 @@ + + +# Module :: instance_of + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_instance_of_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_instance_of_push.yml) [![docs.rs](https://img.shields.io/docsrs/instance_of?color=e3e8f0&logo=docs.rs)](https://docs.rs/instance_of) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Macro to answer the question: does it implement a trait? + +This solution has a limitation: + +- In case entity is a function and trait is `Fn`/`FnMut`/`FnOnce` which current entity does not implement you will get compile-time error instead of `false`. + +This is alias for [module::implements](https://github.com/Wandalen/wTools/tree/master/module/core/implements). + +### Basic use-case + + + +```rust +use instance_of::*; + +dbg!( instance_of!( 13_i32 => Copy ) ); +// < instance_of!( 13_i32 => Copy ) : true +dbg!( instance_of!( Box::new( 13_i32 ) => Copy ) ); +// < instance_of!( 13_i32 => Copy ) : false +``` + +### To add to your project + +```sh +cargo add implements +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/implements_trivial +cargo run +``` diff --git a/module/alias/instance_of/examples/instance_of_trivial_sample/Cargo.toml b/module/alias/instance_of/examples/instance_of_trivial_sample/Cargo.toml new file mode 100644 index 0000000000..fde1f0d697 --- /dev/null +++ b/module/alias/instance_of/examples/instance_of_trivial_sample/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "meta_instance_of_trivial" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +instance_of = { workspace = true } diff --git a/module/alias/instance_of/examples/instance_of_trivial_sample/src/main.rs b/module/alias/instance_of/examples/instance_of_trivial_sample/src/main.rs new file mode 100644 index 0000000000..17f1cf8848 --- /dev/null +++ b/module/alias/instance_of/examples/instance_of_trivial_sample/src/main.rs @@ -0,0 +1,11 @@ +//! qqq : write proper descriptionpub use instance_of::*; + +fn main() +{ + + dbg!( instance_of!( 13_i32 => Copy ) ); + // < instance_of!( 13_i32 => Copy ) : true + dbg!( instance_of!( Box::new( 13_i32 ) => Copy ) ); + // < instance_of!( 13_i32 => Copy ) : false + +} diff --git a/module/alias/instance_of/src/typing/implements_impl.rs b/module/alias/instance_of/src/typing/implements_impl.rs new file mode 100644 index 0000000000..cf6ea20ac1 --- /dev/null +++ b/module/alias/instance_of/src/typing/implements_impl.rs @@ -0,0 +1,36 @@ +#[ doc( hidden ) ] +#[ macro_export ] +macro_rules! _implements +{ + ( $V : expr => $( $Traits : tt )+ ) => + {{ + use ::core::marker::PhantomData; + + trait False + { + fn get( self : &'_ Self ) -> bool { false } + } + + impl< T > False + for &'_ PhantomData< T > + where T : ?Sized, + {} + + trait True + { + fn get( self : &'_ Self ) -> bool { true } + } + + impl< T > True + for PhantomData< T > + where T : $( $Traits )+ + ?Sized, + {} + + fn does< T : Sized >( _ : &T ) -> PhantomData< T > + { + PhantomData + } + ( &does( &$V ) ).get() + + }}; +} diff --git a/module/alias/instance_of/src/typing/implements_lib.rs b/module/alias/instance_of/src/typing/implements_lib.rs new file mode 100644 index 0000000000..4b7067310e --- /dev/null +++ b/module/alias/instance_of/src/typing/implements_lib.rs @@ -0,0 +1,108 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/implements/latest/implements/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Macro to answer the question: does it implement a trait? +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// #[ macro_use ] +mod implements_impl; + +/// Internal namespace. +pub( crate ) mod private +{ + + /// + /// Macro `implements` to answer the question: does it implement a trait? + /// + /// ### Basic use-case. + /// ``` + /// use implements::*; + /// + /// dbg!( implements!( 13_i32 => Copy ) ); + /// // < implements!( 13_i32 => Copy ) : true + /// dbg!( implements!( Box::new( 13_i32 ) => Copy ) ); + /// // < implements!( 13_i32 => Copy ) : false + /// ``` + + #[ macro_export ] + macro_rules! implements + { + ( $( $arg : tt )+ ) => + { + $crate::_implements!( $( $arg )+ ); + } + } + + /// + /// Macro `instance_of` to answer the question: does it implement a trait? Alias of the macro `implements`. + /// + /// ### Basic use-case. + /// ``` + /// use implements::instance_of; + /// + /// dbg!( instance_of!( 13_i32 => Copy ) ); + /// // < instance_of!( 13_i32 => Copy ) : true + /// dbg!( instance_of!( Box::new( 13_i32 ) => Copy ) ); + /// // < instance_of!( 13_i32 => Copy ) : false + /// ``` + + #[ macro_export ] + macro_rules! instance_of + { + ( $( $arg : tt )+ ) => + { + $crate::_implements!( $( $arg )+ ); + } + } + + pub use implements; + pub use instance_of; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + implements, + instance_of, + }; +} diff --git a/module/alias/instance_of/src/typing/inspect_type_lib.rs b/module/alias/instance_of/src/typing/inspect_type_lib.rs new file mode 100644 index 0000000000..26cb2b6a24 --- /dev/null +++ b/module/alias/instance_of/src/typing/inspect_type_lib.rs @@ -0,0 +1,104 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/inspect_type/latest/inspect_type/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Diagnostic-purpose tools to inspect type of a variable and its size. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "nightly" ) ] +mod nightly +{ + + /// + /// Macro to inspect type of a variable and its size exporting it as a string. + /// + + #[ macro_export ] + // #[ cfg_attr( feature = "nightly1", macro_export ) ] + macro_rules! inspect_to_str_type_of + { + ( $src : expr ) => + {{ + let mut result = String::new(); + let stringified = stringify!( $src ); + + let size = &std::mem::size_of_val( &$src ).to_string()[ .. ]; + let type_name = std::any::type_name_of_val( &$src ); + result.push_str( &format!( "sizeof( {} : {} ) = {}", stringified, type_name, size )[ .. ] ); + + result + }}; + ( $( $src : expr ),+ $(,)? ) => + { + ( $( $crate::dbg!( $src ) ),+ ) + }; + } + + /// + /// Macro to inspect type of a variable and its size printing into stdout and exporting it as a string. + /// + + #[ macro_export ] + // #[ cfg_attr( feature = "nightly1", macro_export ) ] + macro_rules! inspect_type_of + { + ( $src : expr ) => + {{ + let result = $crate::inspect_to_str_type_of!( $src ); + println!( "{}", result ); + result + }} + } + + pub use inspect_to_str_type_of; + pub use inspect_type_of; +} + +// #[ cfg( feature = "nightly" ) ] +// #[ doc( inline ) ] +#[ allow( unused_imports ) ] +// pub use nightly::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ cfg( feature = "nightly" ) ] + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::nightly::*; +} diff --git a/module/alias/instance_of/src/typing/instance_of_lib.rs b/module/alias/instance_of/src/typing/instance_of_lib.rs new file mode 100644 index 0000000000..2f552e12b2 --- /dev/null +++ b/module/alias/instance_of/src/typing/instance_of_lib.rs @@ -0,0 +1,9 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/instance_of/latest/instance_of/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use implements::*; diff --git a/module/alias/instance_of/src/typing/is_slice_lib.rs b/module/alias/instance_of/src/typing/is_slice_lib.rs new file mode 100644 index 0000000000..a65f9f68c8 --- /dev/null +++ b/module/alias/instance_of/src/typing/is_slice_lib.rs @@ -0,0 +1,111 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/is_slice/latest/is_slice/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Macro to answer the question: is it a slice? +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Internal namespace. +pub( crate ) mod private +{ + + /// Macro to answer the question: is it a slice? + /// + /// ### Basic use-case. + /// ``` + /// use is_slice::*; + /// + /// fn main() + /// { + /// dbg!( is_slice!( Box::new( true ) ) ); + /// // < is_slice!(Box :: new(true)) = false + /// dbg!( is_slice!( &[ 1, 2, 3 ] ) ); + /// // < is_slice!(& [1, 2, 3]) = false + /// dbg!( is_slice!( &[ 1, 2, 3 ][ .. ] ) ); + /// // < is_slice!(& [1, 2, 3] [..]) = true + /// } + /// ``` + + #[ macro_export ] + macro_rules! is_slice + { + ( $V : expr ) => + {{ + use ::core::marker::PhantomData; + + trait NotSlice + { + fn is_slice( self : &'_ Self ) -> bool { false } + } + + impl< T > NotSlice + for &'_ PhantomData< T > + where T : ?Sized, + {} + + trait Slice + { + fn is_slice( self : &'_ Self ) -> bool { true } + } + + impl< 'a, T > Slice for PhantomData< &'a &[ T ] > + {} + + fn does< T : Sized >( _ : &T ) -> PhantomData< &T > + { + PhantomData + } + + ( &does( &$V ) ).is_slice() + + }} + } + + pub use is_slice; +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::private:: + { + is_slice, + }; +} diff --git a/module/alias/instance_of/src/typing/mod.rs b/module/alias/instance_of/src/typing/mod.rs new file mode 100644 index 0000000000..23d5a6236d --- /dev/null +++ b/module/alias/instance_of/src/typing/mod.rs @@ -0,0 +1,11 @@ +// pub use is_slice::*; +// // pub use instance_of::*; +// #[cfg( feature = "inspect_type" ) ] +// pub use inspect_type::*; + +// pub use inspect_type::*; +// pub use is_slice::*; +// pub use implements::*; + +#[ cfg( feature = "typing_tools" ) ] +pub use typing_tools::*; diff --git a/module/alias/instance_of/src/typing/typing.rs b/module/alias/instance_of/src/typing/typing.rs new file mode 100644 index 0000000000..312d1bf158 --- /dev/null +++ b/module/alias/instance_of/src/typing/typing.rs @@ -0,0 +1,60 @@ + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::inspect_type::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::is_slice::orphan::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::implements::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Orphan namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::inspect_type::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::is_slice::exposed::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::implements::exposed::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::inspect_type::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::is_slice::prelude::*; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::implements::prelude::*; +} diff --git a/module/alias/instance_of/src/typing/typing_tools_lib.rs b/module/alias/instance_of/src/typing/typing_tools_lib.rs new file mode 100644 index 0000000000..2aa2317153 --- /dev/null +++ b/module/alias/instance_of/src/typing/typing_tools_lib.rs @@ -0,0 +1,30 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/typing_tools/latest/typing_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Collection of general purpose tools for type checking. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Collection of general purpose tools for type checking. +pub mod typing; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::inspect_type; + pub use ::is_slice; + pub use ::implements; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use typing::*; diff --git a/module/alias/instance_of/tests/instance_of_tests.rs b/module/alias/instance_of/tests/instance_of_tests.rs new file mode 100644 index 0000000000..aa8cb1fd0f --- /dev/null +++ b/module/alias/instance_of/tests/instance_of_tests.rs @@ -0,0 +1,2 @@ +#[ path="../../../../module/core/implements/tests/implements_tests.rs" ] +mod implements; \ No newline at end of file diff --git a/module/alias/instance_of/tests/smoke_test.rs b/module/alias/instance_of/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/instance_of/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/multilayer/Cargo.toml b/module/alias/multilayer/Cargo.toml new file mode 100644 index 0000000000..5d2e3db53e --- /dev/null +++ b/module/alias/multilayer/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "multilayer" +version = "0.1.3" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/multilayer" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/multilayer" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/multilayer" +description = """ +Protocol of modularity unifying interface of a module and introducing layers. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "builder-pattern" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/meta/mod_interface/front/multilayer_lib.rs", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "multilayer" +path = "src/meta/mod_interface/front/multilayer_lib.rs" + +[[test]] +name = "mod_interface_test" +path = "tests/multilayer_tests.rs" + +[[test]] +name = "mod_interface_smoke_test" +path = "tests/smoke_test.rs" + +# [[example]] +# name = "multilayer_trivial" +# path = "examples/multilayer_trivial/src/main.rs" + +[dependencies] +mod_interface = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/multilayer/License b/module/alias/multilayer/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/alias/multilayer/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/multilayer/Readme.md b/module/alias/multilayer/Readme.md new file mode 100644 index 0000000000..2ce79f6c18 --- /dev/null +++ b/module/alias/multilayer/Readme.md @@ -0,0 +1,29 @@ + + +# Module :: multilayer + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_multilayer_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_multilayer_push.yml) [![docs.rs](https://img.shields.io/docsrs/multilayer?color=e3e8f0&logo=docs.rs)](https://docs.rs/multilayer) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Protocol of modularity unifying interface of a module and introducing layers. + +### Basic use-case + +```ignore +``` + + +### To add to your project + +```sh +cargo add multilayer +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/multilayer_trivial +cargo run +``` diff --git a/module/alias/multilayer/src/meta/mod_interface/front/multilayer_lib.rs b/module/alias/multilayer/src/meta/mod_interface/front/multilayer_lib.rs new file mode 100644 index 0000000000..0839df028b --- /dev/null +++ b/module/alias/multilayer/src/meta/mod_interface/front/multilayer_lib.rs @@ -0,0 +1,20 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/multilayer/latest/multilayer/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! Protocol of modularity unifying interface of a module and introducing layers. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use mod_interface::*; diff --git a/module/alias/multilayer/tests/multilayer_tests.rs b/module/alias/multilayer/tests/multilayer_tests.rs new file mode 100644 index 0000000000..4d9ae7ab44 --- /dev/null +++ b/module/alias/multilayer/tests/multilayer_tests.rs @@ -0,0 +1,4 @@ +#[ path="../../../../module/core/mod_interface/tests/mod_interface_tests.rs" ] +mod mod_interface; + +pub use mod_interface::*; \ No newline at end of file diff --git a/module/alias/multilayer/tests/smoke_test.rs b/module/alias/multilayer/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/multilayer/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/proc_macro_tools/Cargo.toml b/module/alias/proc_macro_tools/Cargo.toml new file mode 100644 index 0000000000..c7e394f81a --- /dev/null +++ b/module/alias/proc_macro_tools/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "proc_macro_tools" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/macro_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/macro_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/macro_tools" +description = """ +Tools for writing procedural macroses. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +exclude = ["/tests", "/example", "-*"] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = ["macro_tools/enabled"] + +[dependencies] +macro_tools = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } + diff --git a/module/alias/proc_macro_tools/License b/module/alias/proc_macro_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/proc_macro_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/proc_macro_tools/Readme.md b/module/alias/proc_macro_tools/Readme.md new file mode 100644 index 0000000000..4fa511924a --- /dev/null +++ b/module/alias/proc_macro_tools/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: proc_macro_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_proc_macro_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_proc_macro_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/proc_macro_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/proc_macro_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fproc_macro_tools%2Fexamples%2Fproc_macro_tools_trivial.rs,RUN_POSTFIX=--example%20proc_macro_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools for writing procedural macros. + +### Basic use-case + + + +```rust ignore +use proc_macro_tools::*; + +fn main() +{ + let code = qt!( core::option::Option< i8, i16, i32, i64 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = type_parameters( &tree_type, 0..=2 ); + got.iter().for_each( | e | println!( "{}", qt!( #e ) ) ); + // < i8 + // < i16 + // < i32 +} +``` + +### To add to your project + +```sh +cargo add proc_macro_tools +``` diff --git a/module/alias/proc_macro_tools/examples/proc_macro_tools_trivial.rs b/module/alias/proc_macro_tools/examples/proc_macro_tools_trivial.rs new file mode 100644 index 0000000000..2d3cad5ff6 --- /dev/null +++ b/module/alias/proc_macro_tools/examples/proc_macro_tools_trivial.rs @@ -0,0 +1,19 @@ +//! qqq : write proper description +#[ cfg( feature = "no_std" ) ] +fn main(){} + +#[ cfg( not( feature = "no_std" ) ) ] +fn main() +{ + use proc_macro_tools::{ typ, qt }; + + let code = qt!( core::option::Option< i8, i16, i32, i64 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = typ::type_parameters( &tree_type, 0..=2 ); + got.iter().for_each( | e | println!( "{}", qt!( #e ) ) ); + /* print : + i8 + i16 + i32 + */ +} \ No newline at end of file diff --git a/module/alias/proc_macro_tools/src/lib.rs b/module/alias/proc_macro_tools/src/lib.rs new file mode 100644 index 0000000000..163e220301 --- /dev/null +++ b/module/alias/proc_macro_tools/src/lib.rs @@ -0,0 +1,18 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/macro_tools/latest/macro_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Tools for writing procedural macroses. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use macro_tools::*; + diff --git a/module/alias/proc_macro_tools/tests/proc_macro_tool_tests.rs b/module/alias/proc_macro_tools/tests/proc_macro_tool_tests.rs new file mode 100644 index 0000000000..969ee9a798 --- /dev/null +++ b/module/alias/proc_macro_tools/tests/proc_macro_tool_tests.rs @@ -0,0 +1,6 @@ +use proc_macro_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ path = "../../../core/macro_tools/tests/inc/mod.rs" ] +mod inc; diff --git a/module/alias/proc_macro_tools/tests/smoke_test.rs b/module/alias/proc_macro_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/proc_macro_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/proper_tools/Cargo.toml b/module/alias/proper_tools/Cargo.toml new file mode 100644 index 0000000000..03529f4992 --- /dev/null +++ b/module/alias/proper_tools/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "proper_tools" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/proper_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/proper_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/proper_tools" +description = """ +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/proper_tools/License b/module/alias/proper_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/proper_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/proper_tools/Readme.md b/module/alias/proper_tools/Readme.md new file mode 100644 index 0000000000..745078fa5b --- /dev/null +++ b/module/alias/proper_tools/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: proper_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_proper_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_proper_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/proper_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/proper_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. + + diff --git a/module/alias/proper_tools/src/lib.rs b/module/alias/proper_tools/src/lib.rs new file mode 100644 index 0000000000..fc1b4d6066 --- /dev/null +++ b/module/alias/proper_tools/src/lib.rs @@ -0,0 +1,11 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/proper_tools/latest/proper_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Function description. +#[ cfg( feature = "enabled" ) ] +pub fn f1() +{ +} diff --git a/module/alias/proper_tools/tests/smoke_test.rs b/module/alias/proper_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/proper_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/werror/Cargo.toml b/module/alias/werror/Cargo.toml new file mode 100644 index 0000000000..31884116ec --- /dev/null +++ b/module/alias/werror/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "werror" +version = "0.4.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/werror" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/werror" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/werror" +description = """ +Basic exceptions handling mechanism. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# = features + +[features] +default = [ + "enabled", + "error_for_lib", + "error_for_app" +] +full = [ + "enabled", + "error_for_lib", + "error_for_app" +] +no_std = [ "error_tools/no_std" ] +use_alloc = [ "error_tools/use_alloc" ] +enabled = [ "error_tools/enabled" ] + +error_for_lib = [ + "error_tools/error_for_lib" +] +error_for_app = [ + "error_tools/error_for_app" +] + +[dependencies] +error_tools = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/werror/License b/module/alias/werror/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/werror/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/werror/Readme.md b/module/alias/werror/Readme.md new file mode 100644 index 0000000000..dc7e2b669a --- /dev/null +++ b/module/alias/werror/Readme.md @@ -0,0 +1,45 @@ + + +# Module :: werror + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_werror_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_werror_push.yml) [![docs.rs](https://img.shields.io/docsrs/werror?color=e3e8f0&logo=docs.rs)](https://docs.rs/werror) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwerror%2Fexamples%2Fwerror_tools_trivial.rs,RUN_POSTFIX=--example%20werror_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Basic exceptions handling mechanism. + +### Basic use-case + + + +```rust ignore +fn main() +{ + let err = f1(); + println!( "{err:#?}" ); + // < Err( + // < BasicError { + // < msg: "Some error", + // < }, + // < ) +} + +fn f1() -> werror::Result< () > +{ + let _read = std::fs::read_to_string( "Cargo.toml" )?; + Err( werror::BasicError::new( "Some error" ).into() ) +} +``` + +### To add to your project + +```sh +cargo add werror +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example werror_tools_trivial +``` diff --git a/module/alias/werror/examples/werror_tools_trivial.rs b/module/alias/werror/examples/werror_tools_trivial.rs new file mode 100644 index 0000000000..2dc6996cf3 --- /dev/null +++ b/module/alias/werror/examples/werror_tools_trivial.rs @@ -0,0 +1,21 @@ +//! qqq : write proper description +fn main() +{ + #[ cfg( not( feature = "no_std" ) ) ] + { + let err = f1(); + println!( "{err:#?}" ); + // < Err( + // < BasicError { + // < msg: "Some error", + // < }, + // < ) + } +} + +#[ cfg( not( feature = "no_std" ) ) ] +fn f1() -> werror::Result< () > +{ + let _read = std::fs::read_to_string( "Cargo.toml" )?; + Err( werror::BasicError::new( "Some error" ).into() ) +} diff --git a/module/alias/werror/src/lib.rs b/module/alias/werror/src/lib.rs new file mode 100644 index 0000000000..a916607493 --- /dev/null +++ b/module/alias/werror/src/lib.rs @@ -0,0 +1,17 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/werror/latest/werror/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Basic exceptions handling mechanism. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use error_tools::*; diff --git a/module/alias/werror/tests/smoke_test.rs b/module/alias/werror/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/werror/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/werror/tests/werror_tests.rs b/module/alias/werror/tests/werror_tests.rs new file mode 100644 index 0000000000..729f215467 --- /dev/null +++ b/module/alias/werror/tests/werror_tests.rs @@ -0,0 +1,8 @@ + +#[ allow( unused_imports ) ] +use error_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ path = "../../../core/error_tools/tests/inc/mod.rs" ] +mod inc; diff --git a/module/alias/willbe2/Cargo.toml b/module/alias/willbe2/Cargo.toml new file mode 100644 index 0000000000..409ede798b --- /dev/null +++ b/module/alias/willbe2/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "willbe2" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/willbe2" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/willbe2" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/willbe2" +description = """ +Utility to publish multi-crate and multi-workspace environments and maintain their consistency. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] +# qqq : better classification is necessary + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +# use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] +# willbe = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/willbe2/License b/module/alias/willbe2/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/willbe2/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/willbe2/Readme.md b/module/alias/willbe2/Readme.md new file mode 100644 index 0000000000..544acb7210 --- /dev/null +++ b/module/alias/willbe2/Readme.md @@ -0,0 +1,33 @@ +# Module :: willbe2 + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_2_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_2_push.yml) [![docs.rs](https://img.shields.io/docsrs/willbe2?color=e3e8f0&logo=docs.rs)](https://docs.rs/willbe2) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Utility to publish multi-crate and multi-workspace environments and maintain their consistency. + + + + diff --git a/module/alias/willbe2/src/lib.rs b/module/alias/willbe2/src/lib.rs new file mode 100644 index 0000000000..ba2fae131c --- /dev/null +++ b/module/alias/willbe2/src/lib.rs @@ -0,0 +1,11 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// #[ doc( inline ) ] +// #[ allow( unused_imports ) ] +// pub use ::willbe::*; + +// qqq : for Petro : make it alias for willbe too diff --git a/module/alias/willbe2/src/main.rs b/module/alias/willbe2/src/main.rs new file mode 100644 index 0000000000..63d99d2aa7 --- /dev/null +++ b/module/alias/willbe2/src/main.rs @@ -0,0 +1,16 @@ +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/{{template_blank}}/latest/{{template_blank}}/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use ::willbe2::*; + +// fn main() -> Result< (), wtools::error::for_app::Error > +// { +// Ok( willbe::run()? ) +// } + +fn main() +{ +} diff --git a/module/alias/willbe2/tests/smoke_test.rs b/module/alias/willbe2/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/willbe2/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/winterval/Cargo.toml b/module/alias/winterval/Cargo.toml new file mode 100644 index 0000000000..385471c227 --- /dev/null +++ b/module/alias/winterval/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "winterval" +version = "0.3.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/winterval" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/winterval" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/winterval" +description = """ +Interval adapter for both open/closed implementations of intervals ( ranges ). +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +# exclude = [ "/tests", "/examples", "-*" ] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [ "interval_adapter/enabled" ] +no_std = [] +use_alloc = [ "no_std" ] + +[dependencies] +interval_adapter = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/winterval/License b/module/alias/winterval/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/winterval/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/winterval/Readme.md b/module/alias/winterval/Readme.md new file mode 100644 index 0000000000..a853161c8c --- /dev/null +++ b/module/alias/winterval/Readme.md @@ -0,0 +1,101 @@ + + +# Module :: winterval + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_winterval_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_winterval_push.yml) [![docs.rs](https://img.shields.io/docsrs/winterval?color=e3e8f0&logo=docs.rs)](https://docs.rs/winterval) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwinterval%2Fexamples%2Fwinterval_trivial.rs,RUN_POSTFIX=--example%20winterval_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Integer interval adapter for both Range and RangeInclusive. + +Let's assume you have a function which should accept Interval. But you don't want to limit caller of the function to either half-open interval `core::ops::Range` or closed one `core::ops::RangeInclusive` you want allow to use anyone of iterable interval. To make that work smoothly use `IterableInterval`. Both `core::ops::Range` and `core::ops::RangeInclusive` implement the trait, also it's possible to work with non-iterable intervals, like ( -Infinity .. +Infinity ). + +### Basic use-case + +```rust + +use winterval::IterableInterval; + +fn f1( interval : impl IterableInterval ) +{ + for i in interval + { + println!( "{i}" ); + } +} + +// Calling the function either with +// half-open interval `core::ops::Range`. +f1( 0..=3 ); +// Or closed one `core::ops::RangeInclusive`. +f1( 0..4 ); + +``` + +### More flexibility + +If you need more flexibility in defining intervals, you can convert a tuple of endpoints to an interval. + +```rust + +use winterval::{ IterableInterval, IntoInterval, Bound }; + +fn f1( interval : impl IterableInterval ) +{ + for i in interval + { + println!( "{i}" ); + } +} + +// Calling the function either with +// half-open interval `core::ops::Range`. +f1( 0..=3 ); +// Or closed one `core::ops::RangeInclusive`. +f1( 0..4 ); +// Alternatively you construct your custom interval from a tuple. +f1( ( 0, 3 ).into_interval() ); +f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); +// All the calls to the function `f1`` perform the same task, +// and the output is exactly identical. + +``` + +### Non-iterable intervals + +You may also use the crate to specify non-iterable intervals. Non-iterable intervals have either one or several unbound endpoints. For example, interval `core::ops::RangeFull` has no bounds and represents the range from minus infinity to plus infinity. + +```rust + +use winterval::{ NonIterableInterval, IntoInterval, Bound }; + +fn f1( interval : impl NonIterableInterval ) +{ + println!( "Do something with this {:?} .. {:?} interval", interval.left(), interval.right() ); +} + +// Iterable/bound interval from tuple. +f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); +// Non-iterable/unbound interval from tuple. +f1( ( Bound::Included( 0 ), Bound::Unbounded ).into_interval() ); +// Non-iterable/unbound interval from `core::ops::RangeFrom`. +f1( 0.. ); +// Non-iterable/unbound interval from `core::ops::RangeFull` +// what is ( -Infinity .. +Infinity ). +f1( .. ); + +``` + +### To add to your project + +```sh +cargo add interval_adaptor +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run --example winterval_trivial +``` + diff --git a/module/alias/winterval/examples/winterval_more.rs b/module/alias/winterval/examples/winterval_more.rs new file mode 100644 index 0000000000..d026f4f22b --- /dev/null +++ b/module/alias/winterval/examples/winterval_more.rs @@ -0,0 +1,30 @@ +//! more example + +fn main() +{ + use winterval::{ IterableInterval, IntoInterval, Bound }; + + // + // Let's assume you have a function which should accept Interval. + // But you don't want to limit caller of the function to use either half-open interval `core::ops::Range` or closed one `core::ops::RangeInclusive`. + // To make that work smoothly use `IterableInterval`. + // Both `core::ops::Range` and `core::ops::RangeInclusive` implement the trait. + // + fn f1( interval : impl IterableInterval ) + { + for i in interval + { + println!( "{i}" ); + } + } + + // Calling the function either with half-open interval `core::ops::Range`. + f1( 0..=3 ); + // Or closed one `core::ops::RangeInclusive`. + f1( 0..4 ); + // Alternatively you construct your custom interval from a tuple. + f1( ( 0, 3 ).into_interval() ); + f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); + // All the calls to the function `f1`` perform the same task, and the output is exactly identical. + +} diff --git a/module/alias/winterval/examples/winterval_non_iterable.rs b/module/alias/winterval/examples/winterval_non_iterable.rs new file mode 100644 index 0000000000..21a12e9f24 --- /dev/null +++ b/module/alias/winterval/examples/winterval_non_iterable.rs @@ -0,0 +1,21 @@ +//! non-iterable example + +fn main() +{ + use winterval::{ NonIterableInterval, IntoInterval, Bound }; + + fn f1( interval : impl NonIterableInterval ) + { + println!( "Do something with this {:?} .. {:?} interval", interval.left(), interval.right() ); + } + + // Iterable/bound interval from tuple. + f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() ); + // Non-iterable/unbound interval from tuple. + f1( ( Bound::Included( 0 ), Bound::Unbounded ).into_interval() ); + // Non-iterable/unbound interval from `core::ops::RangeFrom`. + f1( 0.. ); + // Non-iterable/unbound interval from `core::ops::RangeFull` + // what is ( -Infinity .. +Infinity ). + f1( .. ); +} diff --git a/module/alias/winterval/examples/winterval_trivial.rs b/module/alias/winterval/examples/winterval_trivial.rs new file mode 100644 index 0000000000..5b8373bb8a --- /dev/null +++ b/module/alias/winterval/examples/winterval_trivial.rs @@ -0,0 +1,26 @@ +//! trivial example + +fn main() +{ + use winterval::IterableInterval; + + // + // Let's assume you have a function which should accept Interval. + // But you don't want to limit caller of the function to use either half-open interval `core::ops::Range` or closed one `core::ops::RangeInclusive`. + // To make that work smoothly use `IterableInterval`. + // Both `core::ops::Range` and `core::ops::RangeInclusive` implement the trait. + // + fn f1( interval : impl IterableInterval ) + { + for i in interval + { + println!( "{i}" ); + } + } + + // Calling the function either with half-open interval `core::ops::Range`. + f1( 0..=3 ); + // Or closed one `core::ops::RangeInclusive`. + f1( 0..4 ); + +} diff --git a/module/alias/winterval/src/lib.rs b/module/alias/winterval/src/lib.rs new file mode 100644 index 0000000000..25d40b1177 --- /dev/null +++ b/module/alias/winterval/src/lib.rs @@ -0,0 +1,20 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/winterval/latest/winterval/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +/* zzz : consider https://doc.rust-lang.org/std/ops/trait.RangeBounds.html */ +/* zzz : implement iterator */ + +//! +//! Interval adapter for both open/closed implementations of intervals ( ranges ). +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use interval_adapter::*; diff --git a/module/alias/winterval/tests/interval_tests.rs b/module/alias/winterval/tests/interval_tests.rs new file mode 100644 index 0000000000..7ae3b0d958 --- /dev/null +++ b/module/alias/winterval/tests/interval_tests.rs @@ -0,0 +1,7 @@ +#[ allow( unused_imports ) ] +use winterval as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ path = "../../../core/interval_adapter/tests/inc/mod.rs" ] +mod inc; diff --git a/module/alias/winterval/tests/smoke_test.rs b/module/alias/winterval/tests/smoke_test.rs new file mode 100644 index 0000000000..663dd6fb9f --- /dev/null +++ b/module/alias/winterval/tests/smoke_test.rs @@ -0,0 +1,12 @@ + +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/wproc_macro/Cargo.toml b/module/alias/wproc_macro/Cargo.toml new file mode 100644 index 0000000000..704d8c457d --- /dev/null +++ b/module/alias/wproc_macro/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "wproc_macro" +version = "0.1.1" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wproc_macro" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/wproc_macro" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/wproc_macro" +description = """ +Tools for writing procedural macroses. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [] + +[dependencies] +macro_tools = { workspace = true } + +[dev-dependencies] +# trybuild = { version = "~1.0", features = [ "diff" ] } +test_tools = { workspace = true } diff --git a/module/alias/wproc_macro/License b/module/alias/wproc_macro/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/wproc_macro/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/wproc_macro/Readme.md b/module/alias/wproc_macro/Readme.md new file mode 100644 index 0000000000..f3eef99bf7 --- /dev/null +++ b/module/alias/wproc_macro/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: wproc_macro + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wproc_macro_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wproc_macro_push.yml) [![docs.rs](https://img.shields.io/docsrs/wproc_macro?color=e3e8f0&logo=docs.rs)](https://docs.rs/wproc_macro) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools for writing procedural macros. + +### Basic use-case + + + +```rust +use wproc_macro::*; + +fn main() +{ + let code = qt!( core::option::Option< i8, i16, i32, i64 > ); + let tree_type = syn::parse2::< syn::Type >( code ).unwrap(); + let got = type_parameters( &tree_type, 0..=2 ); + got.iter().for_each( | e | println!( "{}", qt!( #e ) ) ); + // < i8 + // < i16 + // < i32 +} +``` + +### To add to your project + +```sh +cargo add wproc_macro +``` diff --git a/module/alias/wproc_macro/src/lib.rs b/module/alias/wproc_macro/src/lib.rs new file mode 100644 index 0000000000..8867e58ec9 --- /dev/null +++ b/module/alias/wproc_macro/src/lib.rs @@ -0,0 +1,9 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wproc_macro/latest/wproc_macro/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use macro_tools::*; diff --git a/module/alias/wproc_macro/tests/smoke_test.rs b/module/alias/wproc_macro/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/wproc_macro/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/wproc_macro/tests/wproc_macro_tests.rs b/module/alias/wproc_macro/tests/wproc_macro_tests.rs new file mode 100644 index 0000000000..d42012f68d --- /dev/null +++ b/module/alias/wproc_macro/tests/wproc_macro_tests.rs @@ -0,0 +1,3 @@ + +#[ path="../../../../module/core/macro_tools/tests/tests.rs" ] +mod macro_tools; diff --git a/module/alias/wstring_tools/Cargo.toml b/module/alias/wstring_tools/Cargo.toml new file mode 100644 index 0000000000..f213f4d120 --- /dev/null +++ b/module/alias/wstring_tools/Cargo.toml @@ -0,0 +1,79 @@ +[package] +name = "wstring_tools" +version = "0.2.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wstring_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/alias/wstring_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/alias/wstring_tools" +description = """ +Tools to manipulate strings. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/wstring_tools_lib.rs", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ + "indentation", + # "isolate", + # "parse_request", + # "split", + "parse_number", +] +full = [ + "indentation", + # "isolate", + # "parse_request", + # "split", + "parse_number", +] +# use_std = [ "strs_tools/use_std" ] +no_std = [ "strs_tools/no_std" ] +use_alloc = [ "strs_tools/use_alloc" ] + +indentation = [ "strs_tools/string_indentation" ] +isolate = [ "strs_tools/string_isolate" ] +parse_request = [ "split", "isolate", "strs_tools/string_parse_request" ] +parse_number = [ "strs_tools/string_parse_number" ] +split = [ "strs_tools/string_split" ] + +# [lib] +# name = "wstring_tools" +# path = "src/string/wstring_tools_lib.rs" + +# [[test]] +# name = "string_test" +# path = "tests/string/wstring_tools_tests.rs" + +# [[test]] +# name = "string_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" + +# [[example]] +# name = "wstring_tools_trivial" +# path = "examples/strs_tools_trivial/src/main.rs" + +[dependencies] +strs_tools = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/alias/wstring_tools/License b/module/alias/wstring_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/wstring_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/wstring_tools/Readme.md b/module/alias/wstring_tools/Readme.md new file mode 100644 index 0000000000..ff1e2a4f75 --- /dev/null +++ b/module/alias/wstring_tools/Readme.md @@ -0,0 +1,51 @@ + + +# Module :: wstring_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wstring_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wstring_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/wstring_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/wstring_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwstring_tools%2Fexamples%2Fwstring_toolst_trivial_sample.rs,RUN_POSTFIX=--example%20wstring_toolst_trivial_sample/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools to manipulate strings. + +### Basic use-case + + + +```rust +#[ cfg( all( feature = "split", feature = "use_std" ) ) ] +{ + /* delimeter exists */ + let src = "abc def"; + let iter = wstring_tools::string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .perform(); + let iterated = iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc", " ", "def" ] ); + + /* delimeter not exists */ + let src = "abc def"; + let iter = wstring_tools::string::split() + .src( src ) + .delimeter( "g" ) + .perform(); + let iterated = iter.map( | e | String::from( e ) ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc def" ] ); +} +``` + +### To add to your project + +```sh +cargo add wstring_tools +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/wstring_tools_trivial +cargo run +``` diff --git a/module/alias/wstring_tools/examples/wstring_toolst_trivial_sample.rs b/module/alias/wstring_tools/examples/wstring_toolst_trivial_sample.rs new file mode 100644 index 0000000000..c24ce60979 --- /dev/null +++ b/module/alias/wstring_tools/examples/wstring_toolst_trivial_sample.rs @@ -0,0 +1,28 @@ +//! qqq : write proper description +#[ allow( unused_imports ) ] +use strs_tools::*; + +fn main() +{ + #[ cfg( all( feature = "string_split", not( feature = "no_std" ) ) ) ] + { + /* delimeter exists */ + let src = "abc def"; + let iter = string::split() + .src( src ) + .delimeter( " " ) + .stripping( false ) + .perform(); + let iterated = iter.map( String::from ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc", " ", "def" ] ); + + /* delimeter not exists */ + let src = "abc def"; + let iter = string::split() + .src( src ) + .delimeter( "g" ) + .perform(); + let iterated = iter.map( String::from ).collect::< Vec< _ > >(); + assert_eq!( iterated, vec![ "abc def" ] ); + } +} \ No newline at end of file diff --git a/module/alias/wstring_tools/src/lib.rs b/module/alias/wstring_tools/src/lib.rs new file mode 100644 index 0000000000..2abdc702d7 --- /dev/null +++ b/module/alias/wstring_tools/src/lib.rs @@ -0,0 +1,18 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/strs_tools/latest/strs_tools/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Tools to manipulate strings. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +#[ cfg( feature = "enabled" ) ] +pub use strs_tools::*; \ No newline at end of file diff --git a/module/alias/wstring_tools/tests/smoke_test.rs b/module/alias/wstring_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/alias/wstring_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/wstring_tools/tests/wstring_tools_tests.rs b/module/alias/wstring_tools/tests/wstring_tools_tests.rs new file mode 100644 index 0000000000..81446f1384 --- /dev/null +++ b/module/alias/wstring_tools/tests/wstring_tools_tests.rs @@ -0,0 +1,7 @@ + + +#[ allow( unused_imports ) ] +use wstring_tools as the_module; + +#[ path = "../../../core/strs_tools/tests/inc/mod.rs" ] +mod inc; diff --git a/module/alias/wtest/Cargo.toml b/module/alias/wtest/Cargo.toml new file mode 100644 index 0000000000..4cb3aad3a8 --- /dev/null +++ b/module/alias/wtest/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "wtest" +version = "0.4.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wtest" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/wtest" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/wtest" +description = """ +Tools for writing and running tests. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "testing" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/test", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] +test_tools = { workspace = true } +# wtools = { workspace = true } +# wca = { workspace = true } +# wpublisher = { workspace = true } +# anyhow = "~1.0.56" + +[dev-dependencies] +# trybuild = { version = "~1.0", features = [ "diff" ] } diff --git a/module/alias/wtest/License b/module/alias/wtest/License new file mode 100644 index 0000000000..e3e9e057cf --- /dev/null +++ b/module/alias/wtest/License @@ -0,0 +1,23 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/wtest/Readme.md b/module/alias/wtest/Readme.md new file mode 100644 index 0000000000..0f3d21c9a8 --- /dev/null +++ b/module/alias/wtest/Readme.md @@ -0,0 +1,58 @@ + + +# Module :: wtest + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_push.yml) [![docs.rs](https://img.shields.io/docsrs/wtest?color=e3e8f0&logo=docs.rs)](https://docs.rs/wtest) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwtest%2Fexamples%2Fwtest_trivial_sample.rs,RUN_POSTFIX=--example%20wtest_trivial_sample/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools for writing and running tests. + +## Sample + + + +```rust +use wtest::*; + +// + +tests_impls! +{ + + fn pass1() + { + assert_eq!( true, true ); + } + + // + + fn pass2() + { + assert_eq!( 1, 1 ); + } + +} + +// + +tests_index! +{ + pass1, + pass2, +} +``` + +### To add to your project + +```sh +cargo add wtest --dev +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/test_trivial +cargo run +``` diff --git a/module/alias/wtest/examples/wtest_trivial_sample.rs b/module/alias/wtest/examples/wtest_trivial_sample.rs new file mode 100644 index 0000000000..b32a3751bc --- /dev/null +++ b/module/alias/wtest/examples/wtest_trivial_sample.rs @@ -0,0 +1,31 @@ +//! qqq : write proper description +use test_tools::*; + +tests_impls! +{ + + fn pass1_test() + { + assert_eq!( true, true ); + } + + // + + fn pass2_test() + { + assert_eq!( 1, 1 ); + } + +} + +// + +tests_index! +{ + pass1_test, + pass2_test, +} + +fn main() +{ +} \ No newline at end of file diff --git a/module/alias/wtest/src/test/commands/init.rs b/module/alias/wtest/src/test/commands/init.rs new file mode 100644 index 0000000000..57b5db1db1 --- /dev/null +++ b/module/alias/wtest/src/test/commands/init.rs @@ -0,0 +1,26 @@ +use super::*; + +/// +/// Form CA commands grammar. +/// + +pub fn grammar_form() -> Vec< wca::Command > +{ + vec! + [ + smoke::smoke_command(), + smoke::smoke_with_subject_command(), + ] +} + +/// +/// Form CA commands executor. +/// + +pub fn executor_form() -> std::collections::HashMap< String, wca::Routine > +{ + std::collections::HashMap::from_iter + ([ + ( "smoke".to_string(), wca::Routine::new( smoke::smoke ) ), + ]) +} diff --git a/module/alias/wtest/src/test/commands/mod.rs b/module/alias/wtest/src/test/commands/mod.rs new file mode 100644 index 0000000000..c9a4052b57 --- /dev/null +++ b/module/alias/wtest/src/test/commands/mod.rs @@ -0,0 +1,13 @@ + +crate::mod_interface! +{ + /// Perform smoke testing. + #[ cfg( not( feature = "no_std" ) ) ] + prelude mod smoke; + /// Init aggregator commands. + #[ cfg( not( feature = "no_std" ) ) ] + prelude mod init; +} + +#[ cfg( not( feature = "no_std" ) ) ] +pub use init::*; diff --git a/module/alias/wtest/src/test/commands/smoke.rs b/module/alias/wtest/src/test/commands/smoke.rs new file mode 100644 index 0000000000..555e67325c --- /dev/null +++ b/module/alias/wtest/src/test/commands/smoke.rs @@ -0,0 +1,328 @@ +use std::env::current_dir; +use std::path::PathBuf; +use wtools::error::BasicError; +use ::wpublisher::manifest::Manifest; +use wca::{ Args, Props, Type }; +use wtools::error::Result; + +pub( crate ) fn smoke_command() -> wca::Command +{ + wca::Command::former() + .hint( "Perform smoke testing on module." ) + .long_hint( "Perform smoke testing on module." ) + .phrase( "smoke" ) + .property( "smoke", "A variant of smoke testing of module. It can be:\n local - local module in directory.\n published - module published on `crates.io`. true - local and published version.\n Default is \"local\"", Type::String, true ) + .property( "code_path", "A path to code snippet to test. By default utility imports module into binary.", Type::Path, true ) + .property( "version", "A string version of module. By default \"*\"", Type::String, true ) + .form() +} + +pub( crate ) fn smoke_with_subject_command() -> wca::Command +{ + wca::Command::former() + .hint( "Perform smoke testing on module by path." ) + .long_hint( "Perform smoke testing on module by path." ) + .phrase( "smoke" ) + .subject( "A path to module. Should be a directory with file `Cargo.toml`. Default is current directory.", Type::Path, true ) + .property( "smoke", "A variant of smoke testing of module. It can be:\n local - local module in directory.\n published - module published on `crates.io`. true - local and published version.\n Default is \"local\"", Type::String, true ) + .property( "code_path", "A path to code snippet to test. By default utility imports module into binary.", Type::Path, true ) + .property( "version", "A string version of module. By default \"*\"", Type::String, true ) + .form() +} + +/// +/// Perform smoke testing. +/// + +pub fn smoke( ( args, props ) : ( Args, Props ) ) -> Result< () > +{ + println!( "Command \".smoke\"" ); + let mut current_path = current_dir().unwrap(); + + let subject_path = args.get_owned::< PathBuf >( 0 ).unwrap_or_default(); + let module_path = if subject_path.is_relative() + { + current_path.push( args.get_owned::< PathBuf >( 0 ).unwrap_or_default() ); + current_path + } + else + { + subject_path + }; + + let mut manifest_path = module_path.clone(); + manifest_path.push( "Cargo.toml" ); + + if !manifest_path.exists() + { + let msg = format!( "Current directory {:?} has no file \"Cargo.toml\"", module_path.canonicalize().unwrap() ); + return Err( BasicError::new( msg ) ); + } + + let mut manifest = Manifest::new(); + manifest.manifest_path_from_str( &manifest_path ).unwrap(); + manifest.load().unwrap(); + let data = manifest.manifest_data.as_deref().unwrap(); + + /* */ + + let module_name = &data[ "package" ][ "name" ].clone(); + let module_name = module_name.as_str().unwrap(); + + let code_path = match props.get_owned( "code_path" ) + { + Some( path ) => path, + None => PathBuf::default(), + }; + + let mut data = None; + if code_path.exists() + { + data = Some( std::fs::read_to_string( code_path ).unwrap() ); + } + + let version = match props.get_owned( "version" ) + { + Some( x ) => x, + None => "*".to_string(), + }; + + let smoke = match props.get_owned( "smoke" ) + { + Some( x ) => x, + None => + { + if let Ok( x ) = std::env::var( "WITH_SMOKE" ) + { + x + } + else + { + "local".to_string() + } + }, + }; + + /* */ + + if smoke != "false" && smoke != "0" + { + let mut threads = vec![]; + if smoke == "local" || smoke != "published" + { + let module_name = module_name.to_owned(); + let data = data.clone(); + let version = version.clone(); + let thread = std::thread::spawn( move || + { + let mut t = SmokeModuleTest::new( module_name ); + t.test_postfix( "_test_local" ); + if data.is_some() + { + t.code( data.as_ref().unwrap() ); + } + t.version( version.as_str() ); + t.local_path_clause( module_path.to_str().unwrap() ); + + t.clean( true ).unwrap(); + t.form().unwrap(); + t.perform().unwrap(); + t.clean( false ).unwrap(); + }); + threads.push( thread ); + } + + if smoke == "published" || smoke != "local" + { + let module_name = module_name.to_owned(); + let data = data; + let version = version; + let thread = std::thread::spawn( move || + { + let mut t = SmokeModuleTest::new( module_name ); + t.test_postfix( "_test_published" ); + if data.is_some() + { + t.code( data.as_ref().unwrap() ); + } + t.version( version.as_str() ); + + t.clean( true ).unwrap(); + t.form().unwrap(); + t.perform().unwrap(); + t.clean( false ).unwrap(); + }); + threads.push( thread ); + } + + for thread in threads + { + thread.join().unwrap(); + } + } + + Ok( () ) +} + +// + +#[ derive( Debug ) ] +struct SmokeModuleTest< 'a > +{ + pub dependency_name : String, + pub version : &'a str, + pub local_path_clause : &'a str, + pub code : String, + pub test_path : std::path::PathBuf, + pub test_postfix : &'a str, +} + +impl< 'a > SmokeModuleTest< 'a > +{ + fn new( dependency_name : String ) -> SmokeModuleTest< 'a > + { + let test_postfix = "_smoke_test"; + let smoke_test_path = format!( "{}{}", dependency_name, test_postfix ); + let mut test_path = std::env::temp_dir(); + test_path.push( smoke_test_path ); + + SmokeModuleTest + { + dependency_name, + version : "*", + local_path_clause : "", + code : "".to_string(), + test_path, + test_postfix, + } + } + + fn version( &mut self, version : &'a str ) -> &mut SmokeModuleTest< 'a > + { + self.version = version; + self + } + + fn local_path_clause( &mut self, local_path_clause : &'a str ) -> &mut SmokeModuleTest< 'a > + { + self.local_path_clause = local_path_clause; + self + } + + fn test_postfix( &mut self, test_postfix : &'a str ) -> &mut SmokeModuleTest< 'a > + { + self.test_postfix = test_postfix; + let smoke_test_path = format!( "{}{}", self.dependency_name, test_postfix ); + self.test_path.pop(); + self.test_path.push( smoke_test_path ); + self + } + + fn code( &mut self, code : impl AsRef< str > + 'a ) -> &mut SmokeModuleTest< 'a > + { + self.code = code.as_ref().into(); + self + } + + fn form( &mut self ) -> Result< (), &'static str > + { + std::fs::create_dir( &self.test_path ).unwrap(); + + let mut test_path = self.test_path.clone(); + + /* create binary test module */ + let test_name = format!( "{}{}", self.dependency_name, self.test_postfix ); + let output = std::process::Command::new( "cargo" ) + .current_dir( &test_path ) + .args([ "new", "--bin", &test_name ]) + .output() + .expect( "Failed to execute command" ); + println!( "Creating smoke binary module :\n\n{}", std::str::from_utf8( &output.stderr ).expect( "Found invalid UTF-8" ) ); + + test_path.push( &test_name ); + + /* setup config */ + #[ cfg( target_os = "windows" ) ] + let local_path_clause = if self.local_path_clause.is_empty() { "".to_string() } else { format!( ", path = \"{}\"", self.local_path_clause.escape_default() ) }; + #[ cfg( not( target_os = "windows" ) ) ] + let local_path_clause = if self.local_path_clause.is_empty() { "".to_string() } else { format!( ", path = \"{}\"", self.local_path_clause ) }; + let dependencies_section = format!( "{} = {{ version = \"{}\" {} }}", self.dependency_name, self.version, &local_path_clause ); + let config_data = format! + ( + "[package] + edition = \"2021\" + name = \"{}_smoke_test\" + version = \"0.0.1\" + + [dependencies] + {}", + &self.dependency_name, + &dependencies_section + ); + let mut config_path = test_path.clone(); + config_path.push( "Cargo.toml" ); + println!( "Manifest of module \"{}\" :\n\n {}\n", test_name, config_data ); + std::fs::write( config_path, config_data ).unwrap(); + + /* write code */ + test_path.push( "src" ); + test_path.push( "main.rs" ); + if self.code.is_empty() + { + self.code = format!( "use ::{}::*;", self.dependency_name ); + } + let code = format! + ( + "#[ allow( unused_imports ) ] + fn main() + {{ + {} + }}", + self.code, + ); + self.code = code; + std::fs::write( &test_path, &self.code ).unwrap(); + + Ok( () ) + } + + fn perform( &self ) -> Result<(), BasicError> + { + let mut test_path = self.test_path.clone(); + let test_name = format!( "{}{}", self.dependency_name, self.test_postfix ); + test_path.push( test_name ); + + let output = std::process::Command::new( "cargo" ) + .current_dir( test_path ) + .args([ "run", "--release" ]) + .output() + .unwrap(); + println!( "{}", std::str::from_utf8( &output.stdout ).expect( "Found invalid UTF-8" ) ); + println!( "{}", std::str::from_utf8( &output.stderr ).expect( "Found invalid UTF-8" ) ); + println!( "Process status :\n {}\n", output.status ); + println!( "Code :\n\n {}\n", self.code ); + + if !output.status.success() + { + return Err( BasicError::new( "Smoke test failed" ) ); + } + + Ok( () ) + } + + fn clean( &self, force : bool ) -> Result<(), &'static str> + { + let result = std::fs::remove_dir_all( &self.test_path ); + if force + { + result.unwrap_or_default(); + } + else + { + let msg = format!( "Cannot remove temporary directory {}. Please, remove it manually", &self.test_path.display() ); + result.expect( &msg ); + } + Ok( () ) + } + +} diff --git a/module/alias/wtest/src/test/lib.rs b/module/alias/wtest/src/test/lib.rs new file mode 100644 index 0000000000..7cd7667480 --- /dev/null +++ b/module/alias/wtest/src/test/lib.rs @@ -0,0 +1,23 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wtest/latest/wtest/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Tools for writing and running tests. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +use ::wtools::mod_interface; + +crate::mod_interface! +{ + /// Commands of binary target. + #[ cfg( not( feature = "no_std" ) ) ] + layer commands; + use ::test_tools; +} diff --git a/module/alias/wtest/src/test/main.rs b/module/alias/wtest/src/test/main.rs new file mode 100644 index 0000000000..e9d144bdd2 --- /dev/null +++ b/module/alias/wtest/src/test/main.rs @@ -0,0 +1,48 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wtest/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Utility to publish modules on `crates.io` from a command line. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +use ::wtest::*; +#[ cfg( not( feature = "no_std" ) ) ] +use std::env; + +// + +#[ cfg( not( feature = "no_std" ) ) ] +fn main() -> Result< (), wtools::error::BasicError > +{ + let args = env::args().skip( 1 ).collect::< Vec< String > >(); + + let ca = wca::CommandsAggregator::former() + // .exit_code_on_error( 1 ) + .grammar( commands::grammar_form() ) + .executor( commands::executor_form() ) + .perform(); + + let program = args.join( " " ); + if program.is_empty() + { + eprintln!( "Illformed command \"\"" ); + ca.perform( ".help" )?; + std::process::exit( 1 ) + } + else + { + ca.perform( program.as_str() ) + } +} + +#[ cfg( feature = "no_std" ) ] +fn main() +{ +} diff --git a/module/alias/wtest/tests/smoke_test.rs b/module/alias/wtest/tests/smoke_test.rs new file mode 100644 index 0000000000..fddef25d11 --- /dev/null +++ b/module/alias/wtest/tests/smoke_test.rs @@ -0,0 +1,15 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +#[ ignore ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/wtest/tests/wtest_basic_tests.rs b/module/alias/wtest/tests/wtest_basic_tests.rs new file mode 100644 index 0000000000..1c45c54c1d --- /dev/null +++ b/module/alias/wtest/tests/wtest_basic_tests.rs @@ -0,0 +1,8 @@ + +// #[ allow( unused_imports ) ] +// use inc::wtest as the_module; +// #[ allow( unused_imports ) ] +// use test_tools::exposed::*; + +#[ path="../../../../module/core/test_tools/tests/test_tools_tests.rs" ] +mod test_tools; diff --git a/module/alias/wtest_basic/Cargo.toml b/module/alias/wtest_basic/Cargo.toml new file mode 100644 index 0000000000..3d5e3d1218 --- /dev/null +++ b/module/alias/wtest_basic/Cargo.toml @@ -0,0 +1,80 @@ +[package] +name = "wtest_basic" +version = "0.4.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wtest_basic" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/wtest_basic" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/wtest_basic" +description = """ +Tools for writing tests. The most basic things. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose", "testing" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +include = [ + "/rust/impl/test/wtest_basic_lib.rs", + "/rust/impl/test/basic", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "test_tools/default" ] +full = [ "test_tools/full" ] +no_std = [ "test_tools/no_std" ] +use_alloc = [ "test_tools/use_alloc" ] +enabled = [ "test_tools/enabled" ] +# nightly = [ "test_tools/nightly" ] + +# [lib] +# name = "wtest_basic" +# path = "src/test/wtest_basic_lib.rs" +# +# [[test]] +# name = "wtest_basic_test" +# path = "tests/test/wtest_basic_tests.rs" +# +# [[test]] +# name = "wtest_basic_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" +# +# [[example]] +# name = "wtest_basic_trivial" +# path = "examples/wtest_basic_trivial/src/main.rs" + +[dependencies] + +test_tools = { workspace = true, features = [ "full" ] } + +# ## external +# +# paste = "~1.0" +# rustversion = "~1.0" +# anyhow = "~1.0" +# num-traits = "~0.2" +# trybuild = { version = "~1.0", features = [ "diff" ] } +# +# ## internal +# +# meta_tools = { workspace = true, features = [ "full" ] } +# mem_tools = { workspace = true, features = [ "full" ] } +# typing_tools = { workspace = true, features = [ "full" ] } +# data_type = { workspace = true, features = [ "full" ] } +# diagnostics_tools = { workspace = true, features = [ "full" ] } + +# [dev-dependencies] +# test_tools = { workspace = true } diff --git a/module/alias/wtest_basic/License b/module/alias/wtest_basic/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/alias/wtest_basic/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/alias/wtest_basic/Readme.md b/module/alias/wtest_basic/Readme.md new file mode 100644 index 0000000000..bcc5d8e56f --- /dev/null +++ b/module/alias/wtest_basic/Readme.md @@ -0,0 +1,59 @@ + + +# Module :: wtest_basic + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_basic_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_basic_push.yml) [![docs.rs](https://img.shields.io/docsrs/wtest_basic?color=e3e8f0&logo=docs.rs)](https://docs.rs/wtest_basic) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Tools for writing and running tests. The most basic things. + +### Basic use-case. + + + +```rust +use wtest_basic::*; + +// + +tests_impls! +{ + + fn pass1() + { + assert_eq!( true, true ); + } + + // + + fn pass2() + { + assert_eq!( 1, 1 ); + } + +} + +// + +tests_index! +{ + pass1, + pass2, +} +``` + +### To add to your project + +```sh +cargo add wtest_basic --dev +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/test_basic_trivial +cargo run +``` + diff --git a/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Cargo.toml b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Cargo.toml new file mode 100644 index 0000000000..1df5174357 --- /dev/null +++ b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "wtest_basic_trivial" +version = "0.0.0" +edition = "2021" +publish = false + +[[test]] +name = "trivial_test" +path = "test/trivial_test.rs" + +[dependencies] +wtest_basic = { workspace = true } diff --git a/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Readme.md b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Readme.md new file mode 100644 index 0000000000..dbaa8ba637 --- /dev/null +++ b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/Readme.md @@ -0,0 +1,5 @@ +# Sample + +[![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) +[![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=sample%2Frust%2Fwtest_basic_trivial,SAMPLE_FILE=.%2Fsrc%2Fmain.rs/https://github.com/Wandalen/wTools) +[![docs.rs](https://raster.shields.io/static/v1?label=docs&message=online&color=eee&logo=docsdotrs&logoColor=eee)](https://docs.rs/wtest_basic) diff --git a/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/src/main.rs b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/src/main.rs new file mode 100644 index 0000000000..cca4967994 --- /dev/null +++ b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/src/main.rs @@ -0,0 +1,4 @@ + +fn main() +{ +} diff --git a/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/test/trivial_test.rs b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/test/trivial_test.rs new file mode 100644 index 0000000000..1b86716748 --- /dev/null +++ b/module/alias/wtest_basic/examples/wtest_basic_trivial_sample/test/trivial_test.rs @@ -0,0 +1,30 @@ +use wtest_basic::*; + +tests_impls! +{ + + // + + fn pass1_test() + { + assert_eq!( true, true ); + } + + // + + fn pass2_test() + { + assert_eq!( 1, 1 ); + } + + // + +} + +// + +tests_index! +{ + pass1_test, + pass2_test, +} diff --git a/module/alias/wtest_basic/src/_blank/empty_lib.rs b/module/alias/wtest_basic/src/_blank/empty_lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/alias/wtest_basic/src/_blank/standard_lib.rs b/module/alias/wtest_basic/src/_blank/standard_lib.rs new file mode 100644 index 0000000000..bd56ee14ed --- /dev/null +++ b/module/alias/wtest_basic/src/_blank/standard_lib.rs @@ -0,0 +1,56 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/_blank/latest/_blank/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! ___. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Parented namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ +} + +// #[ doc( inline ) ] +#[ allow( unused_imports ) ] +// pub use exposed::*; + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/alias/wtest_basic/src/test/basic/helper.rs b/module/alias/wtest_basic/src/test/basic/helper.rs new file mode 100644 index 0000000000..2b7c9b8ef0 --- /dev/null +++ b/module/alias/wtest_basic/src/test/basic/helper.rs @@ -0,0 +1,85 @@ + +//! +//! Helpers. +//! + +/// Internal namespace. +pub( crate ) mod private +{ + + // zzz : move here test tools + + // /// Pass only if callback fails either returning error or panicing. + // + // pub fn should_throw< R, F : FnOnce() -> anyhow::Result< R > >( f : F ) -> anyhow::Result< R > + // { + // f() + // } + + // + + // #[panic_handler] + // fn panic( info : &core::panic::PanicInfo ) -> ! + // { + // println!( "{:?}", info ); + // loop {} + // } + + // pub use test_suite; + // pub use test_suite_internals; + // pub use index; + + /// + /// Required to convert integets to floats. + /// + + #[ macro_export ] + macro_rules! num + { + + () => + { + }; + + ( $num : expr ) => + { + num_traits::cast::< _, T >( $num ).unwrap() + }; + + ( $( $num : expr ),+ ) => + {( + $( num_traits::cast::< _, T >( $num ).unwrap() ),+ + )}; + + } + + /// + /// Test a file with documentation. + /// + + #[ macro_export ] + macro_rules! doc_file_test + { + ( $file:expr ) => + { + #[ allow( unused_doc_comments ) ] + #[ cfg( doctest ) ] + #[ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", $file ) ) ] + extern { } + }; + } + + pub use num; + pub use doc_file_test; +} + +// + +meta_tools::mod_interface! +{ + prelude use + { + num, + doc_file_test, + }; +} diff --git a/module/alias/wtest_basic/src/test/basic/mod.rs b/module/alias/wtest_basic/src/test/basic/mod.rs new file mode 100644 index 0000000000..1fcd87a4b0 --- /dev/null +++ b/module/alias/wtest_basic/src/test/basic/mod.rs @@ -0,0 +1,16 @@ + +//! +//! Basic tools for testing. +//! + +/// Internal namespace. +pub( crate ) mod private +{ +} + +// + +crate::mod_interface! +{ + layer helper; +} diff --git a/module/alias/wtest_basic/src/test/wtest_basic_lib.rs b/module/alias/wtest_basic/src/test/wtest_basic_lib.rs new file mode 100644 index 0000000000..3eb13b9abe --- /dev/null +++ b/module/alias/wtest_basic/src/test/wtest_basic_lib.rs @@ -0,0 +1,85 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wtest_basic/latest/wtest_basic/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! Tools for writing and running tests. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// doc_file_test!( "rust/test/test/asset/Test.md" ); + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::paste; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::trybuild; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::anyhow; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::rustversion; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::meta_tools; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::mem_tools; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::typing_tools; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::num_traits; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use ::diagnostics_tools; +} + +use ::meta_tools::mod_interface; + +mod_interface! +{ + /// Basics. + layer basic; + + // use super::exposed::meta; + use super::exposed::mem; + use super::exposed::typing; + use super::exposed::dt; + use super::exposed::diagnostics; + + protected use super::dependency; + protected use super::dependency::*; + + prelude use ::meta_tools as meta; + prelude use ::mem_tools as mem; + prelude use ::typing_tools as typing; + prelude use ::data_type as dt; + prelude use ::diagnostics_tools as diagnostics; + + prelude use ::meta_tools:: + { + impls, + index, + tests_impls, + tests_impls_optional, + tests_index, + }; + prelude use ::typing_tools::{ implements }; + +} + +// qqq : for Dima : add negative test that wtest_basic::exposed::exposed does not exist /* aaa : Dmytro : added trybuild test with compile time error */ diff --git a/module/alias/wtest_basic/tests/smoke_test.rs b/module/alias/wtest_basic/tests/smoke_test.rs new file mode 100644 index 0000000000..fddef25d11 --- /dev/null +++ b/module/alias/wtest_basic/tests/smoke_test.rs @@ -0,0 +1,15 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +#[ ignore ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/alias/wtest_basic/tests/wtest_basic_tests.rs b/module/alias/wtest_basic/tests/wtest_basic_tests.rs new file mode 100644 index 0000000000..9e1bb880ad --- /dev/null +++ b/module/alias/wtest_basic/tests/wtest_basic_tests.rs @@ -0,0 +1,2 @@ +#[ path="../../../../module/core/test_tools/tests/test_tools_tests.rs" ] +mod test_tools; \ No newline at end of file diff --git a/module/blank/exe_tools/Cargo.toml b/module/blank/exe_tools/Cargo.toml new file mode 100644 index 0000000000..ff0bdda58b --- /dev/null +++ b/module/blank/exe_tools/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "exe_tools" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/exe_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/exe_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/exe_tools" +description = """ +Collection of algorithms and structures to handle execution properly. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/blank/exe_tools/License b/module/blank/exe_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/blank/exe_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/blank/exe_tools/Readme.md b/module/blank/exe_tools/Readme.md new file mode 100644 index 0000000000..4125d2ee58 --- /dev/null +++ b/module/blank/exe_tools/Readme.md @@ -0,0 +1,35 @@ + + +# Module :: exe_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_exe_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_exe_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/exe_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/exe_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of algorithms and structures to handle execution properly. + + diff --git a/module/blank/exe_tools/src/lib.rs b/module/blank/exe_tools/src/lib.rs new file mode 100644 index 0000000000..8232f96ec6 --- /dev/null +++ b/module/blank/exe_tools/src/lib.rs @@ -0,0 +1,11 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/exe_tools/latest/exe_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Function description. +#[ cfg( feature = "enabled" ) ] +pub fn f1() +{ +} diff --git a/module/blank/exe_tools/tests/inc/basic_test.rs b/module/blank/exe_tools/tests/inc/basic_test.rs new file mode 100644 index 0000000000..60c9a81cfb --- /dev/null +++ b/module/blank/exe_tools/tests/inc/basic_test.rs @@ -0,0 +1,7 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn basic() +{ +} diff --git a/module/blank/exe_tools/tests/inc/mod.rs b/module/blank/exe_tools/tests/inc/mod.rs new file mode 100644 index 0000000000..dde9de6f94 --- /dev/null +++ b/module/blank/exe_tools/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic_test; diff --git a/module/blank/exe_tools/tests/smoke_test.rs b/module/blank/exe_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/blank/exe_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/blank/exe_tools/tests/tests.rs b/module/blank/exe_tools/tests/tests.rs new file mode 100644 index 0000000000..13968c0f4c --- /dev/null +++ b/module/blank/exe_tools/tests/tests.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use exe_tools as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/blank/image_tools/Cargo.toml b/module/blank/image_tools/Cargo.toml new file mode 100644 index 0000000000..bc788844d8 --- /dev/null +++ b/module/blank/image_tools/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "image_tools" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/image_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/image_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/image_tools" +description = """ +Collections of algorithms and structures to process images. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/blank/image_tools/License b/module/blank/image_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/blank/image_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/blank/image_tools/Readme.md b/module/blank/image_tools/Readme.md new file mode 100644 index 0000000000..c670c5a0e2 --- /dev/null +++ b/module/blank/image_tools/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: image_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_image_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_image_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/image_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/image_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collections of algorithms and structures to process images. + + diff --git a/module/blank/image_tools/src/lib.rs b/module/blank/image_tools/src/lib.rs new file mode 100644 index 0000000000..39d9969091 --- /dev/null +++ b/module/blank/image_tools/src/lib.rs @@ -0,0 +1,11 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/image_tools/latest/image_tools/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Function description. +#[ cfg( feature = "enabled" ) ] +pub fn f1() +{ +} diff --git a/module/blank/image_tools/tests/smoke_test.rs b/module/blank/image_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/blank/image_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/blank/math_tools/Cargo.toml b/module/blank/math_tools/Cargo.toml new file mode 100644 index 0000000000..88c6be4d46 --- /dev/null +++ b/module/blank/math_tools/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "math_tools" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/template_blank" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/template_blank" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/template_blank" +description = """ +Math tools +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/blank/math_tools/License b/module/blank/math_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/blank/math_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/blank/math_tools/Readme.md b/module/blank/math_tools/Readme.md new file mode 100644 index 0000000000..3e314ebc9c --- /dev/null +++ b/module/blank/math_tools/Readme.md @@ -0,0 +1,34 @@ + + +# Module :: math_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_math_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_math_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/math_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/math_tools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +To be done. + +### Basic use-case + + + +```rust +use template_blank::*; + +fn main() +{ +} +``` + +### To add to your project + +```bash +cargo add template_blank +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run example +``` diff --git a/module/blank/math_tools/src/lib.rs b/module/blank/math_tools/src/lib.rs new file mode 100644 index 0000000000..3a6d0b03cc --- /dev/null +++ b/module/blank/math_tools/src/lib.rs @@ -0,0 +1,6 @@ +//! qqq : write proper description +/// get name +pub fn name() -> String +{ + "math_tools".to_string() +} \ No newline at end of file diff --git a/module/blank/math_tools/tests/smoke_test.rs b/module/blank/math_tools/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/blank/math_tools/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/blank/rustql/Cargo.toml b/module/blank/rustql/Cargo.toml new file mode 100644 index 0000000000..8d24519fb1 --- /dev/null +++ b/module/blank/rustql/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "rustql" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/rustql" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/rustql" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/rustql" +description = """ +Rust query language. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/blank/rustql/License b/module/blank/rustql/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/blank/rustql/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/blank/rustql/Readme.md b/module/blank/rustql/Readme.md new file mode 100644 index 0000000000..162de54d71 --- /dev/null +++ b/module/blank/rustql/Readme.md @@ -0,0 +1,33 @@ + + +# Module :: rustql +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModulerustqlPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModulerustqlPush.yml) [![docs.rs](https://img.shields.io/docsrs/rustql?color=e3e8f0&logo=docs.rs)](https://docs.rs/rustql) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +Rust query language. + + diff --git a/module/blank/rustql/src/lib.rs b/module/blank/rustql/src/lib.rs new file mode 100644 index 0000000000..e8dceed08a --- /dev/null +++ b/module/blank/rustql/src/lib.rs @@ -0,0 +1,11 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/rustql/latest/rustql/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Function description. +#[ cfg( feature = "enabled" ) ] +pub fn f1() +{ +} diff --git a/module/blank/rustql/tests/inc/basic_test.rs b/module/blank/rustql/tests/inc/basic_test.rs new file mode 100644 index 0000000000..60c9a81cfb --- /dev/null +++ b/module/blank/rustql/tests/inc/basic_test.rs @@ -0,0 +1,7 @@ +#[ allow( unused_imports ) ] +use super::*; + +#[ test ] +fn basic() +{ +} diff --git a/module/blank/rustql/tests/inc/mod.rs b/module/blank/rustql/tests/inc/mod.rs new file mode 100644 index 0000000000..dde9de6f94 --- /dev/null +++ b/module/blank/rustql/tests/inc/mod.rs @@ -0,0 +1,4 @@ +#[ allow( unused_imports ) ] +use super::*; + +mod basic_test; diff --git a/module/blank/rustql/tests/smoke_test.rs b/module/blank/rustql/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/blank/rustql/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/blank/rustql/tests/tests.rs b/module/blank/rustql/tests/tests.rs new file mode 100644 index 0000000000..5a21773934 --- /dev/null +++ b/module/blank/rustql/tests/tests.rs @@ -0,0 +1,10 @@ + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +#[ allow( unused_imports ) ] +use rustql as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/blank/w4d/Cargo.toml b/module/blank/w4d/Cargo.toml new file mode 100644 index 0000000000..e2c6597f9d --- /dev/null +++ b/module/blank/w4d/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "w4d" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/template_blank" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/template_blank" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/template_blank" +description = """ +Math tools +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/blank/w4d/License b/module/blank/w4d/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/blank/w4d/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/blank/w4d/Readme.md b/module/blank/w4d/Readme.md new file mode 100644 index 0000000000..09648e3f1c --- /dev/null +++ b/module/blank/w4d/Readme.md @@ -0,0 +1,34 @@ + + +# Module :: math_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_w_4_d_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_w_4_d_push.yml) [![docs.rs](https://img.shields.io/docsrs/w4d?color=e3e8f0&logo=docs.rs)](https://docs.rs/w4d) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +To be done. + +### Basic use-case + + + +```rust +use template_blank::*; + +fn main() +{ +} +``` + +### To add to your project + +```bash +cargo add template_blank +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cargo run example +``` diff --git a/module/blank/w4d/src/lib.rs b/module/blank/w4d/src/lib.rs new file mode 100644 index 0000000000..d2ac89fa6d --- /dev/null +++ b/module/blank/w4d/src/lib.rs @@ -0,0 +1,6 @@ +//! qqq : write proper description +/// get name +pub fn name() -> String +{ + "w4d".to_string() +} \ No newline at end of file diff --git a/module/blank/w4d/tests/smoke_test.rs b/module/blank/w4d/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/blank/w4d/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/blank/willbe_old/Cargo.toml b/module/blank/willbe_old/Cargo.toml new file mode 100644 index 0000000000..56716163d5 --- /dev/null +++ b/module/blank/willbe_old/Cargo.toml @@ -0,0 +1,80 @@ +[package] +name = "willbe_old" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/willbe" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/willbe_old" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/willbe_old" +description = """ +___ +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] +publish = false + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/willbe_old", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[lib] +name = "willbe_old" +path = "src/willbe_old/willbe_lib.rs" + +[[bin]] +name = "willbe_old" +path = "src/willbe_old/willbe_entry.rs" + +[[test]] +name = "willbe_test" +path = "tests/willbe_old/willbe_test.rs" + +# disable for now +# [[test]] +# name = "willbe_smoke_test" +# path = "tests/_integration_test/smoke_test.rs" +# +# [[example]] +# name = "willbe_trivial" +# path = "examples/willbe_trivial/src/main.rs" + +[dependencies] +wtools = { workspace = true } +wca = { workspace = true } +mod_interface = { workspace = true, features = [ "default" ] } +iter_tools = { workspace = true, features = [ "default" ] } +error_tools = { workspace = true, features = [ "default" ] } +toml = "0.5" +globwalk = "0.8" +cargo_metadata = "0.15" +path-absolutize = "3" +petgraph = "~0.6" +rand = "0.8.4" + +[dev-dependencies] +test_tools = { workspace = true } +tempfile = "3" +assert_cmd = "2.0" +predicates = "2.1" diff --git a/module/blank/willbe_old/License b/module/blank/willbe_old/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/blank/willbe_old/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/blank/willbe_old/Readme.md b/module/blank/willbe_old/Readme.md new file mode 100644 index 0000000000..7028ba383c --- /dev/null +++ b/module/blank/willbe_old/Readme.md @@ -0,0 +1,35 @@ + + +# Module :: willbe + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_old_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_willbe_old_push.yml) [![docs.rs](https://img.shields.io/docsrs/willbe_old?color=e3e8f0&logo=docs.rs)](https://docs.rs/willbe_old) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +___ + +### Basic use-case + + + +```rust +use willbe_old::*; + +fn main() +{ +} +``` + +### To add to your project + +```bash +cargo add willbe +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/willbe_trivial +cargo run +``` diff --git a/module/blank/willbe_old/src/willbe_old/commands/each.rs b/module/blank/willbe_old/src/willbe_old/commands/each.rs new file mode 100644 index 0000000000..21a81accae --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/commands/each.rs @@ -0,0 +1,119 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::{ env, rc::Rc, cell::RefCell, }; + use wca:: + { + Args, Props, + Context, + }; + use error_tools::{ Result, BasicError }; + + use crate::protected::*; + use crate::commands::{ StartPointStack, EndPointStack }; + + #[ derive( Clone ) ] + struct PackagesIterator + ( + Rc< RefCell< dyn Iterator< Item = Package > > > + ); + + impl< I > From< I > for PackagesIterator + where + I : Iterator< Item = Package > + 'static + { + fn from( iter : I ) -> Self + { + Self( Rc::new( RefCell::new( iter ) ) ) + } + } + + impl PackagesIterator + { + fn next( &self ) -> Option< Package > + { + self.0.borrow_mut().next() + } + } + + /// Each command declaration + pub fn each_command() -> wca::Command + { + wca::Command::former() + .hint( "Iterate over packages" ) + .long_hint( "Iterates over all packages from current directory" ) + .phrase( "each" ) + .form() + } + + /// + /// Iterate over packages + /// + + pub fn each( _ : ( Args, Props ), mut ctx : Context ) -> Result< () > + { + println!( "[LOG] Called each command" ); + + // Already iterate + if let Some( iter ) = ctx.get_mut::< PackagesIterator >() + { + // It isn't end of iterator + let is_current_package_exists = ctx.get_ref::< Option< Package > >().and_then( | p | p.as_ref() ).is_some(); + let next_package = iter.next(); + if is_current_package_exists && next_package.is_some() + { + ctx.insert( next_package ); + } + else + { + ctx.remove::< Option< Package > >(); + ctx.remove::< PackagesIterator >(); + // At the end of each - go to first endpoint + // remove self from startpoints + ctx.get_mut::< StartPointStack >().and_then( | sp | sp.pop() ); + // go to endpoint + let prog_state = ctx.get_mut::< wca::RuntimeState >() + .ok_or_else( || BasicError::new( "Have no Program State" ) )?; + + ctx.get_mut::< EndPointStack >() + .and_then( | ep | ep.pop() ) + .map( | point | prog_state.pos = point ) + //? What is better - panic or go to the end of the program when endpoints doesn't exists for any reason + .unwrap_or_else( || prog_state.pos = usize::MAX ); + } + } + else + { + // Begin iteration + let current_path = env::current_dir().unwrap(); + let mut packages_iter = packages_iterate( current_path ); + + let package = packages_iter.next(); + + // But anyway program must found the end of `.each` + if package.is_none() + { + println!( "Any package was found at current directory" ); + } + + // Add current package and the iterator to context + ctx.insert( package ); + ctx.insert::< PackagesIterator >( packages_iter.into() ); + + // Start point to previous instruction( back to current ) + let prog_state = ctx.get_ref::< wca::RuntimeState >() + .ok_or_else( || BasicError::new( "Have no Program State" ) )?; + ctx.get_or_default::< StartPointStack >().push( prog_state.pos - 1 ); + } + + Ok( () ) + } +} + +// + +crate::mod_interface! +{ + prelude use each_command; + prelude use each; +} diff --git a/module/blank/willbe_old/src/willbe_old/commands/end.rs b/module/blank/willbe_old/src/willbe_old/commands/end.rs new file mode 100644 index 0000000000..b7931a06dd --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/commands/end.rs @@ -0,0 +1,61 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use wca:: + { + Args, Props, + Context, + }; + use error_tools::{ Result, BasicError }; + + use crate::commands::{ StartPointStack, EndPointStack }; + + // ! TODO: Remove this command somehow + + /// End command declaration + pub fn end_command() -> wca::Command + { + wca::Command::former() + .hint( "Command that is end of a block or a program" ) + .phrase( "end" ) + .form() + } + + /// + /// End of loop/program + /// + + pub fn end( _ : ( Args, Props ), ctx : Context ) -> Result< () > + { + println!( "[LOG] end called" ); + + if let Some( startpoints ) = ctx.get_ref::< StartPointStack >() + { + if let Some( point ) = startpoints.last() + { + let prog_state = ctx.get_mut::< wca::RuntimeState >() + .ok_or_else( || BasicError::new( "Have no Program State" ) )?; + + let endpoints = ctx.get_or_default::< EndPointStack >(); + // if has no point at current instruction - push it + if endpoints.last() != Some( &( prog_state.pos - 1 ) ) + { + endpoints.push( prog_state.pos - 1 ); + } + + // Go to start point + prog_state.pos = *point; + } + } + + Ok( () ) + } +} + +// + +crate::mod_interface! +{ + prelude use end_command; + prelude use end; +} diff --git a/module/blank/willbe_old/src/willbe_old/commands/init.rs b/module/blank/willbe_old/src/willbe_old/commands/init.rs new file mode 100644 index 0000000000..ddfa273b42 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/commands/init.rs @@ -0,0 +1,43 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::commands; + + /// + /// Form CA commands grammar. + /// + + pub fn grammar_form() -> Vec< wca::Command > + { + vec! + [ + commands::each::each_command(), + commands::package::info::info_command(), + commands::package::publish::publish_command(), + commands::end::end_command(), + ] + } + + /// + /// Form CA commands executor. + /// + + pub fn executor_form() -> std::collections::HashMap< String, wca::Routine > + { + std::collections::HashMap::from( + [ + ( "each".to_owned(), wca::Routine::new_with_ctx( commands::each::each ) ), + ( "crate.info".to_owned(), wca::Routine::new_with_ctx( commands::package::info::info ) ), + ( "crate.publish".to_owned(), wca::Routine::new_with_ctx( commands::package::publish::publish ) ), + ( "end".to_owned(), wca::Routine::new_with_ctx( commands::end::end ) ), + ]) + } +} + +// + +crate::mod_interface! +{ + prelude use grammar_form; + prelude use executor_form; +} diff --git a/module/blank/willbe_old/src/willbe_old/commands/mod.rs b/module/blank/willbe_old/src/willbe_old/commands/mod.rs new file mode 100644 index 0000000000..5f0d00ec1c --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/commands/mod.rs @@ -0,0 +1,66 @@ +crate::mod_interface! +{ + /// Init aggregator commands. + prelude mod init; + + /// Works with crates + prelude mod package; + + /// Iterate over subject + prelude mod each; + + /// End of loop/program + prelude mod end; + + protected use super::init::protected::*; + + protected use super::private::StartPointStack; + protected use super::private::EndPointStack; +} + +mod private +{ + /// Allow to go back to the iterator + #[ derive( Debug, Default, Clone ) ] + pub struct StartPointStack( Vec< usize > ); + + impl std::ops::Deref for StartPointStack + { + type Target = Vec< usize >; + + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl std::ops::DerefMut for StartPointStack + { + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + /// Allow to go back to the end + #[ derive( Debug, Default, Clone ) ] + pub struct EndPointStack( Vec< usize > ); + + impl std::ops::Deref for EndPointStack + { + type Target = Vec< usize >; + + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl std::ops::DerefMut for EndPointStack + { + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } +} diff --git a/module/blank/willbe_old/src/willbe_old/commands/package/info.rs b/module/blank/willbe_old/src/willbe_old/commands/package/info.rs new file mode 100644 index 0000000000..30121caf50 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/commands/package/info.rs @@ -0,0 +1,80 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use std::env; + use wca:: + { + Args, Props, + Context, + }; + use error_tools::{ Result, for_app::format_err }; + + /// Info command declaration + pub fn info_command() -> wca::Command + { + wca::Command::former() + .hint( "Prints information about package" ) + .long_hint( "Prints information about package at current directory" ) + .phrase( "crate.info" ) + .form() + } + + /// + /// Prints information about package + /// + + pub fn info( _ : ( Args, Props ), ctx : Context ) -> Result< () > + { + println!( "[LOG] Called info command" ); + + // Get package from context or try to read package at current directory + let package = match ctx.get_ref::< Option< Package > >() + { + Some( Some( package ) ) => package.to_owned(), + None => + { + let path = env::current_dir().unwrap().to_owned(); + Package::try_from( path ) + .map_err( | _ | format_err!( "Package not found at current directory" ) )? + } + _ => return Ok( () ) + }; + + let info = PackageMetadata::try_from( package ) + .map_err( | _ | format_err!( "Can not parse package metadata" ) )?; + let info = info.all().to_owned(); + + println! + ( + r#" +Name: "{}" +Version: "{}" +Description: "{}" +Documentation: "{}" +License: "{}" +Readme: "{}" +Dependencies: {:?} +Location: "{}" + "#, + info.name, + info.version, + info.description.unwrap_or_else( || "Not found".to_string() ), + info.documentation.unwrap_or_else( || "Not found".to_string() ), + info.license.unwrap_or_else( || "Not found".to_string() ), + info.readme.map( String::from ).unwrap_or_else( || "Not found".to_string() ), + info.dependencies.iter().map( | d | &d.name ).collect::< Vec< _ > >(), + info.manifest_path.parent().unwrap() + ); + + Ok( () ) + } +} + +// + +crate::mod_interface! +{ + prelude use info_command; + prelude use info; +} diff --git a/module/blank/willbe_old/src/willbe_old/commands/package/mod.rs b/module/blank/willbe_old/src/willbe_old/commands/package/mod.rs new file mode 100644 index 0000000000..777f955a8c --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/commands/package/mod.rs @@ -0,0 +1,8 @@ +crate::mod_interface! +{ + /// Information about package + prelude mod info; + + /// Publish package + prelude mod publish; +} diff --git a/module/blank/willbe_old/src/willbe_old/commands/package/publish.rs b/module/blank/willbe_old/src/willbe_old/commands/package/publish.rs new file mode 100644 index 0000000000..622f34bbfb --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/commands/package/publish.rs @@ -0,0 +1,66 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::protected::*; + use std::env; + use wca:: + { + Args, Props, + Context, + }; + use error_tools::{ Result, for_app::format_err }; + + /// Publish command declaration + pub fn publish_command() -> wca::Command + { + wca::Command::former() + .hint( "Publish a package" ) + .long_hint( "Validate, runs tests and publish a package" ) + .phrase( "crate.publish" ) + .form() + } + + /// + /// Verify and publish a package + /// + + pub fn publish( _ : ( Args, Props ), ctx : Context ) -> Result< () > + { + println!( "[LOG] Called publish command" ); + + // Get package from context or try to read package at current directory + let package = match ctx.get_ref::< Option< Package > >() + { + Some( Some( package ) ) => package.to_owned(), + None => + { + let path = env::current_dir().unwrap().to_owned(); + Package::try_from( path ) + .map_err( | _ | format_err!( "Package not found at current directory" ) )? + } + _ => return Ok( () ) + }; + + let info = PackageMetadata::try_from( package ) + .map_err( | _ | format_err!( "Can not parse package metadata" ) )?; + + println! + ( + "=== Verification ===\nLicense: {}\nReadme: {}\nDocumentation: {}\nTests: {}", + if info.has_license() { "Yes" } else { "No" }, + if info.has_readme() { "Yes" } else { "No" }, + if info.has_documentation() { "Yes" } else { "No" }, + if info.is_tests_passed() { "Passed" } else { "Failed" } + ); + + Ok( () ) + } +} + +// + +crate::mod_interface! +{ + prelude use publish_command; + prelude use publish; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/entities/mod.rs b/module/blank/willbe_old/src/willbe_old/core/entities/mod.rs new file mode 100644 index 0000000000..768053c884 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/entities/mod.rs @@ -0,0 +1,10 @@ + +crate::mod_interface! +{ + /// Package + layer package; + /// Workspace + layer workspace; + /// Auxiliary entities + layer utility; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/entities/package/metadata.rs b/module/blank/willbe_old/src/willbe_old/core/entities/package/metadata.rs new file mode 100644 index 0000000000..3ba8640877 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/entities/package/metadata.rs @@ -0,0 +1,119 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::path::PathBuf; + + use cargo_metadata::MetadataCommand; + + use error_tools::{ BasicError, err }; + + use crate::Package; + + /// Package metadata + #[ derive( Debug ) ] + pub struct PackageMetadata + { + package : Package, + metadata : cargo_metadata::Package, + } + + impl TryFrom< PathBuf > for PackageMetadata + { + type Error = BasicError; + + fn try_from( value : PathBuf ) -> Result< Self, Self::Error > + { + let package = Package::try_from( value )?; + package.try_into() + } + } + + impl TryFrom< Package > for PackageMetadata + { + type Error = BasicError; + + fn try_from( value : Package ) -> Result< Self, Self::Error > + { + let path = value.path().join( "Cargo.toml" ); + let meta = MetadataCommand::new() + .manifest_path( &path ) + .no_deps() + .exec() + .map_err( | _ | err!( "Can not read metadata" ) )?; + + let metadata = meta.packages.iter() + .find( | p | p.manifest_path == path ) + .ok_or_else( || err!( "Can not parse metadata for current package" ) )? + .to_owned(); + Ok( Self + { + package : value, + metadata + }) + } + } + impl PackageMetadata + { + /// Returns name + pub fn name( &self ) -> &String + { + &self.metadata.name + } + + /// Returns version + pub fn version( &self ) -> String + { + self.metadata.version.to_string() + } + } + + impl PackageMetadata + { + /// Returns license from `Cargo.toml` + pub fn license( &self ) -> Option< String > + { + self.metadata.license.to_owned() + } + + /// Returns path to license file if exists + pub fn license_file( &self ) -> Option< PathBuf > + { + self.metadata.license_file.as_ref().map( | r | r.to_owned().into_std_path_buf() ) + } + + /// Returns path to Readme file + pub fn readme( &self ) -> Option< PathBuf > + { + self.metadata.readme.as_ref().map( | r | r.to_owned().into_std_path_buf() ) + } + + /// Returns url to documentation if it is exists + pub fn documentation( &self ) -> Option< String > + { + self.metadata.documentation.to_owned() + } + } + + impl PackageMetadata + { + /// Returns reference to Package + pub fn as_package( &self ) -> &Package + { + &self.package + } + + /// Returns all metadata + pub fn all( &self ) -> &cargo_metadata::Package + { + &self.metadata + } + } + +} + +// + +crate::mod_interface! +{ + prelude use PackageMetadata; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/entities/package/mod.rs b/module/blank/willbe_old/src/willbe_old/core/entities/package/mod.rs new file mode 100644 index 0000000000..62bf81332d --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/entities/package/mod.rs @@ -0,0 +1,10 @@ + +crate::mod_interface! +{ + /// Package + layer package; + /// Metadata + layer metadata; + /// Verification methods + layer verification; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/entities/package/package.rs b/module/blank/willbe_old/src/willbe_old/core/entities/package/package.rs new file mode 100644 index 0000000000..a455cd1cc1 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/entities/package/package.rs @@ -0,0 +1,53 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::path::PathBuf; + use toml::Value; + + use error_tools::{ BasicError, err }; + + /// Package + #[ derive( Debug, Clone ) ] + pub struct Package + { + path : PathBuf, + } + + impl TryFrom< PathBuf > for Package + { + type Error = BasicError; + + fn try_from( path : PathBuf ) -> Result< Self, Self::Error > + { + let config_str = std::fs::read_to_string( path.join( "Cargo.toml" ) ) + .map_err( | _ | err!( "Can not read \"Cargo.toml\"" ) )?; + let toml = config_str.parse::< Value >() + .map_err( | _ | err!( "Can not parse \"Cargo.toml\"" ) )?; + + if toml.get( "package" ).is_some() + { + Ok( Self{ path } ) + } + else + { + Err( err!( "\"package\" into \"Cargo.toml\" not found" ) ) + } + } + } + + impl Package + { + /// Gets path of package + pub fn path( &self ) -> &PathBuf + { + &self.path + } + } +} + +// + +crate::mod_interface! +{ + prelude use Package; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/entities/package/verification.rs b/module/blank/willbe_old/src/willbe_old/core/entities/package/verification.rs new file mode 100644 index 0000000000..0098940074 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/entities/package/verification.rs @@ -0,0 +1,65 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::process::Command; + + use crate::PackageMetadata; + + /// All package verification methods + pub trait Verification + { + /// Do all checks + fn check_all( &self ) -> bool + { + self.has_readme() + && self.has_documentation() + && self.has_license() + && self.is_tests_passed() + } + /// Check if readme exists + fn has_readme( &self ) -> bool; + /// Check if documentation exists + fn has_documentation( &self ) -> bool; + /// Check if the package has a license + fn has_license( &self ) -> bool; + /// Check if all tests is passed + fn is_tests_passed( &self ) -> bool; + } + + impl Verification for PackageMetadata + { + fn has_readme( &self ) -> bool + { + self.readme().is_some() + } + + fn has_documentation( &self ) -> bool + { + self.documentation().is_some() + } + + fn has_license( &self ) -> bool + { + self.license().is_some() + || + self.license_file().is_some() + } + + fn is_tests_passed( &self ) -> bool + { + let tests_output = Command::new( "cargo" ) + .current_dir( self.as_package().path() ) + .args([ "test" ]) + .output().unwrap(); + + tests_output.status.success() + } + } +} + +// + +crate::mod_interface! +{ + prelude use Verification; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/entities/utility.rs b/module/blank/willbe_old/src/willbe_old/core/entities/utility.rs new file mode 100644 index 0000000000..3968aad1af --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/entities/utility.rs @@ -0,0 +1,124 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use crate::{ Package, PackageMetadata }; + use iter_tools::prelude::*; + + /// Represent with which order strategy to iterate over packages + #[ derive( Debug, Clone, Copy ) ] + pub enum OrderStrategy + { + /// Alphabetical by package name + Alphabetical, + /// Based on their dependencies + Topological, + /// Shuffle packages + Random, + } + + /// This trait defines a method to sort packages by selected order strategy + pub trait Ordered : Iterator + where + Vec< Package > : FromIterator< < Self as Iterator >::Item > + { + /// Collect all iterator elements into a sorted vector + fn ordered( self, order : OrderStrategy ) -> Vec< Package > + where + Self : Sized + { + let v : Vec< Package > = self.collect(); + + match order + { + OrderStrategy::Alphabetical => alphabetical( v ), + OrderStrategy::Topological => toposort( v ), + OrderStrategy::Random => shuffle( v ), + } + } + + /// Returns iterator over sorted Packages + fn ordered_iter( self, order : OrderStrategy ) -> Box< dyn Iterator< Item = Package > > + where + Self : Sized + { + Box::new( self.ordered( order ).into_iter() ) + } + } + + fn alphabetical( packages : Vec< Package > ) -> Vec< Package > + { + packages.iter().cloned() + .filter_map( | p | + { + PackageMetadata::try_from( p ).ok() + }) + + .sorted_by_key( | meta | meta.name().to_owned() ) + + .map( | meta | meta.as_package().to_owned() ) + .collect_vec() + } + + fn toposort( packages : Vec< Package > ) -> Vec< Package > + { + use petgraph::Graph; + use cargo_metadata::DependencyKind; + use std::collections::HashMap; + + let ( deps, package_map ) = packages.iter() + .filter_map( | p | PackageMetadata::try_from( p.to_owned() ).ok() ) + .fold( ( Graph::new(), HashMap::new() ), | ( mut deps, mut packages ), meta | + { + packages.insert( meta.name().to_owned(), meta.as_package().to_owned() ); + + let root_node = if let Some( node ) = deps.node_indices().find( | i | deps[ *i ] == meta.name().to_owned() ) + { node } + else + { deps.add_node( meta.name().to_owned() ) }; + + for dep in &meta.all().dependencies + { + if dep.path.is_some() && dep.kind != DependencyKind::Development + { + let dep_node = if let Some( node ) = deps.node_indices().find( | i | deps[ *i ] == dep.name ) + { node } + else + { deps.add_node( dep.name.to_owned() ) }; + + deps.add_edge( root_node, dep_node, () ); + } + } + + ( deps, packages ) + }); + + let sorted = petgraph::algo::toposort( &deps, None ).unwrap(); + sorted.iter() + .rev() + .map( | &dep_idx | deps.node_weight( dep_idx ).unwrap().to_owned() ) + .filter_map( | name | package_map.get( &name ) ) + .cloned().collect::< Vec< Package > >() + } + + fn shuffle( mut packages : Vec< Package > ) -> Vec< Package > + { + use rand::seq::SliceRandom; + + let mut rng = rand::thread_rng(); + packages.shuffle( &mut rng ); + + packages + } + + + impl< T : ?Sized > Ordered for T + where T : Iterator, Vec< Package >: FromIterator< < T as Iterator >::Item > {} +} + +// + +crate::mod_interface! +{ + prelude use OrderStrategy; + prelude use Ordered; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/entities/workspace.rs b/module/blank/willbe_old/src/willbe_old/core/entities/workspace.rs new file mode 100644 index 0000000000..941f65753b --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/entities/workspace.rs @@ -0,0 +1,95 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::path::PathBuf; + use toml::Value; + + use error_tools::{ BasicError, err }; + + use crate::{ Package, unique_walk }; + + /// Workspace + #[ derive( Debug, Clone ) ] + pub struct Workspace + { + path : PathBuf, + } + + impl TryFrom< PathBuf > for Workspace + { + type Error = BasicError; + + fn try_from( path : PathBuf ) -> Result< Self, Self::Error > + { + let config_str = std::fs::read_to_string( path.join( "Cargo.toml" ) ) + .map_err( | _ | err!( "Can not read \"Cargo.toml\"" ) )?; + let toml = config_str.parse::< Value >() + .map_err( | _ | err!( "Can not parse \"Cargo.toml\"" ) )?; + + if toml.get( "workspace" ).is_some() + { + Ok( Self{ path } ) + } + else + { + Err( err!( "\"workspace\" into \"Cargo.toml\" not found" ) ) + } + } + } + + impl Workspace + { + /// Gets list of packages into workspace + pub fn packages( &self ) -> Vec< Package > + { + let config_str = std::fs::read_to_string( self.path.join( "Cargo.toml" ) ).unwrap(); + let toml = config_str.parse::< Value >().unwrap(); + + // iterate over members into workspace + toml[ "workspace" ] + // members can be doesn't setted + .get( "members" ) + .unwrap_or( &Value::Array( vec![] ) ).as_array() + .unwrap_or( &vec![] ) + .iter() + // fold all packages from members + .fold( vec![], | mut acc, member | + { + let packages_paths = unique_walk + ( + self.path.to_owned(), + &[ member.as_str().unwrap().to_string() ] + ); + + packages_paths + .fold( &mut acc, | acc, package_path | + { + if let Ok( package ) = Package::try_from( package_path.to_owned() ) + { + acc.push( package ); + } + // workspaces into workspace + else if let Ok( workspace ) = Workspace::try_from( package_path ) + { + acc.extend( workspace.packages() ); + } + acc + }); + acc + }) + } + + /// iterate over packages into workspace + pub fn packages_iterate( &self ) -> impl Iterator< Item = Package > + { + self.packages().into_iter() + } + } +} + +// + +crate::mod_interface! +{ + prelude use Workspace; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/iterators.rs b/module/blank/willbe_old/src/willbe_old/core/iterators.rs new file mode 100644 index 0000000000..191d28c61f --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/iterators.rs @@ -0,0 +1,36 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::path::PathBuf; + use crate::*; + + /// Iterate over all packages by PathBuf + pub fn packages_iterate( path : PathBuf ) -> Box< dyn Iterator< Item = Package > > + { + if let Ok( package ) = Package::try_from( path.to_owned() ) + { + return Box::new( Some( package ).into_iter() ) + } + + if let Ok( workspace ) = Workspace::try_from( path ) + { + return Box::new( workspace.packages_iterate() ) + } + + Box::new( None.into_iter() ) + } + + /// Iterate over workspaces iterator + pub fn workspaces_packages_iterate( workspaces : impl Iterator< Item = Workspace > ) -> impl Iterator< Item = Package > + { + workspaces.flat_map( move | workspace | workspace.packages_iterate() ) + } +} + +// + +crate::mod_interface! +{ + prelude use packages_iterate; + prelude use workspaces_packages_iterate; +} diff --git a/module/blank/willbe_old/src/willbe_old/core/mod.rs b/module/blank/willbe_old/src/willbe_old/core/mod.rs new file mode 100644 index 0000000000..23c69db43e --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/core/mod.rs @@ -0,0 +1,9 @@ + +crate::mod_interface! +{ + /// Entities of the program + layer entities; + + /// Iterators over packages + layer iterators; +} diff --git a/module/blank/willbe_old/src/willbe_old/files.rs b/module/blank/willbe_old/src/willbe_old/files.rs new file mode 100644 index 0000000000..19e480b1c7 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/files.rs @@ -0,0 +1,34 @@ +/// Internal namespace. +pub( crate ) mod private +{ + use std::path::{ Path, PathBuf }; + + use path_absolutize::*; + + use iter_tools::Itertools; + + /// + /// Iterate over unique files in directory using globs + /// + + pub fn unique_walk< P, S >( base_dir : P, patterns : &[ S ] ) -> impl Iterator< Item = PathBuf > + where + P: AsRef< Path >, + S: AsRef< str >, + { + globwalk::GlobWalkerBuilder::from_patterns( base_dir, patterns ) + .follow_links( true ) + .build().unwrap() + .into_iter() + .filter_map( Result::ok ) + .filter_map( | s | s.path().absolutize().map( | p | p.to_path_buf() ).ok() ) + .unique() + } +} + +// + +crate::mod_interface! +{ + prelude use unique_walk; +} diff --git a/module/blank/willbe_old/src/willbe_old/willbe_entry.rs b/module/blank/willbe_old/src/willbe_old/willbe_entry.rs new file mode 100644 index 0000000000..a3c1823a48 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/willbe_entry.rs @@ -0,0 +1,34 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/wpublisher/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +//! +//! ___. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_imports ) ] +use ::willbe_old::*; + +// + +#[ cfg( not( feature = "no_std" ) ) ] +fn main() -> error_tools::Result< () > +{ + let args = std::env::args().skip( 1 ).collect::< Vec< String > >(); + + let ca = wca::CommandsAggregator::former() + .grammar( commands::grammar_form() ) + .executor( commands::executor_form() ) + .perform(); + + Ok( ca.perform( if args.is_empty() { "".to_owned() } else { args.join( " " ) + " .end" } )? ) +} + +#[ cfg( feature = "no_std" ) ] +fn main() {} diff --git a/module/blank/willbe_old/src/willbe_old/willbe_lib.rs b/module/blank/willbe_old/src/willbe_old/willbe_lib.rs new file mode 100644 index 0000000000..bfbcd09466 --- /dev/null +++ b/module/blank/willbe_old/src/willbe_old/willbe_lib.rs @@ -0,0 +1,36 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/_blank/latest/_blank/" ) ] +// #![ deny( rust_2018_idioms ) ] +// #![ deny( missing_debug_implementations ) ] +// #![ deny( missing_docs ) ] + +// #![ feature( type_name_of_val ) ] +// #![ feature( trace_macros ) ] + +//! +//! ___. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +// +use mod_interface::mod_interface; + +mod_interface! +{ + /// Features of Application Programming Interface that 100% should be implemented + #[ cfg( not( feature = "no_std" ) ) ] + layer core; + + /// Library of utility to work with commands. + #[ cfg( not( feature = "no_std" ) ) ] + layer commands; + + /// Operate over files. + #[ cfg( not( feature = "no_std" ) ) ] + layer files; + + protected( crate ) use ::wtools::prelude::*; +} diff --git a/module/blank/willbe_old/tests/smoke_test.rs b/module/blank/willbe_old/tests/smoke_test.rs new file mode 100644 index 0000000000..8a9c649677 --- /dev/null +++ b/module/blank/willbe_old/tests/smoke_test.rs @@ -0,0 +1,15 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +#[ ignore ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/empty/.gitignore b/module/blank/willbe_old/tests/willbe_old/_asset/empty/.gitignore new file mode 100644 index 0000000000..44c5ea8fa7 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/empty/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/package/Cargo.toml new file mode 100644 index 0000000000..7f16e6e19e --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/package/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "willbe_verified_package" +version = "0.1.0" +edition = "2021" +documentation = "Documentation text" +license = "MIT" +readme = "Readme.md" + +[dependencies] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package/License b/module/blank/willbe_old/tests/willbe_old/_asset/package/License new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package/Readme.md b/module/blank/willbe_old/tests/willbe_old/_asset/package/Readme.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/package/src/lib.rs new file mode 100644 index 0000000000..1ccf57060e --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/package/src/lib.rs @@ -0,0 +1,15 @@ +/// Adds two numbers and returns result +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package/src/main.rs b/module/blank/willbe_old/tests/willbe_old/_asset/package/src/main.rs new file mode 100644 index 0000000000..80a1832bfa --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/package/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/Cargo.toml new file mode 100644 index 0000000000..766bac3bee --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "willbe_no_verified_package" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/lib.rs new file mode 100644 index 0000000000..20cb385493 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/lib.rs @@ -0,0 +1,8 @@ +#[cfg(test)] +mod tests { + #[test] + fn failed() + { + assert!( false ); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/main.rs b/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/main.rs new file mode 100644 index 0000000000..80a1832bfa --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/package_no_verified/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/Cargo.toml new file mode 100644 index 0000000000..ad7fb73a88 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +resolver = "2" +members = [ + "module/*", +] +exclude = [ + "*", +] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/Cargo.toml new file mode 100644 index 0000000000..a183e1b93a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "willbe_with_deps_module1" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module1/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/Cargo.toml new file mode 100644 index 0000000000..e362e58a66 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "willbe_with_deps_module2" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +willbe_with_deps_module1 = { version = "*", path = "../module1" } \ No newline at end of file diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module2/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/Cargo.toml new file mode 100644 index 0000000000..f0302e1626 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "willbe_with_deps_module3" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +willbe_with_deps_module2 = { version = "*", path = "../module2" } \ No newline at end of file diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspace_with_deps/module/module3/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/Cargo.toml new file mode 100644 index 0000000000..c5fc8a2bc2 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +resolver = "2" +members = [ + "workspace1", + "workspace2", +] +exclude = [ + "*", +] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/Cargo.toml new file mode 100644 index 0000000000..ad7fb73a88 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +resolver = "2" +members = [ + "module/*", +] +exclude = [ + "*", +] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/Cargo.toml new file mode 100644 index 0000000000..ca345d6e39 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "willbe_workspace1_module1" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module1/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/Cargo.toml new file mode 100644 index 0000000000..d7de79e725 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "willbe_workspace1_module2" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] \ No newline at end of file diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace1/module/module2/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/Cargo.toml new file mode 100644 index 0000000000..ad7fb73a88 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +resolver = "2" +members = [ + "module/*", +] +exclude = [ + "*", +] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/Cargo.toml new file mode 100644 index 0000000000..1e5b37708b --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "willbe_workspace2_module3" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module3/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/Cargo.toml new file mode 100644 index 0000000000..ce7cc9e559 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "willbe_workspace2_module4" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module4/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/Cargo.toml b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/Cargo.toml new file mode 100644 index 0000000000..ca174d8156 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "willbe_workspace2_module5" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/src/lib.rs b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/src/lib.rs new file mode 100644 index 0000000000..3b9acffd5a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/_asset/workspaces/workspace2/module/module5/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/from.rs b/module/blank/willbe_old/tests/willbe_old/tests/from.rs new file mode 100644 index 0000000000..0b3a81d171 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/from.rs @@ -0,0 +1,38 @@ +use super::*; + +#[ test ] +fn from_empty_asset() +{ + let asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "empty" ) ); + let path = asset.path_buf(); + + let package = Package::try_from( path.to_owned() ); + assert!( package.is_err() ); + + let workspace = Workspace::try_from( path.to_owned() ); + assert!( workspace.is_err() ); +} + +#[ test ] +fn package_from_path() +{ + let asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ); + let path = asset.path_buf(); + + let package = Package::try_from( path.to_owned() ); + + assert!( package.is_ok() ); + assert_eq!( *path, *package.unwrap().path() ); +} + +#[ test ] +fn workspace_from_path() +{ + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ); + let package_path = package_asset.path_buf(); + assert!( Workspace::try_from( package_path.to_owned() ).is_err() ); + + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1" ) ); + let workspace_path = workspace_asset.path_buf(); + assert!( Workspace::try_from( workspace_path.to_owned() ).is_ok() ); +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/integration/each.rs b/module/blank/willbe_old/tests/willbe_old/tests/integration/each.rs new file mode 100644 index 0000000000..21ede7825a --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/integration/each.rs @@ -0,0 +1,130 @@ +use super::*; + +#[ test ] +fn many_workspaces_each_info() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".each .crate.info" ); + + cmd + .assert() + .success() + .stdout + ( + predicate::str::contains( "Name: \"willbe_workspace1_module1\"" ).count( 1 ) + .and + ( + predicate::str::contains( "Name: \"willbe_workspace1_module2\"" ).count( 1 ) + ) + .and + ( + predicate::str::contains( "Name: \"willbe_workspace2_module3\"" ).count( 1 ) + ) + .and + ( + predicate::str::contains( "Name: \"willbe_workspace2_module4\"" ).count( 1 ) + ) + .and + ( + predicate::str::contains( "Name: \"willbe_workspace2_module5\"" ).count( 1 ) + ) + ); + + Ok( () ) +} + +#[ test ] +fn workspace_each_info() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspace_with_deps" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".each .crate.info" ); + + cmd + .assert() + .success() + .stdout + ( + predicate::str::contains( "Name: \"willbe_with_deps_module1\"" ).count( 1 ) + .and + ( + predicate::str::contains( "Name: \"willbe_with_deps_module2\"" ).count( 1 ) + ) + .and + ( + predicate::str::contains( "Name: \"willbe_with_deps_module3\"" ).count( 1 ) + ) + ); + + Ok( () ) +} + +#[ test ] +fn single_package_each_info() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".each .crate.info" ); + + cmd + .assert() + .success() + .stdout + ( + predicate::str::contains( "Name: \"willbe_verified_package\"" ).count( 1 ) + ); + + Ok( () ) +} + +#[ test ] +fn empty_path_each_info() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "empty" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".each .crate.info" ); + + cmd + .assert() + .success() + .stdout + ( + predicate::str::contains( "Any package was found at current directory" ) + ); + + Ok( () ) +} + +#[ test ] +fn another_command_after_each() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".each .crate.info .end .crate.info" ); + + cmd + .assert() + .success() + .stdout + ( + predicate::str::contains( "Name: \"willbe_verified_package\"" ).count( 2 ) + ); + + Ok( () ) +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/integration/info.rs b/module/blank/willbe_old/tests/willbe_old/tests/integration/info.rs new file mode 100644 index 0000000000..f9957e9942 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/integration/info.rs @@ -0,0 +1,78 @@ +use super::*; + +#[ test ] +fn package_info() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".crate.info" ); + + cmd + .assert() + .success() + .stdout + ( + predicate::str::contains( "Name: \"willbe_verified_package\"" ) + .and + ( + predicate::str::contains( "Version: \"0.1.0\"" ) + ) + .and + ( + predicate::str::contains( "Description: \"Not found\"" ) + ) + .and + ( + predicate::str::contains( "Documentation: \"Documentation text\"" ) + ) + .and + ( + predicate::str::contains( "License: \"MIT\"" ) + ) + .and + ( + predicate::str::contains( "Dependencies: []" ) + ) + ); + + Ok( () ) +} + +#[ test ] +fn workspace_path_info() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".crate.info" ); + + cmd + .assert() + .failure() + .stderr( predicate::str::contains( "Package not found at current directory" ) ); + + Ok( () ) +} + +#[ test ] +fn empty_path_info() -> Result< (), Box< dyn std::error::Error > > +{ + let mut cmd = Command::cargo_bin( MODULE_NAME )?; + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "empty" ) ).copied(); + let package_path = package_asset.path_buf(); + + cmd.current_dir( package_path ); + cmd.arg( ".crate.info" ); + + cmd + .assert() + .failure() + .stderr( predicate::str::contains( "Package not found at current directory" ) ); + + Ok( () ) +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/integration/mod.rs b/module/blank/willbe_old/tests/willbe_old/tests/integration/mod.rs new file mode 100644 index 0000000000..6ac91b348b --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/integration/mod.rs @@ -0,0 +1,8 @@ +use super::*; +use assert_cmd::Command; +use predicates::prelude::*; + +const MODULE_NAME : &str = "willbe_old"; + +mod each; +mod info; diff --git a/module/blank/willbe_old/tests/willbe_old/tests/iterator.rs b/module/blank/willbe_old/tests/willbe_old/tests/iterator.rs new file mode 100644 index 0000000000..38354cbc40 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/iterator.rs @@ -0,0 +1,149 @@ +use super::*; + +#[ test ] +fn over_workspace() +{ + use std::collections::HashSet; + + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1" ) ); + let workspace_path = workspace_asset.path_buf(); + let workspace = Workspace::try_from( workspace_path.to_owned() ).unwrap(); + // `workspace.packages()` and `workspace.packages_iterate().collect::< Vec< _ > >()` is the same + let packages = workspace.packages(); + + let expected = HashSet::from([ "willbe_workspace1_module1".to_owned(), "willbe_workspace1_module2".to_owned() ]); + + assert_eq!( expected.len(), packages.len() ); + assert_eq! + ( + expected, + packages.iter().cloned() + .filter_map( | p | + { + PackageMetadata::try_from( p ).ok() + }) + .map( | meta | meta.name().to_owned() ) + .collect::< HashSet< _ > >() + ); +} + +#[ test ] +fn over_workspaces_iterator() +{ + use std::collections::HashSet; + + let assets = vec! + [ + Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1" ) ), + Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace2" ) ), + ]; + let workspaces = assets.iter() + .map( | asset | Workspace::try_from( asset.path_buf().to_owned() ) ) + .filter_map( Result::ok ) + .collect::< Vec< _ > >(); + + let packages = workspaces_packages_iterate( workspaces.into_iter() ) + .collect::< Vec< _ > >(); + + let expected = HashSet::from( + [ + "willbe_workspace1_module1".to_owned(), + "willbe_workspace1_module2".to_owned(), + + "willbe_workspace2_module3".to_owned(), + "willbe_workspace2_module4".to_owned(), + "willbe_workspace2_module5".to_owned(), + ]); + + assert_eq!( expected.len(), packages.len() ); + assert_eq! + ( + expected, + packages.iter().cloned() + .filter_map( | p | + { + PackageMetadata::try_from( p ).ok() + }) + .map( | meta | meta.name().to_owned() ) + .collect::< HashSet< _ > >() + ); +} + +#[ test ] +fn over_empty_path() +{ + let empty_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "empty" ) ); + let empty_path = empty_asset.path_buf(); + let packages = packages_iterate( empty_path.to_owned() ).collect::< Vec< _ > >(); + + assert!( packages.is_empty() ); +} + +#[ test ] +fn over_single_package_path() +{ + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ).copied(); + let package_path = package_asset.path_buf(); + let package = packages_iterate( package_path.to_owned() ).collect::< Vec< _ > >(); + + assert_eq!( 1, package.len() ); + assert_eq!( "willbe_verified_package", PackageMetadata::try_from( package[ 0 ].clone() ).unwrap().all().name.as_str() ); +} + +#[ test ] +fn over_single_workspace_path() +{ + use std::collections::HashSet; + + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1" ) ).copied(); + let workspace_path = workspace_asset.path_buf(); + let packages = packages_iterate( workspace_path.to_owned() ).collect::< Vec< _ > >(); + + let expected = HashSet::from([ "willbe_workspace1_module1".to_owned(), "willbe_workspace1_module2".to_owned() ]); + + assert_eq!( expected.len(), packages.len() ); + assert_eq! + ( + expected, + packages.iter().cloned() + .filter_map( | p | + { + PackageMetadata::try_from( p ).ok() + }) + .map( | meta | meta.name().to_owned() ) + .collect::< HashSet< _ > >() + ); +} + +#[ test ] +fn over_workspaces_root_path() +{ + use std::collections::HashSet; + + let many_workspaces_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces" ) ).copied(); + let many_workspaces_path = many_workspaces_asset.path_buf(); + let packages = packages_iterate( many_workspaces_path.to_owned() ).collect::< Vec< _ > >(); + + let expected = HashSet::from( + [ + "willbe_workspace1_module1".to_owned(), + "willbe_workspace1_module2".to_owned(), + + "willbe_workspace2_module3".to_owned(), + "willbe_workspace2_module4".to_owned(), + "willbe_workspace2_module5".to_owned(), + ]); + + assert_eq!( expected.len(), packages.len() ); + assert_eq! + ( + expected, + packages.iter().cloned() + .filter_map( | p | + { + PackageMetadata::try_from( p ).ok() + }) + .map( | meta | meta.name().to_owned() ) + .collect::< HashSet< _ > >() + ); +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/metadata.rs b/module/blank/willbe_old/tests/willbe_old/tests/metadata.rs new file mode 100644 index 0000000000..efd11d457c --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/metadata.rs @@ -0,0 +1,24 @@ +use super::*; + +#[ test ] +fn try_get_from_empty_asset() +{ + let empty_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "empty" ) ).copied(); + let empty_asset_path = empty_asset.path_buf(); + + let meta = PackageMetadata::try_from( empty_asset_path.to_owned() ); + + assert!( meta.is_err() ); +} + +#[ test ] +fn get_info() +{ + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ).copied(); + let package_path = package_asset.path_buf(); + + let meta = PackageMetadata::try_from( package_path.to_owned() ).unwrap(); + + assert!( !meta.name().is_empty() ); + assert!( !meta.version().is_empty() ); +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/mod.rs b/module/blank/willbe_old/tests/willbe_old/tests/mod.rs new file mode 100644 index 0000000000..20e46e0375 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/mod.rs @@ -0,0 +1,11 @@ +use super::*; +use utility::*; + +const ASSET_PATH : &str = concat!( env!("CARGO_MANIFEST_DIR"), "/tests/willbe_old/_asset" ); + +mod integration; +mod ordering; +mod from; +mod iterator; +mod verification; +mod metadata; diff --git a/module/blank/willbe_old/tests/willbe_old/tests/ordering/mod.rs b/module/blank/willbe_old/tests/willbe_old/tests/ordering/mod.rs new file mode 100644 index 0000000000..683c5f15eb --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/ordering/mod.rs @@ -0,0 +1,6 @@ +use super::*; + +//? Write test for iteration over path has no reason because it delegates everything to another functions + +mod workspace; +mod through_workspaces; diff --git a/module/blank/willbe_old/tests/willbe_old/tests/ordering/through_workspaces.rs b/module/blank/willbe_old/tests/willbe_old/tests/ordering/through_workspaces.rs new file mode 100644 index 0000000000..58ab7788a4 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/ordering/through_workspaces.rs @@ -0,0 +1,74 @@ +use super::*; + +#[ test ] +fn alphabetical() +{ + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1" ) ).copied(); + let workspace_path = workspace_asset.path_buf(); + let first_workspace = Workspace::try_from( workspace_path.to_owned() ).unwrap(); + + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace2" ) ).copied(); + let workspace_path = workspace_asset.path_buf(); + let second_workspace = Workspace::try_from( workspace_path.to_owned() ).unwrap(); + + let source = + [ + &second_workspace, // module3, module4, module 5 + &first_workspace, // module1, module2 + ]; + + let expected = + [ + "willbe_workspace1_module1", + "willbe_workspace1_module2", + + "willbe_workspace2_module3", + "willbe_workspace2_module4", + "willbe_workspace2_module5" + ]; + + assert_eq! + ( + expected.iter().map( | m | m.to_string() ).collect::< Vec< _ > >(), + workspaces_packages_iterate( source.into_iter().cloned() ) + + .ordered_iter( OrderStrategy::Alphabetical ) + + .filter_map( | p | PackageMetadata::try_from( p ).ok() ) + .map( | p | p.name().to_owned() ) + .collect::< Vec< _ > >() + ); +} + +#[ test ] +fn random() +{ + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1" ) ).copied(); + let workspace_path = workspace_asset.path_buf(); + let first_workspace = Workspace::try_from( workspace_path.to_owned() ).unwrap(); + + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace2" ) ).copied(); + let workspace_path = workspace_asset.path_buf(); + let second_workspace = Workspace::try_from( workspace_path.to_owned() ).unwrap(); + + let source = + [ + &second_workspace, // module3, module4, module 5 + &first_workspace, // module1, module2 + ]; + + dbg! + ( + workspaces_packages_iterate( source.into_iter().cloned() ) + + .ordered( OrderStrategy::Random ) + + .iter().cloned() + .filter_map( | p | PackageMetadata::try_from( p ).ok() ) + .map( | p | p.name().to_owned() ) + .collect::< Vec< _ > >() + ); + + // TODO: make some check. Eg: source is not equal to ordered, but... It may be equal because random + assert!( true ); +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/ordering/workspace.rs b/module/blank/willbe_old/tests/willbe_old/tests/ordering/workspace.rs new file mode 100644 index 0000000000..644fef1118 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/ordering/workspace.rs @@ -0,0 +1,103 @@ +use super::*; + +#[ test ] +fn alphabetical() +{ + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1/module/module1" ) ).copied(); + let package_path = package_asset.path_buf(); + let first_package = Package::try_from( package_path.to_owned() ).unwrap(); + + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1/module/module2" ) ).copied(); + let package_path = package_asset.path_buf(); + let second_package = Package::try_from( package_path.to_owned() ).unwrap(); + + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace2/module/module3" ) ).copied(); + let package_path = package_asset.path_buf(); + let third_package = Package::try_from( package_path.to_owned() ).unwrap(); + + let source = + [ + &second_package, // module2 + &first_package, // module1 + &third_package, // module3 + ]; + + let expected = vec![ &first_package, &second_package, &third_package ]; + + assert_eq! + ( + expected.iter().map( | p | p.path().to_owned() ).collect::< Vec< _ > >(), + source.into_iter().cloned() + + .ordered_iter( OrderStrategy::Alphabetical ) + + .map( | p | p.path().to_owned() ).collect::< Vec< _ > >() + ); +} + +#[ test ] +fn topological() +{ + let workspace_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspace_with_deps" ) ).copied(); + let workspace_path = workspace_asset.path_buf(); + let first_package = Package::try_from( workspace_path.to_owned().join( "module/module1" ) ).unwrap(); + let second_package = Package::try_from( workspace_path.to_owned().join( "module/module2" ) ).unwrap(); + let third_package = Package::try_from( workspace_path.to_owned().join( "module/module3" ) ).unwrap(); + + let source = + [ + &third_package, // module3 dependent on module2 + &first_package, // module1 + &second_package, // module2 dependent on module1 + ]; + + let expected = vec![ &first_package, &second_package, &third_package ]; + + assert_eq! + ( + expected.iter().map( | p | p.path().to_owned() ).collect::< Vec< _ > >(), + source.into_iter().cloned() + + .ordered_iter( OrderStrategy::Topological ) + + .map( | p | p.path().to_owned() ).collect::< Vec< _ > >() + ); +} + +#[ test ] +fn random() +{ + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1/module/module1" ) ).copied(); + let package_path = package_asset.path_buf(); + let first_package = Package::try_from( package_path.to_owned() ).unwrap(); + + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace1/module/module2" ) ).copied(); + let package_path = package_asset.path_buf(); + let second_package = Package::try_from( package_path.to_owned() ).unwrap(); + + let package_asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "workspaces/workspace2/module/module3" ) ).copied(); + let package_path = package_asset.path_buf(); + let third_package = Package::try_from( package_path.to_owned() ).unwrap(); + + let source = + [ + &second_package, // module2 + &first_package, // module1 + &third_package, // module3 + ]; + + dbg! + ( + source.into_iter().cloned() + + .ordered( OrderStrategy::Random ) + + .iter().cloned() + .filter_map( | p | PackageMetadata::try_from( p ).ok() ) + .map( | p | p.name().to_owned() ) + .collect::< Vec< _ > >() + ); + + // TODO: make some check. Eg: source is not equal to ordered, but... It may be equal because random + assert!( true ); +} diff --git a/module/blank/willbe_old/tests/willbe_old/tests/verification.rs b/module/blank/willbe_old/tests/willbe_old/tests/verification.rs new file mode 100644 index 0000000000..091a678ed3 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/tests/verification.rs @@ -0,0 +1,26 @@ +use super::*; + +#[ test ] +fn verified() +{ + let asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package" ) ).copied(); + let path = asset.path_buf(); + + let meta = PackageMetadata::try_from( path.to_owned() ).unwrap(); + + assert!( meta.check_all() ); +} + +#[ test ] +fn no_verified() +{ + let asset = Asset::from( PathBuf::from( ASSET_PATH ).join( "package_no_verified" ) ).copied(); + let path = asset.path_buf(); + + let meta = PackageMetadata::try_from( path.to_owned() ).unwrap(); + + assert!( !meta.has_license() ); + assert!( !meta.has_readme() ); + assert!( !meta.has_documentation() ); + assert!( !meta.is_tests_passed() ); +} diff --git a/module/blank/willbe_old/tests/willbe_old/utility.rs b/module/blank/willbe_old/tests/willbe_old/utility.rs new file mode 100644 index 0000000000..9b5a83b0ea --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/utility.rs @@ -0,0 +1,71 @@ +use std::{ io, fs }; +use std::path::Path; + +pub use std::path::PathBuf; + +#[ derive( Debug ) ] +pub struct Asset +{ + remove_after_use : bool, + path : PathBuf, +} + +impl From< PathBuf > for Asset +{ + fn from( path : PathBuf ) -> Self + { + Self{ remove_after_use : false, path } + } +} + +impl Asset +{ + pub fn path_buf( &self ) -> &PathBuf + { + &self.path + } + + pub fn copied( mut self ) -> Self + { + let tmp_dir = tempfile::tempdir().unwrap(); + + Self::copy_dir_all( &self.path, &tmp_dir ).unwrap(); + self.path = tmp_dir.into_path(); + self.remove_after_use = true; + + self + } +} + +impl Asset +{ + fn copy_dir_all( src : impl AsRef< Path >, dst : impl AsRef< Path > ) -> io::Result< () > + { + fs::create_dir_all(&dst)?; + for entry in fs::read_dir(src)? + { + let entry = entry?; + let ty = entry.file_type()?; + if ty.is_dir() + { + Asset::copy_dir_all( entry.path(), dst.as_ref().join( entry.file_name() ) )?; + } else + { + fs::copy( entry.path(), dst.as_ref().join( entry.file_name() ) )?; + } + } + Ok( () ) + } +} + +impl Drop for Asset +{ + fn drop( &mut self ) + { + if self.remove_after_use + { + fs::remove_dir_all( &self.path ) + .expect( &format!( "Can not delete \"{}\"", &self.path.display() ) ) + } + } +} diff --git a/module/blank/willbe_old/tests/willbe_old/willbe_test.rs b/module/blank/willbe_old/tests/willbe_old/willbe_test.rs new file mode 100644 index 0000000000..2e70508245 --- /dev/null +++ b/module/blank/willbe_old/tests/willbe_old/willbe_test.rs @@ -0,0 +1,7 @@ +use willbe_old::*; + +#[ cfg( not( feature = "no_std" ) ) ] +mod utility; + +#[ cfg( not( feature = "no_std" ) ) ] +mod tests; diff --git a/module/blank/wlang/Cargo.toml b/module/blank/wlang/Cargo.toml new file mode 100644 index 0000000000..828d17a7c3 --- /dev/null +++ b/module/blank/wlang/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "wlang" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/wlang" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/wlang" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/wlang" +description = """ +Wlang. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] +include = [ + "/rust/impl/_blank", + "/Cargo.toml", + "/Readme.md", + "/License", +] + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [] + +[dependencies] + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/blank/wlang/License b/module/blank/wlang/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/blank/wlang/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/blank/wlang/Readme.md b/module/blank/wlang/Readme.md new file mode 100644 index 0000000000..cccb1180b6 --- /dev/null +++ b/module/blank/wlang/Readme.md @@ -0,0 +1,30 @@ + + +# Module :: wlang + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wlang_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wlang_push.yml) [![docs.rs](https://img.shields.io/docsrs/wlang?color=e3e8f0&logo=docs.rs)](https://docs.rs/wlang) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Wlang. + +### Basic use-case + + + +```rust +``` + +### To add to your project + +```bash +cargo add wlang +``` + +### Try out from the repository + +``` shell test +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/wlang_trivial +cargo run +``` diff --git a/module/blank/wlang/src/empty_lib.rs b/module/blank/wlang/src/empty_lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/blank/wlang/src/standard_lib.rs b/module/blank/wlang/src/standard_lib.rs new file mode 100644 index 0000000000..656b3eb36e --- /dev/null +++ b/module/blank/wlang/src/standard_lib.rs @@ -0,0 +1,46 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/_blank/latest/_blank/" ) ] + +//! +//! ___. +//! + +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ +} + +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Parented namespace of the module. +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +pub mod exposed +{ +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +pub mod prelude +{ +} diff --git a/module/blank/wlang/tests/smoke_test.rs b/module/blank/wlang/tests/smoke_test.rs new file mode 100644 index 0000000000..fddef25d11 --- /dev/null +++ b/module/blank/wlang/tests/smoke_test.rs @@ -0,0 +1,15 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +#[ ignore ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/blank/wlang/tests/tests.rs b/module/blank/wlang/tests/tests.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/core/clone_dyn/Cargo.toml b/module/core/clone_dyn/Cargo.toml new file mode 100644 index 0000000000..0c2804d339 --- /dev/null +++ b/module/core/clone_dyn/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "clone_dyn" +version = "0.18.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/clone_dyn" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/clone_dyn" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/clone_dyn" +description = """ +Derive to clone dyn structures. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[features] + +default = [ "enabled" ] +full = [ "enabled" ] +no_std = [] +use_alloc = [ "no_std" ] +enabled = [ "clone_dyn_meta/enabled" ] + +[dependencies] +clone_dyn_meta = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/clone_dyn/License b/module/core/clone_dyn/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/clone_dyn/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/clone_dyn/Readme.md b/module/core/clone_dyn/Readme.md new file mode 100644 index 0000000000..4a8efa5ae2 --- /dev/null +++ b/module/core/clone_dyn/Readme.md @@ -0,0 +1,49 @@ + +# Module :: clone_dyn + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml) [![docs.rs](https://img.shields.io/docsrs/clone_dyn?color=e3e8f0&logo=docs.rs)](https://docs.rs/clone_dyn) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fclone_dyn%2Fexamples%2Fclone_dyn_trivial.rs,RUN_POSTFIX=--example%20clone_dyn_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Derive to clone dyn structures. + +By default, Rust does not support cloning for trait objects due to the `Clone` trait requiring compile-time knowledge of the type's size. The `clone_dyn` crate addresses this limitation through procedural macros, allowing for cloning collections of trait objects. The crate's purpose is straightforward: it allows for easy cloning of `dyn< Trait >` with minimal effort and complexity, accomplished by applying the derive attribute to the trait. + +### Alternative + +There are few alternatives [dyn-clone](https://github.com/dtolnay/dyn-clone), [dyn-clonable](https://github.com/kardeiz/objekt-clonable). Unlike other options, this solution is more concise and demands less effort to use, all without compromising the quality of the outcome. Also, you can ask an inquiry and get answers, which is problematic in the case of alternatives. + +### Basic use-case + + + +```rust +# #[ cfg( all( feature = "enabled", any( not( feature = "no_std" ), feature = "use_alloc" ) ) ) ] +# { + use clone_dyn::clone_dyn; + + #[ clone_dyn ] + trait Trait1 + { + } + + let vec = Vec::< Box< dyn Trait1 > >::new(); + let vec2 = vec.clone(); /* <- it does not work without `clone_dyn` */ +# } +``` + + + +### To add to your project + +```sh +cargo add clone_dyn +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/clone_dyn_trivial +cargo run +``` diff --git a/module/core/clone_dyn/examples/clone_dyn_trivial.rs b/module/core/clone_dyn/examples/clone_dyn_trivial.rs new file mode 100644 index 0000000000..980bb02488 --- /dev/null +++ b/module/core/clone_dyn/examples/clone_dyn_trivial.rs @@ -0,0 +1,24 @@ +//! Demonstrates the usage of `clone_dyn` to enable cloning for trait objects. +//! +//! By default, Rust does not support cloning for trait objects due to the `Clone` trait +//! requiring compile-time knowledge of the type's size. The `clone_dyn` crate addresses +//! this limitation through procedural macros, allowing for cloning collections of trait objects. + +#[ cfg( any( not( feature = "enabled" ), all( feature = "no_std", not( feature = "use_alloc" ) ) ) ) ] +fn main() {} + +#[ cfg( all( feature = "enabled", any( not( feature = "no_std" ), feature = "use_alloc" ) ) ) ] +fn main() +{ + + use clone_dyn::clone_dyn; + + #[ clone_dyn ] + trait Trait1 + { + } + + let vec = Vec::< Box< dyn Trait1 > >::new(); + let _vec2 = vec.clone(); /* <- it does not work without `clone_dyn` */ + +} diff --git a/module/core/clone_dyn/src/lib.rs b/module/core/clone_dyn/src/lib.rs new file mode 100644 index 0000000000..54e6f3ef40 --- /dev/null +++ b/module/core/clone_dyn/src/lib.rs @@ -0,0 +1,105 @@ +#![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/clone_dyn/latest/clone_dyn/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ allow( unused_extern_crates ) ] +#[ cfg( all( feature = "no_std", feature = "use_alloc" ) ) ] +extern crate alloc; + +/// Namespace with dependencies. + +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::clone_dyn_meta; +} + +/// Internal namespace. +#[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] +#[ cfg( feature = "enabled" ) ] +pub( crate ) mod private +{ + + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + extern crate alloc; + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + #[ allow( unused_imports ) ] + use alloc::boxed::Box; + #[ cfg( all( feature = "use_std", not( feature = "use_alloc" ) ) ) ] + use std::boxed::Box; + + /// Clone boxed dyn. + /// + /// Not intended to be used directly. + #[ inline ] + pub fn _clone_boxed< T >( t : &T ) -> Box< T > + where + T : ?Sized, + { + // Explanation for the use of `unsafe`: + // The `unsafe` block is necessary here because we're performing low-level memory manipulations + // that cannot be checked by the Rust compiler for safety. Specifically, we're manually handling + // raw pointers and converting them to and from `Box< T >`, which is considered unsafe as it + // bypasses Rust's ownership and borrowing rules. This is done to dynamically clone a boxed + // trait object, which doesn't support cloning through the standard `Clone` trait. The operations + // within this block are carefully crafted to ensure memory safety manually, including proper + // allocation and deallocation of heap memory for the clone. + #[ allow( unsafe_code ) ] + unsafe + { + let mut ptr = t as *const T; + let data_ptr = &mut ptr as *mut *const T as *mut *mut (); + *data_ptr = Box::into_raw( Box::new( < &T >::clone( &t ) ) ) as *mut (); + Box::from_raw( ptr as *mut T ) + } + } + +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use protected::*; + +/// Protected namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod protected +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::orphan::*; +} + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod orphan +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::exposed::*; +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +pub mod exposed +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + pub use super::prelude::*; +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +pub mod prelude +{ + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + pub use ::clone_dyn_meta::clone_dyn; + #[ doc( inline ) ] + #[ allow( unused_imports ) ] + #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ] + pub use super::private::_clone_boxed; +} diff --git a/module/core/clone_dyn/tests/inc/mod.rs b/module/core/clone_dyn/tests/inc/mod.rs new file mode 100644 index 0000000000..99cee0a3c6 --- /dev/null +++ b/module/core/clone_dyn/tests/inc/mod.rs @@ -0,0 +1,160 @@ + +#[ allow( unused_imports ) ] +use super::*; + +// + +tests_impls! +{ + + // + + // qqq : organize tests in the same way tests organized for derive_tools + fn manual() + { + + trait Trait1 + { + } + + // + + #[ inline ] + pub fn _clone_boxed< T >( t : &T ) -> Box< T > + where + T : ?Sized, + { + unsafe + { + let mut ptr = t as *const T; + let data_ptr = &mut ptr as *mut *const T as *mut *mut (); + *data_ptr = Box::into_raw( Box::new( t.clone() ) ) as *mut (); + Box::from_raw( ptr as *mut T ) + } + } + + // + + #[ allow( non_local_definitions ) ] + impl < 'c > Clone + for Box< dyn Trait1 + 'c > + { + #[ inline ] + fn clone( &self ) -> Self { _clone_boxed( &**self ) } + } + + #[ allow( non_local_definitions ) ] + impl < 'c > Clone + for Box< dyn Trait1 + Send + 'c > + { + #[ inline ] + fn clone( &self ) -> Self { _clone_boxed( &**self ) } + } + + #[ allow( non_local_definitions ) ] + impl < 'c > Clone + for Box< dyn Trait1 + Sync + 'c > + { + #[ inline ] + fn clone( &self ) -> Self { _clone_boxed( &**self ) } + } + + #[ allow( non_local_definitions ) ] + impl < 'c > Clone + for Box< dyn Trait1 + Send + Sync + 'c > + { + #[ inline ] + fn clone( &self ) -> Self { _clone_boxed( &**self ) } + } + + // + + let vec = Vec::< Box< dyn Trait1 > >::new(); + let vec2 = vec.clone(); + + } + + // + + fn basic() + { + use the_module::clone_dyn; + + #[ clone_dyn ] + trait Trait1 + { + } + + // + + let vec = Vec::< Box< dyn Trait1 > >::new(); + let vec2 = vec.clone(); + + } + + // + + fn prelude() + { + use the_module::prelude::*; + + #[ clone_dyn ] + trait Trait1 + { + } + + // + + let vec = Vec::< Box< dyn Trait1 > >::new(); + let vec2 = vec.clone(); + + } + + // + + fn parametrized() + { + use the_module::clone_dyn; + + #[ clone_dyn ] + trait Trait2< T1 : Copy, T2 : Copy > + where + T2 : Clone + core::fmt::Debug, + { + } + + // + + let vec = Vec::< Box< dyn Trait2< i32, f32 > > >::new(); + let vec2 = vec.clone(); + + } + + // + + fn sample() + { + use the_module::clone_dyn; + + #[ clone_dyn ] + trait Trait1 + { + } + + let vec = Vec::< Box< dyn Trait1 > >::new(); + let vec2 = vec.clone(); /* <- it does not work without `clone_dyn` */ + + } + +} + +// + +tests_index! +{ + manual, + basic, + prelude, + parametrized, + sample, +} diff --git a/module/core/clone_dyn/tests/smoke_test.rs b/module/core/clone_dyn/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/clone_dyn/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/clone_dyn/tests/tests.rs b/module/core/clone_dyn/tests/tests.rs new file mode 100644 index 0000000000..a465740896 --- /dev/null +++ b/module/core/clone_dyn/tests/tests.rs @@ -0,0 +1,8 @@ + +#[ allow( unused_imports ) ] +use clone_dyn as the_module; +#[ allow( unused_imports ) ] +use test_tools::exposed::*; + +#[ cfg( all( feature = "enabled", any( not( feature = "no_std" ), feature = "use_alloc" ) ) ) ] +mod inc; diff --git a/module/core/clone_dyn_meta/Cargo.toml b/module/core/clone_dyn_meta/Cargo.toml new file mode 100644 index 0000000000..3b371d1629 --- /dev/null +++ b/module/core/clone_dyn_meta/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "clone_dyn_meta" +version = "0.18.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", + "Dmytro Kryvoruchko ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/clone_dyn_meta" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/clone_dyn_meta" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/clone_dyn_meta" +description = """ +Derive to clone dyn structures. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false +# exclude = [ "/tests", "/examples", "-*" ] + +[lib] +proc-macro = true + +[features] +default = [ "enabled" ] +full = [ "enabled" ] +enabled = [ "macro_tools/enabled" ] + +[dependencies] +macro_tools = { workspace = true } + +[dev-dependencies] +test_tools = { workspace = true } diff --git a/module/core/clone_dyn_meta/License b/module/core/clone_dyn_meta/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/clone_dyn_meta/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/clone_dyn_meta/Readme.md b/module/core/clone_dyn_meta/Readme.md new file mode 100644 index 0000000000..bb46445c85 --- /dev/null +++ b/module/core/clone_dyn_meta/Readme.md @@ -0,0 +1,9 @@ + +# Module :: clone_dyn_meta + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_meta_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_meta_push.yml) [![docs.rs](https://img.shields.io/docsrs/clone_dyn_meta?color=e3e8f0&logo=docs.rs)](https://docs.rs/clone_dyn_meta) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Derive to clone dyn structures. + +Don't use it directly. Instead use `clone_dyn` which is front-end for `clone_dyn_meta`. diff --git a/module/core/clone_dyn_meta/src/derive.rs b/module/core/clone_dyn_meta/src/derive.rs new file mode 100644 index 0000000000..cb006d1a9e --- /dev/null +++ b/module/core/clone_dyn_meta/src/derive.rs @@ -0,0 +1,69 @@ + +use macro_tools::prelude::*; +use macro_tools::{ Result, generic_params }; + +// + +pub fn clone_dyn( _attr : proc_macro::TokenStream, item : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream > +{ + + let item_parsed = match syn::parse::< syn::ItemTrait >( item ) + { + Ok( original ) => original, + Err( err ) => return Err( err ), + }; + + let name_ident = &item_parsed.ident; + + let generic_params = &item_parsed.generics.params; + let generics_where = &item_parsed.generics.where_clause; + let generics_names : Vec< _ > = generic_params::names( &item_parsed.generics ).collect(); + + let result = qt! + { + #item_parsed + + #[ allow( non_local_definitions ) ] + impl < 'c, #generic_params > Clone + for Box< dyn #name_ident< #( #generics_names ),* > + 'c > + // where + #generics_where + { + #[ inline ] + fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) } + } + + #[ allow( non_local_definitions ) ] + impl < 'c, #generic_params > Clone + for Box< dyn #name_ident< #( #generics_names ),* > + Send + 'c > + // where + #generics_where + { + #[ inline ] + fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) } + } + + #[ allow( non_local_definitions ) ] + impl < 'c, #generic_params > Clone + for Box< dyn #name_ident< #( #generics_names ),* > + Sync + 'c > + // where + #generics_where + { + #[ inline ] + fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) } + } + + #[ allow( non_local_definitions ) ] + impl < 'c, #generic_params > Clone + for Box< dyn #name_ident< #( #generics_names ),* > + Send + Sync + 'c > + // where + #generics_where + { + #[ inline ] + fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) } + } + + }; + + Ok( result ) +} diff --git a/module/core/clone_dyn_meta/src/lib.rs b/module/core/clone_dyn_meta/src/lib.rs new file mode 100644 index 0000000000..5ea886b867 --- /dev/null +++ b/module/core/clone_dyn_meta/src/lib.rs @@ -0,0 +1,24 @@ +// #![ cfg_attr( feature = "no_std", no_std ) ] +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/clone_dyn_meta/latest/clone_dyn_meta/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +#[ cfg( feature = "enabled" ) ] +mod derive; + +/// +/// Derive macro to generate former for a structure. Former is variation of Builder Pattern. +/// + +#[ cfg( feature = "enabled" ) ] +#[ proc_macro_attribute ] +pub fn clone_dyn( _attr : proc_macro::TokenStream, item : proc_macro::TokenStream ) -> proc_macro::TokenStream +{ + let result = derive::clone_dyn( _attr, item ); + match result + { + Ok( stream ) => stream.into(), + Err( err ) => err.to_compile_error().into(), + } +} diff --git a/module/core/clone_dyn_meta/tests/smoke_test.rs b/module/core/clone_dyn_meta/tests/smoke_test.rs new file mode 100644 index 0000000000..7fd288e61d --- /dev/null +++ b/module/core/clone_dyn_meta/tests/smoke_test.rs @@ -0,0 +1,14 @@ + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn local_smoke_test() +{ + ::test_tools::smoke_test_for_local_run(); +} + +// #[ cfg( feature = "default" ) ] +#[ test ] +fn published_smoke_test() +{ + ::test_tools::smoke_test_for_published_run(); +} diff --git a/module/core/collection_tools/Cargo.toml b/module/core/collection_tools/Cargo.toml new file mode 100644 index 0000000000..65a81d7cde --- /dev/null +++ b/module/core/collection_tools/Cargo.toml @@ -0,0 +1,70 @@ +[package] +name = "collection_tools" +version = "0.8.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/collection_tools" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/collection_tools" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/collection_tools" +description = """ +Collection of general purpose tools to manipulate collections( containers like Vec/HashMap/HashSet ). +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + + +[lints] +workspace = true + + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] + +no_std = [ + "test_tools/no_std", +] + +use_alloc = [ + "no_std", # qqq : for Anton : why is that better? -- use_alloc means that we do not use std, but alloc and hashbrown + "hashbrown", + # "test_tools/use_alloc", // why is it needed? -- not needed, removed +] + +default = [ + "enabled", + # "reexports", + "collection_constructors", + "collection_into_constructors", +] + +full = [ + "enabled", + # "reexports", + "collection_constructors", + "collection_into_constructors", +] + +enabled = [] +# reexports = [] + +# Collection constructors, like `hmap!{ "key" => "val" }` +collection_constructors = [] +# Collection constructors, using `into()` under the hood, like `into_hmap!( "key" => "val" )` +collection_into_constructors = [] +# qqq : is this feature used? seems not. if yes, what is it responsible for? discuss -- not needed, removed + +[dependencies] + +## external +hashbrown = { version = "~0.14.3", optional = true, default-features = false, features = [ "default" ] } + +[dev-dependencies] +test_tools = { workspace = true } +# former = { workspace = true } diff --git a/module/core/collection_tools/License b/module/core/collection_tools/License new file mode 100644 index 0000000000..6d5ef8559f --- /dev/null +++ b/module/core/collection_tools/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn W and Out of the Box Systems (c) 2013-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/collection_tools/Readme.md b/module/core/collection_tools/Readme.md new file mode 100644 index 0000000000..1fed2e48ad --- /dev/null +++ b/module/core/collection_tools/Readme.md @@ -0,0 +1,157 @@ + + +# Module :: collection_tools + + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/collection_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/collection_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fcollection_tools%2Fexamples%2Fcollection_tools_trivial.rs,RUN_POSTFIX=--example%20collection_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + + +Collection of general purpose tools to manipulate collections( containers like Vec/HashMap/HashSet... ). + +### Basic Use Case :: Variadic Constructors for Collections + +This module encompasses a suite of meta-tools designed to enhance Rust's collection handling, most notably through the inclusion of variadic constructors. A prime example is the `hmap!` macro, which facilitates the ergonomic construction of `HashMap` instances. These constructors allow for the intuitive and concise initialization of collections, mirroring the simplicity found in other programming languages. + +Consider the following example, which demonstrates the use of the `hmap!` macro to effortlessly create a `HashMap`: + +```rust +# #[ cfg( all( feature = "enabled", feature = "collection_constructors" ) ) ] +# #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] +# { +use collection_tools::*; + +let meta_map = hmap! { 3 => 13 }; + +// it is identical to `hashbrown::HashMap` if `use_alloc` feature is on, otherwise `std::collections::HashMap` +let mut std_map = collection_tools::HashMap::new(); + +std_map.insert( 3, 13 ); +assert_eq!( meta_map, std_map ); +# } +``` + +Another example, this time, `into_bset!`, providing you a `BTreeSet`: + +```rust +# #[ cfg( all( feature = "enabled", feature = "collection_constructors" ) ) ] +# #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] +# { +use collection_tools::*; + +let meta_set = bset! { 3, 13 }; + +// this `BTreeSet` is just a reexport from `alloc`, +// so it can be used in the same places as `alloc/std::BTreeSet` +let mut std_set = collection_tools::BTreeSet::new(); + +std_set.insert( 13 ); +std_set.insert( 3 ); +assert_eq!( meta_set, std_set ); +# } +``` + +Another example with `list!`: + +```rust +# #[ cfg( all( feature = "enabled", feature = "collection_constructors" ) ) ] +# #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] +# { +use collection_tools::*; + +let meta_list : LinkedList< i32 > = list! { 3, 13 }; + +// this `LinkedList` is just a reexport from `alloc`, +// so it can be used in the same places as `alloc/std::LinkedList` +let mut meta_list = collection_tools::LinkedList::new(); + +meta_list.push_front( 13 ); +meta_list.push_front( 3 ); +assert_eq!( meta_list, meta_list ); +# } +``` + +### Basic Use Case :: `no_std` `HashSet` / `HashMap` + +When implementing a `no_std` environment with the `use_alloc` feature in your Rust project, you'll encounter a challenge: collections like `Vec` are imported differently depending on the availability of the `std` library. Moreover, to use data structures such as `HashSet` or `HashMap` in a `no_std` context, it's necessary to depend on third-party crates, as these are not provided by the `alloc` crate directly. This crate aims to simplify the process of designing Rust libraries or applications that require these collections in a `no_std` environment, offering a more streamlined approach to working with dynamic data structures without the standard library. + +You can do + + +```rust +# #[ cfg( feature = "enabled" ) ] +# #[ cfg( any( feature = "use_alloc", not( feature = "no_std" ) ) ) ] +# { +use collection_tools::HashSet; + +let mut vec : HashSet< i32 > = HashSet::new(); +vec.insert( 1 ); +assert_eq!( vec.contains( &1 ), true ); +# } +``` + +Instead of + +

    ReB-N|B*^?RXPY8)bBO|~P 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

    E&CxyjPEy!kId>gEu3Go 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 OH474a^y|`aUH%(JuIkMI literal 0 HcmV?d00001 diff --git a/asset/img/logo_v3_trans_square_icon_small_v2.png b/asset/img/logo_v3_trans_square_icon_small_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..c37d6dafbd4260807b325f26f38d25b231205600 GIT binary patch literal 20403 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 z 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%0D?JwfepfYwq<^|$eXF4=VATaMk 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

  • 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%0Dc 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�m%*mwO99+a(d@6gnxkL73MhX)8d9 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%0Ddtl3I>)da^Mie!ZmI3N=xbE}1f{ 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 literal 0 HcmV?d00001 diff --git a/asset/img/logo_v3_trans.png b/asset/img/logo_v3_trans.png new file mode 100644 index 0000000000000000000000000000000000000000..53c4e549f42e5cc72ad6f6b2c94ae2453467c939 GIT binary patch literal 331673 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%0D3w^DW{Ci2QR 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 F{|BU|0-FE; literal 0 HcmV?d00001 diff --git a/asset/img/logo_v2_trans_rect_small.png b/asset/img/logo_v2_trans_rect_small.png new file mode 100644 index 0000000000000000000000000000000000000000..12057e4ceafc5826fbffb6fe83ab5f8ef65f3e21 GIT binary patch literal 62757 zcmZsiQ*dQpwDn`#wr!(hCmq|iZQC6?>DW#>wr$(ClY9PO)pwunuG;IooR?L5?=|Nb z<2NIJ%S*t+;J^R@0l`a2iYfsC0n`0=LqPym1h4J`z>mG9h{$hCV`Cs7szldBUKvm! zw9pxqj}3U zhh69}ijQ9XdJE2de?M7u)t;S7o72JL;rF9v8m5Mnh7?_pi`>OI^rR}3gvN)0mf-z< z6+bJd>7kiceN(RICd>maJwKaacc=(#?$ksgKqsI%HLZ3da79%pX=9>XqI5=z=0fg& zl~OcA&p{C?7aOZ;XM8-#GL_@Y{DkLV8cHN(+zu!+JewwCokRn4X7ESD8$4;tKK(VGSpExs+DNX z>q^DdiYn19X633y&$&W2%p@k14LjQ}u^(SE?NTap{tFzEkGbD^M_cYA?lbP)joqwN zQJ@HV47cA?L;CcZLfzUAsH7>mCCJD z(Z9dyBYHEYm)B%1v^hu(@$PV2uUrM0Kigi0jZ^7?&w z&je7jb-_G8w3alf|G1An;kKr$GuNf;RFmt|>k3Jux8!2ZgS1mt-|IFjB`r9tMiH)o&?7bZRK^xfWa9{g4d-`XmxwdwukoU9r zwbAE#_2}iBQ)pZy0f$OPPHy>q^Z0eUAdZ6hLez2Erax41=(h>lp;xM1vRqcWT($A1 z7}DV1U(*h|-m!}W8f4coOnnA&BH}-9Z*RE=lyaoa=bV&JIIR>?y;6C8(}RfSNSzph zVk4JsA0fT7l7*u)h(H)dUjx1U){86eYH*aXS}sIp$!8Cx{tpcL8HYzl+HrYYVoJ&j zgz4wyMLn86KApuBuyWv#>VKo- z6mSH?zT6+)**nLPpSCTRo9>|9-Q!PD!=HcO#OBDFmJU4_9FoMU(GDQe?z8bI#H!t_ z6?!ITDF}+tp)ivqj)EK{2yn0FTWTjIq+38&C@pl`9KF1@STbhX#fqcC8I8l2RNXI( zJlx-RHsjc)l*Uu1NXG~HKZp%!0!1+E zd+^ig86!~ZB1q23Ie0D<>f;sx2_khk$HogEvv~BoH7MJaVss510rb|Nlj;{3F3Y+rJrq}4k(8&9Ud(`fwQkNGL`Xu~7&&fGcBvl#5EnJXbh9$mxc}UXZ`b2kQ3SVJ0 z6$VEPSHT}MB+Oe(zDeC3WPNJvUFf=A9xWibC$p~48fbiVKw zJt{aqqaQ*Y{iYas?oE-*jId-7t5x(_`f^*2G~C&=q(?yK$fhN3h!Bd}k$G3+?ahQPJEOWrG}W=LoDFr850`aW^Q68(GB9c?=b z5iX@c%eL@%Dif;bdmk0i-`{^q#y{F2wPS^~kZ?kJ0rmT`v#RP+_V**+=-I*kzJ46B z^LIbFT1}wkbE|63?dW?I*8GKQm$VWWue30==o**ra_NsAM-Wm=?fW;RQW7In@W%-w zlv$GT1S7As&Uw)^`)$t4_qXp0KG&p|q26+k5GTs%L)K4C`QtqOWzQ2_x_eS?VuANs zu-5%ltI2MHkvyqYMs1XL&nWwMHlu3k!d9Z>-v)I`B@d@&E#H%$+L&I4VQFovt_q=Y z6|217S)9qAp+A+;jbe0(!}~jIa_);(>)PG(3#t z zNtj5f{T$qY>mg+1(QEoS#l;%NiVefL>@y@CNhE2VYn*6u8%RA|JZoIWam_?g_>op1 z*xkbgfdM8hq)%1T`z|<~&go#fWt#V&?EtH5H@^7}MhKPmgz1_%wG?m{__qtXGn3ns z&xQrJk(-Kx5q+flXx-OC3oC2eSWb;MyK&X>#zb}SFj%{ll$Ay4wTx-XlBwZ)bX>gw z_EMGS1r_L>t4OWNi-5-?efxmRWQ;YMU3jCgLrcUJge_o&$FtF-@JRireE-IW;(n1N z@nv?^K(N(u{khrOwEhl9tcegVLXQRmdg;~y!9d{#S%e%d)&~+80NGP-GH`Mi;=rI! zhQh>VTZA31ONk=mv&XrAe4P5)8C;wCwHf)9sc_7A&*%NUf74lLp?o^ic3H6`SSaIF zDPG+I4opE4x!36Ax{X;Kx};H&>pGY@%qZ`JAb)Dgmk zcHVyX_dTVZ)bdRHLb$SKNT@7dz%f?^ReqY7gk1l^JFM}8`>4WG z#D=m3-3k;R;;0$DfAP9q5tAfJBG77Duw{@twJ)srWBo}}Z`Z!QzUDJGrxXb`yRw1= zdsT*phAvFwE^B|lI5+qOks)jK?YVWnpW*F?Udf_W?Y26Bh2)hG*mwOSfq9@4oc-QF z1{s3)863Iro#P4yvYMTcu0mo1lGAkhMVr_P3m0oL{u9hpP7+YA74F2&PG4=piT-Pn ztPl%iA$o9R1k>7E#D3O496`q1z+T-EC|f|)2?I~lQbih`TFojST(XYj3wYc~MU8NuG_ zy#OU8CxdTqZ+G>I669p$EZpu5NZ9do0dKMVX^ciyrRG{i(jX?%M9~?h<5K3hQNhmVHf~Zvt_EJfczbY@&N{kVunM3oiwz)>! zC%jY0>H3w!Mw3EA$PXqqBZRA7y<8^4AJn@Y3kILpCsd@>X0(Kpl$uKH zm0}Fkc*2oMbE+o}OH4{Spi_|mmMRSL?#gsq?3=bNE3A}M#ug(}x&irtd}l6-;^i2Z$0sLEJ9Kh#0{Ny2C()B$@1;U|oPr1>iIDw9ewx@Gs`C*J#8_71x*kDc%rGt1Up)e|(kj|?ieyWh zK-9mfTlt)9^p?~Qpu-G;n3lR>Le)y1ML@s)V#kEJkvlD1UeXB-jk8}-MG5iWdMC?b z%`Rw#hpaRd>@X1%@9pe3j7HS|m45OX9*HNs*b&WQ5;;{ry>sAlFxd1OEY;$wUsTxxY86*?{YJ4up5|(bH(N0z1?}rYDp*{ z9cDr3s5Z2+$}Ezahzn`aAP}4$RoNG45wA9Tm~Cii%y^gEK#CsviKB@Rj!_&MFKZ_}p2O zC*UBN%vZ-{dzXc)XU2(rOTT!%WN&MaFE;_I`q(yX_4nRiv^1Xbnp$&aZEVm*KGX9{ z*&ULFmCxogj;-1X`I4(#xxe7Flo{^>qgEX^PKR9Sdg;aNM!KF;uTly&NC5UL+->x} z`Nqt(Zq@Wv?0c@(K)PAZ*W}&IS~2#*k<;ejbMM>ocC?7u?=B%o&0R8J66LU6f^KD_ zSIZ>$GCzbqfghco<^T&4ir(qbe?V<_`+_)Ln`7kJ+2TxZx}MF64Wr^&cJF1XBVCa7 ze#XydB@k321$p%1?@)ewPIzJBp6#^%A(rv-3i~$`KnzB~Dps!Y3|7$zmzQ2DcrDO( z$;CuBXx6yhw6WVZFzvUE&yEoL7O&67ut_9*=CQv>&AKZT?g3O_ws7J4?a!51ayCpS zp4B39J|CDWGZ1|8NXQivTLnqOeOJQ!V$h&zBA3CD75n;&6(N;3>pmeV>E2t~CoR{$ zzMiFE>0B!;{yhK=_f3F$(M_&R^ZQ}>YRKr;Aly=g#&r2G-VC`|I5EtTwb$EXcA*Nm zj_t(fUx0xN&g64?aClq;GB6Wz4;=oTK%~`d5Ez&`Df14& zbY6Cnk)Z2yC-5M@_f}gZA+iA?rIWKW{0W07FNJLGv`Y0{KtN{jVk11&%x@jhK95cV z_O-;h$|aoAiL_cSre8oi_)sHoiwy_R3-U9gNNjdeOT~|~_3H^%-vc<41#3IF9`y8=cXnc*7alxM7i1<_FVIz_LhTkO zSd*45AJtaLzgX?$a703w9bbFAtlcmfq%EFSY%43E>@wR%Ds)zo?Qiu7qmBua zekU{4aJy%F1|!dp0ySBklB@VN87Eq9aA!1-a%zZrIf-WHDJu^d*Qf$Tn)NtMp^KMp z8la22N|Rn&)w};ACIaY+EJjkFlDu54AAV|f%r8DrOHk;%LU^FGPNLIl21gew(`kTY zdnRp#bmQ8CXotaQAW*Tia;R0rGepAU3&`hhi}}!=NKHbh*nvD3WO$R{AigZJ9aK2x z(7fn_Uk&Ejmi-0;H71WIiV>v52k0I%L&TOj*{!$QT`sY+d3@uR=4e!78w^^U?XGDN zP`x4iG+LoYM2fy2*G{6PPljRAvHPa9-TSh^VC~?D1c5|8Pbd5sR>`_%i-UkGMw1hI zK)lnHO0Z~FT{vR4hcKzu$8YA`kysW!U_$3l@-`RD8W}!KM{3hs`>eLh_>91g@9ou5 z)2q_<-~H&v$yW^nrHjv>BbZV7larL8R)gIFe;I(9Cfwfo8_2Q14KY@XK!s}%qJBf1 z!|s?3NNa`k_>2kbrN!A&O8sp}L4(9|=mq}YrSF2%{oCTbOvF@a?Zfl!&3=gA#FWXY9WEIN ztLbO#DNz;4#ZAp{j;!@nK)-w`J zs1ObhV_c#D^HyF_ie#zXv$L^_jY{05zfvMJZAReu8k26Dx{8(TM+|!1()c_+F&Esd*1I<4hah@NOv#SU2_=rU8j<+-6NKbJEO>#fLi zxnV^8V^&rcR#Sk2CC36+J_PeY`l)jnIVmkEHuUMl?<$C3N*-%_Q5DcHS9+7nVNOF^ zp5>5Ow(O@ui>gx!FUxQ~HYDl>e;ZvVVQUG zvz!G2KC{KN*yI2MU(c^!ZN@KHLtv?1dxs?hKQ%e|Ac{DjYi*62J2mZ@C`YdqF^zDT zl^Q(?#&pRHyz7F7#m6V!C$#^km=DYt?YCS+yuZq^Gr~s?e~d0Mp)X(QA-aXZA?BR* zu6q4BZen&uTADuoMom5sFi53LMv7s^2WNpDVQm>t`r0&2ruDa8rDbp!$!A#j- z-o{S5-!v(}W$p!O{rM}9pG$8;QN#S+-}A_ck|w_Xiw@seA#?zM6L!#u*_ZQL z$SiUbEtyfIQf!V$%uLZ9OM~vXcFygw5=;J@-PDrpJPe?J)fyu)#*XA+ci2p%iW|-V z?=oHTn2lLu`9zO!YM;S60~*W~y*9^zqCHg%E^87cMzqZswdKdpQY?i+P9(~}pTxw( zj}j8t^bf-(Z04NTpPZL8a&h;oH3btEXu;kc|7(EN^zfj&xwW}!1D2@a(=hwT!QIiV z=Irp&hoEPHZ7Xu-fO`_7F}Kh|lp^JyfVY3g0C50$uQ*F3`+54OkJuE<(FEh4i6hut z0fovXo$)E<#fsko2GF0+)C7(5E)oQJCrFVnxj&r@DJT1Td)q(*O3`uXu}_vv+H^NO zc#{Vsnwmo^#A$Rt2w6&T9`71&2~fNh@K(*@_m6i~mp1kG23Q%byR;xZ{KLjMUXP?= zF-o-yOEpSe1bsoqW{sXhCG;DkVRG85Ro<6RZFUDUaNn_FYYR$BgR2{l?^D_sS+Ra> zcKd7%jt`8NzWWCU;OSdl2gme{Q)a$gj^l6*$0JXn+_Q#%0YV_8ej`sNa?YxG>Ml3k zQU8x`&vEG!z>4DSOz>hl=jNgtuUI(CEkojNZx>HbIJvkwJU&)R4-NQ-#%BRR5F7~G z7uHa?_f`nm%bqzP5x?OJWZ6sB>cezL3WAo_`m>8XU%6v2**!zR?8V311~|>@n&0cC zyHZ*j~)PI;WxJBv0NA#+(qG(5eEJsmlYm!Kf1&vqOZa4B)_;JEktMvc&j8B8XAq_JK)M zQNT@{Ao6Py3P_LEX`OZKRKG>?RcH3P_rg!9wSSu(y@*!M4U$uk9~ngQsBIpr^r&5G?@t5PaI z09fQJ77)Y?0Rf}Ve6UPb{XPa!D7QyW*tSeK1igERuRh(N-9MJa&4+DSJ5ShLm%(2> zcJ)hktJ2#=)|52Y&qpfF;@S+~d!*)^oG*htTHmf0qKd(g&+I;k=?<$`M_)k|O3hX( zwTop!U#Df6iQQe^F6?xA&sSFIe6{x}B;{I(O9R&8;+r9@x7a);`S(VXDKeOajDmYI zDI&o$eQn?!t@g`66xgrH`~(DgLwe*51o!=nx%eWbaaU!*5^>xpC@4OH*#hpFq9o$} z{Q6|?s4aS{qiWH4LLw5#VUA7ZN?kSJ1h@XhgS+k$$pCl0Z!uoNAYV<$YCzL>u3b{o zt&)Aua-0PR-nkAwMZQwm=G(Lb^fjkYsX54O+Mw4z!XH$O%0Fx;K&;n^zKqbYRl8PD zdm*rdp8F1wu%utQ-S_31A9C5ZZo?+6z63OevB)hLgAs3K>4I~T>gnZ5&;;~3z_h|O z9faS1Z{;v_zD~6gqZ60Yt|0@?d`2P|i8wU){pX5AFqbDVEjv>lAime&rv?Yfh6ff% z=Oz{&+MRWEv(Y8wv*WDRI?s}YxVX6)fi40FIPQaMjcasD$w=x~3TFiN5V2;nl6bj& zK^ezDx0@dKk7)k{P~Kv*?9y-dhq?!%$S^iRmps5d7cdS>b1&WgN&*x&bk$k@vNp%QhJjuG{>(xFmWy!)aF#y*` znMxUORFDS0cmrH2X;>gr!!HUMbdy&D)8GQr3d|rQ+G_bHR5KthC5xw-b*HvkT<`&So6MXvXA6wtCRe&6R z1wuxKX1WP?OD`|ZS+5seK!8yOui?@~Qs?JqQLEj^dg;vPpQfA5EL&hOC~t?uSLj22 zfz`j?rB6MrRm0x|fMft6MavZE+bDzM0o80FRo`N9foZHmwZqN^92IMz2H;ZhpuvQ~ z5*=>_L*AvEiVI{ir-|x!+5}0>a@%n5->!d;o~THxHtv&HFK^Dk78lT1PPFKnymWts z63acYm$mQ}(A8@=jTzNPFcHg8B%kAQ*vBtLug**Mw*DsJGLU28IrxApiiZvrMhfshr!c+elg>#laF7r-RbDD_v4==SrXoCXStm&PeRip zTz5yu1%U>H1FBzduy$HeV}o-XCZ;CkOm^`v-27gi)rCfFiJ_)=!TLy1l1wD=+rHJr zOKyd-BY;I|2JleKJeb3f`tzRmz~0Id2Rv@z2t{i2It;sgt~CglrgnS0sHh4bfRR-b z%;(iA5t$5PmKXYeF@R81aO1^!gA^p#7gs+42cp>9-^2m>koxa$zh)NJ##));eK97n zn;>kHr>DCsYo=35sMjEAgs^f5P(diVLe#og0j3#_wr}P1QLIP}7U7~L1Y{`ilikfB zibl^C4KiT~Q$a$)Jfo{$MeHCE4O<=9y8M5wa>5C&?cPB!5w2WL-a}jL?Cef*6`ATM z?fB_J|ALlGdx-@uE@{N0J>>7G9Oq_bk&47qi*EvDX#{PUfT!f1r`r#06EnKZZFcz; zWXhMi4|^yud0{h!Y=MA$LV~hGypCxbHfA)`NDyp$cLhz~OWOrNR@A-qiI)Of#3mr)vCgB5MLdAZ{I^-DK4r zpU?{O9TOJbtu`O=`Bnvm4+UI~BJP)w7JZ!RW2_`yL%6bPy<`rJT@pNh?QSdh4%i0k z7lC6rQ4Fd|SfN=vgv`X<9ZpU?hyY9!+3lH}(EOTZuMQgTWZ>j=Lh!}hj(wdP z+SMLHoc4aD3Ph+-0jKhp~whsd9fYjA@>T}fZ=sDE;YeJu-a@O0Ra;J%3p8{3;*H!~2F}zI2 z&`wv99Y(;u?9!k~ zafE`?)*JPd9ghyeeVbiMG-e9bYVK6}yL@aU`@euXmw6@w(o@8AvmN*-itaX)#I8#f z@=nlgc2?>`)S??)F8G1i_afB!5hiJAE?=yxbgB`GRA?$vwahZJvaH2Hn~5OnON>Wq zy=PUNe8I!&`vl8qK6Kc^6mkW$ITmq>h4(nmzoazQ<}fhE?%_rN>2_pIh;}w$s~$t! z?H9eXpm34{qiGRZu~R%nH;9JrT}Fcr z75>)#@=^?jcyv{vB6Qf8SYQRcTyqgdu6iU)&An^8%V?Y zo3Uz^5vB!yK>TU>!px8rcs1=Fu)f0sI3=pqe(SG&^G7?VO>-f_fuITD5P}!Lz3Z0- zoe#5y6DP_DpZ(vXOjVGmR7x7W6&UtgnJMv5j*E9sPpsWhjy-Oi(Q4IbyzOm%e}7X^ z=JFF>c|Wbo(J*`yrvMUpV3hK@@dA~iu%~i2TdmB>5H%hstPd5s6oLHz7li!ZOFmnF z3^uFA$;T<8pvljc`ym@6J-yth;qg%KM{QS~c;%CeThdFt#%U|y>_6XW|LOhOe6yf= zp7y2TKVTNqu8u(KKY3t2iQjwh=)M6}3OP}M(zm<1T|{vyMe3^2wD+VN;(j0_1r4eW8OycdHX#@;-j8ze>{ z*+jKWfb?&)FolM?i6-1U8T^=Mn|gVA+Jh(Li8x>B2=Cw8a;@((&^b6cDLsIy{39eU zAD0{*J>g#OeuJ3BV#|?|lp5C@=n%YtfU4KjKIP7Z2eOL?0{Mx*dm_p8Of6LccCNrV&;l_F}yf_;QiKbXb1yVSUG*&K+$OGZX6vH8z; z#qy`1XtDW%v%Uoi8734gVlFO3clJDKcbJE;2(wD9GT*uMdC|PFRJ*H_ZCc#RyBp;;VQJoZXh+?kzs!~+bbtTbj$T@EMOlah8$TKC&#oV zrjj=5AT{nrGuvNeo#LQDbAGDG>8X$^+DGwGU`Z0eGXjY2S)n=b~X7xKEKZgR4+Xqz>wKk8`g0s0XRBU21y07+Rk z>ZuxQdh+cN)`$g1!Aa$wv)5oYe&|y{U!yoeQm0)b8YB`LRSx(LB1IbgPQNc)zVssI zYt(wta@?sAgv6NFw_eokb=2|lnLVf|TTmol&H3MqwuqzwRWzTo5I`MpAh}N#NkDTn zYw6wy#*^mMe0{ZfRI&BtM~EWm{b^V#_V%yBMQ=2nz>xQpV8V%wl+$vn`nz<7U9TaE znSP|^c$2&JDuXe#L7gfI;V^L>3Ncy2h*^vEe(*jOBT7R3X>O^$xy!CFv-pgMyE z_OEZU{b4S~FOM`9<-j0u4wKP1g$RP)LZ`DV*tgk)d-?YAy@Wc)8Iah>1`QP2gjyD> z(ec30o*_uUFv6a!V}~a7#YJP$*}$4r(ExA5&6O&ika&xy0e5%_lj3W)UXeI-(r|t; z5;pNvgK()OdYH7YjH_Bls8v=gQ|MFi(#rft{sf7t=F5m_ei{q`37I-Ad{tn!9_QR8 z3m7eoIJSb2i+2rIN35A>>6Yk`2{O+3UOekoiPVl}g!2P3i3uLNOnpRv%@%EZvuW(k z3=>NMi*dz@1s7?$5B{s=!_e@he;>x?Ooz_Zgat>!dEw(7Ky#R4s6jGgy53Jtc*o|9 zM1!uL!?YSZkmsvoO>MP8z(bPju4HA+&x4vZp7AVaiq(W}!g^C39UfOmUj^82cA7F8 zG}|l&HUs#ukP`ZXwsJaO12!Dv@o*LMgtjQ0ChO+R$D}s*NU!a_@izTtvjHo4d3g+B zEP?nD%$*MGE@he&_`{NVmmuk4FD&GxHkQc@blTPRD}=Fu4t0dSY*$8f&?b#Z(5&V& z**ZGG1~r!;0l)0>!;+du5ho{@ST76?PzmaVu9*!i`ny`Za`O3)x4VOppb2L6*5VQ~ zg966zB`egKR|}MxF)4y!IqkD>rz1X4Gr6Ax^XBy-lEhg*-e(5q_sh3n0F~jfrIv3e zrA3g%X(I8g_KnrdHdSvtaY&SGa@2H^AIpYt^RT(B}a?$`=ESz?-6>_iY*CU zGV8dwx~l$G_Kz64m$I_raddPvs{>c-;GnNl9sk=?M_~Sl%l0XgJU8e!@^>cjrd#Cc zY^f`%v~&cO(ZS6vu3P)2H3yfYOvLwT$UInAN5_x)9iFpx!}VHOgb1y!gnrw2EGb~W~dHf4MQ|KF26SxQ8G0fj1iCrq=~QPMw@$R>?01>o=r`D~t-y?fQl zy{$3W9aL1SfxYetO#ehTN)C=T&uEOFmt4CVJMC%xwl>e%x;dkE9Wx={x6`}iDQBk! zPd~r!8Rn?fRSg<4vbK%qD_(>+0$o{PQ|2uBeFDN^si|yM!~rd}?$b`v5qZAI%6{QZ zfOE7F8#M(e!T%6H;xrx_E_F*#V_oh0Qyy) z6s_jxxgs!rEL=~R(EV{hxSXl!e8O72?mm#Z>e`3$FBboxUb!=+<`1vy)dNHB|i=xLZXL=KGAB*RP};b5fzKcBr-Z*VvP7G;^sFjrignhjnu!?B4ke`I;A`u+ zmCsq6&wSYs3qZagIoDVD0RRNUfs$%4-thq$nvuA?psql6+HT#cUD%y2?|6^5@coc< z$9+d9gC{dVV_DhO+0;-rImSZzM@*?PYHmA$J}|V!4qM(QvP!id$wjLtr07sRu)I)! z-;6DnwNts##{OnC=0rhE+!r94kd!HYLW_>Bq?9CDhg1`~V)IKtzbzd&Xx_8$rk5Qx zz{1OrabMw>KI8)B$%BuZe5gi=S_JTKvD--*_HzzXXgDaX3*By(xEExkWoSHaB`2r# zQD#(F=m|Bt{-BrjNLYhubA6`#1pyE{UzoOqGjl;EK}tHdF1X=a({5qKDsOFDmo2@o z@ZD^q_l$BMNp`%OYs#j?yjn3v{*q0@B2_*_Or%|he*Gxna+PEM3pF}5Pcv%dBl=~y zJoXpowXtOLWH~cs+;&;NFp0!oTu%D~>Q(eaN+c*xyP6uuA#yr*_ZMp-;c<2=4FzN@ zt$~y8tLSy`=+rg>LB}vJmm4d;((A7-X83Nku46li=bO64T6Kxp0&PJ>r%(8)AjY)z z8$pjh(!MSqe{`-Fug^aI{rl(l_4pDVj}mt8*#isPNqHKuA>_ipSHqEItLWFAR6(G) z1n{i!6Qdhpk4`SSG%1n=hj#)8Vy`y4ubvuD81IH-u?ryDcMF%!viAh`q*F4ZDl`Wi z8LtC@a^+GGZ+GBH=!+fh;BK~?l|PFo)XTY9OOJPN8=ReWJ10Er3&E)dIO_cE!^dpg z(x))w9B(NSCAUFp@Im&U{{yVSga4rnp4@r(qXnZ$$;n{)_qh3XtPv^{YYlr~3|8(8>?A0pR)Hy~+J zS;~wpQzQ*n3V;4i(yx`;i1PJzE#l+f{5U#1)LVa=2onQ*4k&s(F5@l66Fj_hNv#0~ z-ACv9vZ@toX*kR-NUo2))1Tt>JYlZqvvCzjNVgoF3u$030942;1OovWIS1r?#M#&w zD%gwG^?UHU$x5{nqO`cwT&;GC3}_A^`XKZsnCGO4`k)+_xfC71deCxS<^-+^*H7rv zYzY?}?H6M`dy(PM!6qc6UnBdR;+%}5E4pE64`i(+YzS$w~SwX3c# zk%|un{f2-bsatm^r+!tvJ{uN-TD?+DZ-c9cf9_|J^dIjJHNRBCqs5e&s7Z+4%iifp zp2SHxNIm3NVk=am>2C`bE~aA%c-x2Wl+DXqs#EE^-ud@KH+s!bSX_2O4vlFvI!ZG>L45 zt2`*rHnT$r9-b+zsVVL~USDDDHvxty0C*C>JSWxmyvjPHCLGV8{ z6x_g}$>y;TgJH;==e^he`lw}geaCCK?`S4trIk^xHwtAwQ6OLg9vTM#9e?YdB8VDz zCTbAxJwLN=>uB0|LVA<%)hf{+)=752@}@rqD3n;*Ka+k@=|ISS$kb~zba07=0?~fJ z=o4uG=h^T6yE2U|gLxDX*Bbq(%TDfH8yZ_J(6!#IKt=mw;uJAyrX}FKZqgTyI_w6S z+i(;E*OpJwC~( zE_e5gv1Y>+3#*Qx7Uk0pWr9Y_P+(IHR&qf{Lr-NU&k2`NV{YC7l>Gg{Kejb~>y5w7n zW&#RK?ix}Y;v9GWmb2E|XFTP&k07lZ8Qx~Jox(v3=wU?O#E>Bp3XlK@By{D4`Sezx zasWg%z@-vvFsa2S_&lwPip4n$e2c4R-Kb@~*Lb}hO$xe=Ej0Vig7r9eDj<|La7@1e z9b-)6Bd`vE@mlvH@QYRlRBbEQeH%YEnd4WHqC|GU9b&-AK*t}C5k3RF{boViUo!Y7 zi@yc9f&yPAgP47A0o*TGh$vHXsb9>^G=PiWoS zgoMs^33YkC|5v~HopPZ~Y9Yh$R=fYpS_Tx9mha4E^RMC;+^&koC3K3r*~1L)paJw- z%3^dbxBuN-{XuE^%ScQez@til#31P7@}etz2GX;e?J)L$mKvj4xWZ)AE3n(@7O69z zW1dYMBw=XA$2qcMj_fQ@qB~1$PfIIya67d>X^ddwY~<~ex4Fk zm6Vny2aFBmNlQzm2ujNq2GKy2STysD45ibO!Cz0&s)Uh{R!9fasQpd#<3^+(2{-uq z=hI{4xU;U97-mY_qu=B*^b&o(TyCn@Y9_W~=L_+#FTEp=-ygZkSwO?8KaBU~5|p-y zXIj}t3KfGXZI;!%sGI~G|F-|(?k)~;nwR)_y`7<>)z-xA^Iv>GqDZi71!&Gj1P|9F zWKVV)q5e6{>OfyI=W(QP{vSx}=p8C5QC=JUX|8cEF? zoyw}WV864VmD9AKRXZ-4G^l>Q+|J-}x7T5>odA`}6U!7PWH5u(~E#ryR?offEi`R2U|EF}mTr(8i<-G&z zATs{(k$GUJf6P60gqq#=ez92ebI>ekci3#TMrU@>qT7F4H;(2L@4$qRJ7so){WwgC z3+y0k(YWz@8LF=$Q}DgZP^A)q-_8Aob=7kp(wM~nfxzu_U17Pxw^hWxX9+PjzS65J z@ce6eHcyOX?tXF6#R{O%(eSi2?t>CIKXo3-*`Tmu${$`H3bJ#u{U8oZMge_vd?&vP z+I0g~y)J(3EEzZmrZ%10T{|kIQy@g@clkX6p84>t;sNGXOxHz1gc#dqucBngDz5^} zq?FUm@sPbxT6)=nRVZY9ZXH09>;NyL#_~^dR)55;{4<3W7!t||=5@cp1{~Uqu5PK? zHXKhxvepRlXRj`!6@~+SQ5{ zTCWzP!@(&Rj(DRhP71Y8j@8ByBu1FxvYvF^q3&~X~5?H zIBKXXXRMdS|qXT_&8`eZqx#XZWD3-?%%$v zEFiZrs9}jU>16g(K$=%lTpHbWM#BqK_(XJC3uh-#l)KfT?w+ebbq*lfaT!wTR{W$L{an=N1O)_^hPHv(8`gw^akDj+QmLw@~uk5VAq;1r@s zsopQCL35_bQS&*sVdHlkmldZ$UoZfQG?&YxJKbp1Zkw}-wB9O!e6MA?+@wLuFUnR| z3CjlNmxa(5eX-YD2j+R%@GmzmSEbisz)%eS7850e4g6VOu^04ENzTx+mXLr-hMvUVuAn(F`b8_C=lP{10! zKL4J9OA1+JnsTP_9l zJa?F42FP?VdDX3Yh9aV%yrP4CD)_XT`DUT-R1b|xU*7g&oQ@d1=C8`A(f>s4)cN5f z`4v|x{DS+CMC-!^HGoXLHSU8z#V z93NT&e*t@29R`npZcC2c>6W9lI$Oyz@4Le|8c&g7Fq{xtnKi1nQ2<<>?u^rZ$DiQG z!`0eYgU5C0a@YpMa8k1JX4OJnLjHUee$FT;7(+fR_QZCzuZ|0vJiR6?wzW!K45%o2 zSyP}-kjC^3*MTV|^mEe1^B^?v-2Qtc&M(`(yr0z}4~W?CVc+%j^+Wdx7+J=Bavfc~ zR-b_voc6}2Ae zB~MQvWt=ahR-82yDUx%7kwYP&9F=mD2M?>MbpF}e6%KaT0;ej%T$pH2(U`hAx>+eu zhQtOlILT{;mg^ObKqd{kWGJgqB+z;7>WM*=4eOUi>gJUHjek&kzDYNBbkNS`6y^5h z<>h4UtHYL;pXHOTRZVTU9`KHtVi1v77kodG5QRQOboq&D40(N1HhTDayI-ANUpsaV zaxKFiJ{0J`5S+4{G%`BWMj%6rA-H54$!isW2MWde9GYpsW4A(@`LH1mB#wH>?5aToaF8nfCg9 z-SGju^S1}FXy(lzA^#K8bLlB5DJG5c+EZrEl|!%?f4VTICMIf|>;{et5zr{;yqmnPcnX)S1P({@4*`QI z41`=JgUKKs8g<~xCx&;l+b$#7(5(1DXIyHJ{JI>(n`VR*XLEar= zPg{xFu7DVmRNwuRG7*Ha+vxM~?5|OQ2c58V*RU;CigZq5Mh5kfr z#$az{A-UFaJ)KUE8Lq?&qvG)Ong1uJ4bwrhXl7i#M&KK`H`#*U;dtabZ5TNPUY3)Y zIjsViwzvWbgRPf5geTyL0z`$uwaz}pEw1*t!pNdoQ&RNnt`Z}apxO`njxkk0tQxly zC4`>v=S$xj6lwlXgd`;f-2whZfI#Cv*ts4yS&nG8aY#d!qVY8Rrl&xw)rMnoX(`3} zL0eYs=L}%8)gc4-O%?>DcDcf8uZOY9r1?j?qD==kA3Q+N?2{f43N)-(E=DyM!dlbh zhmI^;5Pn`;u({ds`=nD*$sI5_PYu(XEx3=!=VEg{2UClZq_CtD2R(t-)weBKVH%2U zk?T*D^0-?O!jJzL5Zd27Haz;}!@w<{K3bdk|Lc7NC_}KucvwH0ssokdh+Yp`Z-B zSh*A$-bL|gx?w4opRwyPH8FjJhexD)TsJh$tj&R}4G8!~6Q0A;L2*IJs z6o$}}?ojZ8Giuhd4k_r-3F0rHcMKqMa)fJ2hN?pQMM|fRpt=5QChYnJmKDW5uORCJ zxZ-YZ%@7eBf~2U+(Dd`DBAyfCk<|GeZr6o!Ib7ioA^1l@2($QWlX{Gt^BBeGi9v=VyZaJMd!eo0STCUfG zab+n;QKMHim^bDJ+siOIf@i{Xja_*`2RK)FC9?>>LVM~8;64V`eETH*+vW0BZ47_i z)unvDyzCmcXlz6{=S2+rJIW&oc=(f@1buRD2sGV&1hi6ieiJzqR#OYEI2S3cE^&Z9 z+p`*e;+8I2aZplva_m425SyE@ce>p--{%jEl(mM(mwt5mY~+xW=A%T$$u50%Wx{_+ z!#Lq?^bBn+Vqn<`{Ug0_Z`Oc{FxUt@HqI!x1NBo;slrpC+=+QSU-0_e;;-Kzkjfk(ko8vJ9q@u`F;g`@vK&*rC4@)S}+if>^%C4 z{xUM+9}WUicP}w#M;~e)oaqy#p|ULKYh|#H z(Iyjn=>{WuNM$Grv-E7STrqpCrI_^RPmC|WZVpqWF}ZBLp5@I=;UUx|d@x*GTqS_q zMpawm-d&s0R^_l=mCKIrmeHIvBTbc{N>qq|En2A}j0mTp5tfC6MGz1jVow+H!6Y

    -vP3U&?&4kmxN^D<+UY0{gd^H2Pjy&5<_gE^0DN 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[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 VS$3!YYmEAiKAsqldv4+Be*-jI;Bf!| literal 0 HcmV?d00001 diff --git a/asset/img/logo_v2_light.png b/asset/img/logo_v2_light.png new file mode 100644 index 0000000000000000000000000000000000000000..98f7cdbcc8da7e1e25b62e7863c12ec8455214ef GIT binary patch literal 382946 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 z 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 z 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�=<=ndilS1mNPnu;ZkC#vD7rX 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 literal 0 HcmV?d00001 diff --git a/asset/img/logo_v2_trans.png b/asset/img/logo_v2_trans.png new file mode 100644 index 0000000000000000000000000000000000000000..3fec380a75fe2fbea40fdd960e2a38c2f86781ee GIT binary patch literal 527274 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�NsnU8;b`IHkGlKvY|G))Oi~PBXHEs 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μ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