diff --git a/Cargo.lock b/Cargo.lock index a707f23..b4415fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,9 +73,9 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -93,41 +93,21 @@ name = "automation" version = "0.1.0" dependencies = [ "anyhow", - "async-trait", - "automation_cast", - "automation_macro", + "automation_devices", + "automation_lib", "axum", - "bytes", - "console-subscriber", "dotenvy", - "dyn-clone", - "enum_dispatch", - "eui48", - "futures", "google_home", "hostname", - "impls", - "indexmap 2.2.6", "mlua", - "paste", - "pollster", - "regex", "reqwest", "rumqttc", "serde", "serde_json", - "serde_repr", - "serde_with", - "serde_yaml", "thiserror", "tokio", - "tokio-cron-scheduler", - "tokio-util", "tracing", "tracing-subscriber", - "uuid", - "wakey", - "zigbee2mqtt-types", ] [[package]] @@ -135,16 +115,67 @@ name = "automation_cast" version = "0.1.0" [[package]] -name = "automation_macro" +name = "automation_devices" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "automation_cast", + "automation_lib", + "automation_macro", + "axum", + "bytes", + "dyn-clone", + "eui48", + "google_home", + "impls", + "mlua", + "reqwest", + "rumqttc", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "wakey", + "zigbee2mqtt-types", +] + +[[package]] +name = "automation_lib" version = "0.1.0" dependencies = [ "async-trait", "automation_cast", + "automation_macro", + "bytes", + "dyn-clone", + "futures", + "google_home", + "impls", + "indexmap 2.2.6", + "mlua", + "pollster", + "reqwest", + "rumqttc", + "serde", + "serde_json", + "serde_repr", + "thiserror", + "tokio", + "tokio-cron-scheduler", + "tokio-util", + "tracing", + "uuid", +] + +[[package]] +name = "automation_macro" +version = "0.1.0" +dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "serde", - "serde_json", "syn 2.0.60", ] @@ -238,9 +269,9 @@ checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bstr" -version = "1.6.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", "serde", @@ -252,12 +283,6 @@ version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - [[package]] name = "bytes" version = "1.4.0" @@ -288,46 +313,9 @@ dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "serde", "winapi", ] -[[package]] -name = "console-api" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2895653b4d9f1538a83970077cb01dfc77a4810524e51a110944688e916b18e" -dependencies = [ - "prost", - "prost-types", - "tonic", - "tracing-core", -] - -[[package]] -name = "console-subscriber" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cf42660ac07fcebed809cfe561dd8730bcd35b075215e6479c516bcd0d11cb" -dependencies = [ - "console-api", - "crossbeam-channel", - "crossbeam-utils", - "futures", - "hdrhistogram", - "humantime", - "prost-types", - "serde", - "serde_json", - "thread_local", - "tokio", - "tokio-stream", - "tonic", - "tracing", - "tracing-core", - "tracing-subscriber", -] - [[package]] name = "core-foundation" version = "0.9.3" @@ -344,15 +332,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - [[package]] name = "cron" version = "0.12.0" @@ -364,66 +343,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "darling" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[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", - "strsim", - "syn 2.0.60", -] - -[[package]] -name = "darling_macro" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.60", -] - -[[package]] -name = "deranged" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" -dependencies = [ - "serde", -] - [[package]] name = "dotenvy" version = "0.15.7" @@ -451,18 +370,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "enum_dispatch" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.60", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -471,18 +378,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" dependencies = [ "serde", + "typeid", ] [[package]] name = "errno" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", "windows-sys 0.52.0", @@ -498,16 +406,6 @@ dependencies = [ "serde", ] -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "flume" version = "0.10.14" @@ -648,7 +546,6 @@ checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" name = "google_home" version = "0.1.0" dependencies = [ - "anyhow", "async-trait", "automation_cast", "futures", @@ -704,24 +601,11 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "hdrhistogram" -version = "7.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" -dependencies = [ - "base64 0.13.1", - "byteorder", - "flate2", - "nom", - "num-traits", -] - [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -783,12 +667,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" version = "0.14.27" @@ -827,18 +705,6 @@ dependencies = [ "tokio-rustls 0.24.1", ] -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - [[package]] name = "iana-time-zone" version = "0.1.57" @@ -862,12 +728,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.4.0" @@ -892,7 +752,6 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde", ] [[package]] @@ -912,15 +771,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.12.1" @@ -971,15 +821,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -1008,23 +858,14 @@ dependencies = [ [[package]] name = "luajit-src" -version = "210.5.7+d06beb0" +version = "210.5.11+97813fb" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d251fdacdabbf87704cf48ac1f8b1eb23d6e10855c3ee08e5beb25b4be2e9e4" +checksum = "3015551c284515db7c30c559fc1080f9cb9ee990d1f6fca315451a107c7540bb" dependencies = [ "cc", "which", ] -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matchit" version = "0.7.2" @@ -1033,9 +874,9 @@ checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1071,9 +912,9 @@ dependencies = [ [[package]] name = "mlua" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae9546e4a268c309804e8bbb7526e31cbfdedca7cd60ac1b987d0b212e0d876" +checksum = "9ea43c3ffac2d0798bd7128815212dd78c98316b299b7a902dabef13dc7b6b8d" dependencies = [ "bstr", "either", @@ -1090,9 +931,9 @@ dependencies = [ [[package]] name = "mlua-sys" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa6bf1a64f06848749b7e7727417f4ec2121599e2a10ef0a8a3888b0e9a5a0d" +checksum = "63a11d485edf0f3f04a508615d36c7d50d299cf61a7ee6d3e2530651e0a31771" dependencies = [ "cc", "cfg-if", @@ -1103,13 +944,13 @@ dependencies = [ [[package]] name = "mlua_derive" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfc5faa2e0d044b3f5f0879be2920e0a711c97744c42cf1c295cb183668933e" +checksum = "870d71c172fcf491c6b5fb4c04160619a2ee3e5a42a1402269c66bcbf1dd4deb" dependencies = [ "itertools 0.13.0", "once_cell", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", "regex", @@ -1234,12 +1075,6 @@ dependencies = [ "windows-targets 0.52.5", ] -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - [[package]] name = "percent-encoding" version = "2.3.0" @@ -1280,9 +1115,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "pollster" @@ -1291,33 +1126,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" [[package]] -name = "ppv-lite86" -version = "0.2.17" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn 2.0.60", ] [[package]] @@ -1329,38 +1156,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools 0.10.5", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "prost-types" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" -dependencies = [ - "prost", -] - [[package]] name = "quote" version = "1.0.36" @@ -1370,36 +1165,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - [[package]] name = "redox_syscall" version = "0.5.2" @@ -1417,17 +1182,8 @@ checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1438,15 +1194,9 @@ checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.7.4" @@ -1533,15 +1283,15 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.5.0", "errno", @@ -1748,48 +1498,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1402f54f9a3b9e2efe71c1cea24e648acce55887983553eeb858cf3115acfd49" -dependencies = [ - "base64 0.21.2", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.2.6", - "serde", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9197f1ad0e3c173a0222d3c4404fb04c3afe87e962bcb327af73e8301fa203c7" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.60", -] - -[[package]] -name = "serde_yaml" -version = "0.9.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" -dependencies = [ - "indexmap 2.2.6", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - [[package]] name = "sharded-slab" version = "0.1.4" @@ -1799,15 +1507,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - [[package]] name = "slab" version = "0.4.8" @@ -1858,12 +1557,6 @@ dependencies = [ "lock_api", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "syn" version = "1.0.109" @@ -1922,34 +1615,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fdd63d58b18d663fbdf70e049f00a22c8e42be082203be7f26589213cd75ea" -dependencies = [ - "deranged", - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" -dependencies = [ - "time-core", -] - [[package]] name = "tinyvec" version = "1.6.0" @@ -1976,12 +1641,9 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2 0.5.3", "tokio-macros", - "tracing", "windows-sys 0.48.0", ] @@ -2000,16 +1662,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-macros" version = "2.1.0" @@ -2042,17 +1694,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.11" @@ -2070,34 +1711,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tonic" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" -dependencies = [ - "async-trait", - "axum", - "base64 0.21.2", - "bytes", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost", - "tokio", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.4.13" @@ -2106,13 +1719,9 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", - "indexmap 1.9.3", "pin-project", "pin-project-lite", - "rand", - "slab", "tokio", - "tokio-util", "tower-layer", "tower-service", "tracing", @@ -2166,12 +1775,12 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] @@ -2181,14 +1790,10 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ - "matchers", "nu-ansi-term", - "once_cell", - "regex", "sharded-slab", "smallvec", "thread_local", - "tracing", "tracing-core", "tracing-log", ] @@ -2199,6 +1804,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -2220,12 +1831,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unsafe-libyaml" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" - [[package]] name = "untrusted" version = "0.7.1" @@ -2386,9 +1991,9 @@ dependencies = [ [[package]] name = "which" -version = "6.0.1" +version = "6.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" +checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" dependencies = [ "either", "home", diff --git a/Cargo.toml b/Cargo.toml index 4032878..7593852 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,45 +9,11 @@ members = [ "automation_cast", "google_home/google_home", "google_home/google_home_macro", + "automation_devices", + "automation_lib", ] - -[dependencies] -automation_macro = { path = "./automation_macro" } -automation_cast = { path = "./automation_cast/" } -rumqttc = "0.18" -serde = { version = "1.0.149", features = ["derive"] } -serde_json = "1.0.89" -google_home = { path = "./google_home/google_home/" } -paste = "1.0.10" -tokio = { version = "1", features = ["rt-multi-thread"] } -dotenvy = "0.15.0" -reqwest = { version = "0.11.13", features = [ - "json", - "rustls-tls", -], default-features = false } # Use rustls, since the other packages also use rustls -axum = "0.6.1" -serde_repr = "0.1.10" -tracing = "0.1.37" -bytes = "1.3.0" -pollster = "0.2.5" -regex = "1.7.0" -async-trait = "0.1.61" -futures = "0.3.25" -eui48 = { version = "1.1.0", default-features = false, features = [ - "disp_hexstring", - "serde", -] } -thiserror = "1.0.38" -anyhow = "1.0.68" -wakey = "0.3.0" -console-subscriber = "0.1.8" -tracing-subscriber = "0.3.16" -serde_with = "3.2.0" -enum_dispatch = "0.3.12" -indexmap = { version = "2.0.0", features = ["serde"] } -serde_yaml = "0.9.27" -tokio-cron-scheduler = "0.9.4" +[workspace.dependencies] mlua = { version = "0.10.1", features = [ "lua54", "vendored", @@ -56,13 +22,68 @@ mlua = { version = "0.10.1", features = [ "async", "send", ] } -hostname = "0.4.0" -tokio-util = { version = "0.7.11", features = ["full"] } -uuid = "1.8.0" +automation_macro = { path = "./automation_macro" } +automation_cast = { path = "./automation_cast" } +automation_lib = { path = "./automation_lib" } +automation_devices = { path = "./automation_devices" } +google_home = { path = "./google_home/google_home" } +google_home_macro = { path = "./google_home/google_home_macro" } +tokio = { version = "1", features = ["rt-multi-thread"] } +rumqttc = "0.18" +tracing = "0.1.37" +anyhow = "1.0.68" +async-trait = "0.1.83" +axum = "0.6.1" +bytes = "1.3.0" +dotenvy = "0.15.0" dyn-clone = "1.0.17" +eui48 = { version = "1.1.0", features = [ + "disp_hexstring", + "serde", +], default-features = false } +futures = "0.3.25" +hostname = "0.4.0" impls = "1.0.3" +indexmap = { version = "2.0.0", features = ["serde"] } +itertools = "0.12.1" +json_value_merge = "2.0.0" +pollster = "0.2.5" +proc-macro2 = "1.0.81" +quote = "1.0.36" +reqwest = { version = "0.11.13", features = [ + "json", + "rustls-tls", +], default-features = false } # Use rustls, since the other packages also use rustls +serde = { version = "1.0.149", features = ["derive"] } +serde_json = "1.0.89" +serde_repr = "0.1.10" +syn = { version = "2.0.60", features = ["extra-traits", "full"] } +thiserror = "1.0.38" +tokio-cron-scheduler = "0.9.4" +tokio-util = { version = "0.7.11", features = ["full"] } +tracing-subscriber = "0.3.16" +uuid = "1.8.0" +wakey = "0.3.0" zigbee2mqtt-types = { version = "0.2.0", features = ["debug", "philips"] } +[dependencies] +automation_lib = { workspace = true } +automation_devices = { workspace = true } +google_home = { workspace = true } +mlua = { workspace = true } +tokio = { workspace = true } +hostname = { workspace = true } +rumqttc = { workspace = true } +axum = { workspace = true } +tracing = { workspace = true } +anyhow = { workspace = true } +dotenvy = { workspace = true } +tracing-subscriber = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } +serde_json = { workspace = true } +reqwest = { workspace = true } + [patch.crates-io] wakey = { git = "https://git.huizinga.dev/Dreaded_X/wakey" } diff --git a/automation_devices/Cargo.toml b/automation_devices/Cargo.toml new file mode 100644 index 0000000..cbb6afc --- /dev/null +++ b/automation_devices/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "automation_devices" +version = "0.1.0" +edition = "2021" + +[dependencies] +automation_lib = { workspace = true } +automation_macro = { workspace = true } +automation_cast = { workspace = true } +google_home = { workspace = true } +mlua = { workspace = true } +async-trait = { workspace = true } +dyn-clone = { workspace = true } +rumqttc = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } +serde_json = { workspace = true } +impls = { workspace = true } +serde = { workspace = true } +reqwest = { workspace = true } # Use rustls, since the other packages also use rustls +anyhow = { workspace = true } +zigbee2mqtt-types = { workspace = true } +axum = { workspace = true } +bytes = { workspace = true } +thiserror = { workspace = true } +eui48 = { workspace = true } +wakey = { workspace = true } diff --git a/src/devices/air_filter.rs b/automation_devices/src/air_filter.rs similarity index 96% rename from src/devices/air_filter.rs rename to automation_devices/src/air_filter.rs index d5dc936..e4e820e 100644 --- a/src/devices/air_filter.rs +++ b/automation_devices/src/air_filter.rs @@ -1,6 +1,11 @@ use std::sync::Arc; use async_trait::async_trait; +use automation_lib::config::{InfoConfig, MqttDeviceConfig}; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::OnMqtt; +use automation_lib::messages::{AirFilterFanState, AirFilterState, SetAirFilterFanState}; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; use google_home::device::Name; use google_home::errors::ErrorCode; @@ -13,13 +18,6 @@ use rumqttc::Publish; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use tracing::{debug, error, trace, warn}; -use super::LuaDeviceCreate; -use crate::config::{InfoConfig, MqttDeviceConfig}; -use crate::devices::Device; -use crate::event::OnMqtt; -use crate::messages::{AirFilterFanState, AirFilterState, SetAirFilterFanState}; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { #[device_config(flatten)] diff --git a/src/devices/contact_sensor.rs b/automation_devices/src/contact_sensor.rs similarity index 93% rename from src/devices/contact_sensor.rs rename to automation_devices/src/contact_sensor.rs index 3de9c68..630a8bc 100644 --- a/src/devices/contact_sensor.rs +++ b/automation_devices/src/contact_sensor.rs @@ -2,20 +2,19 @@ use std::sync::Arc; use std::time::Duration; use async_trait::async_trait; +use automation_lib::action_callback::ActionCallback; +use automation_lib::config::MqttDeviceConfig; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::error::DeviceConfigError; +use automation_lib::event::{OnMqtt, OnPresence}; +use automation_lib::messages::{ContactMessage, PresenceMessage}; +use automation_lib::mqtt::WrappedAsyncClient; +use automation_lib::presence::DEFAULT_PRESENCE; use automation_macro::LuaDeviceConfig; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use tokio::task::JoinHandle; use tracing::{debug, error, trace, warn}; -use super::{Device, LuaDeviceCreate}; -use crate::action_callback::ActionCallback; -use crate::config::MqttDeviceConfig; -use crate::devices::DEFAULT_PRESENCE; -use crate::error::DeviceConfigError; -use crate::event::{OnMqtt, OnPresence}; -use crate::messages::{ContactMessage, PresenceMessage}; -use crate::mqtt::WrappedAsyncClient; - // NOTE: If we add more presence devices we might need to move this out of here #[derive(Debug, Clone, LuaDeviceConfig)] pub struct PresenceDeviceConfig { diff --git a/src/devices/debug_bridge.rs b/automation_devices/src/debug_bridge.rs similarity index 89% rename from src/devices/debug_bridge.rs rename to automation_devices/src/debug_bridge.rs index ab45f2b..eaabfb0 100644 --- a/src/devices/debug_bridge.rs +++ b/automation_devices/src/debug_bridge.rs @@ -1,16 +1,14 @@ use std::convert::Infallible; use async_trait::async_trait; +use automation_lib::config::MqttDeviceConfig; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::{OnDarkness, OnPresence}; +use automation_lib::messages::{DarknessMessage, PresenceMessage}; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; use tracing::{trace, warn}; -use super::LuaDeviceCreate; -use crate::config::MqttDeviceConfig; -use crate::devices::Device; -use crate::event::{OnDarkness, OnPresence}; -use crate::messages::{DarknessMessage, PresenceMessage}; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, LuaDeviceConfig, Clone)] pub struct Config { pub identifier: String, diff --git a/src/devices/hue_bridge.rs b/automation_devices/src/hue_bridge.rs similarity index 95% rename from src/devices/hue_bridge.rs rename to automation_devices/src/hue_bridge.rs index d1829ac..cd5dfbd 100644 --- a/src/devices/hue_bridge.rs +++ b/automation_devices/src/hue_bridge.rs @@ -2,14 +2,12 @@ use std::convert::Infallible; use std::net::SocketAddr; use async_trait::async_trait; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::{OnDarkness, OnPresence}; use automation_macro::LuaDeviceConfig; use serde::{Deserialize, Serialize}; use tracing::{error, trace, warn}; -use super::LuaDeviceCreate; -use crate::devices::Device; -use crate::event::{OnDarkness, OnPresence}; - #[derive(Debug)] pub enum Flag { Presence, diff --git a/src/devices/hue_group.rs b/automation_devices/src/hue_group.rs similarity index 99% rename from src/devices/hue_group.rs rename to automation_devices/src/hue_group.rs index 210b2e8..fa5b063 100644 --- a/src/devices/hue_group.rs +++ b/automation_devices/src/hue_group.rs @@ -2,13 +2,13 @@ use std::net::SocketAddr; use anyhow::Result; use async_trait::async_trait; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; use google_home::errors::ErrorCode; use google_home::traits::OnOff; use tracing::{error, trace, warn}; use super::{Device, LuaDeviceCreate}; -use crate::mqtt::WrappedAsyncClient; #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { diff --git a/src/devices/hue_switch.rs b/automation_devices/src/hue_switch.rs similarity index 88% rename from src/devices/hue_switch.rs rename to automation_devices/src/hue_switch.rs index 1a9b601..daeb77a 100644 --- a/src/devices/hue_switch.rs +++ b/automation_devices/src/hue_switch.rs @@ -1,16 +1,14 @@ +use async_trait::async_trait; +use automation_lib::action_callback::ActionCallback; +use automation_lib::config::{InfoConfig, MqttDeviceConfig}; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::OnMqtt; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; -use axum::async_trait; use rumqttc::{matches, Publish}; use tracing::{debug, trace, warn}; use zigbee2mqtt_types::vendors::philips::Zigbee929003017102; -use super::LuaDeviceCreate; -use crate::action_callback::ActionCallback; -use crate::config::{InfoConfig, MqttDeviceConfig}; -use crate::devices::Device; -use crate::event::OnMqtt; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { #[device_config(flatten)] diff --git a/src/devices/ikea_outlet.rs b/automation_devices/src/ikea_outlet.rs similarity index 94% rename from src/devices/ikea_outlet.rs rename to automation_devices/src/ikea_outlet.rs index 4f70579..c309efd 100644 --- a/src/devices/ikea_outlet.rs +++ b/automation_devices/src/ikea_outlet.rs @@ -2,6 +2,12 @@ use std::sync::Arc; use anyhow::Result; use async_trait::async_trait; +use automation_lib::action_callback::ActionCallback; +use automation_lib::config::{InfoConfig, MqttDeviceConfig}; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::{OnMqtt, OnPresence}; +use automation_lib::messages::OnOffMessage; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; use google_home::device; use google_home::errors::ErrorCode; @@ -12,14 +18,6 @@ use serde::Deserialize; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use tracing::{debug, error, trace, warn}; -use super::LuaDeviceCreate; -use crate::action_callback::ActionCallback; -use crate::config::{InfoConfig, MqttDeviceConfig}; -use crate::devices::Device; -use crate::event::{OnMqtt, OnPresence}; -use crate::messages::OnOffMessage; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, Clone, Deserialize, PartialEq, Eq, Copy)] pub enum OutletType { Outlet, diff --git a/src/devices/ikea_remote.rs b/automation_devices/src/ikea_remote.rs similarity index 79% rename from src/devices/ikea_remote.rs rename to automation_devices/src/ikea_remote.rs index c679b6a..b2995f9 100644 --- a/src/devices/ikea_remote.rs +++ b/automation_devices/src/ikea_remote.rs @@ -1,16 +1,14 @@ +use automation_lib::action_callback::ActionCallback; +use automation_lib::config::{InfoConfig, MqttDeviceConfig}; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::OnMqtt; +use automation_lib::messages::{RemoteAction, RemoteMessage}; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; use axum::async_trait; use rumqttc::{matches, Publish}; use tracing::{debug, error, trace}; -use super::LuaDeviceCreate; -use crate::action_callback::ActionCallback; -use crate::config::{InfoConfig, MqttDeviceConfig}; -use crate::devices::Device; -use crate::event::OnMqtt; -use crate::messages::RemoteMessage; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { #[device_config(flatten)] @@ -73,14 +71,14 @@ impl OnMqtt for IkeaRemote { let on = if self.config.single_button { match action { - crate::messages::RemoteAction::On => Some(true), - crate::messages::RemoteAction::BrightnessMoveUp => Some(false), + RemoteAction::On => Some(true), + RemoteAction::BrightnessMoveUp => Some(false), _ => None, } } else { match action { - crate::messages::RemoteAction::On => Some(true), - crate::messages::RemoteAction::Off => Some(false), + RemoteAction::On => Some(true), + RemoteAction::Off => Some(false), _ => None, } }; diff --git a/src/devices/kasa_outlet.rs b/automation_devices/src/kasa_outlet.rs similarity index 98% rename from src/devices/kasa_outlet.rs rename to automation_devices/src/kasa_outlet.rs index 4f0530e..956278e 100644 --- a/src/devices/kasa_outlet.rs +++ b/automation_devices/src/kasa_outlet.rs @@ -3,6 +3,8 @@ use std::net::SocketAddr; use std::str::Utf8Error; use async_trait::async_trait; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::OnPresence; use automation_macro::LuaDeviceConfig; use bytes::{Buf, BufMut}; use google_home::errors::{self, DeviceError}; @@ -13,9 +15,6 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpStream; use tracing::{debug, trace}; -use super::{Device, LuaDeviceCreate}; -use crate::event::OnPresence; - #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { pub identifier: String, diff --git a/src/devices/mod.rs b/automation_devices/src/lib.rs similarity index 63% rename from src/devices/mod.rs rename to automation_devices/src/lib.rs index 4421503..9ad1793 100644 --- a/src/devices/mod.rs +++ b/automation_devices/src/lib.rs @@ -8,19 +8,13 @@ mod ikea_outlet; mod ikea_remote; mod kasa_outlet; mod light_sensor; -mod ntfy; -mod presence; mod wake_on_lan; mod washer; -use std::fmt::Debug; use std::ops::Deref; -use async_trait::async_trait; use automation_cast::Cast; -use dyn_clone::DynClone; -use google_home::traits::OnOff; -use mlua::ObjectLike; +use automation_lib::device::{Device, LuaDeviceCreate}; pub use self::air_filter::AirFilter; pub use self::contact_sensor::ContactSensor; @@ -32,21 +26,8 @@ pub use self::ikea_outlet::IkeaOutlet; pub use self::ikea_remote::IkeaRemote; pub use self::kasa_outlet::KasaOutlet; pub use self::light_sensor::LightSensor; -pub use self::ntfy::{Notification, Ntfy}; -pub use self::presence::{Presence, DEFAULT_PRESENCE}; pub use self::wake_on_lan::WakeOnLAN; pub use self::washer::Washer; -use crate::event::{OnDarkness, OnMqtt, OnNotification, OnPresence}; - -#[async_trait] -pub trait LuaDeviceCreate { - type Config; - type Error; - - async fn create(config: Self::Config) -> Result - where - Self: Sized; -} macro_rules! register_device { ($lua:expr, $device:ty) => { @@ -60,7 +41,7 @@ macro_rules! impl_device { impl mlua::UserData for $device { fn add_methods>(methods: &mut M) { methods.add_async_function("new", |_lua, config| async { - let device: $device = crate::devices::LuaDeviceCreate::create(config) + let device: $device = LuaDeviceCreate::create(config) .await .map_err(mlua::ExternalError::into_lua_err)?; @@ -74,9 +55,9 @@ macro_rules! impl_device { methods.add_async_method("get_id", |_lua, this, _: ()| async move { Ok(this.get_id()) }); - if impls::impls!($device: OnOff) { + if impls::impls!($device: google_home::traits::OnOff) { methods.add_async_method("set_on", |_lua, this, on: bool| async move { - (this.deref().cast() as Option<&dyn OnOff>) + (this.deref().cast() as Option<&dyn google_home::traits::OnOff>) .expect("Cast should be valid") .set_on(on) .await @@ -86,7 +67,7 @@ macro_rules! impl_device { }); methods.add_async_method("is_on", |_lua, this, _: ()| async move { - Ok((this.deref().cast() as Option<&dyn OnOff>) + Ok((this.deref().cast() as Option<&dyn google_home::traits::OnOff>) .expect("Cast should be valid") .on() .await @@ -108,8 +89,6 @@ impl_device!(IkeaOutlet); impl_device!(IkeaRemote); impl_device!(KasaOutlet); impl_device!(LightSensor); -impl_device!(Ntfy); -impl_device!(Presence); impl_device!(WakeOnLAN); impl_device!(Washer); @@ -124,46 +103,8 @@ pub fn register_with_lua(lua: &mlua::Lua) -> mlua::Result<()> { register_device!(lua, IkeaRemote); register_device!(lua, KasaOutlet); register_device!(lua, LightSensor); - register_device!(lua, Ntfy); - register_device!(lua, Presence); register_device!(lua, WakeOnLAN); register_device!(lua, Washer); Ok(()) } - -pub trait Device: - Debug - + DynClone - + Sync - + Send - + Cast - + Cast - + Cast - + Cast - + Cast - + Cast -{ - fn get_id(&self) -> String; -} - -impl mlua::FromLua for Box { - fn from_lua(value: mlua::Value, _lua: &mlua::Lua) -> mlua::Result { - match value { - mlua::Value::UserData(ud) => { - let ud = if ud.is::>() { - ud - } else { - ud.call_method::<_>("__box", ())? - }; - - let b = ud.borrow::()?.clone(); - Ok(b) - } - _ => Err(mlua::Error::RuntimeError("Expected user data".into())), - } - } -} -impl mlua::UserData for Box {} - -dyn_clone::clone_trait_object!(Device); diff --git a/src/devices/light_sensor.rs b/automation_devices/src/light_sensor.rs similarity index 92% rename from src/devices/light_sensor.rs rename to automation_devices/src/light_sensor.rs index 6c12941..c979742 100644 --- a/src/devices/light_sensor.rs +++ b/automation_devices/src/light_sensor.rs @@ -1,18 +1,16 @@ use std::sync::Arc; use async_trait::async_trait; +use automation_lib::config::MqttDeviceConfig; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::{self, Event, EventChannel, OnMqtt}; +use automation_lib::messages::BrightnessMessage; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; use rumqttc::Publish; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use tracing::{debug, trace, warn}; -use super::LuaDeviceCreate; -use crate::config::MqttDeviceConfig; -use crate::devices::Device; -use crate::event::{self, Event, EventChannel, OnMqtt}; -use crate::messages::BrightnessMessage; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { pub identifier: String, diff --git a/src/devices/wake_on_lan.rs b/automation_devices/src/wake_on_lan.rs similarity index 94% rename from src/devices/wake_on_lan.rs rename to automation_devices/src/wake_on_lan.rs index 16a5b90..6e60a1b 100644 --- a/src/devices/wake_on_lan.rs +++ b/automation_devices/src/wake_on_lan.rs @@ -1,6 +1,11 @@ use std::net::Ipv4Addr; use async_trait::async_trait; +use automation_lib::config::{InfoConfig, MqttDeviceConfig}; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::OnMqtt; +use automation_lib::messages::ActivateMessage; +use automation_lib::mqtt::WrappedAsyncClient; use automation_macro::LuaDeviceConfig; use eui48::MacAddress; use google_home::device; @@ -10,12 +15,6 @@ use google_home::types::Type; use rumqttc::Publish; use tracing::{debug, error, trace}; -use super::{Device, LuaDeviceCreate}; -use crate::config::{InfoConfig, MqttDeviceConfig}; -use crate::event::OnMqtt; -use crate::messages::ActivateMessage; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { #[device_config(flatten)] diff --git a/src/devices/washer.rs b/automation_devices/src/washer.rs similarity index 92% rename from src/devices/washer.rs rename to automation_devices/src/washer.rs index 3f0f0f8..00ff394 100644 --- a/src/devices/washer.rs +++ b/automation_devices/src/washer.rs @@ -1,18 +1,17 @@ use std::sync::Arc; use async_trait::async_trait; +use automation_lib::config::MqttDeviceConfig; +use automation_lib::device::{Device, LuaDeviceCreate}; +use automation_lib::event::{self, Event, EventChannel, OnMqtt}; +use automation_lib::messages::PowerMessage; +use automation_lib::mqtt::WrappedAsyncClient; +use automation_lib::ntfy::{Notification, Priority}; use automation_macro::LuaDeviceConfig; use rumqttc::Publish; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use tracing::{debug, error, trace, warn}; -use super::ntfy::Priority; -use super::{Device, LuaDeviceCreate, Notification}; -use crate::config::MqttDeviceConfig; -use crate::event::{self, Event, EventChannel, OnMqtt}; -use crate::messages::PowerMessage; -use crate::mqtt::WrappedAsyncClient; - #[derive(Debug, Clone, LuaDeviceConfig)] pub struct Config { pub identifier: String, diff --git a/automation_lib/Cargo.toml b/automation_lib/Cargo.toml new file mode 100644 index 0000000..7334da8 --- /dev/null +++ b/automation_lib/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "automation_lib" +version = "0.1.0" +edition = "2021" + +[dependencies] +automation_macro = { workspace = true } +automation_cast = { workspace = true } +google_home = { workspace = true } +rumqttc = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +tokio = { workspace = true } +reqwest = { workspace = true } +serde_repr = { workspace = true } +tracing = { workspace = true } +bytes = { workspace = true } +pollster = { workspace = true } +async-trait = { workspace = true } +futures = { workspace = true } +thiserror = { workspace = true } +indexmap = { workspace = true } +tokio-cron-scheduler = { workspace = true } +mlua = { workspace = true } +tokio-util = { workspace = true } +uuid = { workspace = true } +dyn-clone = { workspace = true } +impls = { workspace = true } diff --git a/src/action_callback.rs b/automation_lib/src/action_callback.rs similarity index 100% rename from src/action_callback.rs rename to automation_lib/src/action_callback.rs diff --git a/src/config.rs b/automation_lib/src/config.rs similarity index 100% rename from src/config.rs rename to automation_lib/src/config.rs diff --git a/automation_lib/src/device.rs b/automation_lib/src/device.rs new file mode 100644 index 0000000..0845f85 --- /dev/null +++ b/automation_lib/src/device.rs @@ -0,0 +1,99 @@ +use std::fmt::Debug; + +use automation_cast::Cast; +use dyn_clone::DynClone; +use google_home::traits::OnOff; +use mlua::ObjectLike; + +use crate::event::{OnDarkness, OnMqtt, OnNotification, OnPresence}; + +// TODO: Make this a proper macro +macro_rules! impl_device { + ($device:ty) => { + impl mlua::UserData for $device { + fn add_methods>(methods: &mut M) { + methods.add_async_function("new", |_lua, config| async { + let device: $device = LuaDeviceCreate::create(config) + .await + .map_err(mlua::ExternalError::into_lua_err)?; + + Ok(device) + }); + + methods.add_method("__box", |_lua, this, _: ()| { + let b: Box = Box::new(this.clone()); + Ok(b) + }); + + methods.add_async_method("get_id", |_lua, this, _: ()| async move { Ok(this.get_id()) }); + + if impls::impls!($device: google_home::traits::OnOff) { + methods.add_async_method("set_on", |_lua, this, on: bool| async move { + (this.deref().cast() as Option<&dyn google_home::traits::OnOff>) + .expect("Cast should be valid") + .set_on(on) + .await + .unwrap(); + + Ok(()) + }); + + methods.add_async_method("is_on", |_lua, this, _: ()| async move { + Ok((this.deref().cast() as Option<&dyn google_home::traits::OnOff>) + .expect("Cast should be valid") + .on() + .await + .unwrap()) + }); + } + } + } + }; +} +pub(crate) use impl_device; + +#[async_trait::async_trait] +pub trait LuaDeviceCreate { + type Config; + type Error; + + async fn create(config: Self::Config) -> Result + where + Self: Sized; +} + +pub trait Device: + Debug + + DynClone + + Sync + + Send + + Cast + + Cast + + Cast + + Cast + + Cast + + Cast +{ + fn get_id(&self) -> String; +} + +impl mlua::FromLua for Box { + fn from_lua(value: mlua::Value, _lua: &mlua::Lua) -> mlua::Result { + match value { + mlua::Value::UserData(ud) => { + let ud = if ud.is::>() { + ud + } else { + ud.call_method::<_>("__box", ())? + }; + + let b = ud.borrow::()?.clone(); + Ok(b) + } + _ => Err(mlua::Error::RuntimeError("Expected user data".into())), + } + } +} +impl mlua::UserData for Box {} + +dyn_clone::clone_trait_object!(Device); diff --git a/src/device_manager.rs b/automation_lib/src/device_manager.rs similarity index 99% rename from src/device_manager.rs rename to automation_lib/src/device_manager.rs index 789cd79..497f30a 100644 --- a/src/device_manager.rs +++ b/automation_lib/src/device_manager.rs @@ -8,7 +8,7 @@ use tokio::sync::{RwLock, RwLockReadGuard}; use tokio_cron_scheduler::{Job, JobScheduler}; use tracing::{debug, instrument, trace}; -use crate::devices::Device; +use crate::device::Device; use crate::event::{Event, EventChannel, OnDarkness, OnMqtt, OnNotification, OnPresence}; pub type DeviceMap = HashMap>; diff --git a/src/error.rs b/automation_lib/src/error.rs similarity index 58% rename from src/error.rs rename to automation_lib/src/error.rs index 7deded4..a95cb71 100644 --- a/src/error.rs +++ b/automation_lib/src/error.rs @@ -1,10 +1,7 @@ use std::{error, fmt, result}; -use axum::http::status::InvalidStatusCode; -use axum::response::IntoResponse; use bytes::Bytes; use rumqttc::ClientError; -use serde::{Deserialize, Serialize}; use thiserror::Error; #[derive(Debug, Clone)] @@ -101,68 +98,3 @@ pub enum LightSensorError { #[error(transparent)] SubscribeError(#[from] ClientError), } - -#[derive(Debug, Error)] -#[error("{source}")] -pub struct ApiError { - status_code: axum::http::StatusCode, - source: Box, -} - -impl ApiError { - pub fn new(status_code: axum::http::StatusCode, source: Box) -> Self { - Self { - status_code, - source, - } - } -} - -impl From for ApiErrorJson { - fn from(value: ApiError) -> Self { - let error = ApiErrorJsonError { - code: value.status_code.as_u16(), - status: value.status_code.to_string(), - reason: value.source.to_string(), - }; - - Self { error } - } -} - -impl IntoResponse for ApiError { - fn into_response(self) -> axum::response::Response { - ( - self.status_code, - serde_json::to_string::(&self.into()) - .expect("Serialization should not fail"), - ) - .into_response() - } -} - -#[derive(Debug, Serialize, Deserialize)] -struct ApiErrorJsonError { - code: u16, - status: String, - reason: String, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct ApiErrorJson { - error: ApiErrorJsonError, -} - -impl TryFrom for ApiError { - type Error = InvalidStatusCode; - - fn try_from(value: ApiErrorJson) -> result::Result { - let status_code = axum::http::StatusCode::from_u16(value.error.code)?; - let source = value.error.reason.into(); - - Ok(Self { - status_code, - source, - }) - } -} diff --git a/src/event.rs b/automation_lib/src/event.rs similarity index 96% rename from src/event.rs rename to automation_lib/src/event.rs index 0065fbf..331793d 100644 --- a/src/event.rs +++ b/automation_lib/src/event.rs @@ -3,7 +3,7 @@ use mlua::FromLua; use rumqttc::Publish; use tokio::sync::mpsc; -use crate::devices::Notification; +use crate::ntfy::Notification; #[derive(Debug, Clone)] pub enum Event { diff --git a/src/helpers/mod.rs b/automation_lib/src/helpers/mod.rs similarity index 100% rename from src/helpers/mod.rs rename to automation_lib/src/helpers/mod.rs diff --git a/src/helpers/timeout.rs b/automation_lib/src/helpers/timeout.rs similarity index 100% rename from src/helpers/timeout.rs rename to automation_lib/src/helpers/timeout.rs diff --git a/src/lib.rs b/automation_lib/src/lib.rs similarity index 83% rename from src/lib.rs rename to automation_lib/src/lib.rs index 31495d5..93051c7 100644 --- a/src/lib.rs +++ b/automation_lib/src/lib.rs @@ -3,13 +3,14 @@ #![feature(let_chains)] pub mod action_callback; -pub mod auth; pub mod config; +pub mod device; pub mod device_manager; -pub mod devices; pub mod error; pub mod event; pub mod helpers; pub mod messages; pub mod mqtt; +pub mod ntfy; +pub mod presence; pub mod schedule; diff --git a/src/messages.rs b/automation_lib/src/messages.rs similarity index 100% rename from src/messages.rs rename to automation_lib/src/messages.rs diff --git a/src/mqtt.rs b/automation_lib/src/mqtt.rs similarity index 100% rename from src/mqtt.rs rename to automation_lib/src/mqtt.rs diff --git a/src/devices/ntfy.rs b/automation_lib/src/ntfy.rs similarity index 97% rename from src/devices/ntfy.rs rename to automation_lib/src/ntfy.rs index d3ee42b..f337329 100644 --- a/src/devices/ntfy.rs +++ b/automation_lib/src/ntfy.rs @@ -1,14 +1,15 @@ use std::collections::HashMap; use std::convert::Infallible; +use std::ops::Deref; use async_trait::async_trait; +use automation_cast::Cast; use automation_macro::LuaDeviceConfig; use serde::Serialize; use serde_repr::*; use tracing::{error, trace, warn}; -use super::LuaDeviceCreate; -use crate::devices::Device; +use crate::device::{impl_device, Device, LuaDeviceCreate}; use crate::event::{self, Event, EventChannel, OnNotification, OnPresence}; #[derive(Debug, Serialize_repr, Clone, Copy)] @@ -125,6 +126,8 @@ pub struct Ntfy { config: Config, } +impl_device!(Ntfy); + #[async_trait] impl LuaDeviceCreate for Ntfy { type Config = Config; diff --git a/src/devices/presence.rs b/automation_lib/src/presence.rs similarity index 96% rename from src/devices/presence.rs rename to automation_lib/src/presence.rs index 21b8e55..de4fd6d 100644 --- a/src/devices/presence.rs +++ b/automation_lib/src/presence.rs @@ -1,15 +1,16 @@ use std::collections::HashMap; +use std::ops::Deref; use std::sync::Arc; use async_trait::async_trait; +use automation_cast::Cast; use automation_macro::LuaDeviceConfig; use rumqttc::Publish; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use tracing::{debug, trace, warn}; -use super::LuaDeviceCreate; use crate::config::MqttDeviceConfig; -use crate::devices::Device; +use crate::device::{impl_device, Device, LuaDeviceCreate}; use crate::event::{self, Event, EventChannel, OnMqtt}; use crate::messages::PresenceMessage; use crate::mqtt::WrappedAsyncClient; @@ -48,6 +49,8 @@ impl Presence { } } +impl_device!(Presence); + #[async_trait] impl LuaDeviceCreate for Presence { type Config = Config; diff --git a/src/schedule.rs b/automation_lib/src/schedule.rs similarity index 100% rename from src/schedule.rs rename to automation_lib/src/schedule.rs diff --git a/automation_macro/Cargo.toml b/automation_macro/Cargo.toml index 300f052..339abbd 100644 --- a/automation_macro/Cargo.toml +++ b/automation_macro/Cargo.toml @@ -7,14 +7,7 @@ edition = "2021" proc-macro = true [dependencies] -automation_cast = { path = "../automation_cast" } -async-trait = "0.1.80" -itertools = "0.12.1" -proc-macro2 = "1.0.81" -quote = "1.0.36" -serde = { version = "1.0.202", features = ["derive"] } -syn = { version = "2.0.60", features = ["extra-traits", "full"] } -serde_json = "1.0.118" - -[dev-dependencies] -serde = { version = "1.0.202", features = ["derive"] } +itertools = { workspace = true } +proc-macro2 = { workspace = true } +quote = { workspace = true } +syn = { workspace = true } diff --git a/google_home/google_home/Cargo.toml b/google_home/google_home/Cargo.toml index 346de26..8b66e4c 100644 --- a/google_home/google_home/Cargo.toml +++ b/google_home/google_home/Cargo.toml @@ -6,13 +6,12 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -automation_cast = { path = "../../automation_cast/" } -google_home_macro = { path = "../google_home_macro/" } -serde = { version = "1.0.149", features = ["derive"] } -serde_json = "1.0.89" -thiserror = "1.0.37" -tokio = { version = "1", features = ["sync", "full"] } -async-trait = "0.1.61" -futures = "0.3.25" -anyhow = "1.0.75" -json_value_merge = "2.0.0" +automation_cast = { workspace = true } +google_home_macro = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +async-trait = { workspace = true } +futures = { workspace = true } +json_value_merge = { workspace = true } diff --git a/google_home/google_home_macro/Cargo.toml b/google_home/google_home_macro/Cargo.toml index 977676d..60b8a15 100644 --- a/google_home/google_home_macro/Cargo.toml +++ b/google_home/google_home_macro/Cargo.toml @@ -7,6 +7,6 @@ edition = "2021" proc-macro = true [dependencies] -proc-macro2 = "1.0.81" -quote = "1.0.36" -syn = { version = "2.0.60", features = ["extra-traits", "full"] } +proc-macro2 = { workspace = true } +quote = { workspace = true } +syn = { workspace = true } diff --git a/src/main.rs b/src/main.rs index a865045..9fca469 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,15 @@ +mod web; + use std::path::Path; use std::process; use anyhow::anyhow; -use automation::auth::User; -use automation::config::{FulfillmentConfig, MqttConfig}; -use automation::device_manager::DeviceManager; -use automation::error::ApiError; -use automation::mqtt::{self, WrappedAsyncClient}; -use automation::{devices, helpers}; +use automation_lib::config::{FulfillmentConfig, MqttConfig}; +use automation_lib::device_manager::DeviceManager; +use automation_lib::helpers; +use automation_lib::mqtt::{self, WrappedAsyncClient}; +use automation_lib::ntfy::Ntfy; +use automation_lib::presence::Presence; use axum::extract::{FromRef, State}; use axum::http::StatusCode; use axum::routing::post; @@ -17,6 +19,7 @@ use google_home::{GoogleHome, Request, Response}; use mlua::LuaSerdeExt; use rumqttc::AsyncClient; use tracing::{debug, error, info, warn}; +use web::{ApiError, User}; #[derive(Clone)] struct AppState { @@ -111,8 +114,11 @@ async fn app() -> anyhow::Result<()> { lua.globals().set("automation", automation)?; - devices::register_with_lua(&lua)?; + automation_devices::register_with_lua(&lua)?; helpers::register_with_lua(&lua)?; + lua.globals().set("Ntfy", lua.create_proxy::()?)?; + lua.globals() + .set("Presence", lua.create_proxy::()?)?; // TODO: Make this not hardcoded let config_filename = std::env::var("AUTOMATION_CONFIG").unwrap_or("./config.lua".into()); diff --git a/src/auth.rs b/src/web.rs similarity index 52% rename from src/auth.rs rename to src/web.rs index 5703657..2dcb1ee 100644 --- a/src/auth.rs +++ b/src/web.rs @@ -1,10 +1,78 @@ +use std::result; + use axum::async_trait; use axum::extract::{FromRef, FromRequestParts}; use axum::http::request::Parts; +use axum::http::status::InvalidStatusCode; use axum::http::StatusCode; -use serde::Deserialize; +use axum::response::IntoResponse; +use serde::{Deserialize, Serialize}; +use thiserror::Error; -use crate::error::{ApiError, ApiErrorJson}; +#[derive(Debug, Error)] +#[error("{source}")] +pub struct ApiError { + status_code: axum::http::StatusCode, + source: Box, +} + +impl ApiError { + pub fn new(status_code: axum::http::StatusCode, source: Box) -> Self { + Self { + status_code, + source, + } + } +} + +impl From for ApiErrorJson { + fn from(value: ApiError) -> Self { + let error = ApiErrorJsonError { + code: value.status_code.as_u16(), + status: value.status_code.to_string(), + reason: value.source.to_string(), + }; + + Self { error } + } +} + +impl IntoResponse for ApiError { + fn into_response(self) -> axum::response::Response { + ( + self.status_code, + serde_json::to_string::(&self.into()) + .expect("Serialization should not fail"), + ) + .into_response() + } +} + +#[derive(Debug, Serialize, Deserialize)] +struct ApiErrorJsonError { + code: u16, + status: String, + reason: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ApiErrorJson { + error: ApiErrorJsonError, +} + +impl TryFrom for ApiError { + type Error = InvalidStatusCode; + + fn try_from(value: ApiErrorJson) -> result::Result { + let status_code = axum::http::StatusCode::from_u16(value.error.code)?; + let source = value.error.reason.into(); + + Ok(Self { + status_code, + source, + }) + } +} #[derive(Debug, Deserialize)] pub struct User {