diff --git a/Cargo.lock b/Cargo.lock index 7aa4a47..d5eac8f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", @@ -22,70 +22,77 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "apache-avro" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceb7c683b2f8f40970b70e39ff8be514c95b96fcb9c4af87e1ed2cb2e10801a0" +checksum = "1aef82843a0ec9f8b19567445ad2421ceeb1d711514384bdd3d49fe37102ee13" dependencies = [ "apache-avro-derive", + "bigdecimal", "digest", - "lazy_static", "libflate", "log", "num-bigint", @@ -93,6 +100,7 @@ dependencies = [ "rand", "regex-lite", "serde", + "serde_bytes", "serde_json", "strum", "strum_macros", @@ -103,34 +111,42 @@ dependencies = [ [[package]] name = "apache-avro-derive" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e317e411016923787d14f6deb741c1a1d036e64c2785b079747c852f7fae5ca4" +checksum = "8c3029311b93f214dcaccf8c9839217b56ad431de9319ca83f9b73b65d4535f2" dependencies = [ - "darling 0.20.3", + "darling", "proc-macro2", "quote", "serde_json", - "syn 2.0.48", + "syn", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] -name = "bitflags" -version = "1.3.2" +name = "bigdecimal" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "51d712318a27c7150326677b321a5fa91b55f6d9034ffd67f20319e147d40cee" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" @@ -143,14 +159,20 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", "serde", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cfg-if" version = "1.0.0" @@ -159,9 +181,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "num-traits", "serde", @@ -169,9 +191,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.14" +version = "4.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e92c5c1a78c62968ec57dbc2440366a2d6e5a23faf829970ff1585dc6b18e2" +checksum = "c937d4061031a6d0c8da4b9a4f98a172fc2976dfb1c19213a9cf7d0d3c837e36" dependencies = [ "clap_builder", "clap_derive", @@ -179,9 +201,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.14" +version = "4.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4323769dc8a61e2c39ad7dc26f6f2800524691a44d74fe3d1071a5c24db6370" +checksum = "85379ba512b21a328adf887e85f7742d12e96eb31f3ef077df4ffc26b506ffed" dependencies = [ "anstream", "anstyle", @@ -191,27 +213,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "core2" @@ -233,9 +255,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -261,9 +283,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-common" @@ -277,71 +299,37 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] - -[[package]] -name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.3", - "darling_macro 0.20.3", + "darling_core", + "darling_macro", ] [[package]] name = "darling_core" -version = "0.14.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.3", + "darling_core", "quote", - "syn 2.0.48", + "syn", ] [[package]] @@ -352,33 +340,33 @@ checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca" [[package]] name = "derive_builder" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" +checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" +checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" dependencies = [ - "darling 0.14.4", + "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "derive_builder_macro" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" +checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 1.0.109", + "syn", ] [[package]] @@ -399,19 +387,19 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fnv" @@ -431,9 +419,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -461,29 +449,30 @@ dependencies = [ [[package]] name = "globwalk" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 1.3.2", + "bitflags", "ignore", "walkdir", ] [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", + "allocator-api2", ] [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "ident_case" @@ -507,29 +496,35 @@ dependencies = [ "winapi-util", ] +[[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.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libflate" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7d5654ae1795afc7ff76f4365c2c8791b0feb18e8996a96adad8ffd7c3b2bf" +checksum = "45d9dfdc14ea4ef0900c1cddbc8dcd553fbaacd8a4a282cf4018ae9dd04fb21e" dependencies = [ "adler32", "core2", @@ -540,59 +535,64 @@ dependencies = [ [[package]] name = "libflate_lz77" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5f52fb8c451576ec6b79d3f4deb327398bc05bbdbd99021a6e77a4c855d524" +checksum = "e6e0d73b369f386f1c44abd9c570d5318f55ccde816ff4b562fa452e5182863d" dependencies = [ "core2", "hashbrown", "rle-decode-fast", ] +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", + "serde", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -605,9 +605,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "pest" -version = "2.7.6" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" dependencies = [ "memchr", "thiserror", @@ -616,9 +616,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.6" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" dependencies = [ "pest", "pest_generator", @@ -626,22 +626,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.6" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn", ] [[package]] name = "pest_meta" -version = "2.7.6" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" dependencies = [ "once_cell", "pest", @@ -650,9 +650,12 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "pretty_assertions" @@ -666,9 +669,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -681,9 +684,9 @@ checksum = "658fa1faf7a4cc5f057c9ee5ef560f717ad9d8dc66d975267f709624d6e1ab88" [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -718,20 +721,11 @@ dependencies = [ "getrandom", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "regex" -version = "1.10.2" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -741,9 +735,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -752,15 +746,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rle-decode-fast" @@ -781,38 +775,36 @@ dependencies = [ "lazy_static", "pretty_assertions", "serde", - "serde_bytes", "serde_json", "tempfile", "tera", "thiserror", - "uuid", ] [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.1", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -825,40 +817,41 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.195" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -876,45 +869,34 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.25.0" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn", ] [[package]] name = "syn" -version = "1.0.109" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -923,22 +905,22 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.9.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "once_cell", "rustix", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] name = "tera" -version = "1.19.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8" +checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee" dependencies = [ "globwalk", "lazy_static", @@ -952,42 +934,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn", ] [[package]] name = "typed-builder" -version = "0.16.2" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34085c17941e36627a879208083e25d357243812c30e7d7387c3b954f30ade16" +checksum = "a06fbd5b8de54c5f7c91f6fe4cebb949be2125d7758e630bb58b1d831dbce600" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.16.2" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03ca4cb38206e2bef0700092660bb74d696f808514dae47fa1467cbfe26e96e" +checksum = "f9534daa9fd3ed0bd911d462a37f172228077e7abf18c18a5f67199d959205f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn", ] [[package]] @@ -1060,31 +1042,30 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ - "getrandom", "serde", ] [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -1097,54 +1078,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "winapi" -version = "0.3.9" +name = "winapi-util" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "windows-sys 0.59.0", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.6" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "winapi", + "windows-targets", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -1153,45 +1122,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +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.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "yansi" @@ -1201,20 +1176,21 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn", ] diff --git a/Cargo.toml b/Cargo.toml index 89b86a5..234037b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,23 +10,21 @@ license = "MIT" readme = "README.md" [dependencies] -apache-avro = { version = "0.16", features = ["derive"] } +apache-avro = { version = "0.17", features = ["derive"] } clap = { version = "4", features = ["derive"], optional = true } glob = "0.3" -heck = "0.4" +heck = "0.5" lazy_static = "1" serde = { version = "1", features = ["serde_derive"] } serde_json = "1" tempfile = "3" tera = { version = "1", default-features = false } thiserror = "1" -uuid = { version = "1", features = ["serde", "v4"] } [dev-dependencies] chrono = { version = "0.4", default-features = false, features = ["serde"] } -derive_builder = "0.12" +derive_builder = "0.20" pretty_assertions = "1" -serde_bytes = "0.11" tempfile = "3" [profile.release] diff --git a/src/error.rs b/src/error.rs index 0f58222..514a7fe 100644 --- a/src/error.rs +++ b/src/error.rs @@ -21,12 +21,6 @@ impl From for Error { } } -impl From for Error { - fn from(source: uuid::Error) -> Self { - Error::Template(source.to_string()) - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/src/gen.rs b/src/gen.rs index ffd62ab..146c19c 100644 --- a/src/gen.rs +++ b/src/gen.rs @@ -2,7 +2,7 @@ use std::collections::{HashMap, VecDeque}; use std::fs; use std::io::prelude::*; -use apache_avro::schema::{DecimalSchema, RecordField, RecordSchema}; +use apache_avro::schema::{ArraySchema, DecimalSchema, MapSchema, RecordField, RecordSchema}; use crate::error::{Error, Result}; use crate::templates::*; @@ -107,11 +107,15 @@ impl Generator { } // Register inner type for it to be used as a nested type later - Schema::Array(ref inner) => { + Schema::Array(ArraySchema { + items: ref inner, .. + }) => { let type_str = array_type(inner, &gs)?; gs.put_type(&s, type_str) } - Schema::Map(ref inner) => { + Schema::Map(MapSchema { + types: ref inner, .. + }) => { let type_str = map_type(inner, &gs)?; gs.put_type(&s, type_str) } @@ -161,7 +165,7 @@ fn deps_stack(schema: &Schema, mut deps: Vec) -> Vec { Schema::Enum { .. } => push_unique(&mut deps, s.clone()), Schema::Fixed { .. } => push_unique(&mut deps, s.clone()), Schema::Decimal(DecimalSchema { inner, .. }) - if matches!(**inner, Schema::Fixed { .. }) => + if matches!(inner.as_ref(), Schema::Fixed { .. }) => { push_unique(&mut deps, s.clone()) } @@ -185,13 +189,17 @@ fn deps_stack(schema: &Schema, mut deps: Vec) -> Vec { Schema::Record { .. } => q.push_back(sr), // Push to the exploration queue, depending on the inner schema format - Schema::Map(sc) | Schema::Array(sc) => match sc.as_ref() { + Schema::Map(MapSchema { types: sc, .. }) + | Schema::Array(ArraySchema { items: sc, .. }) => match sc.as_ref() { Schema::Fixed { .. } | Schema::Enum { .. } | Schema::Record { .. } | Schema::Map(..) | Schema::Array(..) - | Schema::Union(..) => q.push_back(sc), + | Schema::Union(..) => { + q.push_back(sc); + push_unique(&mut deps, s.clone()); + } _ => (), }, Schema::Union(union) => { @@ -222,14 +230,18 @@ fn deps_stack(schema: &Schema, mut deps: Vec) -> Vec { } // Depending on the inner schema type ... - Schema::Map(sc) | Schema::Array(sc) => match &**sc { + Schema::Map(MapSchema { types: sc, .. }) + | Schema::Array(ArraySchema { items: sc, .. }) => match sc.as_ref() { // ... Needs further checks, push to the exploration queue Schema::Fixed { .. } | Schema::Enum { .. } | Schema::Record { .. } | Schema::Map(..) | Schema::Array(..) - | Schema::Union(..) => q.push_back(&**sc), + | Schema::Union(..) => { + q.push_back(sc.as_ref()); + push_unique(&mut deps, s.clone()); + } // ... Not nested, can be pushed to the result stack _ => push_unique(&mut deps, s.clone()), }, @@ -248,7 +260,10 @@ fn deps_stack(schema: &Schema, mut deps: Vec) -> Vec { | Schema::Record { .. } | Schema::Map(..) | Schema::Array(..) - | Schema::Union(..) => q.push_back(sc), + | Schema::Union(..) => { + q.push_back(sc); + push_unique(&mut deps, s.clone()); + } // ... Not nested, can be pushed to the result stack _ => push_unique(&mut deps, s.clone()), }); @@ -352,6 +367,7 @@ impl GeneratorBuilder { #[cfg(test)] mod tests { use apache_avro::schema::{EnumSchema, Name}; + use pretty_assertions::assert_eq; use super::*; @@ -447,7 +463,6 @@ pub struct A { let mut buf = vec![]; g.gen(&source, &mut buf)?; let res = String::from_utf8(buf)?; - println!("{}", res); assert_eq!(expected, res); diff --git a/src/templates.rs b/src/templates.rs index 194b067..7acd015 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -2,17 +2,18 @@ #![allow(clippy::try_err)] +use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; use apache_avro::schema::{ - DecimalSchema, EnumSchema, FixedSchema, Name, RecordField, RecordSchema, UnionSchema, + ArraySchema, DecimalSchema, EnumSchema, FixedSchema, MapSchema, Name, RecordField, + RecordSchema, UnionSchema, }; use apache_avro::Schema; use heck::{ToSnakeCase, ToUpperCamelCase}; use lazy_static::lazy_static; use serde_json::Value; use tera::{Context, Tera}; -use uuid::Uuid; use crate::error::{Error, Result}; @@ -263,7 +264,7 @@ impl GenState { _ => None, }) .collect::>(); - let not_eq = Self::get_not_eq_schemas(deps, &schemata_by_name)?; + let not_eq = Self::get_not_eq_schemata(deps, &schemata_by_name)?; Ok(GenState { types_by_schema: HashMap::new(), schemata_by_name, @@ -303,18 +304,54 @@ impl GenState { } } - /// Utility function to find nested type that does not implement Eq in record and its dependencies. + /// Utility function to find nested type that does not implement Eq in record and + /// its dependencies. fn deep_search_not_eq( schema: &Schema, schemata_by_name: &HashMap, + inner_not_eq: &mut HashMap, + outer_not_eq: &mut HashMap, ) -> Result { + if let Some(name) = schema.name() { + match inner_not_eq.entry(name.clone()) { + Entry::Occupied(not_eq) => return Ok(*not_eq.get()), + Entry::Vacant(not_eq) => { + not_eq.insert(false); + } + } + } match schema { - Schema::Array(inner) | Schema::Map(inner) => { - Self::deep_search_not_eq(inner, schemata_by_name) + Schema::Array(ArraySchema { items: inner, .. }) + | Schema::Map(MapSchema { types: inner, .. }) => { + let not_eq = + Self::deep_search_not_eq(inner, schemata_by_name, inner_not_eq, outer_not_eq)?; + match schema.name() { + Some(schema_name) if not_eq => { + inner_not_eq.insert(schema_name.clone(), true); + outer_not_eq.insert(schema_name.clone(), true); + } + _ => {} + } + Ok(not_eq) } Schema::Record(RecordSchema { fields, .. }) => { for f in fields { - if Self::deep_search_not_eq(&f.schema, schemata_by_name)? { + let not_eq = Self::deep_search_not_eq( + &f.schema, + schemata_by_name, + inner_not_eq, + outer_not_eq, + )?; + + match schema.name() { + Some(schema_name) if not_eq => { + inner_not_eq.insert(schema_name.clone(), true); + outer_not_eq.insert(schema_name.clone(), true); + } + _ => {} + } + + if not_eq { return Ok(true); } } @@ -322,38 +359,63 @@ impl GenState { } Schema::Union(union) => { for s in union.variants() { - if Self::deep_search_not_eq(s, schemata_by_name)? { + if Self::deep_search_not_eq(s, schemata_by_name, inner_not_eq, outer_not_eq)? { return Ok(true); } } Ok(false) } - Schema::Ref { name } => schemata_by_name - .get(name) - .ok_or_else(|| { + Schema::Ref { name } => { + let schema = schemata_by_name.get(name).ok_or_else(|| { Error::Template(format!( "Ref `{name:?}` is not resolved. Schema: {schema:?}", )) - }) - .and_then(|s| Self::deep_search_not_eq(s, schemata_by_name)), + })?; + inner_not_eq.remove(&name); // Force re-exploration of the ref schema + outer_not_eq.remove(&name); // Force re-exploration of the ref schema + let not_eq = + Self::deep_search_not_eq(schema, schemata_by_name, inner_not_eq, outer_not_eq)?; + match schema.name() { + Some(schema_name) if not_eq => { + inner_not_eq.insert(schema_name.clone(), true); + outer_not_eq.insert(schema_name.clone(), true); + } + _ => {} + } + Ok(not_eq) + } Schema::Float | Schema::Double => Ok(true), _ => Ok(false), } } - /// Fill HashSet with schemas that contains type which does not implement Eq - fn get_not_eq_schemas( + /// Fill HashSet with schemata that contains type which does not implement Eq + fn get_not_eq_schemata( deps: &[Schema], schemata_by_name: &HashMap, ) -> Result> { - let mut float_schemas = HashSet::new(); + let mut schemata_not_eq = HashSet::new(); + let mut outer_not_eq = HashMap::new(); for dep in deps { - if Self::deep_search_not_eq(dep, schemata_by_name)? { + let mut inner_not_eq = HashMap::new(); + let not_eq = Self::deep_search_not_eq( + dep, + schemata_by_name, + &mut inner_not_eq, + &mut outer_not_eq, + )?; + let not_eq = not_eq + || inner_not_eq.values().any(|¬_eq| not_eq) + || inner_not_eq + .keys() + .filter_map(|n| outer_not_eq.get(n)) + .any(|¬_eq| not_eq); + if not_eq { let str_schema = serde_json::to_string(dep).expect("Unexpected invalid schema"); - float_schemas.insert(str_schema); + schemata_not_eq.insert(str_schema); } } - Ok(float_schemas) + Ok(schemata_not_eq) } } @@ -501,8 +563,11 @@ impl Templater { Schema::Date if self.use_chrono_dates => { f.push(name_std.clone()); - t.insert(name_std.clone(), "chrono::NaiveDateTime".to_string()); - w.insert(name_std.clone(), "chrono::naive::serde::ts_seconds"); + t.insert( + name_std.clone(), + "chrono::DateTime".to_string(), + ); + w.insert(name_std.clone(), "chrono::serde::ts_seconds"); if let Some(default) = default { let default = self.parse_default(schema, gen_state, default)?; d.insert(name_std.clone(), default); @@ -513,8 +578,11 @@ impl Templater { if self.use_chrono_dates => { f.push(name_std.clone()); - t.insert(name_std.clone(), "chrono::NaiveDateTime".to_string()); - w.insert(name_std.clone(), "chrono::naive::serde::ts_milliseconds"); + t.insert( + name_std.clone(), + "chrono::DateTime".to_string(), + ); + w.insert(name_std.clone(), "chrono::serde::ts_milliseconds"); if let Some(default) = default { let default = self.parse_default(schema, gen_state, default)?; d.insert(name_std.clone(), default); @@ -525,8 +593,26 @@ impl Templater { if self.use_chrono_dates => { f.push(name_std.clone()); - t.insert(name_std.clone(), "chrono::NaiveDateTime".to_string()); - w.insert(name_std.clone(), "chrono::naive::serde::ts_microseconds"); + t.insert( + name_std.clone(), + "chrono::DateTime".to_string(), + ); + w.insert(name_std.clone(), "chrono::serde::ts_microseconds"); + if let Some(default) = default { + let default = self.parse_default(schema, gen_state, default)?; + d.insert(name_std.clone(), default); + } + } + + Schema::TimestampNanos | Schema::LocalTimestampNanos + if self.use_chrono_dates => + { + f.push(name_std.clone()); + t.insert( + name_std.clone(), + "chrono::DateTime".to_string(), + ); + w.insert(name_std.clone(), "chrono::serde::ts_nanoseconds"); if let Some(default) = default { let default = self.parse_default(schema, gen_state, default)?; d.insert(name_std.clone(), default); @@ -547,7 +633,9 @@ impl Templater { | Schema::TimestampMillis | Schema::LocalTimestampMillis | Schema::TimestampMicros - | Schema::LocalTimestampMicros => { + | Schema::LocalTimestampMicros + | Schema::TimestampNanos + | Schema::LocalTimestampNanos => { f.push(name_std.clone()); t.insert(name_std.clone(), "i64".to_string()); if let Some(default) = default { @@ -577,7 +665,7 @@ impl Templater { Schema::Bytes => { f.push(name_std.clone()); t.insert(name_std.clone(), "Vec".to_string()); - w.insert(name_std.clone(), "serde_bytes"); + w.insert(name_std.clone(), "apache_avro::serde_avro_bytes"); if let Some(default) = default { let default = self.parse_default(schema, gen_state, default)?; d.insert(name_std.clone(), default); @@ -595,7 +683,7 @@ impl Templater { Schema::Uuid => { f.push(name_std.clone()); - t.insert(name_std.clone(), "uuid::Uuid".to_string()); + t.insert(name_std.clone(), "apache_avro::Uuid".to_string()); if let Some(default) = default { let default = self.parse_default(schema, gen_state, default)?; d.insert(name_std.clone(), default); @@ -620,12 +708,22 @@ impl Templater { } } + Schema::BigDecimal => { + f.push(name_std.clone()); + t.insert(name_std.clone(), "apache_avro::BigDecimal".to_string()); + if let Some(default) = default { + let default = self.parse_default(schema, gen_state, default)?; + d.insert(name_std.clone(), default); + } + } + Schema::Fixed(FixedSchema { name: Name { name: f_name, .. }, .. }) => { let f_name = sanitize(f_name.to_upper_camel_case()); f.push(name_std.clone()); + w.insert(name_std.clone(), "apache_avro::serde_avro_fixed"); t.insert(name_std.clone(), f_name.clone()); if let Some(default) = default { let default = self.parse_default(schema, gen_state, default)?; @@ -633,7 +731,7 @@ impl Templater { } } - Schema::Array(inner) => match inner.as_ref() { + Schema::Array(ArraySchema { items: inner, .. }) => match inner.as_ref() { Schema::Null => err!("Invalid use of Schema::Null")?, _ => { let type_str = array_type(inner, gen_state)?; @@ -646,7 +744,7 @@ impl Templater { } }, - Schema::Map(inner) => match inner.as_ref() { + Schema::Map(MapSchema { types: inner, .. }) => match inner.as_ref() { Schema::Null => err!("Invalid use of Schema::Null")?, _ => { let type_str = map_type(inner, gen_state)?; @@ -697,7 +795,12 @@ impl Templater { && union.variants().len() == 2 && matches!(union.variants()[1], Schema::Bytes) { - w.insert(name_std.clone(), "serde_bytes"); + w.insert(name_std.clone(), "apache_avro::serde_avro_bytes_opt"); + } else if union.is_nullable() + && union.variants().len() == 2 + && matches!(union.variants()[1], Schema::Fixed(_)) + { + w.insert(name_std.clone(), "apache_avro::serde_avro_fixed_opt"); } } @@ -756,16 +859,18 @@ impl Templater { Schema::Long => "Long(i64)".into(), Schema::Float => "Float(f32)".into(), Schema::Double => "Double(f64)".into(), - Schema::Bytes => r#"Bytes(#[serde(with = "serde_bytes")] Vec)"#.into(), + Schema::Bytes => { + r#"Bytes(#[serde(with = "apache_avro::serde_avro_bytes")] Vec)"#.into() + } Schema::String => "String(String)".into(), - Schema::Array(inner) => { + Schema::Array(ArraySchema { items: inner, .. }) => { format!( "Array{}({})", union_enum_variant(inner.as_ref(), gen_state)?, array_type(inner.as_ref(), gen_state)? ) } - Schema::Map(inner) => format!( + Schema::Map(MapSchema { types: inner, .. }) => format!( "Map{}({})", union_enum_variant(inner.as_ref(), gen_state)?, map_type(sc, gen_state)? @@ -792,25 +897,30 @@ impl Templater { format!("{f}({f})", f = sanitize(name.to_upper_camel_case())) } Schema::Decimal { .. } => "Decimal(apache_avro::Decimal)".into(), - Schema::Uuid => "Uuid(uuid::Uuid)".into(), + Schema::BigDecimal => "BigDecimal(apache_avro::BigDecimal)".into(), + Schema::Uuid => "Uuid(apache_avro::Uuid)".into(), Schema::Date | Schema::TimeMillis | Schema::TimeMicros | Schema::TimestampMillis | Schema::TimestampMicros + | Schema::TimestampNanos | Schema::LocalTimestampMillis | Schema::LocalTimestampMicros + | Schema::LocalTimestampNanos if self.use_chrono_dates => { - "NaiveDateTime(chrono::NaiveDateTime)".into() + "NaiveDateTime(chrono::DateTime)".into() } Schema::Date => "Date(i32)".into(), Schema::TimeMillis => "TimeMillis(i32)".into(), Schema::TimeMicros => "TimeMicros(i64)".into(), Schema::TimestampMillis => "TimestampMillis(i64)".into(), Schema::TimestampMicros => "TimestampMicros(i64)".into(), + Schema::TimestampNanos => "TimestampNanos(i64)".into(), Schema::LocalTimestampMillis => "LocalTimestampMillis(i64)".into(), Schema::LocalTimestampMicros => "LocalTimestampMicros(i64)".into(), + Schema::LocalTimestampNanos => "LocalTimestampNanos(i64)".into(), Schema::Duration => "Duration(apache_avro::Duration)".into(), Schema::Null => err!( "Invalid Schema::Null not in first position on an UnionSchema variants" @@ -893,7 +1003,7 @@ impl Templater { Schema::Date if self.use_chrono_dates => match default { Value::Number(n) if n.is_i64() => format!( - "chrono::NaiveDateTime::from_timestamp_opt({}, 0).unwrap()", + "chrono::DateTime::::from_timestamp({}, 0).unwrap()", n.as_i64().unwrap() ), _ => err!("Invalid default: {:?}", default)?, @@ -904,7 +1014,7 @@ impl Templater { { match default { Value::Number(n) if n.is_i64() => format!( - "chrono::NaiveDateTime::from_timestamp_millis({}).unwrap()", + "chrono::DateTime::::from_timestamp_millis({}).unwrap()", n.as_i64().unwrap() ), _ => err!("Invalid default: {:?}", default)?, @@ -916,7 +1026,17 @@ impl Templater { { match default { Value::Number(n) if n.is_i64() => format!( - "chrono::NaiveDateTime::from_timestamp_micros({}).unwrap()", + "chrono::DateTime::::from_timestamp_micros({}).unwrap()", + n.as_i64().unwrap() + ), + _ => err!("Invalid default: {:?}", default)?, + } + } + + Schema::TimestampNanos | Schema::LocalTimestampNanos if self.use_chrono_dates => { + match default { + Value::Number(n) if n.is_i64() => format!( + "chrono::DateTime::::from_timestamp_nanos({}).unwrap()", n.as_i64().unwrap() ), _ => err!("Invalid default: {:?}", default)?, @@ -932,8 +1052,10 @@ impl Templater { | Schema::TimeMicros | Schema::TimestampMillis | Schema::TimestampMicros + | Schema::TimestampNanos | Schema::LocalTimestampMillis - | Schema::LocalTimestampMicros => match default { + | Schema::LocalTimestampMicros + | Schema::LocalTimestampNanos => match default { Value::Number(n) if n.is_i64() => n.to_string(), _ => err!("Invalid default: {:?}", default)?, }, @@ -978,8 +1100,9 @@ impl Templater { Schema::Uuid => match default { Value::String(s) => { format!( - r#"uuid::Uuid::parse_str("{}").unwrap()"#, - Uuid::parse_str(s)? + r#"apache_avro::Uuid::parse_str("{}").unwrap()"#, + apache_avro::Uuid::parse_str(s) + .map_err(|e| Error::Template(e.to_string()))? ) } _ => err!("Invalid default: {:?}", default)?, @@ -1017,6 +1140,13 @@ impl Templater { _ => err!("Invalid Decimal inner Schema: {:?}", inner)?, }, + Schema::BigDecimal => match default { + Value::String(s) => { + format!(r#"apache_avro::BigDecimal::parse_str("{}").unwrap()"#, s) + } + _ => err!("Invalid default: {:?}", default)?, + }, + Schema::Fixed(FixedSchema { size, .. }) => match default { Value::String(s) => { let bytes = s.clone().into_bytes(); @@ -1028,12 +1158,12 @@ impl Templater { _ => err!("Invalid default: {:?}", default)?, }, - Schema::Array(inner) => match inner.as_ref() { + Schema::Array(ArraySchema { items: inner, .. }) => match inner.as_ref() { Schema::Null => err!("Invalid use of Schema::Null")?, _ => self.array_default(inner, gen_state, default)?, }, - Schema::Map(inner) => match inner.as_ref() { + Schema::Map(MapSchema { types: inner, .. }) => match inner.as_ref() { Schema::Null => err!("Invalid use of Schema::Null")?, _ => self.map_default(inner, gen_state, default)?, }, @@ -1203,19 +1333,27 @@ pub(crate) fn array_type(inner: &Schema, gen_state: &GenState) -> Result | Schema::TimeMicros | Schema::TimestampMillis | Schema::TimestampMicros + | Schema::TimestampNanos + | Schema::LocalTimestampMillis + | Schema::LocalTimestampMicros + | Schema::LocalTimestampNanos if gen_state.use_chrono_dates => { - "Vec".into() + "Vec>".into() } - Schema::Date => "Vec".into(), - Schema::TimeMillis => "Vec".into(), - Schema::TimeMicros => "Vec".into(), - Schema::TimestampMillis | Schema::LocalTimestampMillis => "Vec".into(), - Schema::TimestampMicros | Schema::LocalTimestampMicros => "Vec".into(), + Schema::Date | Schema::TimeMillis => "Vec".into(), + Schema::TimeMicros + | Schema::TimestampMillis + | Schema::TimestampMicros + | Schema::TimestampNanos + | Schema::LocalTimestampMillis + | Schema::LocalTimestampMicros + | Schema::LocalTimestampNanos => "Vec".into(), - Schema::Uuid => "Vec".into(), + Schema::Uuid => "Vec".into(), Schema::Decimal { .. } => "Vec".into(), + Schema::BigDecimal => "Vec".into(), Schema::Duration { .. } => "Vec".into(), Schema::Fixed(FixedSchema { @@ -1278,17 +1416,21 @@ pub(crate) fn map_type(inner: &Schema, gen_state: &GenState) -> Result { | Schema::LocalTimestampMicros if gen_state.use_chrono_dates => { - map_of("chrono::NaiveDateTime") + map_of("chrono::DateTime") } - Schema::Date => map_of("i32"), - Schema::TimeMillis => map_of("i32"), - Schema::TimeMicros => map_of("i64"), - Schema::TimestampMillis | Schema::LocalTimestampMillis => map_of("i64"), - Schema::TimestampMicros | Schema::LocalTimestampMicros => map_of("i64"), + Schema::Date | Schema::TimeMillis => map_of("i32"), + Schema::TimeMicros + | Schema::TimestampMillis + | Schema::TimestampMicros + | Schema::TimestampNanos + | Schema::LocalTimestampMillis + | Schema::LocalTimestampMicros + | Schema::LocalTimestampNanos => map_of("i64"), - Schema::Uuid => map_of("uuid::Uuid"), + Schema::Uuid => map_of("apache_avro::Uuid"), Schema::Decimal { .. } => map_of("apache_avro::Decimal"), + Schema::BigDecimal => map_of("apache_avro::BigDecimal"), Schema::Duration { .. } => map_of("apache_avro::Duration"), Schema::Fixed(FixedSchema { @@ -1336,10 +1478,12 @@ fn union_enum_variant(schema: &Schema, gen_state: &GenState) -> Result { Schema::Double => "Double".into(), Schema::Bytes => "Bytes".into(), Schema::String => "String".into(), - Schema::Array(inner) => { + Schema::Array(ArraySchema { items: inner, .. }) => { format!("Array{}", union_enum_variant(inner.as_ref(), gen_state)?) } - Schema::Map(inner) => format!("Map{}", union_enum_variant(inner.as_ref(), gen_state)?), + Schema::Map(MapSchema { types: inner, .. }) => { + format!("Map{}", union_enum_variant(inner.as_ref(), gen_state)?) + } Schema::Union(union) => union_type(union, gen_state, false)?, Schema::Record(RecordSchema { name: Name { name, .. }, @@ -1355,14 +1499,17 @@ fn union_enum_variant(schema: &Schema, gen_state: &GenState) -> Result { }) => sanitize(name.to_upper_camel_case()), Schema::Decimal { .. } => "Decimal".into(), + Schema::BigDecimal => "BigDecimal".into(), Schema::Uuid => "Uuid".into(), Schema::Date => "Date".into(), Schema::TimeMillis => "TimeMillis".into(), Schema::TimeMicros => "TimeMicros".into(), Schema::TimestampMillis => "TimestampMillis".into(), Schema::TimestampMicros => "TimestampMicros".into(), + Schema::TimestampNanos => "TimestampNanos".into(), Schema::LocalTimestampMillis => "LocalTimestampMillis".into(), Schema::LocalTimestampMicros => "LocalTimestampMicros".into(), + Schema::LocalTimestampNanos => "LocalTimestampNanos".into(), Schema::Duration => "Duration".into(), Schema::Null => { err!("Invalid Schema::Null not in first position on an UnionSchema variants")? @@ -1427,20 +1574,26 @@ pub(crate) fn option_type(inner: &Schema, gen_state: &GenState) -> Result { - "Option".into() + "Option>".into() } - Schema::Date => "Option".into(), - Schema::TimeMillis => "Option".into(), - Schema::TimeMicros => "Option".into(), - Schema::TimestampMillis | Schema::LocalTimestampMillis => "Option".into(), - Schema::TimestampMicros | Schema::LocalTimestampMicros => "Option".into(), + Schema::Date | Schema::TimeMillis => "Option".into(), + Schema::TimeMicros + | Schema::TimestampMillis + | Schema::TimestampMicros + | Schema::TimestampNanos + | Schema::LocalTimestampMillis + | Schema::LocalTimestampMicros + | Schema::LocalTimestampNanos => "Option".into(), - Schema::Uuid => "Option".into(), + Schema::Uuid => "Option".into(), Schema::Decimal { .. } => "Option".into(), + Schema::BigDecimal => "Option".into(), Schema::Duration { .. } => "Option".into(), Schema::Fixed(FixedSchema { diff --git a/tests/generation.rs b/tests/generation.rs index 0b57caa..adcc9c7 100644 --- a/tests/generation.rs +++ b/tests/generation.rs @@ -59,6 +59,11 @@ fn gen_optional_arrays() { validate_generation("optional_arrays", Generator::new().unwrap()); } +#[test] +fn gen_array_3d() { + validate_generation("array_3d", Generator::new().unwrap()); +} + #[test] fn gen_mono_valued_union() { validate_generation("mono_valued_union", Generator::new().unwrap()); @@ -131,7 +136,12 @@ fn gen_nullable_logical_dates() { } #[test] -fn logical_dates() { +fn gen_decimals() { + validate_generation("decimals", Generator::builder().build().unwrap()); +} + +#[test] +fn gen_logical_dates() { validate_generation( "logical_dates", Generator::builder().use_chrono_dates(true).build().unwrap(), @@ -189,6 +199,16 @@ fn gen_fixed() { } #[test] -fn nested_with_float() { +fn gen_nested_with_float() { validate_generation("nested_with_float", Generator::new().unwrap()); } + +#[test] +fn gen_recursive() { + validate_generation("recursive", Generator::new().unwrap()); +} + +#[test] +fn gen_interop() { + validate_generation("interop", Generator::new().unwrap()); +} diff --git a/tests/invalid.rs b/tests/invalid.rs index aa7f2e8..29fe9e1 100644 --- a/tests/invalid.rs +++ b/tests/invalid.rs @@ -1,14 +1,16 @@ use rsgen_avro::{Generator, Source}; #[test] -#[should_panic(expected = "Invalid default: Object {}, expected: Array")] +#[should_panic( + expected = r#"Avro error: `default`'s value type of field "m_f64" in "User" must be "{\"type\":\"array\",\"items\":\"double\"}""# +)] fn bad_default_for_array() { let raw_schema = r#" { "type": "record", "name": "User", "fields": [ { - "name": "m-f64", + "name": "m_f64", "type": {"type": "array", "items": "double"}, "default": {} } ] @@ -18,18 +20,20 @@ fn bad_default_for_array() { let g = Generator::new().unwrap(); let src = Source::SchemaStr(raw_schema); let mut buf = vec![]; - g.gen(&src, &mut buf).unwrap() + g.gen(&src, &mut buf).map_err(|e| panic!("{e}")).ok(); } #[test] -#[should_panic(expected = "Invalid default: Array [], expected: Map")] +#[should_panic( + expected = r#"Avro error: `default`'s value type of field "m_f64" in "User" must be "{\"type\":\"map\",\"values\":\"double\"}""# +)] fn bad_default_for_map() { let raw_schema = r#" { "type": "record", "name": "User", "fields": [ { - "name": "m-f64", + "name": "m_f64", "type": {"type": "map", "values": "double"}, "default": [] } ] @@ -39,18 +43,20 @@ fn bad_default_for_map() { let g = Generator::new().unwrap(); let src = Source::SchemaStr(raw_schema); let mut buf = vec![]; - g.gen(&src, &mut buf).unwrap() + g.gen(&src, &mut buf).map_err(|e| panic!("{e}")).ok(); } #[test] -#[should_panic(expected = "Invalid default: Array [], expected: Object")] +#[should_panic( + expected = r#"Avro error: `default`'s value type of field "m_f64" in "User" must be "{\"name\":\"Inner\",\"type\":\"record\",\"fields\":[{\"name\":\"a\",\"type\":\"boolean\"}]}""# +)] fn bad_default_for_record() { let raw_schema = r#" { "type": "record", "name": "User", "fields": [ { - "name": "m-f64", + "name": "m_f64", "type": { "type": "record", "name": "Inner", @@ -67,5 +73,5 @@ fn bad_default_for_record() { let g = Generator::new().unwrap(); let src = Source::SchemaStr(raw_schema); let mut buf = vec![]; - g.gen(&src, &mut buf).unwrap() + g.gen(&src, &mut buf).map_err(|e| panic!("{e}")).ok(); } diff --git a/tests/nullable.rs b/tests/nullable.rs index d4e90df..51f80b6 100644 --- a/tests/nullable.rs +++ b/tests/nullable.rs @@ -44,7 +44,7 @@ fn deser_nullable_logical_dates() { let val = serde_json::from_str::(serialized) .unwrap(); assert!( - val.birthday == chrono::NaiveDateTime::from_timestamp_opt(1681601653, 0).unwrap(), + val.birthday == chrono::DateTime::::from_timestamp(1681601653, 0).unwrap(), "Should use schema-defined default value when null" ); assert!( @@ -53,7 +53,7 @@ fn deser_nullable_logical_dates() { ); assert!( val.release_datetime_micro - == chrono::NaiveDateTime::from_timestamp_micros(1681601301000000).unwrap(), + == chrono::DateTime::::from_timestamp_micros(1681601301000000).unwrap(), "Deserialized value is different from payload value" ); } diff --git a/tests/schemas/array_3d.avsc b/tests/schemas/array_3d.avsc new file mode 100644 index 0000000..ad3a43a --- /dev/null +++ b/tests/schemas/array_3d.avsc @@ -0,0 +1,17 @@ +{ + "type" : "record", + "name" : "Array3d", + "fields" : [ { + "name" : "coordinates", + "type" : { + "type" : "array", + "items" : { + "type" : "array", + "items" : { + "type" : "array", + "items" : "double" + } + } + } + } ] +} \ No newline at end of file diff --git a/tests/schemas/array_3d.rs b/tests/schemas/array_3d.rs new file mode 100644 index 0000000..08f3c86 --- /dev/null +++ b/tests/schemas/array_3d.rs @@ -0,0 +1,5 @@ + +#[derive(Debug, PartialEq, Clone, serde::Deserialize, serde::Serialize)] +pub struct Array3d { + pub coordinates: Vec>>, +} diff --git a/tests/schemas/decimals.avsc b/tests/schemas/decimals.avsc new file mode 100644 index 0000000..d3c09a5 --- /dev/null +++ b/tests/schemas/decimals.avsc @@ -0,0 +1,12 @@ +{ + "type": "record", + "name": "Decimals", + "fields": [ { + "name": "a_decimal", + "type": {"type": "bytes", "logicalType": "decimal", "precision": 4, "scale": 2} + }, { + "name": "a_big_decimal", + "type": ["null", {"type": "bytes", "logicalType": "big-decimal"}], + "default": null + } ] +} diff --git a/tests/schemas/decimals.rs b/tests/schemas/decimals.rs new file mode 100644 index 0000000..91d3d18 --- /dev/null +++ b/tests/schemas/decimals.rs @@ -0,0 +1,10 @@ + +#[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)] +pub struct Decimals { + pub a_decimal: apache_avro::Decimal, + #[serde(default = "default_decimals_a_big_decimal")] + pub a_big_decimal: Option, +} + +#[inline(always)] +fn default_decimals_a_big_decimal() -> Option { None } diff --git a/tests/schemas/interop.avsc b/tests/schemas/interop.avsc new file mode 100644 index 0000000..df0e00e --- /dev/null +++ b/tests/schemas/interop.avsc @@ -0,0 +1,27 @@ +{"type": "record", "name":"Interop", "namespace": "org.apache.avro", + "fields": [ + {"name": "intField", "type": "int"}, + {"name": "longField", "type": "long"}, + {"name": "stringField", "type": "string"}, + {"name": "boolField", "type": "boolean"}, + {"name": "floatField", "type": "float"}, + {"name": "doubleField", "type": "double"}, + {"name": "bytesField", "type": "bytes"}, + {"name": "arrayField", "type": {"type": "array", "items": "double"}}, + {"name": "mapField", "type": + {"type": "map", "values": + {"type": "record", "name": "Foo", + "fields": [{"name": "label", "type": "string"}]}}}, + {"name": "unionField", "type": + ["boolean", "double", {"type": "array", "items": "bytes"}]}, + {"name": "enumField", "type": + {"type": "enum", "name": "Kind", "symbols": ["A","B","C"]}}, + {"name": "fixedField", "type": + {"type": "fixed", "name": "MD5", "size": 16}}, + {"name": "recordField", "type": + {"type": "record", "name": "Node", + "fields": [ + {"name": "label", "type": "string"}, + {"name": "children", "type": {"type": "array", "items": "Node"}}]}} + ] +} \ No newline at end of file diff --git a/tests/schemas/interop.rs b/tests/schemas/interop.rs new file mode 100644 index 0000000..097d594 --- /dev/null +++ b/tests/schemas/interop.rs @@ -0,0 +1,96 @@ + +#[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)] +pub struct Node { + pub label: String, + pub children: Vec, +} + +#[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)] +pub struct Foo { + pub label: String, +} + +pub type Md5 = [u8; 16]; + +#[derive(Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Clone, serde::Deserialize, serde::Serialize)] +pub enum Kind { + A, + B, + C, +} + +/// Auto-generated type for unnamed Avro union variants. +#[derive(Debug, PartialEq, Clone, serde::Deserialize, serde::Serialize)] +pub enum UnionBooleanDoubleArrayBytes { + Boolean(bool), + Double(f64), + ArrayBytes(Vec>), +} + +impl From for UnionBooleanDoubleArrayBytes { + fn from(v: bool) -> Self { + Self::Boolean(v) + } +} + +impl TryFrom for bool { + type Error = UnionBooleanDoubleArrayBytes; + + fn try_from(v: UnionBooleanDoubleArrayBytes) -> Result { + if let UnionBooleanDoubleArrayBytes::Boolean(v) = v { + Ok(v) + } else { + Err(v) + } + } +} + +impl From for UnionBooleanDoubleArrayBytes { + fn from(v: f64) -> Self { + Self::Double(v) + } +} + +impl TryFrom for f64 { + type Error = UnionBooleanDoubleArrayBytes; + + fn try_from(v: UnionBooleanDoubleArrayBytes) -> Result { + if let UnionBooleanDoubleArrayBytes::Double(v) = v { + Ok(v) + } else { + Err(v) + } + } +} + +#[derive(Debug, PartialEq, Clone, serde::Deserialize, serde::Serialize)] +pub struct Interop { + #[serde(rename = "intField")] + pub int_field: i32, + #[serde(rename = "longField")] + pub long_field: i64, + #[serde(rename = "stringField")] + pub string_field: String, + #[serde(rename = "boolField")] + pub bool_field: bool, + #[serde(rename = "floatField")] + pub float_field: f32, + #[serde(rename = "doubleField")] + pub double_field: f64, + #[serde(rename = "bytesField")] + #[serde(with = "apache_avro::serde_avro_bytes")] + pub bytes_field: Vec, + #[serde(rename = "arrayField")] + pub array_field: Vec, + #[serde(rename = "mapField")] + pub map_field: ::std::collections::HashMap, + #[serde(rename = "unionField")] + pub union_field: UnionBooleanDoubleArrayBytes, + #[serde(rename = "enumField")] + pub enum_field: Kind, + #[serde(rename = "fixedField")] + #[serde(with = "apache_avro::serde_avro_fixed")] + pub fixed_field: Md5, + #[serde(rename = "recordField")] + pub record_field: Node, +} diff --git a/tests/schemas/logical_dates.avsc b/tests/schemas/logical_dates.avsc index e6705ff..8b9c254 100644 --- a/tests/schemas/logical_dates.avsc +++ b/tests/schemas/logical_dates.avsc @@ -8,7 +8,7 @@ "name": "meeting_time", "type": ["null", {"type": "long", "logicalType": "timestamp-millis"}], "default": null - }, { + }, { "name": "release_datetime_micro", "type": {"type": "long", "logicalType": "timestamp-micros"}, "default": 1570903062000000 diff --git a/tests/schemas/logical_dates.rs b/tests/schemas/logical_dates.rs index 5515fd4..0cb55ac 100644 --- a/tests/schemas/logical_dates.rs +++ b/tests/schemas/logical_dates.rs @@ -2,17 +2,17 @@ /// Date type #[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)] pub struct DateLogicalType { - #[serde(with = "chrono::naive::serde::ts_seconds")] - pub birthday: chrono::NaiveDateTime, + #[serde(with = "chrono::serde::ts_seconds")] + pub birthday: chrono::DateTime, #[serde(default = "default_datelogicaltype_meeting_time")] - pub meeting_time: Option, - #[serde(with = "chrono::naive::serde::ts_microseconds")] + pub meeting_time: Option>, + #[serde(with = "chrono::serde::ts_microseconds")] #[serde(default = "default_datelogicaltype_release_datetime_micro")] - pub release_datetime_micro: chrono::NaiveDateTime, + pub release_datetime_micro: chrono::DateTime, } #[inline(always)] -fn default_datelogicaltype_meeting_time() -> Option { None } +fn default_datelogicaltype_meeting_time() -> Option> { None } #[inline(always)] -fn default_datelogicaltype_release_datetime_micro() -> chrono::NaiveDateTime { chrono::NaiveDateTime::from_timestamp_micros(1570903062000000).unwrap() } +fn default_datelogicaltype_release_datetime_micro() -> chrono::DateTime { chrono::DateTime::::from_timestamp_micros(1570903062000000).unwrap() } diff --git a/tests/schemas/mod.rs b/tests/schemas/mod.rs index a7a6ee8..7db547e 100644 --- a/tests/schemas/mod.rs +++ b/tests/schemas/mod.rs @@ -1,10 +1,13 @@ +pub mod array_3d; pub mod complex; +pub mod decimals; pub mod enums; pub mod enums_casing; pub mod enums_multiline_doc; pub mod enums_sanitize; #[allow(dead_code)] pub mod fixed; +pub mod interop; pub mod logical_dates; pub mod map_default; pub mod map_multiple_def; @@ -24,6 +27,7 @@ pub mod optional_arrays; pub mod record; pub mod record_default; pub mod record_multiline_doc; +pub mod recursive; pub mod simple; pub mod simple_with_builders; pub mod simple_with_schemas; diff --git a/tests/schemas/nested_with_float.avsc b/tests/schemas/nested_with_float.avsc index aa760a2..1a012bb 100644 --- a/tests/schemas/nested_with_float.avsc +++ b/tests/schemas/nested_with_float.avsc @@ -24,6 +24,6 @@ }, { "name": "FooBaz", "type": "record", - "fields": [ {"name": "BarFoo", "type": "record", "fields": [ {"name": "nested_int", "type": "int"} ]} ] + "fields": [ {"name": "BarFoo", "type": "record", "fields": [ {"name": "nested_int", "type": "int"} ]} ] } ] } diff --git a/tests/schemas/nullable_bytes.rs b/tests/schemas/nullable_bytes.rs index a5ad9f3..8c0ec8e 100644 --- a/tests/schemas/nullable_bytes.rs +++ b/tests/schemas/nullable_bytes.rs @@ -3,7 +3,7 @@ #[serde(default)] pub struct BytesData { #[serde(deserialize_with = "nullable_bytesdata_b")] - #[serde(serialize_with = "serde_bytes::serialize")] + #[serde(serialize_with = "apache_avro::serde_avro_bytes::serialize")] pub b: Vec, pub nb: Option>, } @@ -15,7 +15,7 @@ where { use serde::Deserialize; #[derive(serde::Deserialize)] - struct Wrapper(#[serde(with = "serde_bytes")] Vec); + struct Wrapper(#[serde(with = "apache_avro::serde_avro_bytes")] Vec); let opt = Option::::deserialize(deserializer)?.map(|w| w.0); Ok(opt.unwrap_or_else(|| default_bytesdata_b() )) } diff --git a/tests/schemas/nullable_logical_dates.rs b/tests/schemas/nullable_logical_dates.rs index 400867a..73eca6b 100644 --- a/tests/schemas/nullable_logical_dates.rs +++ b/tests/schemas/nullable_logical_dates.rs @@ -4,46 +4,46 @@ #[serde(default)] pub struct DateLogicalType { #[serde(deserialize_with = "nullable_datelogicaltype_birthday")] - #[serde(serialize_with = "chrono::naive::serde::ts_seconds::serialize")] - pub birthday: chrono::NaiveDateTime, - pub meeting_time: Option, + #[serde(serialize_with = "chrono::serde::ts_seconds::serialize")] + pub birthday: chrono::DateTime, + pub meeting_time: Option>, #[serde(deserialize_with = "nullable_datelogicaltype_release_datetime_micro")] - #[serde(serialize_with = "chrono::naive::serde::ts_microseconds::serialize")] - pub release_datetime_micro: chrono::NaiveDateTime, + #[serde(serialize_with = "chrono::serde::ts_microseconds::serialize")] + pub release_datetime_micro: chrono::DateTime, } #[inline(always)] -fn nullable_datelogicaltype_birthday<'de, D>(deserializer: D) -> Result +fn nullable_datelogicaltype_birthday<'de, D>(deserializer: D) -> Result, D::Error> where D: serde::Deserializer<'de>, { use serde::Deserialize; #[derive(serde::Deserialize)] - struct Wrapper(#[serde(with = "chrono::naive::serde::ts_seconds")] chrono::NaiveDateTime); + struct Wrapper(#[serde(with = "chrono::serde::ts_seconds")] chrono::DateTime); let opt = Option::::deserialize(deserializer)?.map(|w| w.0); Ok(opt.unwrap_or_else(|| default_datelogicaltype_birthday() )) } #[inline(always)] -fn nullable_datelogicaltype_release_datetime_micro<'de, D>(deserializer: D) -> Result +fn nullable_datelogicaltype_release_datetime_micro<'de, D>(deserializer: D) -> Result, D::Error> where D: serde::Deserializer<'de>, { use serde::Deserialize; #[derive(serde::Deserialize)] - struct Wrapper(#[serde(with = "chrono::naive::serde::ts_microseconds")] chrono::NaiveDateTime); + struct Wrapper(#[serde(with = "chrono::serde::ts_microseconds")] chrono::DateTime); let opt = Option::::deserialize(deserializer)?.map(|w| w.0); Ok(opt.unwrap_or_else(|| default_datelogicaltype_release_datetime_micro() )) } #[inline(always)] -fn default_datelogicaltype_birthday() -> chrono::NaiveDateTime { chrono::NaiveDateTime::from_timestamp_opt(1681601653, 0).unwrap() } +fn default_datelogicaltype_birthday() -> chrono::DateTime { chrono::DateTime::::from_timestamp(1681601653, 0).unwrap() } #[inline(always)] -fn default_datelogicaltype_meeting_time() -> Option { None } +fn default_datelogicaltype_meeting_time() -> Option> { None } #[inline(always)] -fn default_datelogicaltype_release_datetime_micro() -> chrono::NaiveDateTime { chrono::NaiveDateTime::from_timestamp_micros(1570903062000000).unwrap() } +fn default_datelogicaltype_release_datetime_micro() -> chrono::DateTime { chrono::DateTime::::from_timestamp_micros(1570903062000000).unwrap() } impl Default for DateLogicalType { fn default() -> DateLogicalType { diff --git a/tests/schemas/record.rs b/tests/schemas/record.rs index 7c98f58..af78591 100644 --- a/tests/schemas/record.rs +++ b/tests/schemas/record.rs @@ -7,10 +7,10 @@ pub struct User { pub favorite_number: i32, #[serde(default = "default_user_likes_pizza")] pub likes_pizza: bool, - #[serde(with = "serde_bytes")] + #[serde(with = "apache_avro::serde_avro_bytes")] #[serde(default = "default_user_b")] pub b: Vec, - #[serde(with = "serde_bytes")] + #[serde(with = "apache_avro::serde_avro_bytes_opt")] #[serde(default = "default_user_union_b")] pub union_b: Option>, #[serde(rename = "A_Bool")] diff --git a/tests/schemas/recursive.avsc b/tests/schemas/recursive.avsc new file mode 100644 index 0000000..3ad72e5 --- /dev/null +++ b/tests/schemas/recursive.avsc @@ -0,0 +1,16 @@ +{"type": "record", "name":"RecursiveType", + "fields": [ + {"name": "field_a", "type": + {"type": "record", "name": "Rec", + "fields": [ + {"name": "label", "type": "string"}, + {"name": "children", "type": {"type": "array", "items": "Rec"}}, + {"name": "floatField", "type": "float"} + ]}}, + {"name": "field_b", "type": + {"type": "record", "name": "Node", + "fields": [ + {"name": "label", "type": "string"}, + {"name": "children", "type": {"type": "array", "items": "Node"}}]}} + ] +} diff --git a/tests/schemas/recursive.rs b/tests/schemas/recursive.rs new file mode 100644 index 0000000..950c3e8 --- /dev/null +++ b/tests/schemas/recursive.rs @@ -0,0 +1,20 @@ + +#[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)] +pub struct Node { + pub label: String, + pub children: Vec, +} + +#[derive(Debug, PartialEq, Clone, serde::Deserialize, serde::Serialize)] +pub struct Rec { + pub label: String, + pub children: Vec, + #[serde(rename = "floatField")] + pub float_field: f32, +} + +#[derive(Debug, PartialEq, Clone, serde::Deserialize, serde::Serialize)] +pub struct RecursiveType { + pub field_a: Rec, + pub field_b: Node, +}