Make client immutable to allow for async WASM

This commit is contained in:
NGnius (Graham) 2023-06-28 22:20:45 -04:00
parent 7aaa4ff88c
commit 4a00284a85
10 changed files with 275 additions and 240 deletions

317
Cargo.lock generated
View file

@ -3,10 +3,25 @@
version = 3
[[package]]
name = "anyhow"
version = "1.0.70"
name = "addr2line"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "anyhow"
version = "1.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
[[package]]
name = "async-trait"
@ -16,7 +31,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.15",
"syn 2.0.22",
]
[[package]]
@ -25,6 +40,21 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "backtrace"
version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "beef"
version = "0.5.2"
@ -69,7 +99,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
"windows-sys 0.48.0",
"windows-sys",
]
[[package]]
@ -103,6 +133,12 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "gimli"
version = "0.27.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
[[package]]
name = "hashbrown"
version = "0.12.3"
@ -151,13 +187,13 @@ dependencies = [
[[package]]
name = "io-lifetimes"
version = "1.0.10"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
"hermit-abi 0.3.1",
"libc",
"windows-sys 0.48.0",
"windows-sys",
]
[[package]]
@ -177,21 +213,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.141"
version = "0.2.147"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
[[package]]
name = "linux-raw-sys"
version = "0.3.1"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f"
checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "lock_api"
version = "0.4.9"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
dependencies = [
"autocfg",
"scopeguard",
@ -199,12 +235,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.17"
version = "0.4.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
[[package]]
name = "logos"
@ -225,8 +258,8 @@ dependencies = [
"fnv",
"proc-macro2",
"quote",
"regex-syntax",
"syn 2.0.15",
"regex-syntax 0.6.29",
"syn 2.0.22",
]
[[package]]
@ -239,10 +272,16 @@ dependencies = [
]
[[package]]
name = "miette"
version = "5.7.0"
name = "memchr"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7abdc09c381c9336b9f2e9bd6067a9a5290d20e2d2e2296f275456121c33ae89"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "miette"
version = "5.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a236ff270093b0b67451bc50a509bd1bad302cb1d3c7d37d5efe931238581fa9"
dependencies = [
"miette-derive",
"once_cell",
@ -252,25 +291,33 @@ dependencies = [
[[package]]
name = "miette-derive"
version = "5.7.0"
version = "5.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8842972f23939443013dfd3720f46772b743e86f1a81d120d4b6fb090f87de1c"
checksum = "4901771e1d44ddb37964565c654a3223ba41a594d02b8da471cc4464912b5cfa"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.15",
"syn 2.0.22",
]
[[package]]
name = "miniz_oxide"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
dependencies = [
"adler",
]
[[package]]
name = "mio"
version = "0.8.6"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
dependencies = [
"libc",
"log",
"wasi",
"windows-sys 0.45.0",
"windows-sys",
]
[[package]]
@ -281,7 +328,7 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
[[package]]
name = "nrpc"
version = "0.6.0"
version = "0.7.0"
dependencies = [
"async-trait",
"bytes",
@ -293,13 +340,13 @@ name = "nrpc-build"
version = "0.7.0"
dependencies = [
"nrpc",
"prettyplease 0.2.4",
"prettyplease 0.2.9",
"proc-macro2",
"prost-build",
"prost-types",
"protox",
"quote",
"syn 2.0.15",
"syn 2.0.22",
]
[[package]]
@ -325,10 +372,19 @@ dependencies = [
]
[[package]]
name = "once_cell"
version = "1.17.1"
name = "object"
version = "0.30.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
[[package]]
name = "parking_lot"
@ -342,15 +398,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.7"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.2.16",
"redox_syscall",
"smallvec",
"windows-sys 0.45.0",
"windows-targets",
]
[[package]]
@ -381,19 +437,19 @@ dependencies = [
[[package]]
name = "prettyplease"
version = "0.2.4"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058"
checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282"
dependencies = [
"proc-macro2",
"syn 2.0.15",
"syn 2.0.22",
]
[[package]]
name = "proc-macro2"
version = "1.0.56"
version = "1.0.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
dependencies = [
"unicode-ident",
]
@ -445,9 +501,9 @@ dependencies = [
[[package]]
name = "prost-reflect"
version = "0.11.3"
version = "0.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4df26814fb2cd59b1764305047aac8e9c467efe84a9e51bfd0c8811f08fe88a"
checksum = "000e1e05ebf7b26e1eba298e66fe4eee6eb19c567d0ffb35e0dd34231cdac4c8"
dependencies = [
"logos",
"miette",
@ -467,9 +523,9 @@ dependencies = [
[[package]]
name = "protox"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cb2d1d74977bfa8fc4ddac1951ea639197c2896a830b6c5640085e498726da2"
checksum = "24022a7eb88547eaba87a1db7954c9c4cb4a143565c4e8f2b7f3e76eed63db2d"
dependencies = [
"bytes",
"miette",
@ -482,9 +538,9 @@ dependencies = [
[[package]]
name = "protox-parse"
version = "0.3.2"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df78235a8c28dc4c5d8acb498d3000851b61b80a68774ff7b43323371b082ea4"
checksum = "712a2a651fa4466e67df6c967df5d7fc6cbffac89afc7b834f97ec49846c9c11"
dependencies = [
"logos",
"miette",
@ -494,22 +550,13 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.26"
version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]]
name = "redox_syscall"
version = "0.3.5"
@ -521,11 +568,11 @@ dependencies = [
[[package]]
name = "regex"
version = "1.7.3"
version = "1.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f"
dependencies = [
"regex-syntax",
"regex-syntax 0.7.2",
]
[[package]]
@ -535,17 +582,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "rustix"
version = "0.37.11"
name = "regex-syntax"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77"
checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
[[package]]
name = "rustc-demangle"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustix"
version = "0.37.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
"windows-sys 0.48.0",
"windows-sys",
]
[[package]]
@ -592,9 +651,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.15"
version = "2.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616"
dependencies = [
"proc-macro2",
"quote",
@ -603,15 +662,16 @@ dependencies = [
[[package]]
name = "tempfile"
version = "3.5.0"
version = "3.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6"
dependencies = [
"autocfg",
"cfg-if",
"fastrand",
"redox_syscall 0.3.5",
"redox_syscall",
"rustix",
"windows-sys 0.45.0",
"windows-sys",
]
[[package]]
@ -631,16 +691,17 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.15",
"syn 2.0.22",
]
[[package]]
name = "tokio"
version = "1.27.0"
version = "1.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
checksum = "374442f06ee49c3a28a8fc9f01a2596fed7559c6b99b31279c3261778e77d84f"
dependencies = [
"autocfg",
"backtrace",
"bytes",
"libc",
"mio",
@ -650,25 +711,25 @@ dependencies = [
"signal-hook-registry",
"socket2",
"tokio-macros",
"windows-sys 0.45.0",
"windows-sys",
]
[[package]]
name = "tokio-macros"
version = "2.0.0"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce"
checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.15",
"syn 2.0.22",
]
[[package]]
name = "unicode-ident"
version = "1.0.8"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
[[package]]
name = "unicode-width"
@ -715,132 +776,66 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [
"windows-targets 0.42.2",
]
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets 0.48.0",
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.42.2"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
dependencies = [
"windows_aarch64_gnullvm 0.42.2",
"windows_aarch64_msvc 0.42.2",
"windows_i686_gnu 0.42.2",
"windows_i686_msvc 0.42.2",
"windows_x86_64_gnu 0.42.2",
"windows_x86_64_gnullvm 0.42.2",
"windows_x86_64_msvc 0.42.2",
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows-targets"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
dependencies = [
"windows_aarch64_gnullvm 0.48.0",
"windows_aarch64_msvc 0.48.0",
"windows_i686_gnu 0.48.0",
"windows_i686_msvc 0.48.0",
"windows_x86_64_gnu 0.48.0",
"windows_x86_64_gnullvm 0.48.0",
"windows_x86_64_msvc 0.48.0",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]]
name = "windows_i686_gnu"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
[[package]]
name = "windows_i686_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
[[package]]
name = "windows_i686_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]]
name = "windows_i686_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.0"

View file

@ -21,4 +21,4 @@ quote = "1.0"
syn = "2.0"
proc-macro2 = "1.0"
nrpc = { version = "0.6", path = "../nrpc" }
nrpc = { version = "0.7", path = "../nrpc" }

View file

@ -1,6 +1,6 @@
use std::path::Path;
use std::convert::AsRef;
use std::iter::IntoIterator;
use std::path::Path;
use prost_build::Config;
use prost_build::{Service, ServiceGenerator};
@ -19,7 +19,7 @@ pub struct Transpiler<'a> {
impl<'a> Transpiler<'a> {
pub fn new(
files: impl IntoIterator<Item = impl AsRef<Path>>,
includes: impl IntoIterator<Item = impl AsRef<Path>>
includes: impl IntoIterator<Item = impl AsRef<Path>>,
) -> Result<Self, impl std::error::Error> {
let files: Vec<_> = files.into_iter().collect();
for f in &files {
@ -35,19 +35,28 @@ impl<'a> Transpiler<'a> {
/// Generate client and server service implementations
pub fn generate_all(mut self) -> Self {
self.service_generator.add_service(super::ProtobufServiceGenerator::all(std::env::var("OUT_DIR").unwrap().into()));
self.service_generator
.add_service(super::ProtobufServiceGenerator::all(
std::env::var("OUT_DIR").unwrap().into(),
));
self
}
/// Generate server services implementations
pub fn generate_server(mut self) -> Self {
self.service_generator.add_service(super::ProtobufServiceGenerator::server(std::env::var("OUT_DIR").unwrap().into()));
self.service_generator
.add_service(super::ProtobufServiceGenerator::server(
std::env::var("OUT_DIR").unwrap().into(),
));
self
}
/// Generate client services implementations
pub fn generate_client(mut self) -> Self {
self.service_generator.add_service(super::ProtobufServiceGenerator::client(std::env::var("OUT_DIR").unwrap().into()));
self.service_generator
.add_service(super::ProtobufServiceGenerator::client(
std::env::var("OUT_DIR").unwrap().into(),
));
self
}
@ -70,7 +79,10 @@ impl<'a> Transpiler<'a> {
for mut pp in self.preprocessors {
pp.process(&mut files, &mut generated);
}
self.service_generator.add_service(PreprocessedCodeGenInjector { generated_str: generated });
self.service_generator
.add_service(PreprocessedCodeGenInjector {
generated_str: generated,
});
self.prost_config
.service_generator(Box::new(self.service_generator))
@ -116,9 +128,10 @@ impl ServiceGenerator for MergedServiceGenerator {
/// Compile proto files into Rust with server and client implementations
pub fn compile(
files: impl IntoIterator<Item = impl AsRef<Path>>,
includes: impl IntoIterator<Item = impl AsRef<Path>>
includes: impl IntoIterator<Item = impl AsRef<Path>>,
) {
Transpiler::new(files, includes).unwrap()
Transpiler::new(files, includes)
.unwrap()
.generate_all()
.transpile()
.unwrap();
@ -129,7 +142,8 @@ pub fn compile_clients(
files: impl IntoIterator<Item = impl AsRef<Path>>,
includes: impl IntoIterator<Item = impl AsRef<Path>>,
) {
Transpiler::new(files, includes).unwrap()
Transpiler::new(files, includes)
.unwrap()
.generate_client()
.transpile()
.unwrap();
@ -140,7 +154,8 @@ pub fn compile_servers(
files: impl IntoIterator<Item = impl AsRef<Path>>,
includes: impl IntoIterator<Item = impl AsRef<Path>>,
) {
Transpiler::new(files, includes).unwrap()
Transpiler::new(files, includes)
.unwrap()
.generate_server()
.transpile()
.unwrap();

View file

@ -3,7 +3,7 @@ mod preprocessor;
mod service_gen;
mod token_gen_traits;
pub use builder::{compile, compile_servers, compile_clients, Transpiler};
pub use builder::{compile, compile_clients, compile_servers, Transpiler};
pub use preprocessor::Preprocessor;
pub(crate) use service_gen::ProtobufServiceGenerator;
pub use token_gen_traits::{IServiceGenerator, IPreprocessor, AbstractImpl};
pub use token_gen_traits::{AbstractImpl, IPreprocessor, IServiceGenerator};

View file

@ -52,7 +52,8 @@ fn trait_methods_server(descriptors: &Vec<prost_build::Method>) -> proc_macro2::
let mut gen_method_match_arms = Vec::with_capacity(descriptors.len());
for descriptor in descriptors {
match (descriptor.client_streaming, descriptor.server_streaming) {
(false, false) => { // no streaming; 1->1
(false, false) => {
// no streaming; 1->1
let input_ty = quote::format_ident!("{}", descriptor.input_type);
let output_ty = quote::format_ident!("{}", descriptor.output_type);
let fn_name = quote::format_ident!("{}", descriptor.name);
@ -63,25 +64,25 @@ fn trait_methods_server(descriptors: &Vec<prost_build::Method>) -> proc_macro2::
}
);
gen_method_match_arms.push(
quote! {
#method_name => {
Ok(self.#fn_name(#input_ty::decode(payload)?).await?.encode(buffer)?)
}
gen_method_match_arms.push(quote! {
#method_name => {
Ok(self.#fn_name(#input_ty::decode(payload)?).await?.encode(buffer)?)
}
);
},
(true, false) => { // client streaming; 1 -> many
todo!("streaming not supported")
},
(false, true) => { // server streaming; many -> 1
});
}
(true, false) => {
// client streaming; 1 -> many
todo!("streaming not supported")
}
(true, true) => { // all streaming; many -> many
(false, true) => {
// server streaming; many -> 1
todo!("streaming not supported")
},
}
(true, true) => {
// all streaming; many -> many
todo!("streaming not supported")
}
}
}
quote! {
@ -96,18 +97,23 @@ fn trait_methods_server(descriptors: &Vec<prost_build::Method>) -> proc_macro2::
}
}
fn struct_methods_client(package_name: &str, service_name: &str, descriptors: &Vec<prost_build::Method>) -> proc_macro2::TokenStream {
fn struct_methods_client(
package_name: &str,
service_name: &str,
descriptors: &Vec<prost_build::Method>,
) -> proc_macro2::TokenStream {
let mut gen_methods = Vec::with_capacity(descriptors.len());
for descriptor in descriptors {
match (descriptor.client_streaming, descriptor.server_streaming) {
(false, false) => { // no streaming; 1->1
(false, false) => {
// no streaming; 1->1
let input_ty = quote::format_ident!("{}", descriptor.input_type);
let output_ty = quote::format_ident!("{}", descriptor.output_type);
let fn_name = quote::format_ident!("{}", descriptor.name);
let method_name = &descriptor.name;
gen_methods.push(
quote! {
pub async fn #fn_name(&mut self, input: #input_ty) -> Result<#output_ty, ::nrpc::ServiceError> {
pub async fn #fn_name(&self, input: #input_ty) -> Result<#output_ty, ::nrpc::ServiceError> {
let mut in_buf = ::nrpc::_helpers::bytes::BytesMut::new();
input.encode(&mut in_buf)?;
let mut out_buf = ::nrpc::_helpers::bytes::BytesMut::new();
@ -116,18 +122,20 @@ fn struct_methods_client(package_name: &str, service_name: &str, descriptors: &V
}
}
);
},
(true, false) => { // client streaming; 1 -> many
todo!("streaming not supported")
},
(false, true) => { // server streaming; many -> 1
}
(true, false) => {
// client streaming; 1 -> many
todo!("streaming not supported")
}
(true, true) => { // all streaming; many -> many
(false, true) => {
// server streaming; many -> 1
todo!("streaming not supported")
},
}
(true, true) => {
// all streaming; many -> many
todo!("streaming not supported")
}
}
}
quote! {
@ -143,20 +151,18 @@ fn generate_mod_rs(module_names: &Vec<String>, out_dir: &PathBuf) {
});
let gen_mods: syn::File = syn::parse2(quote! {
#(#modules)*
}).expect("invalid tokenstream");
})
.expect("invalid tokenstream");
let mod_str = prettyplease::unparse(&gen_mods);
std::fs::write(
out_dir
.join("mod.rs"),
&mod_str
).expect("Failed to write to $OUT_DIR/mod.rs");
std::fs::write(out_dir.join("mod.rs"), &mod_str).expect("Failed to write to $OUT_DIR/mod.rs");
//std::fs::write("/home/ngnius/potato.rs", &mod_str).unwrap();
}
impl ServiceGenerator for ProtobufServiceGenerator {
fn generate(&mut self, service: Service, buf: &mut String) {
if self.generate_server {
let service_mod_name = quote::format_ident!("{}_mod_server", service.name.to_lowercase());
let service_mod_name =
quote::format_ident!("{}_mod_server", service.name.to_lowercase());
let service_trait_name = quote::format_ident!("{}Service", service.name);
let service_trait_methods = trait_methods_server(&service.methods);
let service_struct_name = quote::format_ident!("{}ServiceImpl", service.name);
@ -210,8 +216,10 @@ impl ServiceGenerator for ProtobufServiceGenerator {
buf.push_str(&code_str);
}
if self.generate_client {
let service_mod_name = quote::format_ident!("{}_mod_client", service.name.to_lowercase());
let service_methods = struct_methods_client(&service.package, &service.name, &service.methods);
let service_mod_name =
quote::format_ident!("{}_mod_client", service.name.to_lowercase());
let service_methods =
struct_methods_client(&service.package, &service.name, &service.methods);
let service_struct_name = quote::format_ident!("{}Service", service.name);
let descriptor_str = format!("{}.{}", service.package, service.name);
let service_rename = quote::format_ident!("{}Client", service.name);
@ -258,8 +266,8 @@ impl ServiceGenerator for ProtobufServiceGenerator {
}
fn finalize(&mut self, buf: &mut String) {
let mut client_tokens = quote!{};
let mut server_tokens = quote!{};
let mut client_tokens = quote! {};
let mut server_tokens = quote! {};
if self.generate_client {
let exports = &self.client_reexports;
client_tokens = quote! {

View file

@ -1,6 +1,6 @@
use proc_macro2::TokenStream;
use prost_build::Service;
use prost_types::FileDescriptorSet;
use proc_macro2::TokenStream;
/// Higher-level abstraction of prost_build::ServiceGenerator
pub trait IServiceGenerator {
@ -33,7 +33,8 @@ impl<X> std::convert::From<X> for AbstractImpl<X> {
impl<X: IServiceGenerator> prost_build::ServiceGenerator for AbstractImpl<X> {
fn generate(&mut self, service: Service, buf: &mut String) {
let gen_code: syn::File = syn::parse2(self.0.generate(service)).expect("invalid tokenstream");
let gen_code: syn::File =
syn::parse2(self.0.generate(service)).expect("invalid tokenstream");
let code_str = prettyplease::unparse(&gen_code);
buf.push_str(&code_str);
}

View file

@ -1,7 +1,7 @@
use std::error::Error;
use prost::Message;
use nrpc::ServerService;
use prost::Message;
pub mod generated {
include!(concat!(env!("OUT_DIR"), "/mod.rs"));
@ -22,7 +22,10 @@ async fn main() {
let mut input_buf = bytes::BytesMut::new();
let mut output_buf = bytes::BytesMut::new();
req.encode(&mut input_buf).unwrap();
service_impl.call("say_hello", input_buf.into(), &mut output_buf).await.unwrap();
service_impl
.call("say_hello", input_buf.into(), &mut output_buf)
.await
.unwrap();
let actual_resp = helloworld::HelloReply::decode(output_buf).unwrap();
assert_eq!(resp, actual_resp);
@ -36,7 +39,10 @@ struct GreeterService;
#[async_trait::async_trait]
impl helloworld::IGreeter for GreeterService {
async fn say_hello(&mut self, input: helloworld::HelloRequest) -> Result<helloworld::HelloReply, Box<dyn Error>> {
async fn say_hello(
&mut self,
input: helloworld::HelloRequest,
) -> Result<helloworld::HelloReply, Box<dyn Error>> {
let result = helloworld::HelloReply {
message: format!("Hello {}", input.name),
};
@ -49,16 +55,22 @@ struct ClientHandler;
#[async_trait::async_trait]
impl nrpc::ClientHandler for ClientHandler {
async fn call(&mut self,
package: &str,
service: &str,
method: &str,
input: bytes::Bytes,
output: &mut bytes::BytesMut) -> Result<(), nrpc::ServiceError> {
println!("call {}.{}/{} with data {:?}", package, service, method, input);
// This is ok to hardcode ONLY because it's for testing
Ok(helloworld::HelloReply {
message: "Hello World".into(),
}.encode(output)?)
}
async fn call(
&mut self,
package: &str,
service: &str,
method: &str,
input: bytes::Bytes,
output: &mut bytes::BytesMut,
) -> Result<(), nrpc::ServiceError> {
println!(
"call {}.{}/{} with data {:?}",
package, service, method, input
);
// This is ok to hardcode ONLY because it's for testing
Ok(helloworld::HelloReply {
message: "Hello World".into(),
}
.encode(output)?)
}
}

View file

@ -1,6 +1,6 @@
[package]
name = "nrpc"
version = "0.6.0"
version = "0.7.0"
edition = "2021"
license = "Apache-2.0"
repository = "https://github.com/NGnius/nRPC"

View file

@ -1,6 +1,6 @@
mod service;
pub use service::{ServerService, ServiceError, ClientService, ClientHandler};
pub use service::{ClientHandler, ClientService, ServerService, ServiceError};
pub mod _helpers {
pub use async_trait;

View file

@ -2,20 +2,24 @@
pub trait ServerService {
fn descriptor(&self) -> &'static str;
async fn call(&mut self,
method: &str,
input: bytes::Bytes,
output: &mut bytes::BytesMut) -> Result<(), ServiceError>;
async fn call(
&mut self,
method: &str,
input: bytes::Bytes,
output: &mut bytes::BytesMut,
) -> Result<(), ServiceError>;
}
#[async_trait::async_trait]
pub trait ClientHandler {
async fn call(&mut self,
package: &str,
service: &str,
method: &str,
input: bytes::Bytes,
output: &mut bytes::BytesMut) -> Result<(), ServiceError>;
async fn call(
&self,
package: &str,
service: &str,
method: &str,
input: bytes::Bytes,
output: &mut bytes::BytesMut,
) -> Result<(), ServiceError>;
}
pub trait ClientService {