From 33258e54e582fae034578631a938ab2fadb90275 Mon Sep 17 00:00:00 2001 From: L3nn0x Date: Wed, 27 Nov 2024 00:27:10 +0100 Subject: [PATCH] Update IDL so it's easier to create other generators --- .gitignore | 3 +- Cargo.lock | 463 ++++++++++++++---- generator/Cargo.toml | 8 +- .../src/codegen/{ => cpp}/codegen_header.rs | 0 .../src/codegen/{ => cpp}/codegen_source.rs | 12 +- generator/src/codegen/cpp/mod.rs | 94 ++++ generator/src/codegen/mod.rs | 57 +-- generator/src/flat_ast.rs | 6 +- generator/src/flatten.rs | 2 +- generator/src/graph_passes.rs | 6 +- generator/src/main.rs | 66 +-- schema/src/attributes.rs | 2 +- srv_test.cpp | 155 +----- srv_test.h | 62 +-- 14 files changed, 537 insertions(+), 399 deletions(-) rename generator/src/codegen/{ => cpp}/codegen_header.rs (100%) rename generator/src/codegen/{ => cpp}/codegen_source.rs (99%) create mode 100644 generator/src/codegen/cpp/mod.rs diff --git a/.gitignore b/.gitignore index 5c2bc0e..00d3c74 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target **/*.rs.bk -.vscode/ \ No newline at end of file +.vscode/ +/.idea/ diff --git a/Cargo.lock b/Cargo.lock index 0ee42f2..dd3dadb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,23 +3,52 @@ version = 3 [[package]] -name = "ansi_term" -version = "0.11.0" +name = "anstream" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ - "winapi", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", ] [[package]] -name = "atty" -version = "0.2.11" +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ - "libc", - "termion", - "winapi", + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", ] [[package]] @@ -45,12 +74,6 @@ dependencies = [ "libc", ] -[[package]] -name = "bitflags" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" - [[package]] name = "cc" version = "1.0.25" @@ -64,29 +87,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" [[package]] -name = "chrono" -version = "0.4.6" +name = "clap" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ - "num-integer", - "num-traits", - "time", + "clap_builder", + "clap_derive", ] [[package]] -name = "clap" -version = "2.32.0" +name = "clap_builder" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ - "ansi_term", - "atty", - "bitflags", + "anstream", + "anstyle", + "clap_lex", "strsim", - "textwrap", - "unicode-width", - "vec_map", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2 1.0.92", + "quote 1.0.37", + "syn 2.0.89", +] + +[[package]] +name = "clap_lex" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", ] [[package]] @@ -105,54 +167,66 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 0.4.24", + "quote 0.6.10", + "syn 0.15.21", "synstructure", ] [[package]] name = "heck" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04fa3ead4e05e51a7c806fc07271fdbde4e246a6c6d1efd52e72230b771b82" -dependencies = [ - "unicode-segmentation", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.43" +version = "0.2.166" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" [[package]] name = "log" -version = "0.4.6" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" -dependencies = [ - "cfg-if", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] -name = "num-integer" -version = "0.1.39" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -dependencies = [ - "num-traits", -] +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "num-traits" -version = "0.2.6" +name = "num_threads" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] [[package]] name = "packet_generator" -version = "0.1.5" +version = "0.2.0" dependencies = [ "clap", "failure", @@ -162,6 +236,12 @@ dependencies = [ "simple_logger", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "proc-macro2" version = "0.4.24" @@ -172,27 +252,30 @@ dependencies = [ ] [[package]] -name = "quote" -version = "0.6.10" +name = "proc-macro2" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ - "proc-macro2", + "unicode-ident", ] [[package]] -name = "redox_syscall" -version = "0.1.43" +name = "quote" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679da7508e9a6390aeaf7fbd02a800fdc64b73fe2204dd2c8ae66d22d9d5ad5d" +checksum = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" +dependencies = [ + "proc-macro2 0.4.24", +] [[package]] -name = "redox_termios" -version = "0.1.1" +name = "quote" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ - "redox_syscall", + "proc-macro2 1.0.92", ] [[package]] @@ -210,21 +293,43 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "serde" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.37", + "syn 2.0.89", +] + [[package]] name = "simple_logger" -version = "1.0.1" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25111f1d77db1ac3ee11b62ba4b7a162e6bb3be43e28273f0d3935cc8d3ff7fb" +checksum = "e8c5dfa5e08767553704aa0ffd9d9794d527103c736aba9854773851fd7497eb" dependencies = [ - "chrono", + "colored", "log", + "time", + "windows-sys 0.48.0", ] [[package]] name = "strsim" -version = "0.7.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" @@ -232,65 +337,72 @@ version = "0.15.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "816b7af21405b011a23554ea2dc3f6576dc86ca557047c34098c1d741f10f823" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 0.4.24", + "quote 0.6.10", "unicode-xid", ] +[[package]] +name = "syn" +version = "2.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.37", + "unicode-ident", +] + [[package]] name = "synstructure" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 0.4.24", + "quote 0.6.10", + "syn 0.15.21", "unicode-xid", ] [[package]] -name = "termion" -version = "1.5.1" +name = "time" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ + "deranged", + "itoa", "libc", - "redox_syscall", - "redox_termios", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", ] [[package]] -name = "textwrap" -version = "0.10.0" +name = "time-core" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" -dependencies = [ - "unicode-width", -] +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] -name = "time" -version = "0.1.40" +name = "time-macros" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ - "libc", - "redox_syscall", - "winapi", + "num-conv", + "time-core", ] [[package]] -name = "unicode-segmentation" -version = "1.2.1" +name = "unicode-ident" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" - -[[package]] -name = "unicode-width" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-xid" @@ -299,10 +411,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] -name = "vec_map" -version = "0.8.1" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "winapi" @@ -326,6 +438,145 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "xml-rs" version = "0.8.14" diff --git a/generator/Cargo.toml b/generator/Cargo.toml index 099e380..6772f60 100644 --- a/generator/Cargo.toml +++ b/generator/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "packet_generator" -version = "0.1.5" +version = "0.2.0" authors = ["L3nn0x "] [dependencies] schema = { path = "../schema" } failure = "0.1" -heck = "0.3.0" -clap = "2" +heck = "0.5" +clap = { version = "4.5", features = ["derive"] } log = "0.4" -simple_logger = "1" +simple_logger = "5.0" diff --git a/generator/src/codegen/codegen_header.rs b/generator/src/codegen/cpp/codegen_header.rs similarity index 100% rename from generator/src/codegen/codegen_header.rs rename to generator/src/codegen/cpp/codegen_header.rs diff --git a/generator/src/codegen/codegen_source.rs b/generator/src/codegen/cpp/codegen_source.rs similarity index 99% rename from generator/src/codegen/codegen_source.rs rename to generator/src/codegen/cpp/codegen_source.rs index 61e45b6..eb21970 100644 --- a/generator/src/codegen/codegen_source.rs +++ b/generator/src/codegen/cpp/codegen_source.rs @@ -104,7 +104,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> { read_write.clone() } else if let Some(ref enum_type) = elem.enum_type() { enum_type.clone() - } else if iserialize.contains(&elem.type_().to_owned().to_camel_case()) { + } else if iserialize.contains(&elem.type_().to_owned().to_lower_camel_case()) { "iserialize".to_owned() } else { clean_base(elem.type_()) @@ -232,7 +232,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> { if let Some(ref size) = elem.size_occurs() { cg!(self, "size += sizeof({}); // {}", size, elem.name()); } - let rhs = if iserialize.contains(&elem.type_().to_owned().to_camel_case()) && elem.enum_type().is_none() { + let rhs = if iserialize.contains(&elem.type_().to_owned().to_lower_camel_case()) && elem.enum_type().is_none() { format!("{}::size()", elem.type_()) } else { let rhs = elem.bitset().as_ref().map_or(Some(format!("sizeof({})", elem.type_())), |bitset| if bitset.start == 0 { @@ -443,7 +443,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> { if elem.type_() == "std::string" { continue; } - let rhs = if iserialize.contains(&elem.type_().to_owned().to_camel_case()) { + let rhs = if iserialize.contains(&elem.type_().to_owned().to_lower_camel_case()) { format!("{}::size()", elem.type_()) } else { let rhs = elem.bitset().as_ref().map_or(Some(format!("sizeof({})", elem.type_())), |bitset| if bitset.start == 0 { @@ -739,7 +739,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> { read_write.clone() } else if let Some(ref enum_type) = elem.enum_type() { enum_type.clone() - } else if iserialize.contains(&elem.type_().to_owned().to_camel_case()) { + } else if iserialize.contains(&elem.type_().to_owned().to_lower_camel_case()) { "iserialize".to_owned() } else { clean_base(elem.type_()) @@ -799,7 +799,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> { for elem in packet.elements() { let base = if let Some(ref enum_type) = elem.enum_type() { enum_type.clone() - } else if iserialize.contains(&elem.type_().to_owned().to_camel_case()) { + } else if iserialize.contains(&elem.type_().to_owned().to_lower_camel_case()) { "iserialize".to_owned() } else { clean_base(elem.type_()) @@ -865,7 +865,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> { for elem in packet.elements() { let base = if let Some(ref enum_type) = elem.enum_type() { enum_type.clone() - } else if iserialize.contains(&elem.type_().to_owned().to_camel_case()) { + } else if iserialize.contains(&elem.type_().to_owned().to_lower_camel_case()) { "iserialize".to_owned() } else { clean_base(elem.type_()) diff --git a/generator/src/codegen/cpp/mod.rs b/generator/src/codegen/cpp/mod.rs new file mode 100644 index 0000000..52dd4c3 --- /dev/null +++ b/generator/src/codegen/cpp/mod.rs @@ -0,0 +1,94 @@ +use std::fs::File; +use std::path::PathBuf; +use codegen::Codegen; +use ::{flat_ast, writer}; + +mod codegen_header; +mod codegen_source; + +pub struct Generator { + output_header: PathBuf, + output_source: PathBuf +} + +impl Generator { + pub fn new(args: &CppArgs) -> Self { + Self{ + output_header: args.output_header_folder.clone().into(), + output_source: args.output_source_folder.clone().into() + } + } +} + +impl Codegen for Generator { + fn generate(&mut self, version: &str, packet: &flat_ast::Packet) -> Result<(), failure::Error> { + let header_output = File::create(self.output_header.to_str().unwrap().to_owned() + &format!("/{}.h", packet.filename()))?; + debug!("header {:?}", header_output); + let mut writer = writer::Writer::new(header_output); + let mut codegen = codegen_header::CodeHeaderGenerator::new(&mut writer, version.to_string()); + codegen.generate(&packet)?; + let source_output = File::create(self.output_source.to_str().unwrap().to_owned() + &format!("/{}.cpp", packet.filename()))?; + debug!("source {:?}", source_output); + let mut writer = writer::Writer::new(source_output); + let mut codegen = codegen_source::CodeSourceGenerator::new(&mut writer); + codegen.generate(&packet)?; + Ok(()) + } +} + +#[derive(clap::Args, Debug)] +#[command(name="cpp")] +pub struct CppArgs { + #[arg(long)] + output_header_folder: String, + #[arg(long)] + output_source_folder: String +} + +#[cfg(test)] +mod tests { + use crate::{flat_ast::Packet, writer::Writer}; + use super::{codegen_header}; + + struct StringWriter { + output: String + } + + impl StringWriter { + fn new() -> Self { + Self { output: String::new() } + } + } + + impl std::io::Write for StringWriter { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + self.output += std::str::from_utf8(buf).unwrap(); + Ok(buf.len()) + } + + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } + } + + impl Into for StringWriter { + fn into(self) -> String { + self.output + } + } + + fn call_header(packet: &Packet) -> std::io::Result { + let writer = StringWriter::new(); + let mut writer = Writer::new(writer); + let mut codegen = codegen_header::CodeHeaderGenerator::new(&mut writer, "0".to_string()); + codegen.generate(packet)?; + Ok(writer.into().into()) + } + + #[test] + fn empty_packet() { + let packet = Packet::new("PAKCS_PACKET".to_owned(), None); + let result = call_header(&packet); + assert!(result.is_ok()); + } +} \ No newline at end of file diff --git a/generator/src/codegen/mod.rs b/generator/src/codegen/mod.rs index 29b1d2d..8958777 100644 --- a/generator/src/codegen/mod.rs +++ b/generator/src/codegen/mod.rs @@ -1,3 +1,5 @@ +use flat_ast; + #[macro_use] mod macros { #[macro_export] @@ -7,53 +9,18 @@ mod macros { ($v:expr, $fmt:expr, $($arg:tt)*) => (($v).write(format!($fmt, $($arg)*))?); } } -pub mod codegen_header; -pub mod codegen_source; - -#[cfg(test)] -mod tests { - use crate::{flat_ast::Packet, writer::Writer}; - use super::{codegen_header}; - - struct StringWriter { - output: String - } - - impl StringWriter { - fn new() -> Self { - Self { output: String::new() } - } - } - impl std::io::Write for StringWriter { - fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.output += std::str::from_utf8(buf).unwrap(); - Ok(buf.len()) - } - - fn flush(&mut self) -> std::io::Result<()> { - Ok(()) - } - } +// the codegen trait, implement this for your language +pub(crate) trait Codegen { + fn generate(&mut self, version: &str, packet: &flat_ast::Packet) -> Result<(), failure::Error>; +} - impl Into for StringWriter { - fn into(self) -> String { - self.output - } - } +pub mod cpp; - fn call_header(packet: &Packet) -> std::io::Result { - let writer = StringWriter::new(); - let mut writer = Writer::new(writer); - let mut codegen = codegen_header::CodeHeaderGenerator::new(&mut writer, "0".to_string()); - codegen.generate(packet)?; - Ok(writer.into().into()) - } +use clap::Subcommand; - #[test] - fn empty_packet() { - let packet = Packet::new("PAKCS_PACKET".to_owned(), None); - let result = call_header(&packet); - assert!(result.is_ok()); - } +#[derive(Subcommand, Debug)] +pub enum CodegenCommands { + #[command(name = "cpp")] + CppCommand(cpp::CppArgs) } \ No newline at end of file diff --git a/generator/src/flat_ast.rs b/generator/src/flat_ast.rs index 04d2376..fd5e0ab 100644 --- a/generator/src/flat_ast.rs +++ b/generator/src/flat_ast.rs @@ -145,7 +145,7 @@ impl Packet { pub fn new(type_: String , doc: Option) -> Self { use ::heck::*; - let name = type_.clone().to_camel_case(); + let name = type_.clone().to_lower_camel_case(); let (class_name, filename) = if name.starts_with("Isc") { (name.clone(), name.clone().to_snake_case()) @@ -438,8 +438,8 @@ impl Bitset { impl SimpleType { pub fn new(name: String, doc: Option) -> Self { - use heck::CamelCase; - SimpleType{ name: name.to_camel_case(), contents: Vec::new(), doc } + use heck::ToLowerCamelCase; + SimpleType{ name: name.to_lower_camel_case(), contents: Vec::new(), doc } } pub fn add_content(&mut self, content: SimpleTypeContent) { diff --git a/generator/src/flatten.rs b/generator/src/flatten.rs index 1969621..58fd909 100644 --- a/generator/src/flatten.rs +++ b/generator/src/flatten.rs @@ -111,7 +111,7 @@ impl<'a> Context<'a> { fn stop_bits(&mut self) { if let Some(bitset) = self.current_bitset { if bitset % 8 != 0 { - panic!(format!("Error, {} bits cannot be aligned", bitset)); + panic!("Error, {} bits cannot be aligned", bitset); } trace!("generating bitset of {} bits", bitset); for elem in self.find_bitset_mut_ref(self.bitsets) { diff --git a/generator/src/graph_passes.rs b/generator/src/graph_passes.rs index d282ce6..4289b90 100644 --- a/generator/src/graph_passes.rs +++ b/generator/src/graph_passes.rs @@ -1,6 +1,6 @@ use ::flat_ast::*; use std::collections::{BTreeMap, HashSet}; -use heck::CamelCase; +use heck::ToLowerCamelCase; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] struct NodeId(usize); @@ -250,7 +250,7 @@ pub fn run(mut packet: Packet) -> Result { for content in s.contents() { match content { Restriction(ref r) => { - if let Ok(node) = graph.get_node(&r.base().to_owned().to_camel_case()) { + if let Ok(node) = graph.get_node(&r.base().to_owned().to_lower_camel_case()) { let to = graph.get_node(s.name()).unwrap(); graph.add_edge(to, node); } @@ -260,7 +260,7 @@ pub fn run(mut packet: Packet) -> Result { }, PacketContent::Element(ref e) => { trace!("adding start node {}", e.type_()); - graph.add_start_node(&e.type_().to_owned().to_camel_case()); + graph.add_start_node(&e.type_().to_owned().to_lower_camel_case()); match e.occurs() { Some(self::Occurs::Unbounded) => vector = true, Some(self::Occurs::Num(_)) => array = true, diff --git a/generator/src/main.rs b/generator/src/main.rs index d51e12f..ab9b384 100644 --- a/generator/src/main.rs +++ b/generator/src/main.rs @@ -11,43 +11,29 @@ mod writer; mod codegen; mod graph_passes; -use codegen::codegen_header; -use codegen::codegen_source; +use codegen::{cpp, Codegen, CodegenCommands}; -use clap::{App, Arg}; use log::Level; const VERSION: &'static str = env!("CARGO_PKG_VERSION"); +use clap::Parser; +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + #[arg(short, long)] + inputs: Vec, + #[command(subcommand)] + command: codegen::CodegenCommands, + #[arg(short, long, action = clap::ArgAction::Count)] + verbose: u8 + +} + fn main() -> Result<(), failure::Error> { - let matches = App::new("Packet generator") - .version(VERSION) - .author("L3nn0x ") - .about("Generates packets for osiROSE-new") - .arg(Arg::with_name("INPUT") - .help("Sets the input xml file") - .required(true) - .multiple(true) - .index(1)) - .arg(Arg::with_name("outputh") - .help("uses selected output directory for header") - .short("h") - .long("outputh") - .value_name("FOLDER") - .takes_value(true)) - .arg(Arg::with_name("outputc") - .help("uses selected output directory for source") - .short("c") - .long("outputc") - .value_name("FOLDER") - .takes_value(true)) - .arg(Arg::with_name("v") - .short("v") - .multiple(true) - .help("sets the level of verbosity")) - .get_matches(); + let args = Args::parse(); - let verbose = match matches.occurrences_of("v") { + let verbose = match args.verbose { 0 => Level::Info, 1 => Level::Debug, _ => Level::Trace @@ -55,11 +41,7 @@ fn main() -> Result<(), failure::Error> { simple_logger::init_with_level(verbose).unwrap(); - - let outputh_dir = std::path::Path::new(matches.value_of("outputh").unwrap_or("./")); - let outputc_dir = std::path::Path::new(matches.value_of("outputc").unwrap_or("./")); - - for filename in matches.values_of("INPUT").unwrap().map(std::path::Path::new) { + for filename in args.inputs.iter().map(std::path::Path::new) { debug!("filename {:?}", filename); use std::fs::File; let file = File::open(filename)?; @@ -71,16 +53,10 @@ fn main() -> Result<(), failure::Error> { trace!("packet {:?}", packet); let packet = graph_passes::run(packet)?; debug!("packet {:#?}", packet); - let header_output = File::create(outputh_dir.to_str().unwrap().to_owned() + &format!("/{}.h", packet.filename()))?; - debug!("header {:?}", header_output); - let mut writer = writer::Writer::new(header_output); - let mut codegen = codegen_header::CodeHeaderGenerator::new(&mut writer, VERSION.to_string()); - codegen.generate(&packet)?; - let source_output = File::create(outputc_dir.to_str().unwrap().to_owned() + &format!("/{}.cpp", packet.filename()))?; - debug!("source {:?}", source_output); - let mut writer = writer::Writer::new(source_output); - let mut codegen = codegen_source::CodeSourceGenerator::new(&mut writer); - codegen.generate(&packet)?; + let mut generator = match &args.command { + CodegenCommands::CppCommand(args) => cpp::Generator::new(args) + }; + generator.generate(VERSION, &packet)?; info!("Generated packet {}", packet.type_()); } Ok(()) diff --git a/schema/src/attributes.rs b/schema/src/attributes.rs index 1f51d41..c2ca26a 100644 --- a/schema/src/attributes.rs +++ b/schema/src/attributes.rs @@ -8,7 +8,7 @@ pub struct Attributes { } pub trait Parse: Sized { - fn parse(&str) -> Result; + fn parse(value: &str) -> Result; } impl Attributes { diff --git a/srv_test.cpp b/srv_test.cpp index 7cdd665..a7a01ac 100644 --- a/srv_test.cpp +++ b/srv_test.cpp @@ -3,9 +3,9 @@ using namespace RoseCommon; using namespace RoseCommon::Packet; -SrvTest::Bbb::Bbb() : is_valid(false) {} +SrvTest::bbb::bbb() : is_valid(false) {} -SrvTest::Bbb::Bbb(std::string data) : bbb(data), is_valid(false) { +SrvTest::bbb::bbb(std::string data) : bbb(data), is_valid(false) { bool valid = true; if (bbb.size() > 3) { bbb.resize(3); @@ -16,7 +16,7 @@ SrvTest::Bbb::Bbb(std::string data) : bbb(data), is_valid(false) { is_valid = valid; } -bool SrvTest::Bbb::read(CRoseReader& reader) { +bool SrvTest::bbb::read(CRoseReader& reader) { bool valid = true; if (!reader.get_string(bbb, 3)) { return false; @@ -27,115 +27,20 @@ bool SrvTest::Bbb::read(CRoseReader& reader) { return true; } -bool SrvTest::Bbb::write(CRoseBasePolicy& writer) const { +bool SrvTest::bbb::write(CRoseBasePolicy& writer) const { if (!writer.set_string(bbb, 3)) { return false; } return true; } -constexpr size_t SrvTest::Bbb::size() { +constexpr size_t SrvTest::bbb::size() { size_t size = 0; size += 3; // bbb return size; } -SrvTest::Pote& SrvTest::Pote::set_a(const uint8_t a) { - this->data.a = a; - return *this; -} - -uint8_t SrvTest::Pote::get_a() const { - return data.a; -} - -SrvTest::Pote& SrvTest::Pote::set_b(const uint8_t b) { - this->data.b = b; - return *this; -} - -uint8_t SrvTest::Pote::get_b() const { - return data.b; -} - -SrvTest::Pote& SrvTest::Pote::set_c(const uint8_t c) { - this->data.c = c; - return *this; -} - -uint8_t SrvTest::Pote::get_c() const { - return data.c; -} - -bool SrvTest::Pote::write(CRoseBasePolicy& writer) const { - if (!writer.set_uint8_t(data.c)) { - return false; - } - return true; -} - -bool SrvTest::Pote::read(CRoseReader& reader) { - if (!reader.get_uint8_t(data.c)) { - return false; - } - return true; -} - -constexpr size_t SrvTest::Pote::size() { - return sizeof(data); -} - -SrvTest::Pote2& SrvTest::Pote2::set_a(const uint8_t a) { - for (size_t i = 0; i < 1; ++i) { - this->bitset3[i + 0] = a & (1 << i); - } - return *this; -} - -uint8_t SrvTest::Pote2::get_a() const { - uint8_t a_tmp = 0; - for (size_t i = 0; i < 1; ++i) { - a_tmp |= (this->bitset3[i + 0] << i); - } - return a_tmp; -} - -SrvTest::Pote2& SrvTest::Pote2::set_b(const uint8_t b) { - for (size_t i = 0; i < 7; ++i) { - this->bitset3[i + 1] = b & (1 << i); - } - return *this; -} - -uint8_t SrvTest::Pote2::get_b() const { - uint8_t b_tmp = 0; - for (size_t i = 0; i < 7; ++i) { - b_tmp |= (this->bitset3[i + 1] << i); - } - return b_tmp; -} - -bool SrvTest::Pote2::write(CRoseBasePolicy& writer) const { - if (!writer.set_bitset(bitset3)) { - return false; - } - return true; -} - -bool SrvTest::Pote2::read(CRoseReader& reader) { - if (!reader.get_bitset(bitset3)) { - return false; - } - return true; -} - -constexpr size_t SrvTest::Pote2::size() { - size_t size = 0; - size += 8 / 8; // bitset3 - return size; -} - SrvTest::SrvTest() : CRosePacket(SrvTest::PACKET_ID) { set_server_packet(); @@ -153,18 +58,15 @@ SrvTest::SrvTest(CRoseReader reader) : CRosePacket(reader) { if (!reader.get_bitset(bitset2)) { return; } - if (!reader.get_iserialize(pote)) { + if (!reader.get_Pote(pote)) { return; } - if (!reader.get_iserialize(pote2)) { + if (!reader.get_Pote2(pote2)) { return; } - uint8_t x_temp; - if (!reader.get_uint8_t(x_temp)) { + if (!reader.get_iserialize(x)) { return; } - x = static_cast(x_temp); - if (!reader.get_iserialize(y)) { return; } @@ -302,25 +204,25 @@ SrvTest::Pote2 SrvTest::get_pote2() const { return pote2; } -SrvTest& SrvTest::set_x(const SrvTest::Aaa x) { +SrvTest& SrvTest::set_x(const Aaa x) { this->x = x; return *this; } -SrvTest::Aaa SrvTest::get_x() const { +Aaa SrvTest::get_x() const { return x; } -SrvTest& SrvTest::set_y(const SrvTest::Bbb y) { +SrvTest& SrvTest::set_y(const Bbb y) { this->y = y; return *this; } -SrvTest::Bbb SrvTest::get_y() const { +Bbb SrvTest::get_y() const { return y; } -SrvTest SrvTest::create(const uint32_t& a, const uint32_t& b, const uint32_t& c, const uint32_t& d, const uint32_t& e, const uint32_t& f, const uint32_t& g, const uint32_t& h, const SrvTest::Pote& pote, const SrvTest::Pote2& pote2, const SrvTest::Aaa& x, const SrvTest::Bbb& y) { +SrvTest SrvTest::create(const uint32_t& a, const uint32_t& b, const uint32_t& c, const uint32_t& d, const uint32_t& e, const uint32_t& f, const uint32_t& g, const uint32_t& h, const SrvTest::Pote& pote, const SrvTest::Pote2& pote2, const Aaa& x, const Bbb& y) { SrvTest packet; packet.set_a(a); packet.set_b(b); @@ -357,13 +259,13 @@ bool SrvTest::pack(CRoseBasePolicy& writer) const { if (!writer.set_bitset(bitset2)) { return false; } - if (!writer.set_iserialize(pote)) { + if (!writer.set_Pote(pote)) { return false; } - if (!writer.set_iserialize(pote2)) { + if (!writer.set_Pote2(pote2)) { return false; } - if (!writer.set_uint8_t(x)) { + if (!writer.set_iserialize(x)) { return false; } if (!writer.set_iserialize(y)) { @@ -377,41 +279,28 @@ constexpr size_t SrvTest::size() { size += 8 / 8; // bitset1 size += sizeof(uint32_t); // c size += 48 / 8; // bitset2 - size += Pote::size(); // pote - size += Pote2::size(); // pote2 + size += sizeof(Pote); // pote + size += sizeof(Pote2); // pote2 size += sizeof(Aaa); // x - size += Bbb::size(); // y + size += sizeof(Bbb); // y return size; } -void RoseCommon::Packet::to_json(nlohmann::json& j, const SrvTest::Aaa& data) { +void RoseCommon::Packet::to_json(nlohmann::json& j, const SrvTest::aaa& data) { j = nlohmann::json{ { "value", static_cast(data) }, }; } -void RoseCommon::Packet::to_json(nlohmann::json& j, const SrvTest::Bbb& data) { +void RoseCommon::Packet::to_json(nlohmann::json& j, const SrvTest::bbb& data) { j = nlohmann::json{ { "value", data.operator std::string() }, }; } -void RoseCommon::Packet::to_json(nlohmann::json& j, const SrvTest::Pote& data) { - j = nlohmann::json{ - { "a", data.get_a() }, - { "b", data.get_b() }, - { "c", data.get_c() }, - }; -} -void RoseCommon::Packet::to_json(nlohmann::json& j, const SrvTest::Pote2& data) { - j = nlohmann::json{ - { "a", data.get_a() == 1 }, - { "b", data.get_b() == 1 }, - }; -} void RoseCommon::Packet::to_json(nlohmann::json& j, const SrvTest& data) { j = nlohmann::json{ - { "metadata", { "packet", "PAKWC_TEST" }, { "size", data.get_size() } }, + { "metadata", { { "packet", "PAKWC_TEST" }, { "size", data.get_size() } } }, { "fields", { { "a", data.get_a() == 1 }, { "b", data.get_b() == 1 }, diff --git a/srv_test.h b/srv_test.h index eda313e..a72b3ae 100644 --- a/srv_test.h +++ b/srv_test.h @@ -26,20 +26,20 @@ class SrvTest : public CRosePacket { static constexpr size_t size(); - enum Aaa : uint8_t { + enum aaa : uint8_t { ABC = 0, DEF = 1, GHI = 2, }; - struct Bbb : public ISerialize { - Bbb(); - Bbb(std::string); - Bbb(const Bbb&) = default; - Bbb(Bbb&&) = default; - Bbb& operator=(const Bbb&) = default; - Bbb& operator=(Bbb&&) = default; - virtual ~Bbb() = default; + struct bbb : public ISerialize { + bbb(); + bbb(std::string); + bbb(const bbb&) = default; + bbb(bbb&&) = default; + bbb& operator=(const bbb&) = default; + bbb& operator=(bbb&&) = default; + virtual ~bbb() = default; static constexpr size_t size(); @@ -54,44 +54,6 @@ class SrvTest : public CRosePacket { bool is_valid; }; - struct Pote : public ISerialize { - virtual bool read(CRoseReader&) override; - virtual bool write(CRoseBasePolicy&) const override; - - static constexpr size_t size(); - - Pote& set_a(const uint8_t); - uint8_t get_a() const; - Pote& set_b(const uint8_t); - uint8_t get_b() const; - Pote& set_c(const uint8_t); - uint8_t get_c() const; - - private: - union { - PACK(struct { - uint8_t a : 1; - uint8_t b : 7; - }); - uint8_t c; - } data; - }; - - struct Pote2 : public ISerialize { - virtual bool read(CRoseReader&) override; - virtual bool write(CRoseBasePolicy&) const override; - - static constexpr size_t size(); - - Pote2& set_a(const uint8_t); - uint8_t get_a() const; - Pote2& set_b(const uint8_t); - uint8_t get_b() const; - - private: - std::bitset<8> bitset3; - }; - SrvTest& set_a(const uint32_t); uint32_t get_a() const; @@ -136,11 +98,9 @@ class SrvTest : public CRosePacket { Bbb y; }; -void to_json(nlohmann::json& j, const SrvTest::Aaa& data); -void to_json(nlohmann::json& j, const SrvTest::Bbb& data); +void to_json(nlohmann::json& j, const SrvTest::aaa& data); +void to_json(nlohmann::json& j, const SrvTest::bbb& data); -void to_json(nlohmann::json& j, const SrvTest::Pote& data); -void to_json(nlohmann::json& j, const SrvTest::Pote2& data); void to_json(nlohmann::json& j, const SrvTest& data); }