diff --git a/Cargo.lock b/Cargo.lock index 7c8b388..4ff7c99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,42 +1,199 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "aho-corasick" -version = "0.7.13" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] -name = "autocfg" -version = "1.0.0" +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "base64" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] [[package]] name = "cfg-if" -version = "0.1.10" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "config" -version = "0.9.3" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9107d78ed62b3fa5a86e7d18e647abed48cfd8f8fab6c72f4cdb982d196f7e6" +checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" dependencies = [ - "lazy_static 1.4.0", + "async-trait", + "convert_case", + "json5", + "lazy_static", "nom", + "pathdiff", + "ron", "rust-ini", - "serde 1.0.115", - "serde-hjson", + "serde", "serde_json", "toml", "yaml-rust", ] +[[package]] +name = "const-random" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "indexmap" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + [[package]] name = "itoa" version = "0.4.6" @@ -44,10 +201,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" [[package]] -name = "lazy_static" -version = "0.2.11" +name = "json5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] [[package]] name = "lazy_static" @@ -56,14 +218,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] -name = "linked-hash-map" -version = "0.3.0" +name = "libc" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd" -dependencies = [ - "serde 0.8.23", - "serde_test", -] +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "linked-hash-map" @@ -73,88 +231,167 @@ checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" [[package]] name = "log" -version = "0.4.11" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" -dependencies = [ - "cfg-if", -] +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" -version = "2.3.3" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "nom" -version = "4.2.3" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", - "version_check", + "minimal-lexical", ] [[package]] -name = "num-traits" -version = "0.1.43" +name = "once_cell" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "ordered-multimap" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ed8acf08e98e744e5384c8bc63ceb0364e68a6854187221c18df61c4797690e" dependencies = [ - "num-traits 0.2.12", + "dlv-list", + "hashbrown 0.13.2", ] [[package]] -name = "num-traits" -version = "0.2.12" +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "pest" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" +checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" dependencies = [ - "autocfg", + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "pest_meta" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" +dependencies = [ + "once_cell", + "pest", + "sha2", ] [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.7" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.3.9" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.18" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64", + "bitflags", + "serde", + "serde_derive", +] [[package]] name = "rust-ini" -version = "0.13.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" +checksum = "7e2a3bcec1f113553ef1c88aae6c020a369d03d55b58de9869a0908930385091" +dependencies = [ + "cfg-if", + "ordered-multimap", +] [[package]] name = "ryu" @@ -164,41 +401,22 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "serde" -version = "0.8.23" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" - -[[package]] -name = "serde" -version = "1.0.115" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] -[[package]] -name = "serde-hjson" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b833c5ad67d52ced5f5938b2980f32a9c1c5ef047f0b4fb3127e7a423c76153" -dependencies = [ - "lazy_static 0.2.11", - "linked-hash-map 0.3.0", - "num-traits 0.1.43", - "regex", - "serde 0.8.23", -] - [[package]] name = "serde_derive" -version = "1.0.115" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609feed1d0a73cc36a0182a840a9b37b4a82f0b1150369f0536a9e3f2a31dc48" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.48", ] [[package]] @@ -209,16 +427,27 @@ checksum = "164eacbdb13512ec2745fb09d51fd5b22b0d65ed294a1dcf7285a360c80a675c" dependencies = [ "itoa", "ryu", - "serde 1.0.115", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", ] [[package]] -name = "serde_test" -version = "0.8.23" +name = "sha2" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "serde 0.8.23", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] @@ -233,23 +462,103 @@ dependencies = [ ] [[package]] -name = "thread_local" -version = "1.0.1" +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ - "lazy_static 1.4.0", + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", ] [[package]] name = "toml" -version = "0.4.10" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6a4b9e8023eb94392d3dca65d717c53abc5dad49c07cb65bb8fcd87115fa325" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ - "serde 1.0.115", + "serde", ] +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + [[package]] name = "unicode-xid" version = "0.2.1" @@ -258,9 +567,9 @@ checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "version_check" -version = "0.1.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waiter_codegen" @@ -269,26 +578,41 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn", + "syn 1.0.48", ] [[package]] name = "waiter_di" -version = "1.6.5" +version = "1.6.6" dependencies = [ "config", - "lazy_static 1.4.0", + "lazy_static", "log", "regex", - "serde 1.0.115", + "serde", "waiter_codegen", ] +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winnow" +version = "0.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cad8365489051ae9f054164e459304af2e7e9bb407c958076c8bf4aef52da5" +dependencies = [ + "memchr", +] + [[package]] name = "yaml-rust" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d" dependencies = [ - "linked-hash-map 0.5.3", + "linked-hash-map", ] diff --git a/Cargo.toml b/Cargo.toml index 9039a80..b63c3d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "waiter_di" -version = "1.6.5" +version = "1.6.6" edition = "2018" description = "Dependency injection" keywords = [ "dependency-injection", "inversion-of-control", "di", "ioc"] @@ -14,11 +14,11 @@ members = [ "crates/*" ] [dependencies] waiter_codegen = { path = "crates/waiter_codegen", version = "1.6.5" } -config = "0.9" -serde = { version = "1.0.115", features = [ "derive" ] } -regex = "1.3.9" +config = "0.14.0" +serde = { version = "1.0.196", features = [ "derive" ] } +regex = "1.10.3" lazy_static = "1.4.0" -log = "0.4.11" +log = "0.4.20" [features] async = [ "waiter_codegen/async" ] \ No newline at end of file diff --git a/crates/waiter_codegen/Cargo.toml b/crates/waiter_codegen/Cargo.toml index b7ab6dc..6acdb40 100644 --- a/crates/waiter_codegen/Cargo.toml +++ b/crates/waiter_codegen/Cargo.toml @@ -6,7 +6,7 @@ description = "Macro for Waiter DI" repository = "https://github.com/dmitryb-dev/waiter" license = "MIT" readme = "../../README.md" -authors = [ "dmitryb.dev@gmail.com" ] +authors = ["dmitryb.dev@gmail.com"] [dependencies] quote = "1.0.7" @@ -15,7 +15,7 @@ proc-macro2 = "1.0.24" [dependencies.syn] version = "1.0.48" -features = [ "full" ] +features = ["full"] [lib] proc-macro = true diff --git a/crates/waiter_codegen/src/attr_parser.rs b/crates/waiter_codegen/src/attr_parser.rs index f21c4c0..ca278ff 100644 --- a/crates/waiter_codegen/src/attr_parser.rs +++ b/crates/waiter_codegen/src/attr_parser.rs @@ -1,23 +1,23 @@ -use syn::{Path, Error, Attribute}; -use syn::punctuated::Punctuated; -use syn::parse::Parser; -use syn::token::{Comma}; -use syn::{LitStr, ExprAssign}; -use syn::parse_macro_input::parse; use proc_macro::TokenStream; -use proc_macro2::{TokenStream as TokenStream2}; + +use proc_macro2::TokenStream as TokenStream2; use quote::ToTokens; +use syn::{Attribute, Error, Path}; +use syn::{ExprAssign, LitStr}; +use syn::parse::Parser; +use syn::parse_macro_input::parse; +use syn::punctuated::Punctuated; +use syn::token::Comma; pub(crate) struct ProvidesAttr { - pub profiles: Vec + pub profiles: Vec, } pub(crate) fn parse_provides_attr(attr: TokenStream) -> Result { let profiles_syn = >::parse_terminated.parse(attr)?; let profiles: Vec = profiles_syn - .iter() - .map(|p| p.clone()) + .iter().cloned() .collect(); Ok(ProvidesAttr { profiles }) @@ -27,7 +27,7 @@ pub(crate) fn parse_provides_attr(attr: TokenStream) -> Result, - pub(crate) default_value: Option + pub(crate) default_value: Option, } pub(crate) fn parse_prop_attr(attr: &Attribute) -> Result { @@ -40,13 +40,13 @@ pub(crate) fn parse_prop_attr(attr: &Attribute) -> Result { Ok(PropAttr { name: Some(name.value()), - default_value: Some(with_default.right.to_token_stream()) + default_value: Some(with_default.right.to_token_stream()), }) }) .or_else(|_| { Ok(PropAttr { name: Some(attr.parse_args::()?.value()), - default_value: None + default_value: None, }) }) } diff --git a/crates/waiter_codegen/src/component/injector.rs b/crates/waiter_codegen/src/component/injector.rs index e733b1e..9d0f25c 100644 --- a/crates/waiter_codegen/src/component/injector.rs +++ b/crates/waiter_codegen/src/component/injector.rs @@ -1,23 +1,25 @@ -use proc_macro2::{TokenStream as TokenStream2}; +use proc_macro2::TokenStream as TokenStream2; use quote::ToTokens; -use syn::{Ident, Error, PathArguments}; +use syn::{Error, Ident, PathArguments}; use syn::spanned::Spanned; + use crate::component::type_to_inject::TypeToInject; pub(crate) trait Injector { fn generate_inject_code( &self, to_inject: &TypeToInject, - container: &Ident + container: &Ident, ) -> Option; } pub(crate) struct WrcInjector; + impl Injector for WrcInjector { fn generate_inject_code( &self, to_inject: &TypeToInject, - container: &Ident + container: &Ident, ) -> Option { #[cfg(feature = "async")] const RC_FULL_TYPE: &str = "std :: sync :: Arc <"; @@ -47,17 +49,18 @@ impl Injector for WrcInjector { pub(crate) struct BoxInjector; + impl Injector for BoxInjector { fn generate_inject_code( &self, to_inject: &TypeToInject, - container: &Ident + container: &Ident, ) -> Option { if to_inject.type_name.starts_with("Box <") { let referenced_type = get_type_arg(&to_inject.type_path.segments[0].arguments); return Some(quote::quote! { Box::new(waiter_di::Provider::<#referenced_type>::create(#container)) - }) + }); } None @@ -66,11 +69,12 @@ impl Injector for BoxInjector { pub(crate) struct DeferredInjector; + impl Injector for DeferredInjector { fn generate_inject_code( &self, to_inject: &TypeToInject, - _container: &Ident + _container: &Ident, ) -> Option { let referenced_type_opt = if to_inject.type_name.starts_with("waiter_di :: Deferred <") { Some(get_type_arg(&to_inject.type_path.segments[1].arguments)) @@ -88,15 +92,16 @@ impl Injector for DeferredInjector { pub(crate) struct ConfigInjector; + impl Injector for ConfigInjector { fn generate_inject_code( &self, to_inject: &TypeToInject, - container: &Ident + container: &Ident, ) -> Option { - if to_inject.type_name == "Config".to_string() - || to_inject.type_name == "config :: Config".to_string() { - return Some(quote::quote! { #container.config.clone() }) + if to_inject.type_name == *"Config" + || to_inject.type_name == *"config :: Config" { + return Some(quote::quote! { #container.config.clone() }); } None @@ -105,11 +110,12 @@ impl Injector for ConfigInjector { pub(crate) struct PropInjector; + impl Injector for PropInjector { fn generate_inject_code( &self, to_inject: &TypeToInject, - container: &Ident + container: &Ident, ) -> Option { let (prop_name_opt, default_value_code) = if to_inject.prop_attr.is_some() { let prop_attr = to_inject.prop_attr.clone().unwrap(); @@ -120,7 +126,7 @@ impl Injector for PropInjector { let default_value_code = prop_attr.default_value.clone() .map(|default_value| quote::quote! { .or_else(|| Some(#default_value)) }) - .unwrap_or(quote::quote! {}); + .unwrap_or_default(); (prop_name_opt, default_value_code) } else { @@ -157,7 +163,7 @@ impl Injector for PropInjector { type_path.clone(), type_name.clone(), prop_name.to_string(), - quote::quote! { value } + quote::quote! { value }, ); quote::quote! { @@ -177,7 +183,7 @@ impl Injector for PropInjector { let type_name = to_inject.type_name.clone(); let type_path = to_inject.type_path.clone(); Some(quote::quote! { - #container.config.clone().try_into::<#type_path>() + #container.config.clone().try_deserialize::<#type_path>() .expect(format!("Can't parse config as '{}'", #type_name).as_str()) }) } else { @@ -188,19 +194,20 @@ impl Injector for PropInjector { } trait PropExtractor { - fn generate_extract_method(&self, type_name: String, ) -> Option; + fn generate_extract_method(&self, type_name: String) -> Option; fn generate_convert_code( &self, _type_path: TokenStream2, _type_name: String, _prop_name: String, - extract_code: TokenStream2 + extract_code: TokenStream2, ) -> TokenStream2 { extract_code } } struct SafeCastPropExtractor; + impl PropExtractor for SafeCastPropExtractor { fn generate_extract_method(&self, type_name: String) -> Option { match type_name.as_str() { @@ -214,13 +221,14 @@ impl PropExtractor for SafeCastPropExtractor { type_path: TokenStream2, _type_name: String, _prop_name: String, - value: TokenStream2 + value: TokenStream2, ) -> TokenStream2 { quote::quote! { #type_path::from(#value) } } } struct UnsafeCastPropExtractor; + impl PropExtractor for UnsafeCastPropExtractor { fn generate_extract_method(&self, type_name: String) -> Option { match type_name.as_str() { @@ -235,7 +243,7 @@ impl PropExtractor for UnsafeCastPropExtractor { type_path: TokenStream2, type_name: String, prop_name: String, - value: TokenStream2 + value: TokenStream2, ) -> TokenStream2 { quote::quote! { <#type_path as std::convert::TryFrom>::try_from(#value) @@ -245,12 +253,13 @@ impl PropExtractor for UnsafeCastPropExtractor { } struct AsCastPropExtractor; + impl PropExtractor for AsCastPropExtractor { fn generate_extract_method(&self, type_name: String) -> Option { match type_name.as_str() { "i64" => Some(quote::quote! { get_int }), "f64" | "f32" => Some(quote::quote! { get_float }), - "String" => Some(quote::quote! { get_str }), + "String" => Some(quote::quote! { get_string }), "bool" => Some(quote::quote! { get_bool }), _ => None } @@ -261,7 +270,7 @@ impl PropExtractor for AsCastPropExtractor { type_path: TokenStream2, _type_name: String, _prop_name: String, - value: TokenStream2 + value: TokenStream2, ) -> TokenStream2 { quote::quote! { #value as #type_path diff --git a/crates/waiter_codegen/src/component/mod.rs b/crates/waiter_codegen/src/component/mod.rs index 18afdd5..bf5bcf2 100644 --- a/crates/waiter_codegen/src/component/mod.rs +++ b/crates/waiter_codegen/src/component/mod.rs @@ -1,49 +1,47 @@ -use proc_macro::{TokenStream}; -use proc_macro2::{TokenStream as TokenStream2, Span}; -use quote; +use proc_macro::TokenStream; + +use proc_macro2::{Span, TokenStream as TokenStream2}; use quote::ToTokens; -use syn::{Ident, ItemStruct, Fields, Field, Type, Error, PathArguments, GenericArgument, ItemImpl, ImplItem, Expr, ItemFn}; -use crate::component::injector::{WrcInjector, DeferredInjector, BoxInjector, ConfigInjector, - Injector, PropInjector}; +use syn::{Error, Expr, Field, Fields, GenericArgument, Ident, ImplItem, ItemFn, ItemImpl, ItemStruct, PathArguments, Type}; use syn::spanned::Spanned; + use crate::attr_parser::parse_provides_attr; -use crate::provider::generate_component_provider_impl_fn; +use crate::component::injector::{BoxInjector, ConfigInjector, DeferredInjector, Injector, + PropInjector, WrcInjector}; use crate::component::type_to_inject::TypeToInject; +use crate::provider::generate_component_provider_impl_fn; pub(crate) mod injector; pub(crate) mod type_to_inject; pub(crate) fn generate_component_for_impl(comp_impl: ItemImpl) -> Result { for item in &comp_impl.items { - match item { - ImplItem::Method(method) => { - let provides_attr = method.attrs.iter() - .find(|attr| attr.path.to_token_stream().to_string() == "provides".to_string()); - - if provides_attr.is_some() { - let provides_attr = provides_attr.unwrap(); - let provides = if provides_attr.tokens.is_empty() { - parse_provides_attr(TokenStream::new())? - } else { - parse_provides_attr( - provides_attr.parse_args::()? - .to_token_stream() - .into() - )? - }; - - let mut fn_tokens = method.sig.to_token_stream(); - fn_tokens.extend(method.block.to_token_stream()); - let item_fn = syn::parse::(fn_tokens.into())?; - - return generate_component_provider_impl_fn( - provides, - item_fn, - comp_impl.self_ty.to_token_stream().into() - ) - } - }, - _ => {} + if let ImplItem::Method(method) = item { + let provides_attr = method.attrs.iter() + .find(|attr| attr.path.to_token_stream().to_string() == *"provides"); + + if provides_attr.is_some() { + let provides_attr = provides_attr.unwrap(); + let provides = if provides_attr.tokens.is_empty() { + parse_provides_attr(TokenStream::new())? + } else { + parse_provides_attr( + provides_attr.parse_args::()? + .to_token_stream() + .into() + )? + }; + + let mut fn_tokens = method.sig.to_token_stream(); + fn_tokens.extend(method.block.to_token_stream()); + let item_fn = syn::parse::(fn_tokens.into())?; + + return generate_component_provider_impl_fn( + provides, + item_fn, + comp_impl.self_ty.to_token_stream(), + ); + } } } Err(Error::new(comp_impl.span(), "Constructor with #[provides] attribute is not found")) @@ -55,7 +53,7 @@ pub(crate) fn generate_component_for_struct(component: ItemStruct) -> Result, _>>()? ); let deferred_dependencies_code = generate_deferred_dependencies_code( @@ -91,7 +89,7 @@ pub(crate) fn generate_component_for_struct(component: ItemStruct) -> Result TokenStream2 { @@ -99,9 +97,9 @@ pub(crate) fn generate_inject_dependencies_tuple(dep_number: usize) -> TokenStre .map(|i| Ident::new(format!("dep_{}", i).as_str(), Span::call_site())) .collect(); - return quote::quote! { + quote::quote! { (#(#dependencies),*) - }; + } } fn generate_inject_dependencies_named(fields: Vec<&Field>) -> TokenStream2 { @@ -113,9 +111,9 @@ fn generate_inject_dependencies_named(fields: Vec<&Field>) -> TokenStream2 { .map(|f| f.ident.as_ref().unwrap()) .collect(); - return quote::quote! { + quote::quote! { {#(#field_names: #dependencies),*} - }; + } } fn generate_inject_deferred(fields: Vec<&Field>, is_tuple: bool) -> TokenStream2 { @@ -125,9 +123,9 @@ fn generate_inject_deferred(fields: Vec<&Field>, is_tuple: bool) -> TokenStream2 if let Type::Path(path_type) = &f.ty { let ptr_type = path_type.path.to_token_stream().to_string(); - return ptr_type.starts_with("waiter :: Deferred <") || ptr_type.starts_with("Deferred <") + return ptr_type.starts_with("waiter :: Deferred <") || ptr_type.starts_with("Deferred <"); } - return false; + false }) .map(|(i, f)| if is_tuple { (i, Ident::new(format!("{}", i).as_str(), Span::call_site())) @@ -140,9 +138,9 @@ fn generate_inject_deferred(fields: Vec<&Field>, is_tuple: bool) -> TokenStream2 }) .collect(); - return quote::quote! { + quote::quote! { #(component.#dependencies_inject)* - }; + } } pub(crate) fn generate_dependencies_create_code(args: Vec) -> TokenStream2 { @@ -150,7 +148,7 @@ pub(crate) fn generate_dependencies_create_code(args: Vec) -> Toke .enumerate() .map(|(i, arg)| generate_dependency_create_code(arg, i)).collect(); - return quote::quote! { + quote::quote! { #(#dep_code_list)* } } @@ -159,17 +157,18 @@ fn generate_dependency_create_code(to_inject: TypeToInject, pos: usize) -> Token let dep_var_name = quote::format_ident!("dep_{}", pos); let type_path = to_inject.type_path.clone(); - let mut injectors: Vec> = Vec::new(); - injectors.push(Box::new(DeferredInjector)); - injectors.push(Box::new(WrcInjector)); - injectors.push(Box::new(BoxInjector)); - injectors.push(Box::new(ConfigInjector)); - injectors.push(Box::new(PropInjector)); + let injectors: Vec> = vec![ + Box::new(DeferredInjector), + Box::new(WrcInjector), + Box::new(BoxInjector), + Box::new(ConfigInjector), + Box::new(PropInjector), + ]; let inject_code = injectors.iter() .find_map(|injector| injector.generate_inject_code( &to_inject, - &Ident::new("container", Span::call_site()) + &Ident::new("container", Span::call_site()), )) .unwrap_or_else(|| quote::quote! { waiter_di::Provider::<#type_path>::create(container) }); @@ -204,7 +203,7 @@ fn generate_deferred_dependencies_code(fields: Vec<&Field>) -> Result) -> Result, Error>>()?; - return Ok(quote::quote! { + Ok(quote::quote! { #(#dep_code_list)* }) } \ No newline at end of file diff --git a/crates/waiter_codegen/src/component/type_to_inject.rs b/crates/waiter_codegen/src/component/type_to_inject.rs index 11fc963..d644ef4 100644 --- a/crates/waiter_codegen/src/component/type_to_inject.rs +++ b/crates/waiter_codegen/src/component/type_to_inject.rs @@ -1,15 +1,16 @@ -use proc_macro2::{TokenStream as TokenStream2}; +use proc_macro2::TokenStream as TokenStream2; use quote::ToTokens; -use crate::attr_parser::{PropAttr, parse_prop_attr}; -use syn::{Path, Error, Type, Field, FnArg, Attribute, Pat}; +use syn::{Attribute, Error, Field, FnArg, Pat, Path, Type}; use syn::spanned::Spanned; +use crate::attr_parser::{parse_prop_attr, PropAttr}; + #[derive(Clone)] pub(crate) struct TypeToInject { pub(crate) type_name: String, pub(crate) type_path: Path, pub(crate) arg_name: Option, - pub(crate) prop_attr: Option + pub(crate) prop_attr: Option, } @@ -19,7 +20,7 @@ impl TypeToInject { type_name: type_.to_token_stream().to_string(), type_path: Self::parse_path(type_)?, arg_name: None, - prop_attr: None + prop_attr: None, }) } pub(crate) fn from_field(field: &Field) -> Result { @@ -27,37 +28,38 @@ impl TypeToInject { type_name: field.ty.to_token_stream().to_string(), type_path: Self::parse_path(&field.ty)?, arg_name: field.ident.clone().map(|name| name.to_token_stream()), - prop_attr: Self::parse_attr(&field.attrs)? + prop_attr: Self::parse_attr(&field.attrs)?, }) } pub(crate) fn from_fn_arg(arg: FnArg) -> Result { let typed = if let FnArg::Typed(typed) = &arg { typed } else { - return Err(Error::new(arg.span(), "Unsupported argument type")) + return Err(Error::new(arg.span(), "Unsupported argument type")); }; let arg_name = if let Pat::Ident(pat_ident) = *typed.pat.clone() { Some(pat_ident.ident.to_token_stream()) } else { - return Err(Error::new(arg.span(), "Unsupported argument name")) + return Err(Error::new(arg.span(), "Unsupported argument name")); }; Ok(Self { type_name: typed.ty.to_token_stream().to_string(), type_path: Self::parse_path(&typed.ty)?, arg_name, - prop_attr: Self::parse_attr(&typed.attrs)? + prop_attr: Self::parse_attr(&typed.attrs)?, }) } - fn parse_attr(attrs: &Vec) -> Result, Error> { + fn parse_attr(attrs: &[Attribute]) -> Result, Error> { let prop_attr = attrs.iter() - .find(|attr| attr.path.to_token_stream().to_string() == "prop".to_string()); + .find(|attr| attr.path.to_token_stream().to_string() == *"prop"); + + if let Some(p) = prop_attr { + return parse_prop_attr(p) + .map(Some); - if prop_attr.is_some() { - return parse_prop_attr(prop_attr.unwrap()) - .map(|parsed| Some(parsed)); } Ok(None) } diff --git a/crates/waiter_codegen/src/lib.rs b/crates/waiter_codegen/src/lib.rs index 7f47ad4..1e21441 100644 --- a/crates/waiter_codegen/src/lib.rs +++ b/crates/waiter_codegen/src/lib.rs @@ -1,14 +1,17 @@ use proc_macro::TokenStream; -use proc_macro2::{TokenStream as TokenStream2}; + +use proc_macro2::TokenStream as TokenStream2; use quote::ToTokens; use syn::*; -use component::{generate_component_for_struct, generate_component_for_impl}; -use provider::*; -use attr_parser::{parse_provides_attr}; -use syn::spanned::Spanned; use syn::punctuated::Punctuated; +use syn::spanned::Spanned; use syn::token::Comma; +use attr_parser::parse_provides_attr; +use component::{generate_component_for_impl, generate_component_for_struct}; +use provider::*; + + mod component; mod provider; mod attr_parser; @@ -33,7 +36,7 @@ pub fn component(_attr: TokenStream, item: TokenStream) -> TokenStream { let impl_block = syn::parse::(item.clone()) .expect("#[component]/#[module] cant be used only on struct or impls"); res.extend(unwrap(generate_component_for_impl(impl_block.clone()))); - return res; + res } #[proc_macro_attribute] @@ -46,8 +49,8 @@ pub fn provides(attr: TokenStream, item: TokenStream) -> TokenStream { let mut res = remove_attrs(item.clone()); let impl_block = syn::parse::(item.clone()); - if impl_block.is_ok() { - res.extend(generate_interface_provider_impl(provides_attr, impl_block.unwrap().clone())); + if let Ok(i) = impl_block { + res.extend(generate_interface_provider_impl(provides_attr, i.clone())); return res; } @@ -56,9 +59,9 @@ pub fn provides(attr: TokenStream, item: TokenStream) -> TokenStream { res.extend(unwrap(generate_component_provider_impl_fn( provides_attr, fn_block.clone(), - TokenStream2::new() + TokenStream2::new(), ))); - return res; + res } #[proc_macro_attribute] @@ -84,7 +87,7 @@ pub fn wrapper(_attr: TokenStream, item: TokenStream) -> TokenStream { let wrapper_name = &wrapper.ident; - return TokenStream::from(quote::quote! { + TokenStream::from(quote::quote! { #wrapper impl std::ops::Deref for #wrapper_name { type Target = #type_to_wrap; @@ -93,7 +96,7 @@ pub fn wrapper(_attr: TokenStream, item: TokenStream) -> TokenStream { return &self.0; } } - }); + }) } fn remove_attrs(item: TokenStream) -> TokenStream { @@ -112,7 +115,7 @@ fn remove_attrs(item: TokenStream) -> TokenStream { path.attrs.retain(attr_filter); }); Item::Fn(fn_) - }, + } Item::Impl(impl_) => { let mut impl_filtered = impl_.clone(); impl_filtered.items.clear(); @@ -129,21 +132,21 @@ fn remove_attrs(item: TokenStream) -> TokenStream { FnArg::Typed(mut typed) => { typed.attrs.retain(attr_filter); FnArg::Typed(typed) - }, + } other => other }; method_filtered.sig.inputs.push(filtered); } ImplItem::Method(method_filtered) - }, + } other => other }; impl_filtered.items.push(impl_item) }; Item::Impl(impl_filtered) - }, + } Item::Struct(struct_) => { let mut struct_filtered = struct_.clone(); @@ -163,16 +166,16 @@ fn remove_attrs(item: TokenStream) -> TokenStream { Fields::Named(mut fields) => { fields.named = filter_fields(fields.named.clone()); Fields::Named(fields) - }, + } Fields::Unnamed(mut fields) => { fields.unnamed = filter_fields(fields.unnamed.clone()); Fields::Unnamed(fields) - }, + } other => other }; Item::Struct(struct_filtered) - }, + } other => other }; diff --git a/crates/waiter_codegen/src/provider.rs b/crates/waiter_codegen/src/provider.rs index 5bd9809..aaf78a6 100644 --- a/crates/waiter_codegen/src/provider.rs +++ b/crates/waiter_codegen/src/provider.rs @@ -1,12 +1,13 @@ use proc_macro::TokenStream; -use proc_macro2::{TokenStream as TokenStream2}; -use quote::ToTokens; - -use syn::{GenericParam, ItemImpl, ItemStruct, Path, Type, ItemFn, ReturnType, Error}; use std::ops::Deref; -use crate::component::{generate_dependencies_create_code, generate_inject_dependencies_tuple}; + +use proc_macro2::TokenStream as TokenStream2; +use quote::ToTokens; +use syn::{Error, GenericParam, ItemFn, ItemImpl, ItemStruct, Path, ReturnType, Type}; use syn::spanned::Spanned; + use crate::attr_parser::ProvidesAttr; +use crate::component::{generate_dependencies_create_code, generate_inject_dependencies_tuple}; use crate::component::type_to_inject::TypeToInject; pub(crate) fn generate_component_provider_impl_struct(component: ItemStruct) -> TokenStream { @@ -25,14 +26,14 @@ pub(crate) fn generate_component_provider_impl_struct(component: ItemStruct) -> component.generics.params.iter().collect(), vec!(), create_component_code, - inject_deferred_code + inject_deferred_code, ) } pub(crate) fn generate_component_provider_impl_fn( provides: ProvidesAttr, factory: ItemFn, - force_type: TokenStream2 + force_type: TokenStream2, ) -> Result { let comp_name = if force_type.is_empty() { let ret_value = if let ReturnType::Type(_, type_) = &factory.sig.output { @@ -41,14 +42,14 @@ pub(crate) fn generate_component_provider_impl_fn( } else { return Err(Error::new( factory.span(), - "Unsupported return type for factory function" - )) + "Unsupported return type for factory function", + )); } } else { return Err(Error::new( factory.span(), - "Return type must be specified for factory function" - )) + "Return type must be specified for factory function", + )); }; ret_value } else { @@ -81,11 +82,11 @@ pub(crate) fn generate_component_provider_impl_fn( Ok(generate_component_provider_impl( comp_name, factory.sig.generics.params.iter() - .filter(|p| if let GenericParam::Lifetime(_) = p { true } else { false }) + .filter(|p| matches!(p, GenericParam::Lifetime(_))) .collect(), provides.profiles, create_component_code, - inject_deferred_code + inject_deferred_code, )) } @@ -94,7 +95,7 @@ pub fn generate_component_provider_impl( comp_generics: Vec<&GenericParam>, profiles: Vec, create_component_code: TokenStream2, - inject_deferred_code: TokenStream2 + inject_deferred_code: TokenStream2, ) -> TokenStream { let (profiles, provider_generics) = if profiles.is_empty() { let generic_profile = quote::quote! { PROFILE }; @@ -138,7 +139,7 @@ pub fn generate_component_provider_impl( } )*}; - return TokenStream::from(result); + TokenStream::from(result) } pub(crate) fn generate_interface_provider_impl(provides: ProvidesAttr, impl_block: ItemImpl) -> TokenStream { @@ -146,14 +147,14 @@ pub(crate) fn generate_interface_provider_impl(provides: ProvidesAttr, impl_bloc Some((_, interface, _)) => interface, None => return TokenStream::from(Error::new( impl_block.span(), - "#[provides] can be used only on impl blocks for traits" + "#[provides] can be used only on impl blocks for traits", ).to_compile_error()) }; let comp_name = if let Type::Path(comp_path) = *impl_block.self_ty { comp_path.path.segments.first().unwrap().ident.clone() } else { - return TokenStream::from(Error::new(impl_block.self_ty.span(), "Failed to create provider").to_compile_error()) + return TokenStream::from(Error::new(impl_block.self_ty.span(), "Failed to create provider").to_compile_error()); }; let provider_body = quote::quote! {{ @@ -177,5 +178,5 @@ pub(crate) fn generate_interface_provider_impl(provides: ProvidesAttr, impl_bloc } }; - return TokenStream::from(result); + TokenStream::from(result) } \ No newline at end of file diff --git a/examples/1_get_started.rs b/examples/1_get_started.rs index ed33482..56f3d41 100644 --- a/examples/1_get_started.rs +++ b/examples/1_get_started.rs @@ -23,7 +23,7 @@ impl Interface for InterfaceImpl { #[component] struct SomeComp { #[prop("i32_prop")] prop: i32, - interface: Rc + interface: Rc, } fn main() { diff --git a/examples/2_modules.rs b/examples/2_modules.rs index 4b3749e..bd94341 100644 --- a/examples/2_modules.rs +++ b/examples/2_modules.rs @@ -1,10 +1,11 @@ -extern crate waiter_di; extern crate config; extern crate serde; +extern crate waiter_di; -use waiter_di::*; use std::collections::HashMap; +use waiter_di::*; + // Simple demo of dependency inversion, constructors and modules trait UserRepository { @@ -13,7 +14,7 @@ trait UserRepository { } struct HashMapUserRepository { - users: HashMap + users: HashMap, } #[component] @@ -37,12 +38,12 @@ impl UserRepository for HashMapUserRepository { #[module] struct UserModule { - repository: Box + repository: Box, } #[module] struct RootModule { - user_module: UserModule + user_module: UserModule, } fn main() { diff --git a/examples/3_inject_options_list.rs b/examples/3_inject_options_list.rs index 52b4ab5..6ac0b71 100644 --- a/examples/3_inject_options_list.rs +++ b/examples/3_inject_options_list.rs @@ -1,11 +1,13 @@ -extern crate waiter_di; extern crate config; extern crate serde; +extern crate waiter_di; + +use std::rc::Rc; -use waiter_di::*; use config::Config; use serde::Deserialize; -use std::rc::Rc; + +use waiter_di::*; trait Interface { fn int(&self); @@ -16,7 +18,7 @@ trait Interface2 { } struct Dependency { - map: HashMap + map: HashMap, } impl Dependency { @@ -41,7 +43,7 @@ fn create_external_type_dependency() -> HashMap { #[derive(Debug, Deserialize)] struct ConfigObject { - i32_prop: i32 + i32_prop: i32, } #[component] @@ -58,7 +60,7 @@ struct Comp { #[prop("float_v" = 3.14)] float_prop: f32, str_prop: String, bool_prop: Option, - #[prop] config_object: ConfigObject + #[prop] config_object: ConfigObject, } impl Comp { @@ -69,7 +71,7 @@ impl Comp { self.dependency_def.dep(); self.dependency_def_rc.dep(); self.dependency_def_box.dep(); - self.config.get_str("prop").unwrap(); + self.config.get_string("prop").unwrap(); println!("Comp, {}, {}, {}, {:?}, {}", self.int_prop, self.float_prop, self.str_prop, self.bool_prop, self.config_object.i32_prop); } diff --git a/src/container.rs b/src/container.rs index aa41b47..d0f511e 100644 --- a/src/container.rs +++ b/src/container.rs @@ -1,16 +1,20 @@ -use std::any::{TypeId, type_name}; +use std::any::{type_name, TypeId}; use std::collections::HashMap; use std::env; +use std::env::args; use std::marker::PhantomData; + use config::{Config, Environment, File}; -use regex::Regex; -use std::env::args; use lazy_static::lazy_static; +use regex::Regex; + use crate::{RcAny, Wrc}; pub mod profiles { pub struct Default; + pub struct Dev; + pub struct Test; } @@ -41,31 +45,34 @@ pub trait Provider { pub struct Container

{ profile: PhantomData

, pub config: Config, - pub components: HashMap + pub components: HashMap, +} + +impl

Default for Container

{ + fn default() -> Self { + Self::new() + } } impl

Container

{ pub fn new() -> Container

{ - let mut config = Config::new(); - config.merge(File::with_name("config/default").required(false)) - .expect("Failed to read default config file"); + let mut config = Config::builder() + .add_source(File::with_name("config/default").required(false)); let profile = profile_name::

(); if profile.ne(&"default".to_string()) { - config.merge(File::with_name(&format!("config/{}", profile)).required(false)) - .expect(format!("Failed to read {} config file", profile).as_str()); + config = config + .add_source(File::with_name(&format!("config/{}", profile)) + .required(false)); } - config.merge(Environment::new()) - .expect("Failed to load environment"); - - config.merge(parse_args()) - .expect("Failed to parse args"); + let config = config.add_source(Environment::default()).add_source(parse_args()); + let config = config.build().expect("Failed to load environment"); Container { config, profile: PhantomData::

, - components: HashMap::new() + components: HashMap::new(), } } } @@ -76,17 +83,16 @@ lazy_static! { } fn parse_profile() -> String { - let mut config = Config::new(); + let config_builder = Config::builder() + .add_source(File::with_name("config/default").required(false)); - config.merge(File::with_name("config/default").required(false)) - .expect("Failed to read default config file"); let profile_arg = args().position(|arg| arg.as_str() == "--profile") .and_then(|arg_pos| args().nth(arg_pos + 1)); - + let config = config_builder.build().expect("Failed to load environment"); let parsed_profile = profile_arg .or(env::var("PROFILE").ok()) - .or(config.get_str("profile").ok()) + .or(config.get_string("profile").ok()) .unwrap_or("default".to_string()); log::info!("Using profile: {}", parsed_profile); @@ -95,19 +101,19 @@ fn parse_profile() -> String { } pub fn parse_args() -> Config { - let mut config = Config::new(); + let mut config = Config::builder(); let mut args = args().peekable(); loop { let arg = args.next(); if arg.is_some() { let arg = arg.unwrap(); - if arg.starts_with("--") { + if let Some(stripped) = arg.strip_prefix("--") { let value = args.peek(); if value.is_none() || value.unwrap().starts_with("--") { - config.set(&arg[2..], true).unwrap(); + config = config.set_override(stripped, true).unwrap(); } else { - config.set(&arg[2..], args.next().unwrap()).unwrap(); + config = config.set_override(stripped, args.next().unwrap()).unwrap(); } } } else { @@ -115,7 +121,7 @@ pub fn parse_args() -> Config { } } - config + config.build().expect("Config should be built") } pub fn profile_name() -> String { diff --git a/src/deferred.rs b/src/deferred.rs index 1ffec29..dce891a 100644 --- a/src/deferred.rs +++ b/src/deferred.rs @@ -1,14 +1,15 @@ -use crate::deferred::DeferredValue::{WaitingForValue, Initialized}; use std::ops::Deref; use std::sync::Mutex; +use crate::deferred::DeferredValue::{Initialized, WaitingForValue}; + pub struct Deferred { - value: Mutex> + value: Mutex>, } pub enum DeferredValue { Initialized(T), - WaitingForValue + WaitingForValue, } impl Deferred { @@ -20,6 +21,12 @@ impl Deferred { } } +impl Default for Deferred { + fn default() -> Self { + Self::new() + } +} + impl Deref for Deferred { type Target = T; diff --git a/src/lib.rs b/src/lib.rs index dbc747b..cba06ed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,17 +1,15 @@ +use std::any::Any; + +pub use container::*; +pub use deferred::*; +pub use waiter_codegen::*; + pub mod container; pub mod deferred; #[macro_use] pub mod inject; -pub use waiter_codegen::*; - -pub use container::*; -pub use deferred::*; -pub use inject::*; -use std::any::Any; - - #[cfg(feature = "async")] pub type Wrc = std::sync::Arc;