diff --git a/Cargo.lock b/Cargo.lock index fb87a20c7..49b75f9b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -188,9 +188,9 @@ checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" [[package]] name = "byteorder" @@ -231,9 +231,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "num-traits", ] @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "crc-any" -version = "2.4.3" +version = "2.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" +checksum = "c01a5e1f881f6fb6099a7bdf949e946719fd4f1fefa56264890574febf0eb6d0" dependencies = [ "debug-helper", ] @@ -419,7 +419,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -430,7 +430,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -494,9 +494,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "embassy" @@ -548,7 +548,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -961,6 +961,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "enumset" version = "1.1.3" @@ -979,7 +999,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -995,7 +1015,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1057,7 +1077,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -1209,9 +1229,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fixed" -version = "1.24.0" +version = "1.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c69ce7e7c0f17aa18fdd9d0de39727adb9c6281f2ad12f57cbe54ae6e76e7d" +checksum = "e29e5681dc8556fb9df1409e95eae050e12e8776394313da3546dcb8cf390c73" dependencies = [ "az", "bytemuck", @@ -1242,9 +1262,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1256,9 +1276,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1266,47 +1286,47 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" dependencies = [ "portable-atomic", ] [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-macro", @@ -1352,15 +1372,21 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", "wasi", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "half" version = "2.3.1" @@ -1451,9 +1477,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "httparse" @@ -1479,9 +1505,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1489,13 +1515,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.3", - "rustix", - "windows-sys 0.48.0", + "hermit-abi 0.3.6", + "libc", + "windows-sys", ] [[package]] @@ -1578,9 +1604,9 @@ checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1607,29 +1633,29 @@ checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" [[package]] name = "linkme" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437a510b7d9717b70720ff35a13bbe203f985235dedd6473c72ac51d8312be23" +checksum = "1a78816ac097580aa7fd9d2e9cc7395dda34367c07267a8657516d4ad5e2e3d3" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de09dc283fb2f502fd8173d200675ea5ac0559f37c67b77166d75a67565c0e3d" +checksum = "ee9023a564f8bf7fe3da285a50c3e70de0df3e2bf277ff7c4e76d66008ef93b0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "litrs" @@ -1664,9 +1690,9 @@ checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "microbit" @@ -1929,14 +1955,14 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -2023,7 +2049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] @@ -2133,7 +2159,7 @@ checksum = "a33fa6ec7f2047f572d49317cca19c87195de99c6e5b6ee492da701cfe02b053" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -2231,29 +2257,29 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53313ec9f12686aeeffb43462c3ac77aa25f590a5f630eb2cde0de59417b29c7" +checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2566c4bf6845f2c2e83b27043c3f5dfcd5ba8f2937d6c00dc009bfb51a079dc4" +checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -2263,9 +2289,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -2390,9 +2416,13 @@ dependencies = [ name = "riot-rs-macros" version = "0.1.0" dependencies = [ + "enum-iterator", + "heapless 0.8.0", "proc-macro-crate", "quote", - "syn 2.0.49", + "riot-rs", + "syn 2.0.50", + "trybuild", ] [[package]] @@ -2530,20 +2560,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.20", + "semver 1.0.22", ] [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2554,9 +2584,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "scopeguard" @@ -2575,9 +2605,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "semver-parser" @@ -2602,14 +2632,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2633,9 +2663,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smoltcp" @@ -2782,7 +2812,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -2798,9 +2828,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -2809,15 +2839,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", "rustix", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -2833,37 +2862,37 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.51" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.51" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -2914,7 +2943,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.49", + "syn 2.0.50", "toml 0.8.11", ] @@ -2933,7 +2962,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "toml_datetime", "winnow 0.5.40", ] @@ -2944,13 +2973,28 @@ version = "0.22.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18769cd1cec395d70860ceb4d932812a0b4d06b1a4bb336745a4d21b9496e992" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", "winnow 0.6.5", ] +[[package]] +name = "trybuild" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a9d3ba662913483d6722303f619e75ea10b7855b0f8e0d72799cf8621bb488f" +dependencies = [ + "basic-toml", + "glob", + "once_cell", + "serde", + "serde_derive", + "serde_json", + "termcolor", +] + [[package]] name = "typenum" version = "1.17.0" @@ -3101,15 +3145,6 @@ 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.52.0" @@ -3284,5 +3319,5 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] diff --git a/examples/embassy-http-server/Cargo.toml b/examples/embassy-http-server/Cargo.toml index 0c046d1fc..f744fd110 100644 --- a/examples/embassy-http-server/Cargo.toml +++ b/examples/embassy-http-server/Cargo.toml @@ -26,5 +26,8 @@ static_cell = { workspace = true } embassy-nrf = { workspace = true, optional = true } +[target.'cfg(capability = "hw/usb-device-port")'.dependencies] +riot-rs = { path = "../../src/riot-rs", features = ["override-usb-config"] } + [features] button-readings = ["dep:embassy-nrf"] diff --git a/examples/embassy-http-server/src/main.rs b/examples/embassy-http-server/src/main.rs index 9032fa053..f24c3017a 100644 --- a/examples/embassy-http-server/src/main.rs +++ b/examples/embassy-http-server/src/main.rs @@ -125,8 +125,8 @@ fn web_server_init(spawner: &Spawner, peripherals: &mut OptionalPeripherals) { } } -#[no_mangle] -fn riot_rs_network_config() -> embassy_net::Config { +#[riot_rs::config(network)] +fn network_config() -> embassy_net::Config { use embassy_net::Ipv4Address; embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { @@ -135,3 +135,21 @@ fn riot_rs_network_config() -> embassy_net::Config { gateway: Some(Ipv4Address::new(10, 42, 0, 1)), }) } + +#[cfg(capability = "hw/usb-device-port")] +#[riot_rs::config(usb)] +fn usb_config() -> riot_rs::embassy::embassy_usb::Config<'static> { + let mut config = riot_rs::embassy::embassy_usb::Config::new(0xc0de, 0xcafe); + config.manufacturer = Some("Embassy"); + config.product = Some("HTTP-over-USB-Ethernet example"); + config.serial_number = Some("12345678"); + config.max_power = 100; + config.max_packet_size_0 = 64; + + // Required for Windows support. + config.composite_with_iads = true; + config.device_class = 0xEF; + config.device_sub_class = 0x02; + config.device_protocol = 0x01; + config +} diff --git a/examples/embassy-net-tcp/src/main.rs b/examples/embassy-net-tcp/src/main.rs index 7c3a2e824..196b272a7 100644 --- a/examples/embassy-net-tcp/src/main.rs +++ b/examples/embassy-net-tcp/src/main.rs @@ -62,8 +62,8 @@ fn __init_tcp_echo(spawner: &Spawner, _peripherals: &mut OptionalPeripherals) { spawner.spawn(tcp_echo()).unwrap(); } -#[no_mangle] -fn riot_rs_network_config() -> embassy_net::Config { +#[riot_rs::config(network)] +fn network_config() -> embassy_net::Config { use embassy_net::Ipv4Address; embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { diff --git a/examples/embassy-net-udp/src/main.rs b/examples/embassy-net-udp/src/main.rs index 5bf5375f3..413c74df0 100644 --- a/examples/embassy-net-udp/src/main.rs +++ b/examples/embassy-net-udp/src/main.rs @@ -67,8 +67,8 @@ fn __init_udp_echo(spawner: &Spawner, _peripherals: &mut OptionalPeripherals) { spawner.spawn(udp_echo()).unwrap(); } -#[no_mangle] -fn riot_rs_network_config() -> embassy_net::Config { +#[riot_rs::config(network)] +fn network_config() -> embassy_net::Config { use embassy_net::Ipv4Address; embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { diff --git a/examples/embassy-usb-keyboard/Cargo.toml b/examples/embassy-usb-keyboard/Cargo.toml index ec76f9167..d275199e1 100644 --- a/examples/embassy-usb-keyboard/Cargo.toml +++ b/examples/embassy-usb-keyboard/Cargo.toml @@ -11,7 +11,7 @@ embassy-nrf = { workspace = true, default-features = false } embassy-sync = { workspace = true } embassy-time = { workspace = true, default-features = false } embassy-usb = { workspace = true, features = ["usbd-hid"] } -riot-rs = { path = "../../src/riot-rs", features = ["time", "usb"] } +riot-rs = { path = "../../src/riot-rs", features = ["time", "usb", "override-usb-config"] } riot-rs-boards = { path = "../../src/riot-rs-boards" } static_cell = { workspace = true } usbd-hid = { version = "0.6.1" } diff --git a/examples/embassy-usb-keyboard/src/main.rs b/examples/embassy-usb-keyboard/src/main.rs index 6660d7ce7..1006c02cf 100644 --- a/examples/embassy-usb-keyboard/src/main.rs +++ b/examples/embassy-usb-keyboard/src/main.rs @@ -135,3 +135,20 @@ mod buttons { } } } + +#[riot_rs::config(usb)] +fn usb_config() -> riot_rs::embassy::embassy_usb::Config<'static> { + let mut config = riot_rs::embassy::embassy_usb::Config::new(0xc0de, 0xcafe); + config.manufacturer = Some("Embassy"); + config.product = Some("HID keyboard example"); + config.serial_number = Some("12345678"); + config.max_power = 100; + config.max_packet_size_0 = 64; + + // Required for Windows support. + config.composite_with_iads = true; + config.device_class = 0xEF; + config.device_sub_class = 0x02; + config.device_protocol = 0x01; + config +} diff --git a/laze-project.yml b/laze-project.yml index 6c9b98e84..1696ddcbf 100644 --- a/laze-project.yml +++ b/laze-project.yml @@ -450,17 +450,21 @@ modules: provides_unique: - network_device selects: - - usb_device_port + - hw/usb-device-port env: global: FEATURES: - riot-rs/usb-ethernet - - name: usb_device_port + - name: hw/usb-device-port context: - nrf52840dk - rpi-pico - rpi-pico-w + env: + global: + RUSTFLAGS: + - --cfg capability=\"hw/usb-device-port\" - name: wifi-esp context: diff --git a/src/riot-rs-embassy/src/lib.rs b/src/riot-rs-embassy/src/lib.rs index f8cb64161..e6c378f33 100644 --- a/src/riot-rs-embassy/src/lib.rs +++ b/src/riot-rs-embassy/src/lib.rs @@ -32,6 +32,12 @@ pub use static_cell::make_static; pub use embassy_executor::Spawner; +// Crates used in driver configuration functions +#[cfg(feature = "net")] +pub use embassy_net; +#[cfg(feature = "usb")] +pub use embassy_usb; + #[cfg(feature = "usb-ethernet")] use usb::ethernet::NetworkDevice; diff --git a/src/riot-rs-embassy/src/network.rs b/src/riot-rs-embassy/src/network.rs index 19e68fd8e..f04ae34d1 100644 --- a/src/riot-rs-embassy/src/network.rs +++ b/src/riot-rs-embassy/src/network.rs @@ -1,3 +1,5 @@ +//! To provide a custom network configuration, use the `riot_rs::config` attribute macro. + use core::cell::OnceCell; use embassy_executor::Spawner; diff --git a/src/riot-rs-embassy/src/usb.rs b/src/riot-rs-embassy/src/usb.rs index 73e2e5ff0..841cc2ed0 100644 --- a/src/riot-rs-embassy/src/usb.rs +++ b/src/riot-rs-embassy/src/usb.rs @@ -1,11 +1,4 @@ -//! To provide a custom USB configuration, enable the feature -//! `riot_rs_embassy/override-usb-config`, then add this to your code: -//! ```rust -//! #[no_mangle] -//! pub fn riot_rs_usb_config() -> embassy_usb::Config<'static> { -//! /// create config here -//! } -//! ``` +//! To provide a custom USB configuration, use the `riot_rs::config` attribute macro. pub use crate::arch::usb::UsbDriver; diff --git a/src/riot-rs-macros/Cargo.toml b/src/riot-rs-macros/Cargo.toml index 64686f2af..c048a4c7c 100644 --- a/src/riot-rs-macros/Cargo.toml +++ b/src/riot-rs-macros/Cargo.toml @@ -10,9 +10,15 @@ repository.workspace = true workspace = true [dependencies] +enum-iterator = "1.5.0" proc-macro-crate = "3.1.0" quote = "1.0.35" syn = { version = "2.0.47", features = ["full"] } +[dev-dependencies] +heapless = { workspace = true } +riot-rs = { workspace = true, features = ["no-boards", "usb-ethernet", "override-network-config"] } +trybuild = "1.0.89" + [lib] proc-macro = true diff --git a/src/riot-rs-macros/src/config.rs b/src/riot-rs-macros/src/config.rs new file mode 100644 index 000000000..0558da7bb --- /dev/null +++ b/src/riot-rs-macros/src/config.rs @@ -0,0 +1,135 @@ +/// Registers the function this attribute macro is applied on to provide the configuration for the +/// associated driver during initial system configuration. +/// +/// **Important**: for this configuration to be taken into account, a specific Cargo feature may +/// need to be enabled on the `riot-rs` dependency, for each configuration type (see table below). +/// +/// The name of the function does not matter as it will be renamed by the macro. +/// +/// # Parameters +/// +/// - The name of the driver the function provides configuration for. +/// +/// | Driver | Expected return type | Cargo feature to enable | +/// | --------- | ------------------------------ | ------------------------- | +/// | `network` | `embassy_net::Config` | `override-network-config` | +/// | `usb` | `embassy_usb::Config<'static>` | `override-usb-config` | +/// +/// # Note +/// +/// The `riot_rs` crate provides re-exports for the relevant Embassy crates. +/// +/// # Examples +/// +/// The following function provides configuration for the network stack: +/// +/// ```ignore +/// use riot_rs::embassy_net; +/// +/// #[riot_rs::config(network)] +/// fn network_config() -> embassy_net::Config { +/// use embassy_net::Ipv4Address; +/// +/// embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { +/// address: embassy_net::Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), +/// dns_servers: heapless::Vec::new(), +/// gateway: Some(Ipv4Address::new(10, 42, 0, 1)), +/// }) +/// } +/// ``` +#[allow(clippy::missing_panics_doc)] +#[proc_macro_attribute] +pub fn config(args: TokenStream, item: TokenStream) -> TokenStream { + #[allow(clippy::wildcard_imports)] + use config_macro::*; + + use quote::{format_ident, quote}; + + let mut attrs = ConfigAttributes::default(); + let thread_parser = syn::meta::parser(|meta| attrs.parse(&meta)); + syn::parse_macro_input!(args with thread_parser); + + let config_function = syn::parse_macro_input!(item as syn::ItemFn); + let config_function_name = &config_function.sig.ident; + + let riot_rs_crate = utils::riot_rs_crate(); + + let (config_fn_name, return_type) = match attrs.kind { + Some(ConfigKind::Network) => ( + format_ident!("riot_rs_network_config"), + quote! {#riot_rs_crate::embassy::embassy_net::Config}, + ), + Some(ConfigKind::Usb) => ( + format_ident!("riot_rs_usb_config"), + quote! {#riot_rs_crate::embassy::embassy_usb::Config<'static>}, + ), + None => { + panic!("a configuration kind must be specified"); + } + }; + + // Place the provided function into another function whose type signature we enforce. + // This is important as that function will be called unsafely via FFI. + let expanded = quote! { + #[no_mangle] + fn #config_fn_name() -> #return_type { + #[inline(always)] + #config_function + + #config_function_name() + } + }; + + TokenStream::from(expanded) +} + +mod config_macro { + #[derive(Default)] + pub struct ConfigAttributes { + pub kind: Option, + } + + impl ConfigAttributes { + pub fn parse(&mut self, meta: &syn::meta::ParseNestedMeta) -> syn::Result<()> { + use enum_iterator::all; + + for (config_name, kind) in all::().map(|c| (c.as_name(), c)) { + if meta.path.is_ident(config_name) { + self.check_only_one_kind(config_name); + self.kind = Some(kind); + return Ok(()); + } + } + + let supported_params = all::() + .map(|c| format!("`{}`", c.as_name())) + .collect::>() + .join(", "); + Err(meta.error(format!( + "unsupported parameter ({supported_params} are supported)", + ))) + } + + fn check_only_one_kind(&self, param: &str) { + assert!( + self.kind.is_none(), + "a separate function is required for `{param}` configuration", + ); + } + } + + #[derive(Debug, enum_iterator::Sequence)] + pub enum ConfigKind { + Network, + Usb, + } + + impl ConfigKind { + pub fn as_name(&self) -> &'static str { + match self { + Self::Network => "network", + Self::Usb => "usb", + } + } + } +} diff --git a/src/riot-rs-macros/src/lib.rs b/src/riot-rs-macros/src/lib.rs index 8c834f6e6..7d7b10f05 100644 --- a/src/riot-rs-macros/src/lib.rs +++ b/src/riot-rs-macros/src/lib.rs @@ -4,4 +4,5 @@ mod utils; use proc_macro::TokenStream; +include!("config.rs"); include!("thread.rs"); diff --git a/src/riot-rs-macros/tests/macro_errors.rs b/src/riot-rs-macros/tests/macro_errors.rs new file mode 100644 index 000000000..870c2f95e --- /dev/null +++ b/src/riot-rs-macros/tests/macro_errors.rs @@ -0,0 +1,5 @@ +#[test] +fn ui() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/ui/*.rs"); +} diff --git a/src/riot-rs-macros/tests/ui/config_conflicting_config_kind.rs b/src/riot-rs-macros/tests/ui/config_conflicting_config_kind.rs new file mode 100644 index 000000000..5af2f1376 --- /dev/null +++ b/src/riot-rs-macros/tests/ui/config_conflicting_config_kind.rs @@ -0,0 +1,19 @@ +// #![no_std] +#![no_main] + +// This will not get used because the attribute macro is expected to fail +#[allow(unused_imports)] +use riot_rs::embassy::embassy_net; + +// FAIL: network and usb cannot be used at the same time +#[riot_rs::config(network, usb)] +fn network_config() -> embassy_net::Config { + use embassy_net::Ipv4Address; + + embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { + address: embassy_net::Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), + dns_servers: heapless::Vec::new(), + gateway: Some(Ipv4Address::new(10, 42, 0, 1)), + }) +} + diff --git a/src/riot-rs-macros/tests/ui/config_conflicting_config_kind.stderr b/src/riot-rs-macros/tests/ui/config_conflicting_config_kind.stderr new file mode 100644 index 000000000..5bf7aba56 --- /dev/null +++ b/src/riot-rs-macros/tests/ui/config_conflicting_config_kind.stderr @@ -0,0 +1,7 @@ +error: custom attribute panicked + --> tests/ui/config_conflicting_config_kind.rs:9:1 + | +9 | #[riot_rs::config(network, usb)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: message: a separate function is required for `usb` configuration diff --git a/src/riot-rs-macros/tests/ui/config_misspelled_config_kind.rs b/src/riot-rs-macros/tests/ui/config_misspelled_config_kind.rs new file mode 100644 index 000000000..4b7458f78 --- /dev/null +++ b/src/riot-rs-macros/tests/ui/config_misspelled_config_kind.rs @@ -0,0 +1,18 @@ +// #![no_std] +#![no_main] + +// This will not get used because the attribute macro is expected to fail +#[allow(unused_imports)] +use riot_rs::embassy::embassy_net; + +// FAIL: misspelled config kind +#[riot_rs::config(networkk)] +fn network_config() -> embassy_net::Config { + use embassy_net::Ipv4Address; + + embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { + address: embassy_net::Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), + dns_servers: heapless::Vec::new(), + gateway: Some(Ipv4Address::new(10, 42, 0, 1)), + }) +} diff --git a/src/riot-rs-macros/tests/ui/config_misspelled_config_kind.stderr b/src/riot-rs-macros/tests/ui/config_misspelled_config_kind.stderr new file mode 100644 index 000000000..d52df8a04 --- /dev/null +++ b/src/riot-rs-macros/tests/ui/config_misspelled_config_kind.stderr @@ -0,0 +1,5 @@ +error: unsupported parameter (`network`, `usb` are supported) + --> tests/ui/config_misspelled_config_kind.rs:9:19 + | +9 | #[riot_rs::config(networkk)] + | ^^^^^^^^ diff --git a/src/riot-rs-macros/tests/ui/config_no_parameters.rs b/src/riot-rs-macros/tests/ui/config_no_parameters.rs new file mode 100644 index 000000000..389b6c15e --- /dev/null +++ b/src/riot-rs-macros/tests/ui/config_no_parameters.rs @@ -0,0 +1,18 @@ +// #![no_std] +#![no_main] + +// This will not get used because the attribute macro is expected to fail +#[allow(unused_imports)] +use riot_rs::embassy::embassy_net; + +// FAIL: this attribute macro requires parameters +#[riot_rs::config] +fn network_config() -> embassy_net::Config { + use embassy_net::Ipv4Address; + + embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { + address: embassy_net::Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), + dns_servers: heapless::Vec::new(), + gateway: Some(Ipv4Address::new(10, 42, 0, 1)), + }) +} diff --git a/src/riot-rs-macros/tests/ui/config_no_parameters.stderr b/src/riot-rs-macros/tests/ui/config_no_parameters.stderr new file mode 100644 index 000000000..8b72c3d6b --- /dev/null +++ b/src/riot-rs-macros/tests/ui/config_no_parameters.stderr @@ -0,0 +1,7 @@ +error: custom attribute panicked + --> tests/ui/config_no_parameters.rs:9:1 + | +9 | #[riot_rs::config] + | ^^^^^^^^^^^^^^^^^^ + | + = help: message: a configuration kind must be specified diff --git a/src/riot-rs/src/lib.rs b/src/riot-rs/src/lib.rs index 42a4dad9b..bf8b48c27 100644 --- a/src/riot-rs/src/lib.rs +++ b/src/riot-rs/src/lib.rs @@ -9,8 +9,11 @@ pub use riot_rs_debug as debug; pub use riot_rs_embassy::{self as embassy, define_peripherals}; pub use riot_rs_rt as rt; +// Attribute macros +pub use riot_rs_macros::config; #[cfg(feature = "threading")] pub use riot_rs_macros::thread; + #[cfg(feature = "threading")] pub use riot_rs_threads as thread;