diff --git a/Cargo.lock b/Cargo.lock index 7f5ab00..a51cd8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,7 +49,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -153,14 +153,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] name = "backtrace" -version = "0.3.72" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -185,9 +185,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" @@ -204,17 +204,26 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.0.98" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -234,7 +243,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -249,15 +258,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] @@ -274,9 +283,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -284,27 +293,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -447,7 +456,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.2.6", + "indexmap 2.4.0", "slab", "tokio", "tokio-util", @@ -521,9 +530,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -544,9 +553,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -556,9 +565,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -595,9 +604,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" dependencies = [ "bytes", "futures-channel", @@ -665,9 +674,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -698,9 +707,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -722,15 +731,15 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "lock_api" @@ -744,9 +753,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchers" @@ -765,9 +774,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -783,18 +792,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", @@ -858,9 +867,9 @@ dependencies = [ [[package]] name = "object" -version = "0.35.0" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -872,20 +881,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "openadr-rs" +name = "openadr-client" +version = "0.1.0" +dependencies = [ + "axum", + "chrono", + "http-body-util", + "openadr-wire", + "rangemap", + "reqwest", + "serde", + "serde_json", + "tokio", + "tower", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "openadr-vtn" version = "0.1.0" dependencies = [ - "async-trait", "axum", "axum-extra", "chrono", "http-body-util", - "iso8601-duration", "jsonwebtoken", "mime", - "quickcheck", - "rangemap", - "regex", + "openadr-wire", "reqwest", "serde", "serde_json", @@ -901,6 +925,21 @@ dependencies = [ "validator", ] +[[package]] +name = "openadr-wire" +version = "0.1.0" +dependencies = [ + "chrono", + "http", + "iso8601-duration", + "quickcheck", + "serde", + "serde_json", + "serde_with", + "thiserror", + "uuid", +] + [[package]] name = "openssl-probe" version = "0.1.5" @@ -933,7 +972,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -969,7 +1008,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -992,9 +1031,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-error" @@ -1022,9 +1064,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -1042,9 +1084,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" dependencies = [ "bytes", "pin-project-lite", @@ -1052,6 +1094,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", + "socket2", "thiserror", "tokio", "tracing", @@ -1059,9 +1102,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" dependencies = [ "bytes", "rand", @@ -1076,9 +1119,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" dependencies = [ "libc", "once_cell", @@ -1134,9 +1177,9 @@ checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ "bitflags", ] @@ -1149,8 +1192,8 @@ checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -1164,13 +1207,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] @@ -1181,9 +1224,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -1252,15 +1295,15 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustls" -version = "0.23.10" +version = "0.23.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" dependencies = [ "once_cell", "ring", @@ -1272,9 +1315,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "04182dffc9091a404e0fc069ea5cd60e5b866c3adf881eff99a32d048242dffa" dependencies = [ "openssl-probe", "rustls-pemfile", @@ -1285,9 +1328,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ "base64 0.22.1", "rustls-pki-types", @@ -1295,15 +1338,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" dependencies = [ "ring", "rustls-pki-types", @@ -1339,9 +1382,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", "core-foundation", @@ -1352,9 +1395,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -1377,7 +1420,7 @@ checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -1387,7 +1430,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de514ef58196f1fc96dcaef80fe6170a1ce6215df9687a93fe8300e773fefc5" dependencies = [ "form_urlencoded", - "indexmap 2.2.6", + "indexmap 2.4.0", "itoa", "ryu", "serde", @@ -1437,7 +1480,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.6", + "indexmap 2.4.0", "serde", "serde_derive", "serde_json", @@ -1454,7 +1497,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -1477,6 +1520,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1537,9 +1586,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -1553,9 +1602,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.66" +version = "2.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" dependencies = [ "proc-macro2", "quote", @@ -1591,7 +1640,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -1637,9 +1686,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -1652,9 +1701,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.2" +version = "1.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" dependencies = [ "backtrace", "bytes", @@ -1676,7 +1725,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -1738,15 +1787,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -1768,7 +1817,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -1896,7 +1945,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", ] [[package]] @@ -1907,9 +1956,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" @@ -1928,34 +1977,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -1965,9 +2015,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1975,28 +2025,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.75", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -2030,7 +2080,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2048,7 +2098,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2068,18 +2118,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -2090,9 +2140,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -2102,9 +2152,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -2114,15 +2164,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -2132,9 +2182,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -2144,9 +2194,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -2156,9 +2206,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -2168,9 +2218,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" @@ -2182,6 +2232,27 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.75", +] + [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index 47d7337..9bcf344 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,14 @@ -[package] -name = "openadr-rs" +[workspace] +members = [ + "openadr-vtn", + "openadr-client", + "openadr-wire" +] +exclude = [ ] + +resolver = "2" + +[workspace.package] version = "0.1.0" edition = "2021" rust-version = "1.76" # MSRV @@ -9,42 +18,37 @@ homepage = "https://github.com/tweedegolf/openadr-rs" publish = true description = "An OpenADR 3.0 VTN/VEN implementation" -[dependencies] -reqwest = { version = "0.12.4", default-features = false, features = ["http2", "charset", "rustls-tls-native-roots", "json"] } +[workspace.dependencies] +openadr-wire = { path = "openadr-wire" } +openadr-vtn = { path = "openadr-vtn" } +openadr-client = { path = "openadr-client" } + serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.117" serde_with = { version = "3.8.1", features = ["macros"] } -tokio = { version = "1.37.0", features = ["full"] } + +reqwest = { version = "0.12.4", default-features = false, features = ["http2", "charset", "rustls-tls-native-roots", "json"] } +tokio = { version = "1.37.0", features = ["full", "test-util"] } axum = { version = "0.7.5", features = ["macros"] } axum-extra = { version = "0.9.3", features = ["query", "typed-header"] } +tower = { version = "0.4", features = ["util"] } + tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } + +chrono = "0.4.38" +iso8601-duration = { version = "0.2.0", features = ["chrono"] } +rangemap = "1.5.1" + thiserror = "1.0.61" validator = {version = "0.18.1", features = ["derive"] } uuid = { version = "1.8.0", features = ["v4"] } -regex = "1.10.4" -chrono = "0.4.38" url = "2.5.0" +http = "^1.0.0" +mime = "0.3" tower-http = { version = "0.5.2" , features = ["trace"]} -iso8601-duration = { version = "0.2.0", features = ["chrono"] } -rangemap = "1.5.1" +http-body-util = "0.1.0" jsonwebtoken = "9.3.0" async-trait = "0.1.81" -tower = { version = "0.4", features = ["util"] } -http-body-util = "0.1.0" -[dev-dependencies] quickcheck = "1.0.3" -mime = "0.3" -tokio = { version = "1.37.0", features = ["full", "test-util"] } - -[lib] -name = "openadr" - -[[bin]] -name = "vtn" -path = "src/vtn/main.rs" - -[[bin]] -name = "openadr" -path = "src/cli/main.rs" diff --git a/src/generated/mod.rs b/generated/mod.rs similarity index 100% rename from src/generated/mod.rs rename to generated/mod.rs diff --git a/src/generated/models/mod.rs b/generated/models/mod.rs similarity index 100% rename from src/generated/models/mod.rs rename to generated/models/mod.rs diff --git a/src/generated/models/notification.rs b/generated/models/notification.rs similarity index 100% rename from src/generated/models/notification.rs rename to generated/models/notification.rs diff --git a/src/generated/models/notification_object.rs b/generated/models/notification_object.rs similarity index 100% rename from src/generated/models/notification_object.rs rename to generated/models/notification_object.rs diff --git a/src/generated/models/object_types.rs b/generated/models/object_types.rs similarity index 100% rename from src/generated/models/object_types.rs rename to generated/models/object_types.rs diff --git a/src/generated/models/point.rs b/generated/models/point.rs similarity index 100% rename from src/generated/models/point.rs rename to generated/models/point.rs diff --git a/src/generated/models/resource.rs b/generated/models/resource.rs similarity index 100% rename from src/generated/models/resource.rs rename to generated/models/resource.rs diff --git a/src/generated/models/subscription.rs b/generated/models/subscription.rs similarity index 100% rename from src/generated/models/subscription.rs rename to generated/models/subscription.rs diff --git a/src/generated/models/subscription_object_operations_inner.rs b/generated/models/subscription_object_operations_inner.rs similarity index 100% rename from src/generated/models/subscription_object_operations_inner.rs rename to generated/models/subscription_object_operations_inner.rs diff --git a/src/generated/models/ven.rs b/generated/models/ven.rs similarity index 100% rename from src/generated/models/ven.rs rename to generated/models/ven.rs diff --git a/openadr-client/Cargo.toml b/openadr-client/Cargo.toml new file mode 100644 index 0000000..138e65b --- /dev/null +++ b/openadr-client/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "openadr-client" +description = "openadr client" +readme = "README.md" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true +publish.workspace = true +rust-version.workspace = true + +[dependencies] +openadr-wire.workspace = true + +serde.workspace = true +serde_json.workspace = true + +reqwest.workspace = true +axum.workspace = true +tokio = { workspace = true, features = ["full"] } +tracing.workspace = true +http-body-util.workspace = true +tower.workspace = true + +url.workspace = true +chrono.workspace = true +rangemap.workspace = true +uuid.workspace = true + +[dev-dependencies] +tokio = { workspace = true, features = ["full", "test-util"] } diff --git a/src/cli/main.rs b/openadr-client/src/bin/cli.rs similarity index 93% rename from src/cli/main.rs rename to openadr-client/src/bin/cli.rs index 4ba3d5d..43dd7b9 100644 --- a/src/cli/main.rs +++ b/openadr-client/src/bin/cli.rs @@ -1,8 +1,9 @@ -use openadr::{ClientCredentials, ProgramContent, Target}; +use openadr_client::{ClientCredentials, Target}; +use openadr_wire::program::ProgramContent; #[tokio::main] async fn main() -> Result<(), Box> { - let client = openadr::Client::with_url( + let client = openadr_client::Client::with_url( "http://localhost:3000/".try_into()?, Some(ClientCredentials::new( "admin".to_string(), diff --git a/src/bin/everest.rs b/openadr-client/src/bin/everest.rs similarity index 95% rename from src/bin/everest.rs rename to openadr-client/src/bin/everest.rs index 8afc8b6..57ad718 100644 --- a/src/bin/everest.rs +++ b/openadr-client/src/bin/everest.rs @@ -1,11 +1,10 @@ use chrono::{DateTime, Utc}; -use openadr::{ - wire::{ - event::{EventType, EventValuesMap}, - values_map::Value, - }, - ClientRef, ProgramClient, Target, Timeline, +use openadr_wire::{ + event::{EventType, EventValuesMap}, + values_map::Value, }; + +use openadr_client::{ClientRef, ProgramClient, Target, Timeline}; use std::{error::Error, time::Duration}; use tokio::sync::mpsc::{Receiver, Sender}; use tokio::{select, sync::mpsc}; @@ -39,7 +38,7 @@ impl Clock for ChronoClock { #[tokio::main] async fn main() -> Result<(), Box> { - let client = openadr::Client::with_url("http://localhost:3000/".try_into()?, None); + let client = openadr_client::Client::with_url("http://localhost:3000/".try_into()?, None); let program = client.get_program(Target::Program("name")).await?; // channel used to send new timelines @@ -63,7 +62,7 @@ async fn poll_timeline( mut program: ProgramClient, poll_interval: std::time::Duration, sender: mpsc::Sender, -) -> Result<(), openadr::Error> { +) -> Result<(), openadr_client::Error> { loop { tokio::time::sleep(poll_interval).await; @@ -187,9 +186,9 @@ impl LimitsRes { #[cfg(test)] mod test { use super::*; - use openadr::wire::event::EventInterval; - use openadr::wire::interval::IntervalPeriod; - use openadr::{EventContent, ProgramContent, ProgramId}; + use openadr_wire::event::{EventContent, EventInterval}; + use openadr_wire::interval::IntervalPeriod; + use openadr_wire::program::{ProgramContent, ProgramId}; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; diff --git a/src/error.rs b/openadr-client/src/error.rs similarity index 84% rename from src/error.rs rename to openadr-client/src/error.rs index 282f77a..233d355 100644 --- a/src/error.rs +++ b/openadr-client/src/error.rs @@ -4,8 +4,8 @@ pub enum Error { Reqwest(reqwest::Error), Serde(serde_json::Error), UrlParseError(url::ParseError), - Problem(crate::wire::Problem), - AuthProblem(crate::wire::oauth::OAuthError), + Problem(openadr_wire::problem::Problem), + AuthProblem(openadr_wire::oauth::OAuthError), OAuthTokenNotBearer, ObjectNotFound, DuplicateObject, @@ -31,14 +31,14 @@ impl From for Error { } } -impl From for Error { - fn from(err: crate::wire::Problem) -> Self { +impl From for Error { + fn from(err: openadr_wire::problem::Problem) -> Self { Error::Problem(err) } } -impl From for Error { - fn from(err: crate::wire::oauth::OAuthError) -> Self { +impl From for Error { + fn from(err: openadr_wire::oauth::OAuthError) -> Self { Error::AuthProblem(err) } } diff --git a/src/client/event.rs b/openadr-client/src/event.rs similarity index 92% rename from src/client/event.rs rename to openadr-client/src/event.rs index abec247..b582de8 100644 --- a/src/client/event.rs +++ b/openadr-client/src/event.rs @@ -1,12 +1,13 @@ use std::sync::Arc; use crate::{ - client::ClientRef, - wire::{ - report::{ReportContent, ReportObjectType}, - Event, Report, - }, - EventContent, ReportClient, Result, + error::{Error, Result}, + ClientRef, ReportClient, +}; +use openadr_wire::{ + event::EventContent, + report::{ReportContent, ReportObjectType}, + Event, Report, }; #[derive(Debug)] @@ -23,7 +24,7 @@ impl EventClient { } } - pub fn id(&self) -> &crate::wire::event::EventId { + pub fn id(&self) -> &openadr_wire::event::EventId { &self.data.id } @@ -76,11 +77,11 @@ impl EventClient { /// Create a new report for the event pub async fn create_report(&self, report_data: ReportContent) -> Result> { if report_data.program_id != self.data().program_id { - return Err(crate::Error::InvalidParentObject); + return Err(Error::InvalidParentObject); } if &report_data.event_id != self.id() { - return Err(crate::Error::InvalidParentObject); + return Err(Error::InvalidParentObject); } let report = self.client.post("events", &report_data, &[]).await?; diff --git a/src/client/mod.rs b/openadr-client/src/lib.rs similarity index 97% rename from src/client/mod.rs rename to openadr-client/src/lib.rs index 446f6ed..b7ea25d 100644 --- a/src/client/mod.rs +++ b/openadr-client/src/lib.rs @@ -1,3 +1,4 @@ +mod error; mod event; mod program; mod report; @@ -17,18 +18,20 @@ use http_body_util::BodyExt; use tower::{Service, ServiceExt}; use url::Url; +pub use error::*; pub use event::*; pub use program::*; pub use report::*; pub use target::*; pub use timeline::*; -pub use crate::wire::{ +use crate::error::Result; +pub(crate) use openadr_wire::{ event::EventContent, program::{ProgramContent, ProgramId}, + target::TargetLabel, + Program, }; -use crate::wire::{target::TargetLabel, Program}; -use crate::Result; /// Client used for interaction with a VTN. /// @@ -120,7 +123,7 @@ impl ReqwestClientRef { let since = Instant::now(); let res = request.send().await?; if !res.status().is_success() { - let problem = res.json::().await?; + let problem = res.json::().await?; return Err(crate::Error::AuthProblem(problem)); } @@ -213,8 +216,8 @@ impl ReqwestClientRef { // handle any errors returned by the server if !res.status().is_success() { - let problem = res.json::().await?; - return Err(crate::Error::from(problem)); + let problem = res.json::().await?; + return Err(crate::error::Error::from(problem)); } Ok(res.json().await?) @@ -506,7 +509,7 @@ impl Client { pub async fn get_program_by_id(&self, id: &ProgramId) -> Result> { let program = self .client_ref - .get(&format!("programs/{}", id.0), &[]) + .get(&format!("programs/{}", id.as_str()), &[]) .await?; Ok(ProgramClient::from_program( diff --git a/src/client/program.rs b/openadr-client/src/program.rs similarity index 96% rename from src/client/program.rs rename to openadr-client/src/program.rs index d6c9574..35a82fe 100644 --- a/src/client/program.rs +++ b/openadr-client/src/program.rs @@ -1,13 +1,14 @@ use std::sync::Arc; +use openadr_wire::{ + event::{EventObjectType, Priority}, + target::TargetLabel, + Event, Program, +}; + use crate::{ - client::ClientRef, - wire::{ - event::{EventObjectType, Priority}, - target::TargetLabel, - Event, Program, - }, - Error, EventClient, EventContent, ProgramContent, ProgramId, Result, Target, Timeline, + error::{Error, Result}, + ClientRef, EventClient, EventContent, ProgramContent, ProgramId, Target, Timeline, }; /// A client for interacting with the data in a specific program and the events diff --git a/src/client/report.rs b/openadr-client/src/report.rs similarity index 88% rename from src/client/report.rs rename to openadr-client/src/report.rs index 26b11d5..e2e38ca 100644 --- a/src/client/report.rs +++ b/openadr-client/src/report.rs @@ -1,10 +1,9 @@ use std::sync::Arc; -use crate::{ - client::ClientRef, - wire::{report::ReportContent, Report}, - Result, -}; +use openadr_wire::{report::ReportContent, Report}; + +use crate::error::Result; +use crate::ClientRef; #[derive(Debug)] pub struct ReportClient { @@ -20,7 +19,7 @@ impl ReportClient { } } - pub fn id(&self) -> &crate::wire::report::ReportId { + pub fn id(&self) -> &openadr_wire::report::ReportId { &self.data.id } diff --git a/src/client/target.rs b/openadr-client/src/target.rs similarity index 98% rename from src/client/target.rs rename to openadr-client/src/target.rs index 6899afb..de8efe1 100644 --- a/src/client/target.rs +++ b/openadr-client/src/target.rs @@ -1,4 +1,4 @@ -use crate::wire::target::TargetLabel; +use openadr_wire::target::TargetLabel; /// Target for a query to the VTN #[derive(Copy, Clone, Debug)] diff --git a/src/client/timeline.rs b/openadr-client/src/timeline.rs similarity index 92% rename from src/client/timeline.rs rename to openadr-client/src/timeline.rs index f6f2d7d..bd135b5 100644 --- a/src/client/timeline.rs +++ b/openadr-client/src/timeline.rs @@ -4,12 +4,10 @@ use std::{collections::HashSet, ops::Range}; use chrono::{DateTime, Utc}; use tracing::warn; -use crate::{ - wire::{ - event::{EventValuesMap, Priority}, - interval::IntervalPeriod, - }, - EventContent, ProgramContent, +use openadr_wire::{ + event::{EventContent, EventValuesMap, Priority}, + interval::IntervalPeriod, + program::ProgramContent, }; #[derive(Debug, Clone, PartialEq, Eq)] @@ -167,15 +165,12 @@ mod test { use chrono::{DateTime, Duration, Utc}; - use crate::{ - wire::{event::EventInterval, values_map::Value}, - ProgramId, - }; + use openadr_wire::{event::EventInterval, program::ProgramId, values_map::Value}; use super::*; fn test_program_id() -> ProgramId { - ProgramId("test-program-id".parse().unwrap()) + ProgramId::new("test-program-id").unwrap() } fn test_event_content(range: Range, value: i64) -> EventContent { @@ -190,11 +185,13 @@ mod test { id: range.start as _, interval_period: Some(IntervalPeriod { start: DateTime::UNIX_EPOCH + Duration::hours(range.start.into()), - duration: Some(crate::wire::Duration::hours((range.end - range.start) as _)), + duration: Some(openadr_wire::Duration::hours( + (range.end - range.start) as _, + )), randomize_start: None, }), payloads: vec![EventValuesMap { - value_type: crate::wire::event::EventType::Price, + value_type: openadr_wire::event::EventType::Price, values: vec![Value::Integer(value)], }], } @@ -215,7 +212,7 @@ mod test { id, randomize_start: None, value_map: vec![EventValuesMap { - value_type: crate::wire::event::EventType::Price, + value_type: openadr_wire::event::EventType::Price, values: vec![Value::Integer(value)], }], priority, @@ -319,13 +316,13 @@ mod test { id: range.start as _, interval_period: Some(IntervalPeriod { start: DateTime::UNIX_EPOCH + Duration::hours(range.start.into()), - duration: Some(crate::wire::Duration::hours( + duration: Some(openadr_wire::Duration::hours( (range.end - range.start) as _, )), - randomize_start: Some(crate::wire::Duration::hours(5.0)), + randomize_start: Some(openadr_wire::Duration::hours(5.0)), }), payloads: vec![EventValuesMap { - value_type: crate::wire::event::EventType::Price, + value_type: openadr_wire::event::EventType::Price, values: vec![Value::Integer(value)], }], }], @@ -339,21 +336,21 @@ mod test { Interval { randomize_start: Some(Duration::hours(5)), value_map: &[EventValuesMap { - value_type: crate::wire::event::EventType::Price, + value_type: openadr_wire::event::EventType::Price, values: vec![Value::Integer(43)], }], }, Interval { randomize_start: None, value_map: &[EventValuesMap { - value_type: crate::wire::event::EventType::Price, + value_type: openadr_wire::event::EventType::Price, values: vec![Value::Integer(42)], }], }, Interval { randomize_start: None, value_map: &[EventValuesMap { - value_type: crate::wire::event::EventType::Price, + value_type: openadr_wire::event::EventType::Price, values: vec![Value::Integer(43)], }], }, diff --git a/openadr-vtn/Cargo.toml b/openadr-vtn/Cargo.toml new file mode 100644 index 0000000..2180cfe --- /dev/null +++ b/openadr-vtn/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "openadr-vtn" +description = "openadr VTN server" +readme = "README.md" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true +publish.workspace = true +rust-version.workspace = true + +[dependencies] +openadr-wire.workspace = true + +serde.workspace = true +serde_json.workspace = true +serde_with.workspace = true + +reqwest.workspace = true +axum.workspace = true +axum-extra.workspace = true +tokio = { workspace = true, features = ["full"] } +tower-http.workspace = true +tower.workspace = true + +tracing.workspace = true +tracing-subscriber.workspace = true + +url.workspace = true +uuid.workspace = true +jsonwebtoken.workspace = true +validator.workspace = true +mime.workspace = true +http-body-util.workspace = true + +chrono.workspace = true +thiserror.workspace = true + +[dev-dependencies] +tokio = { workspace = true, features = ["full", "test-util"] } diff --git a/src/vtn/api/auth.rs b/openadr-vtn/src/api/auth.rs similarity index 98% rename from src/vtn/api/auth.rs rename to openadr-vtn/src/api/auth.rs index 1ae8040..c0a212e 100644 --- a/src/vtn/api/auth.rs +++ b/openadr-vtn/src/api/auth.rs @@ -11,7 +11,7 @@ use axum_extra::{ headers::{authorization::Basic, Authorization}, TypedHeader, }; -use openadr::wire::oauth::{OAuthError, OAuthErrorType}; +use openadr_wire::oauth::{OAuthError, OAuthErrorType}; use reqwest::header; use crate::data_source::AuthSource; diff --git a/src/vtn/api/event.rs b/openadr-vtn/src/api/event.rs similarity index 98% rename from src/vtn/api/event.rs rename to openadr-vtn/src/api/event.rs index 92a65e9..6b4eb3b 100644 --- a/src/vtn/api/event.rs +++ b/openadr-vtn/src/api/event.rs @@ -10,11 +10,11 @@ use tokio::sync::RwLock; use tracing::{info, trace}; use validator::Validate; -use openadr::wire::event::EventContent; -use openadr::wire::event::EventId; -use openadr::wire::program::ProgramId; -use openadr::wire::target::TargetLabel; -use openadr::wire::Event; +use openadr_wire::event::EventContent; +use openadr_wire::event::EventId; +use openadr_wire::program::ProgramId; +use openadr_wire::target::TargetLabel; +use openadr_wire::Event; use crate::api::{AppResponse, ValidatedQuery}; use crate::data_source::{Crud, EventCrud}; @@ -186,8 +186,7 @@ mod test { Router, }; use http_body_util::BodyExt; - use openadr::wire::event::Priority; - // for `collect` + use openadr_wire::event::Priority; // for `collect` use tower::{Service, ServiceExt}; // for `call`, `oneshot`, and `ready` fn default_content() -> EventContent { diff --git a/src/vtn/api/mod.rs b/openadr-vtn/src/api/mod.rs similarity index 100% rename from src/vtn/api/mod.rs rename to openadr-vtn/src/api/mod.rs diff --git a/src/vtn/api/program.rs b/openadr-vtn/src/api/program.rs similarity index 99% rename from src/vtn/api/program.rs rename to openadr-vtn/src/api/program.rs index 06637c9..6ccd36b 100644 --- a/src/vtn/api/program.rs +++ b/openadr-vtn/src/api/program.rs @@ -10,9 +10,9 @@ use tokio::sync::RwLock; use tracing::{info, trace, warn}; use validator::Validate; -use openadr::wire::program::{ProgramContent, ProgramId}; -use openadr::wire::target::TargetLabel; -use openadr::wire::Program; +use openadr_wire::program::{ProgramContent, ProgramId}; +use openadr_wire::target::TargetLabel; +use openadr_wire::Program; use crate::api::{AppResponse, ValidatedQuery}; use crate::data_source::{Crud, ProgramCrud}; diff --git a/src/vtn/api/report.rs b/openadr-vtn/src/api/report.rs similarity index 97% rename from src/vtn/api/report.rs rename to openadr-vtn/src/api/report.rs index e731ab2..e69af1a 100644 --- a/src/vtn/api/report.rs +++ b/openadr-vtn/src/api/report.rs @@ -11,10 +11,10 @@ use tokio::sync::RwLock; use tracing::{info, trace}; use validator::Validate; -use openadr::wire::event::EventId; -use openadr::wire::program::ProgramId; -use openadr::wire::report::{ReportContent, ReportId}; -use openadr::wire::Report; +use openadr_wire::event::EventId; +use openadr_wire::program::ProgramId; +use openadr_wire::report::{ReportContent, ReportId}; +use openadr_wire::Report; use crate::api::{AppResponse, ValidatedQuery}; use crate::data_source::{Crud, ReportCrud}; diff --git a/src/vtn/data_source/mod.rs b/openadr-vtn/src/data_source/mod.rs similarity index 92% rename from src/vtn/data_source/mod.rs rename to openadr-vtn/src/data_source/mod.rs index a166c74..fdbb794 100644 --- a/src/vtn/data_source/mod.rs +++ b/openadr-vtn/src/data_source/mod.rs @@ -1,13 +1,11 @@ use std::{collections::HashMap, sync::Arc}; use axum::async_trait; -use openadr::{ - wire::{ - event::EventId, - report::{ReportContent, ReportId}, - Event, Program, Report, - }, - EventContent, ProgramContent, ProgramId, +use openadr_wire::{ + event::{EventContent, EventId}, + program::{ProgramContent, ProgramId}, + report::{ReportContent, ReportId}, + Event, Program, Report, }; use thiserror::Error; use tokio::sync::RwLock; @@ -87,7 +85,7 @@ pub struct AuthInfo { } #[derive(Default, Clone)] -pub(crate) struct InMemoryStorage { +pub struct InMemoryStorage { pub programs: Arc>>, pub reports: Arc>>, pub events: Arc>>, diff --git a/src/vtn/error.rs b/openadr-vtn/src/error.rs similarity index 91% rename from src/vtn/error.rs rename to openadr-vtn/src/error.rs index 2ad725b..264ce43 100644 --- a/src/vtn/error.rs +++ b/openadr-vtn/src/error.rs @@ -1,8 +1,10 @@ use axum::extract::rejection::JsonRejection; use axum::http::StatusCode; use axum::response::{IntoResponse, Response}; +use axum::Json; use axum_extra::extract::QueryRejection; -use openadr::wire::Problem; +use openadr_wire::problem::Problem; +use serde::{Deserialize, Serialize}; use tracing::{error, trace, warn}; use uuid::Uuid; @@ -26,8 +28,8 @@ pub enum AppError { Auth(String), } -impl IntoResponse for AppError { - fn into_response(self) -> Response { +impl AppError { + fn into_problem(self) -> Problem { let reference = Uuid::new_v4(); match self { @@ -132,6 +134,21 @@ impl IntoResponse for AppError { } } } - .into_response() + } +} + +impl IntoResponse for AppError { + fn into_response(self) -> Response { + let problem = self.into_problem(); + (problem.status, Json(problem)).into_response() + } +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +pub struct ProblemUri(String); + +impl Default for ProblemUri { + fn default() -> Self { + Self("about:blank".to_string()) } } diff --git a/src/vtn/jwt.rs b/openadr-vtn/src/jwt.rs similarity index 100% rename from src/vtn/jwt.rs rename to openadr-vtn/src/jwt.rs diff --git a/openadr-vtn/src/lib.rs b/openadr-vtn/src/lib.rs new file mode 100644 index 0000000..1105340 --- /dev/null +++ b/openadr-vtn/src/lib.rs @@ -0,0 +1,5 @@ +pub mod api; +pub mod data_source; +mod error; +pub mod jwt; +pub mod state; diff --git a/src/vtn/main.rs b/openadr-vtn/src/main.rs similarity index 54% rename from src/vtn/main.rs rename to openadr-vtn/src/main.rs index b0ba9e7..5caa844 100644 --- a/src/vtn/main.rs +++ b/openadr-vtn/src/main.rs @@ -1,26 +1,13 @@ -use axum::routing::{get, post}; -use axum::Router; -use data_source::{AuthInfo, InMemoryStorage}; -use jwt::{AuthRole, JwtManager}; use tokio::net::TcpListener; use tokio::signal; -use tower_http::trace::TraceLayer; use tracing::{error, info}; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; use tracing_subscriber::{fmt, EnvFilter}; -use api::program; -use api::report; -use api::{auth, event}; - -use crate::state::AppState; - -mod api; -mod data_source; -mod error; -mod jwt; -mod state; +use openadr_vtn::data_source::{AuthInfo, InMemoryStorage}; +use openadr_vtn::jwt::{AuthRole, JwtManager}; +use openadr_vtn::state::AppState; #[tokio::main] async fn main() { @@ -50,34 +37,6 @@ async fn main() { } } -impl AppState { - fn router_without_state() -> axum::Router { - axum::Router::new() - .route("/programs", get(program::get_all).post(program::add)) - .route( - "/programs/:id", - get(program::get).put(program::edit).delete(program::delete), - ) - .route("/reports", get(report::get_all).post(report::add)) - .route( - "/reports/:id", - get(report::get).put(report::edit).delete(report::delete), - ) - .route("/events", get(event::get_all).post(event::add)) - .route( - "/events/:id", - get(event::get).put(event::edit).delete(event::delete), - ) - .route("/auth/register", post(auth::register)) - .route("/auth/token", post(auth::token)) - .layer(TraceLayer::new_for_http()) - } - - pub fn into_router(self) -> Router { - Self::router_without_state().with_state(self) - } -} - async fn shutdown_signal() { let ctrl_c = async { signal::ctrl_c() diff --git a/openadr-vtn/src/state.rs b/openadr-vtn/src/state.rs new file mode 100644 index 0000000..8bb12f2 --- /dev/null +++ b/openadr-vtn/src/state.rs @@ -0,0 +1,77 @@ +use axum::extract::FromRef; +use std::sync::Arc; + +use crate::data_source::{AuthSource, DataSource, EventCrud, ProgramCrud, ReportCrud}; +use crate::jwt::JwtManager; + +#[derive(Clone, FromRef)] +pub struct AppState { + pub storage: Arc, + pub jwt_manager: Arc, +} + +impl AppState { + pub fn new(storage: S, jwt_manager: JwtManager) -> Self { + Self { + storage: Arc::new(storage), + jwt_manager: Arc::new(jwt_manager), + } + } + + fn router_without_state() -> axum::Router { + use axum::routing::{get, post}; + use tower_http::trace::TraceLayer; + + use crate::api::program; + use crate::api::report; + use crate::api::{auth, event}; + + axum::Router::new() + .route("/programs", get(program::get_all).post(program::add)) + .route( + "/programs/:id", + get(program::get).put(program::edit).delete(program::delete), + ) + .route("/reports", get(report::get_all).post(report::add)) + .route( + "/reports/:id", + get(report::get).put(report::edit).delete(report::delete), + ) + .route("/events", get(event::get_all).post(event::add)) + .route( + "/events/:id", + get(event::get).put(event::edit).delete(event::delete), + ) + .route("/auth/register", post(auth::register)) + .route("/auth/token", post(auth::token)) + .layer(TraceLayer::new_for_http()) + } + + pub fn into_router(self) -> axum::Router { + Self::router_without_state().with_state(self) + } +} + +impl FromRef for Arc { + fn from_ref(state: &AppState) -> Arc { + state.storage.auth() + } +} + +impl FromRef for Arc { + fn from_ref(state: &AppState) -> Arc { + state.storage.programs() + } +} + +impl FromRef for Arc { + fn from_ref(state: &AppState) -> Arc { + state.storage.events() + } +} + +impl FromRef for Arc { + fn from_ref(state: &AppState) -> Arc { + state.storage.reports() + } +} diff --git a/openadr-wire/Cargo.toml b/openadr-wire/Cargo.toml new file mode 100644 index 0000000..f8dd2cc --- /dev/null +++ b/openadr-wire/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "openadr-wire" +description = "encode and decode openadr messages that go over the wire" +readme = "README.md" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true +publish.workspace = true +rust-version.workspace = true + +[dependencies] +serde.workspace = true +chrono.workspace = true +serde_with.workspace = true +uuid.workspace = true +iso8601-duration.workspace = true +thiserror.workspace = true +http.workspace = true + +[dev-dependencies] +serde_json.workspace = true +quickcheck.workspace = true diff --git a/src/wire/event.rs b/openadr-wire/src/event.rs similarity index 96% rename from src/wire/event.rs rename to openadr-wire/src/event.rs index 963cbd5..7dff800 100644 --- a/src/wire/event.rs +++ b/openadr-wire/src/event.rs @@ -6,12 +6,12 @@ use serde_with::skip_serializing_none; use std::fmt::{Display, Formatter}; use uuid::Uuid; -use crate::wire::interval::IntervalPeriod; -use crate::wire::program::ProgramId; -use crate::wire::report::ReportDescriptor; -use crate::wire::target::TargetMap; -use crate::wire::values_map::Value; -use crate::wire::{Identifier, Unit}; +use crate::interval::IntervalPeriod; +use crate::program::ProgramId; +use crate::report::ReportDescriptor; +use crate::target::TargetMap; +use crate::values_map::Value; +use crate::{Identifier, Unit}; /// Event object to communicate a Demand Response request to VEN. If intervalPeriod is present, sets /// start time and duration of intervals. @@ -21,10 +21,10 @@ pub struct Event { /// URL safe VTN assigned object ID. pub id: EventId, /// datetime in ISO 8601 format - #[serde(with = "crate::wire::serde_rfc3339")] + #[serde(with = "crate::serde_rfc3339")] pub created_date_time: DateTime, /// datetime in ISO 8601 format - #[serde(with = "crate::wire::serde_rfc3339")] + #[serde(with = "crate::serde_rfc3339")] pub modification_date_time: DateTime, #[serde(flatten)] pub content: EventContent, @@ -300,15 +300,14 @@ pub enum EventType { CTA2045SetOverrideStatus, #[serde(untagged)] Private( - #[serde(deserialize_with = "crate::wire::string_within_range_inclusive::<1, 128, _>")] - String, + #[serde(deserialize_with = "crate::string_within_range_inclusive::<1, 128, _>")] String, ), } #[cfg(test)] mod tests { - use crate::wire::values_map::Value; - use crate::wire::Duration; + use crate::values_map::Value; + use crate::Duration; use super::*; diff --git a/src/wire/interval.rs b/openadr-wire/src/interval.rs similarity index 93% rename from src/wire/interval.rs rename to openadr-wire/src/interval.rs index 36afb7b..25a6757 100644 --- a/src/wire/interval.rs +++ b/openadr-wire/src/interval.rs @@ -3,8 +3,8 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -use crate::wire::values_map::ValuesMap; -use crate::wire::Duration; +use crate::values_map::ValuesMap; +use crate::Duration; /// An object defining a temporal window and a list of valuesMaps. if intervalPeriod present may set /// temporal aspects of interval or override event.intervalPeriod. @@ -36,7 +36,7 @@ impl Interval { #[serde(rename_all = "camelCase")] pub struct IntervalPeriod { /// The start time of an interval or set of intervals. - #[serde(with = "crate::wire::serde_rfc3339")] + #[serde(with = "crate::serde_rfc3339")] pub start: DateTime, /// The duration of an interval or set of intervals. #[serde(skip_serializing_if = "Option::is_none")] diff --git a/src/wire/mod.rs b/openadr-wire/src/lib.rs similarity index 99% rename from src/wire/mod.rs rename to openadr-wire/src/lib.rs index d7c5cbc..8bf2726 100644 --- a/src/wire/mod.rs +++ b/openadr-wire/src/lib.rs @@ -10,14 +10,13 @@ use serde::de::Unexpected; use serde::{Deserialize, Deserializer, Serialize, Serializer}; pub use event::Event; -pub use problem::Problem; pub use program::Program; pub use report::Report; pub mod event; pub mod interval; pub mod oauth; -mod problem; +pub mod problem; pub mod program; pub mod report; pub mod target; @@ -323,7 +322,7 @@ pub enum Unit { #[cfg(test)] mod tests { - use crate::wire::{Attribute, DataQuality, Identifier, OperatingState, Unit}; + use crate::{Attribute, DataQuality, Identifier, OperatingState, Unit}; #[test] fn test_operating_state_serialization() { diff --git a/src/wire/oauth.rs b/openadr-wire/src/oauth.rs similarity index 100% rename from src/wire/oauth.rs rename to openadr-wire/src/oauth.rs diff --git a/src/wire/problem.rs b/openadr-wire/src/problem.rs similarity index 62% rename from src/wire/problem.rs rename to openadr-wire/src/problem.rs index 320f970..7fc0f7b 100644 --- a/src/wire/problem.rs +++ b/openadr-wire/src/problem.rs @@ -1,16 +1,4 @@ -/* - * OpenADR 3 API - * - * The OpenADR 3 API supports energy retailer to energy customer Demand Response programs. The API includes the following capabilities and operations: __Manage programs:__ * Create/Update/Delete a program * Search programs __Manage events:__ * Create/Update/Delete an event * Search events __Manage reports:__ * Create/Update/Delete a report * Search reports __Manage subscriptions:__ * Create/Update/Delete subscriptions to programs, events, and reports * Search subscriptions * Subscriptions allows clients to register a callback URL (webhook) to be notified on the change of state of a resource __Manage vens:__ * Create/Update/Delete vens and ven resources * Search ven and ven resources __Manage tokens:__ * Obtain an access token * This endpoint is provided as a convenience and may be neglected in a commercial implementation - * - * The version of the OpenAPI document: 3.0.1 - * Contact: frank@pajaritotech.com - * Generated by: https://openapi-generator.tech - */ - -use axum::response::{IntoResponse, Response}; -use axum::Json; -use reqwest::StatusCode; +use http::StatusCode; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; @@ -49,9 +37,10 @@ pub struct Problem { } mod status_code_serialization { - use reqwest::StatusCode; + use super::*; + use serde::de::Unexpected; - use serde::{Deserialize, Deserializer, Serializer}; + use serde::{Deserializer, Serializer}; pub fn serialize(code: &StatusCode, serializer: S) -> Result where @@ -74,9 +63,3 @@ mod status_code_serialization { }) } } - -impl IntoResponse for Problem { - fn into_response(self) -> Response { - (self.status, Json(self)).into_response() - } -} diff --git a/src/wire/program.rs b/openadr-wire/src/program.rs similarity index 95% rename from src/wire/program.rs rename to openadr-wire/src/program.rs index 0f80ebc..c23240d 100644 --- a/src/wire/program.rs +++ b/openadr-wire/src/program.rs @@ -7,11 +7,11 @@ use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; use uuid::Uuid; -use crate::wire::event::EventPayloadDescriptor; -use crate::wire::interval::IntervalPeriod; -use crate::wire::report::ReportPayloadDescriptor; -use crate::wire::target::TargetMap; -use crate::wire::Duration; +use crate::event::EventPayloadDescriptor; +use crate::interval::IntervalPeriod; +use crate::report::ReportPayloadDescriptor; +use crate::target::TargetMap; +use crate::Duration; use super::Identifier; @@ -29,13 +29,13 @@ pub struct Program { /// VTN provisioned on object creation. /// /// datetime in ISO 8601 format - #[serde(with = "crate::wire::serde_rfc3339")] + #[serde(with = "crate::serde_rfc3339")] pub created_date_time: DateTime, /// VTN provisioned on object modification. /// /// datetime in ISO 8601 format - #[serde(with = "crate::wire::serde_rfc3339")] + #[serde(with = "crate::serde_rfc3339")] pub modification_date_time: DateTime, #[serde(flatten)] @@ -63,7 +63,7 @@ pub struct ProgramContent { // TODO: Maybe remove this? It is more part of the enum containing this pub object_type: Option, /// Short name to uniquely identify program. - #[serde(deserialize_with = "crate::wire::string_within_range_inclusive::<1, 128, _>")] + #[serde(deserialize_with = "crate::string_within_range_inclusive::<1, 128, _>")] pub program_name: String, /// Long name of program for human readability. pub program_long_name: Option, diff --git a/src/wire/report.rs b/openadr-wire/src/report.rs similarity index 95% rename from src/wire/report.rs rename to openadr-wire/src/report.rs index fd05892..f6782a7 100644 --- a/src/wire/report.rs +++ b/openadr-wire/src/report.rs @@ -6,12 +6,12 @@ use serde_with::skip_serializing_none; use std::fmt::{Display, Formatter}; use uuid::Uuid; -use crate::wire::event::EventId; -use crate::wire::interval::{Interval, IntervalPeriod}; -use crate::wire::program::ProgramId; -use crate::wire::target::TargetMap; -use crate::wire::values_map::Value; -use crate::wire::{Identifier, Unit}; +use crate::event::EventId; +use crate::interval::{Interval, IntervalPeriod}; +use crate::program::ProgramId; +use crate::target::TargetMap; +use crate::values_map::Value; +use crate::{Identifier, Unit}; /// report object. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -20,10 +20,10 @@ pub struct Report { /// URL safe VTN assigned object ID. pub id: ReportId, /// datetime in ISO 8601 format - #[serde(with = "crate::wire::serde_rfc3339")] + #[serde(with = "crate::serde_rfc3339")] pub created_date_time: DateTime, /// datetime in ISO 8601 format - #[serde(with = "crate::wire::serde_rfc3339")] + #[serde(with = "crate::serde_rfc3339")] pub modification_date_time: DateTime, #[serde(flatten)] pub content: ReportContent, @@ -43,7 +43,7 @@ pub struct ReportContent { #[serde(rename = "eventID")] pub event_id: EventId, /// User generated identifier; may be VEN ID provisioned during program enrollment. - #[serde(deserialize_with = "crate::wire::string_within_range_inclusive::<1, 128, _>")] + #[serde(deserialize_with = "crate::string_within_range_inclusive::<1, 128, _>")] pub client_name: String, /// User defined string for use in debugging or User Interface. pub report_name: Option, @@ -286,8 +286,8 @@ pub struct ReportValuesMap { #[cfg(test)] mod tests { - use crate::wire::values_map::{Value, ValueType, ValuesMap}; - use crate::wire::Duration; + use crate::values_map::{Value, ValueType, ValuesMap}; + use crate::Duration; use super::*; @@ -345,8 +345,7 @@ mod tests { #[test] fn descriptor_parses_minimal() { let json = r#"{"payloadType":"hello"}"#; - let expected = - ReportDescriptor::new(crate::wire::report::ReportType::Private("hello".into())); + let expected = ReportDescriptor::new(crate::report::ReportType::Private("hello".into())); assert_eq!( serde_json::from_str::(json).unwrap(), @@ -506,8 +505,7 @@ pub enum ReportType { ExportReservationFee, #[serde(untagged)] Private( - #[serde(deserialize_with = "crate::wire::string_within_range_inclusive::<1, 128, _>")] - String, + #[serde(deserialize_with = "crate::string_within_range_inclusive::<1, 128, _>")] String, ), } @@ -538,7 +536,6 @@ pub enum ResourceName { AggregatedReport, #[serde(untagged)] Private( - #[serde(deserialize_with = "crate::wire::string_within_range_inclusive::<1, 128, _>")] - String, + #[serde(deserialize_with = "crate::string_within_range_inclusive::<1, 128, _>")] String, ), } diff --git a/src/wire/target.rs b/openadr-wire/src/target.rs similarity index 100% rename from src/wire/target.rs rename to openadr-wire/src/target.rs diff --git a/src/wire/values_map.rs b/openadr-wire/src/values_map.rs similarity index 93% rename from src/wire/values_map.rs rename to openadr-wire/src/values_map.rs index 115b8ea..4c67bef 100644 --- a/src/wire/values_map.rs +++ b/openadr-wire/src/values_map.rs @@ -15,8 +15,7 @@ pub struct ValuesMap { #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct ValueType( - #[serde(deserialize_with = "crate::wire::string_within_range_inclusive::<1, 128, _>")] - pub String, + #[serde(deserialize_with = "crate::string_within_range_inclusive::<1, 128, _>")] pub String, ); #[derive(Clone, Debug, Serialize, Deserialize)] diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index cc6a5b7..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -#![doc=include_str!("../README.md")] - -mod client; -mod error; -mod generated; -pub mod wire; - -pub use client::*; -pub use error::*; diff --git a/src/vtn/state.rs b/src/vtn/state.rs deleted file mode 100644 index 617ca57..0000000 --- a/src/vtn/state.rs +++ /dev/null @@ -1,44 +0,0 @@ -use axum::extract::FromRef; -use std::sync::Arc; - -use crate::data_source::{AuthSource, DataSource, EventCrud, ProgramCrud, ReportCrud}; -use crate::jwt::JwtManager; - -#[derive(Clone, FromRef)] -pub struct AppState { - pub storage: Arc, - pub jwt_manager: Arc, -} - -impl AppState { - pub fn new(storage: S, jwt_manager: JwtManager) -> Self { - Self { - storage: Arc::new(storage), - jwt_manager: Arc::new(jwt_manager), - } - } -} - -impl FromRef for Arc { - fn from_ref(state: &AppState) -> Arc { - state.storage.auth() - } -} - -impl FromRef for Arc { - fn from_ref(state: &AppState) -> Arc { - state.storage.programs() - } -} - -impl FromRef for Arc { - fn from_ref(state: &AppState) -> Arc { - state.storage.events() - } -} - -impl FromRef for Arc { - fn from_ref(state: &AppState) -> Arc { - state.storage.reports() - } -}