diff --git a/.go-arch-lint.yml b/.go-arch-lint.yml
index 9ed916517d..a008190c07 100644
--- a/.go-arch-lint.yml
+++ b/.go-arch-lint.yml
@@ -13,7 +13,6 @@ components:
ftl-cmd: { in: frontend/cli/ftl/** }
go-runtime: { in: go-runtime/** }
jvm-runtime: { in: jvm-runtime/** }
- rust-runtime: { in: rust-runtime/** }
runner: { in: backend/runner/** }
ftl-runner-cmd: { in: cmd/ftl-runner/** }
frontend: { in: frontend/console/** }
diff --git a/CODEOWNERS b/CODEOWNERS
index 37d1380649..dee090daab 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -7,7 +7,6 @@
# Below are team-specific overrides. These should supercede the default ftl-reviewers team.
frontend/ @TBD54566975/ftl-frontend-team
pnpm-* @TBD54566975/ftl-frontend-team
-rust-runtime/ @gak
go-runtime/ @TBD54566975/ftl-go-team
jvm-runtime/ @TBD54566975/ftl-jvm-team
deployment/ @TBD54566975/ftl-infra-team
diff --git a/backend/controller/scaling/localscaling/local_scaling.go b/backend/controller/scaling/localscaling/local_scaling.go
index 3ace46aa70..ec0c3cf577 100644
--- a/backend/controller/scaling/localscaling/local_scaling.go
+++ b/backend/controller/scaling/localscaling/local_scaling.go
@@ -195,7 +195,7 @@ func (l *localScaling) startRunner(ctx context.Context, deploymentKey string, in
simpleName := fmt.Sprintf("runner%d", keySuffix)
if err := kong.ApplyDefaults(&config, kong.Vars{
"deploymentdir": filepath.Join(l.cacheDir, "ftl-runner", simpleName, "deployments"),
- "language": "go,kotlin,rust,java",
+ "language": "go,kotlin,java",
}); err != nil {
return fmt.Errorf("failed to apply defaults: %w", err)
}
diff --git a/backend/runner/runner.go b/backend/runner/runner.go
index 42c84d622c..1abcaad571 100644
--- a/backend/runner/runner.go
+++ b/backend/runner/runner.go
@@ -51,7 +51,7 @@ type Config struct {
TemplateDir string `help:"Template directory to copy into each deployment, if any." type:"existingdir"`
DeploymentDir string `help:"Directory to store deployments in." default:"${deploymentdir}"`
DeploymentKeepHistory int `help:"Number of deployments to keep history for." default:"3"`
- Language []string `short:"l" help:"Languages the runner supports." env:"FTL_LANGUAGE" default:"go,kotlin,rust,java"`
+ Language []string `short:"l" help:"Languages the runner supports." env:"FTL_LANGUAGE" default:"go,kotlin,java"`
HeartbeatPeriod time.Duration `help:"Minimum period between heartbeats." default:"3s"`
HeartbeatJitter time.Duration `help:"Jitter to add to heartbeat period." default:"2s"`
Deployment string `help:"The deployment this runner is for." env:"FTL_DEPLOYMENT"`
diff --git a/examples/rust/moo/Cargo.lock b/examples/rust/moo/Cargo.lock
deleted file mode 100644
index c7ec6c9a5a..0000000000
--- a/examples/rust/moo/Cargo.lock
+++ /dev/null
@@ -1,1507 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "addr2line"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "anstream"
-version = "0.6.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
-
-[[package]]
-name = "anstyle-parse"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
-dependencies = [
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
-dependencies = [
- "anstyle",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.86"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
-
-[[package]]
-name = "async-stream"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
-dependencies = [
- "async-stream-impl",
- "futures-core",
- "pin-project-lite",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "async-trait"
-version = "0.1.80"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
-
-[[package]]
-name = "axum"
-version = "0.6.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
-dependencies = [
- "async-trait",
- "axum-core",
- "bitflags 1.3.2",
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "hyper",
- "itoa",
- "matchit",
- "memchr",
- "mime",
- "percent-encoding",
- "pin-project-lite",
- "rustversion",
- "serde",
- "sync_wrapper",
- "tower",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "axum-core"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
-dependencies = [
- "async-trait",
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "mime",
- "rustversion",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "backtrace"
-version = "0.3.73"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
-
-[[package]]
-name = "base64"
-version = "0.21.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bitflags"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
-
-[[package]]
-name = "bytes"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
-
-[[package]]
-name = "cc"
-version = "1.0.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c891175c3fb232128f48de6590095e59198bbeb8620c310be349bfc3afd12c7b"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "chrono"
-version = "0.4.38"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "clap"
-version = "4.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f"
-dependencies = [
- "clap_builder",
- "clap_derive",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f"
-dependencies = [
- "anstream",
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_derive"
-version = "4.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6"
-dependencies = [
- "heck 0.5.0",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "clap_lex"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70"
-
-[[package]]
-name = "colorchoice"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
-
-[[package]]
-name = "either"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
-
-[[package]]
-name = "equivalent"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
-
-[[package]]
-name = "errno"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
-
-[[package]]
-name = "fixedbitset"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "ftl"
-version = "0.1.0"
-dependencies = [
- "clap",
- "ftl_derive",
- "ftl_protos",
- "glob",
- "heck 0.5.0",
- "prettyplease",
- "proc-macro2",
- "prost",
- "quote",
- "serde",
- "serde_json",
- "syn",
- "tokio",
- "tonic",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "ftl_derive"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
-]
-
-[[package]]
-name = "ftl_protos"
-version = "0.1.0"
-dependencies = [
- "pbjson",
- "pbjson-build",
- "pbjson-types",
- "prost",
- "prost-build",
- "prost-types",
- "serde",
- "tonic",
- "tonic-build",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
-dependencies = [
- "futures-core",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
-
-[[package]]
-name = "futures-sink"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
-
-[[package]]
-name = "futures-task"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
-
-[[package]]
-name = "futures-util"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
-dependencies = [
- "futures-core",
- "futures-task",
- "pin-project-lite",
- "pin-utils",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi",
-]
-
-[[package]]
-name = "gimli"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
-
-[[package]]
-name = "glob"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
-
-[[package]]
-name = "h2"
-version = "0.3.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
-dependencies = [
- "bytes",
- "fnv",
- "futures-core",
- "futures-sink",
- "futures-util",
- "http",
- "indexmap 2.2.6",
- "slab",
- "tokio",
- "tokio-util",
- "tracing",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-
-[[package]]
-name = "hashbrown"
-version = "0.14.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-
-[[package]]
-name = "heck"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
-
-[[package]]
-name = "http"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "http-body"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
-dependencies = [
- "bytes",
- "http",
- "pin-project-lite",
-]
-
-[[package]]
-name = "httparse"
-version = "1.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
-
-[[package]]
-name = "httpdate"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
-
-[[package]]
-name = "hyper"
-version = "0.14.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-core",
- "futures-util",
- "h2",
- "http",
- "http-body",
- "httparse",
- "httpdate",
- "itoa",
- "pin-project-lite",
- "socket2",
- "tokio",
- "tower-service",
- "tracing",
- "want",
-]
-
-[[package]]
-name = "hyper-timeout"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
-dependencies = [
- "hyper",
- "pin-project-lite",
- "tokio",
- "tokio-io-timeout",
-]
-
-[[package]]
-name = "indexmap"
-version = "1.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
-dependencies = [
- "autocfg",
- "hashbrown 0.12.3",
-]
-
-[[package]]
-name = "indexmap"
-version = "2.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
-dependencies = [
- "equivalent",
- "hashbrown 0.14.5",
-]
-
-[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
-
-[[package]]
-name = "itertools"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itertools"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
-
-[[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
-[[package]]
-name = "libc"
-version = "0.2.155"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
-
-[[package]]
-name = "log"
-version = "0.4.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
-
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata 0.1.10",
-]
-
-[[package]]
-name = "matchit"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
-
-[[package]]
-name = "memchr"
-version = "2.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
-
-[[package]]
-name = "mime"
-version = "0.3.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "mio"
-version = "0.8.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
-dependencies = [
- "libc",
- "wasi",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "moo"
-version = "0.1.0"
-dependencies = [
- "ftl",
- "serde",
- "tokio",
- "tracing",
-]
-
-[[package]]
-name = "multimap"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
-
-[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
-dependencies = [
- "overload",
- "winapi",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
-dependencies = [
- "hermit-abi",
- "libc",
-]
-
-[[package]]
-name = "object"
-version = "0.36.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
-
-[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
-name = "pbjson"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1030c719b0ec2a2d25a5df729d6cff1acf3cc230bf766f4f97833591f7577b90"
-dependencies = [
- "base64",
- "serde",
-]
-
-[[package]]
-name = "pbjson-build"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2580e33f2292d34be285c5bc3dba5259542b083cfad6037b6d70345f24dcb735"
-dependencies = [
- "heck 0.4.1",
- "itertools 0.11.0",
- "prost",
- "prost-types",
-]
-
-[[package]]
-name = "pbjson-types"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18f596653ba4ac51bdecbb4ef6773bc7f56042dc13927910de1684ad3d32aa12"
-dependencies = [
- "bytes",
- "chrono",
- "pbjson",
- "pbjson-build",
- "prost",
- "prost-build",
- "serde",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
-
-[[package]]
-name = "petgraph"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
-dependencies = [
- "fixedbitset",
- "indexmap 2.2.6",
-]
-
-[[package]]
-name = "pin-project"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
-
-[[package]]
-name = "prettyplease"
-version = "0.2.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
-dependencies = [
- "proc-macro2",
- "syn",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.86"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "prost"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
-dependencies = [
- "bytes",
- "prost-derive",
-]
-
-[[package]]
-name = "prost-build"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4"
-dependencies = [
- "bytes",
- "heck 0.5.0",
- "itertools 0.12.1",
- "log",
- "multimap",
- "once_cell",
- "petgraph",
- "prettyplease",
- "prost",
- "prost-types",
- "regex",
- "syn",
- "tempfile",
-]
-
-[[package]]
-name = "prost-derive"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
-dependencies = [
- "anyhow",
- "itertools 0.12.1",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "prost-types"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0"
-dependencies = [
- "prost",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha",
- "rand_core",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "regex"
-version = "1.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata 0.4.7",
- "regex-syntax 0.8.4",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax 0.6.29",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax 0.8.4",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-
-[[package]]
-name = "rustix"
-version = "0.38.34"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
-dependencies = [
- "bitflags 2.5.0",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
-
-[[package]]
-name = "ryu"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
-
-[[package]]
-name = "serde"
-version = "1.0.203"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.203"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
-dependencies = [
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
-
-[[package]]
-name = "socket2"
-version = "0.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
-name = "syn"
-version = "2.0.68"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "sync_wrapper"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
-
-[[package]]
-name = "tempfile"
-version = "3.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
-dependencies = [
- "cfg-if",
- "fastrand",
- "rustix",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
-dependencies = [
- "cfg-if",
- "once_cell",
-]
-
-[[package]]
-name = "tokio"
-version = "1.38.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
-dependencies = [
- "backtrace",
- "bytes",
- "libc",
- "mio",
- "num_cpus",
- "pin-project-lite",
- "socket2",
- "tokio-macros",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "tokio-io-timeout"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
-dependencies = [
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tokio-util"
-version = "0.7.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
-dependencies = [
- "bytes",
- "futures-core",
- "futures-sink",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tonic"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13"
-dependencies = [
- "async-stream",
- "async-trait",
- "axum",
- "base64",
- "bytes",
- "h2",
- "http",
- "http-body",
- "hyper",
- "hyper-timeout",
- "percent-encoding",
- "pin-project",
- "prost",
- "tokio",
- "tokio-stream",
- "tower",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tonic-build"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2"
-dependencies = [
- "prettyplease",
- "proc-macro2",
- "prost-build",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tower"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
-dependencies = [
- "futures-core",
- "futures-util",
- "indexmap 1.9.3",
- "pin-project",
- "pin-project-lite",
- "rand",
- "slab",
- "tokio",
- "tokio-util",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tower-layer"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
-
-[[package]]
-name = "tower-service"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
-
-[[package]]
-name = "tracing"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
-dependencies = [
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
-
-[[package]]
-name = "try-lock"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
-
-[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
-name = "want"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
-dependencies = [
- "try-lock",
-]
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
-dependencies = [
- "windows-targets 0.52.5",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
-dependencies = [
- "windows_aarch64_gnullvm 0.52.5",
- "windows_aarch64_msvc 0.52.5",
- "windows_i686_gnu 0.52.5",
- "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",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
diff --git a/examples/rust/moo/Cargo.toml b/examples/rust/moo/Cargo.toml
deleted file mode 100644
index 6b39b8d536..0000000000
--- a/examples/rust/moo/Cargo.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-[package]
-name = "moo"
-version = "0.1.0"
-edition = "2021"
-
-[dependencies]
-ftl = { path = "../../../rust-runtime/ftl" }
-serde = { version = "1.0.203", features = ["derive"] }
-tracing = "0.1.40"
-tokio = "1.38.0"
\ No newline at end of file
diff --git a/examples/rust/moo/_ftl/Cargo.toml b/examples/rust/moo/_ftl/Cargo.toml
deleted file mode 100644
index 4c2d3c9788..0000000000
--- a/examples/rust/moo/_ftl/Cargo.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-[package]
-name = "main"
-version = "0.1.0"
-edition = "2021"
-
-[dependencies]
-ftl = { path = "../../../../rust-runtime/ftl" }
-moo = { path = ".." }
-tokio = "1.38.0"
-serde = { version = "1.0.203", features = ["derive"] }
-serde_json = "1.0.117"
-
-[build-dependencies]
-ftl = { path = "../../../../rust-runtime/ftl" }
diff --git a/examples/rust/moo/_ftl/build.rs b/examples/rust/moo/_ftl/build.rs
deleted file mode 100644
index 208f34d53a..0000000000
--- a/examples/rust/moo/_ftl/build.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-fn main() {
- ftl::builder::build("moo")
-}
\ No newline at end of file
diff --git a/examples/rust/moo/_ftl/src/main.rs b/examples/rust/moo/_ftl/src/main.rs
deleted file mode 100644
index cdf0d4e131..0000000000
--- a/examples/rust/moo/_ftl/src/main.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-include!(concat!(env!("OUT_DIR"), "/call_immediate.rs"));
-
-fn main() {
- ftl::builder::main(call_immediate)
-}
diff --git a/examples/rust/moo/ftl.toml b/examples/rust/moo/ftl.toml
deleted file mode 100644
index 02dea6d392..0000000000
--- a/examples/rust/moo/ftl.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-module = "moo"
-language = "rust"
diff --git a/examples/rust/moo/src/lib.rs b/examples/rust/moo/src/lib.rs
deleted file mode 100644
index e879f851c1..0000000000
--- a/examples/rust/moo/src/lib.rs
+++ /dev/null
@@ -1,118 +0,0 @@
-use ftl::Context;
-use serde::{Deserialize, Serialize};
-use tracing::info;
-use std::collections::HashMap;
-use std::fmt::Debug;
-
-mod builtin {
- use super::*;
-
- #[derive(Debug, Serialize, Deserialize)]
- pub struct HttpRequest
- where Body: Debug
- {
- pub method: String,
- pub path: String,
- pub path_parameters: HashMap,
- pub query: HashMap>,
- pub headers: HashMap>,
- pub body: Body,
- }
-
- #[derive(Debug, Serialize, Deserialize)]
- pub struct HttpResponse
- where
- Body: Debug,
- Error: Debug
- {
- pub status: i32,
- pub headers: HashMap>,
- pub body: Option,
- pub error: Option,
- }
-
- #[derive(Debug, Serialize, Deserialize)]
- pub struct Empty {}
-}
-
-mod echo {
- use super::*;
-
- #[derive(Debug, Serialize, Deserialize)]
- pub struct EchoRequest {
- pub name: String,
- }
-
- #[derive(Debug, Serialize, Deserialize)]
- pub struct EchoResponse {
- pub message: String,
- }
-
- pub struct EchoVerb;
-
- impl ftl::VerbFn for EchoVerb {
- type Request = EchoRequest;
- type Response = EchoResponse;
-
- fn module() -> &'static str {
- "echo"
- }
- fn name() -> &'static str {
- "echo"
- }
- }
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct MooVerbRequest {
- pub your_name: String,
- pub age: u32,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct MooVerbResponse {
- pub message: String,
- pub your_score: u32,
-}
-
-#[ftl::verb]
-pub async fn test_verb(mut ctx: Context, request: MooVerbRequest) -> MooVerbResponse {
- info!("test_verb was called");
- info!("request: {:?}", &request);
-
- let echo_response = ctx.call(echo::EchoVerb, echo::EchoRequest {
- name: request.your_name,
- }).await;
-
- MooVerbResponse {
- message: format!("Hello. Ping response was: {}!", echo_response.message),
- your_score: request.age * 42,
- }
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct IngressRequest {
- pub user_name: String,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct IngressResponse {
- pub message: String,
-}
-
-#[ftl::ingress]
-pub async fn http_echo(_: Context, request: builtin::HttpRequest) -> builtin::HttpResponse {
- info!("http_echo was called");
- info!("request: {:?}", &request);
-
- builtin::HttpResponse {
- status: 200,
- headers: HashMap::new(),
- body: Some(IngressResponse {
- message: format!("Hello, {}!", request.body.user_name),
- }),
- error: None,
- }
-}
\ No newline at end of file
diff --git a/internal/buildengine/languageplugin/plugin.go b/internal/buildengine/languageplugin/plugin.go
index 0d00e5de9b..5f96354b0b 100644
--- a/internal/buildengine/languageplugin/plugin.go
+++ b/internal/buildengine/languageplugin/plugin.go
@@ -133,16 +133,11 @@ type LanguagePlugin interface {
// PluginFromConfig creates a new language plugin from the given config.
func New(ctx context.Context, bindAllocator *bind.BindAllocator, language, name string) (p LanguagePlugin, err error) {
- switch language {
- case "rust":
- return newRustPlugin(ctx), nil
- default:
- port, err := bindAllocator.Next()
- if err != nil {
- return nil, fmt.Errorf("failed to allocate port for external plugin: %w", err)
- }
- return newExternalPlugin(ctx, port, language, name)
+ port, err := bindAllocator.Next()
+ if err != nil {
+ return nil, fmt.Errorf("failed to allocate port for external plugin: %w", err)
}
+ return newExternalPlugin(ctx, port, language, name)
}
//sumtype:decl
diff --git a/internal/buildengine/languageplugin/rust_plugin.go b/internal/buildengine/languageplugin/rust_plugin.go
deleted file mode 100644
index b822b8bed1..0000000000
--- a/internal/buildengine/languageplugin/rust_plugin.go
+++ /dev/null
@@ -1,105 +0,0 @@
-package languageplugin
-
-import (
- "context"
- "fmt"
- "os"
- "path/filepath"
-
- "github.com/alecthomas/kong"
- "github.com/alecthomas/types/optional"
- "google.golang.org/protobuf/proto"
-
- languagepb "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1/language"
- "github.com/TBD54566975/ftl/internal/builderrors"
- "github.com/TBD54566975/ftl/internal/errors"
- "github.com/TBD54566975/ftl/internal/exec"
- "github.com/TBD54566975/ftl/internal/log"
- "github.com/TBD54566975/ftl/internal/moduleconfig"
- "github.com/TBD54566975/ftl/internal/projectconfig"
- "github.com/TBD54566975/ftl/internal/schema"
- "github.com/TBD54566975/ftl/internal/watch"
-)
-
-type rustPlugin struct {
- *internalPlugin
-}
-
-var _ = LanguagePlugin(&rustPlugin{})
-
-func newRustPlugin(ctx context.Context) *rustPlugin {
- internal := newInternalPlugin(ctx, "rust", buildRust)
- return &rustPlugin{
- internalPlugin: internal,
- }
-}
-
-func (p *rustPlugin) ModuleConfigDefaults(ctx context.Context, dir string) (moduleconfig.CustomDefaults, error) {
- return moduleconfig.CustomDefaults{
- Build: optional.Some("cargo build"),
- DeployDir: "_ftl/target/debug",
- Watch: []string{"**/*.rs", "Cargo.toml", "Cargo.lock"},
- }, nil
-}
-
-func (p *rustPlugin) GetCreateModuleFlags(ctx context.Context) ([]*kong.Flag, error) {
- return []*kong.Flag{}, nil
-}
-
-func (p *rustPlugin) CreateModule(ctx context.Context, projConfig projectconfig.Config, c moduleconfig.ModuleConfig, flags map[string]string) error {
- return fmt.Errorf("not implemented")
-}
-
-func (p *rustPlugin) GetDependencies(ctx context.Context, config moduleconfig.ModuleConfig) ([]string, error) {
- return nil, fmt.Errorf("not implemented")
-}
-
-func buildRust(ctx context.Context, projectRoot, stubsRoot string, bctx BuildContext, buildEnv []string, devMode bool, transaction watch.ModifyFilesTransaction) (BuildResult, error) {
- config := bctx.Config.Abs()
- logger := log.FromContext(ctx)
- logger.Debugf("Using build command '%s'", config.Build)
- err := exec.Command(ctx, log.Debug, config.Dir+"/_ftl", "bash", "-c", config.Build).RunBuffered(ctx)
- if err != nil {
- return BuildResult{}, fmt.Errorf("failed to build module %q: %w", config.Module, err)
- }
- buildErrs, err := loadProtoErrors(config)
- if err != nil {
- return BuildResult{}, fmt.Errorf("failed to load build errors: %w", err)
- }
- result := BuildResult{
- Errors: buildErrs,
- }
- if builderrors.ContainsTerminalError(buildErrs) {
- // skip reading schema
- return result, nil
- }
-
- moduleSchema, err := schema.ModuleFromProtoFile(filepath.Join(config.DeployDir, "schema.pb"))
- if err != nil {
- return BuildResult{}, fmt.Errorf("failed to read schema for module: %w", err)
- }
-
- result.Schema = moduleSchema
- result.Deploy = []string{"main"}
-
- return result, nil
-}
-
-func loadProtoErrors(config moduleconfig.AbsModuleConfig) ([]builderrors.Error, error) {
- errorsPath := filepath.Join(config.DeployDir, "errors.pb")
- if _, err := os.Stat(errorsPath); errors.Is(err, os.ErrNotExist) {
- return nil, nil
- }
-
- content, err := os.ReadFile(errorsPath)
- if err != nil {
- return nil, fmt.Errorf("could not load build errors file: %w", err)
- }
-
- errorspb := &languagepb.ErrorList{}
- err = proto.Unmarshal(content, errorspb)
- if err != nil {
- return nil, fmt.Errorf("could not unmarshal build errors %w", err)
- }
- return languagepb.ErrorsFromProto(errorspb), nil
-}
diff --git a/rust-runtime/Cargo.lock b/rust-runtime/Cargo.lock
deleted file mode 100644
index e3a7e1cf7f..0000000000
--- a/rust-runtime/Cargo.lock
+++ /dev/null
@@ -1,1492 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "addr2line"
-version = "0.24.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler2"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "anstream"
-version = "0.6.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56"
-
-[[package]]
-name = "anstyle-parse"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
-dependencies = [
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
-dependencies = [
- "anstyle",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.91"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8"
-
-[[package]]
-name = "async-stream"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"
-dependencies = [
- "async-stream-impl",
- "futures-core",
- "pin-project-lite",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "async-trait"
-version = "0.1.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "atomic-waker"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
-
-[[package]]
-name = "autocfg"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
-
-[[package]]
-name = "axum"
-version = "0.7.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae"
-dependencies = [
- "async-trait",
- "axum-core",
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "http-body-util",
- "itoa",
- "matchit",
- "memchr",
- "mime",
- "percent-encoding",
- "pin-project-lite",
- "rustversion",
- "serde",
- "sync_wrapper 1.0.1",
- "tower 0.5.1",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "axum-core"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
-dependencies = [
- "async-trait",
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "http-body-util",
- "mime",
- "pin-project-lite",
- "rustversion",
- "sync_wrapper 1.0.1",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "backtrace"
-version = "0.3.74"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
-dependencies = [
- "addr2line",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
- "windows-targets",
-]
-
-[[package]]
-name = "base64"
-version = "0.21.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
-
-[[package]]
-name = "base64"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
-
-[[package]]
-name = "bitflags"
-version = "2.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
-
-[[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-
-[[package]]
-name = "bytes"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "chrono"
-version = "0.4.38"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "clap"
-version = "4.5.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8"
-dependencies = [
- "clap_builder",
- "clap_derive",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.5.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54"
-dependencies = [
- "anstream",
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_derive"
-version = "4.5.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "clap_lex"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
-
-[[package]]
-name = "colorchoice"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
-
-[[package]]
-name = "either"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
-
-[[package]]
-name = "equivalent"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
-
-[[package]]
-name = "errno"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
-
-[[package]]
-name = "fixedbitset"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "ftl"
-version = "0.1.0"
-dependencies = [
- "clap",
- "ftl_derive",
- "ftl_protos",
- "glob",
- "heck",
- "prettyplease",
- "proc-macro2",
- "prost",
- "quote",
- "serde",
- "serde_json",
- "syn",
- "tokio",
- "tonic",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "ftl_derive"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
-]
-
-[[package]]
-name = "ftl_protos"
-version = "0.1.0"
-dependencies = [
- "pbjson",
- "pbjson-build",
- "pbjson-types",
- "prost",
- "prost-build",
- "prost-types",
- "serde",
- "tonic",
- "tonic-build",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
-dependencies = [
- "futures-core",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
-
-[[package]]
-name = "futures-sink"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
-
-[[package]]
-name = "futures-task"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
-
-[[package]]
-name = "futures-util"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
-dependencies = [
- "futures-core",
- "futures-task",
- "pin-project-lite",
- "pin-utils",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi",
-]
-
-[[package]]
-name = "gimli"
-version = "0.31.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
-
-[[package]]
-name = "glob"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
-
-[[package]]
-name = "h2"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
-dependencies = [
- "atomic-waker",
- "bytes",
- "fnv",
- "futures-core",
- "futures-sink",
- "http",
- "indexmap 2.6.0",
- "slab",
- "tokio",
- "tokio-util",
- "tracing",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-
-[[package]]
-name = "hashbrown"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
-
-[[package]]
-name = "http"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "http-body"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
-dependencies = [
- "bytes",
- "http",
-]
-
-[[package]]
-name = "http-body-util"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
-dependencies = [
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "pin-project-lite",
-]
-
-[[package]]
-name = "httparse"
-version = "1.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
-
-[[package]]
-name = "httpdate"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
-
-[[package]]
-name = "hyper"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-util",
- "h2",
- "http",
- "http-body",
- "httparse",
- "httpdate",
- "itoa",
- "pin-project-lite",
- "smallvec",
- "tokio",
- "want",
-]
-
-[[package]]
-name = "hyper-timeout"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793"
-dependencies = [
- "hyper",
- "hyper-util",
- "pin-project-lite",
- "tokio",
- "tower-service",
-]
-
-[[package]]
-name = "hyper-util"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-util",
- "http",
- "http-body",
- "hyper",
- "pin-project-lite",
- "socket2",
- "tokio",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "indexmap"
-version = "1.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
-dependencies = [
- "autocfg",
- "hashbrown 0.12.3",
-]
-
-[[package]]
-name = "indexmap"
-version = "2.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
-dependencies = [
- "equivalent",
- "hashbrown 0.15.0",
-]
-
-[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
-
-[[package]]
-name = "itertools"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
-
-[[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
-[[package]]
-name = "libc"
-version = "0.2.161"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
-
-[[package]]
-name = "log"
-version = "0.4.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
-
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata 0.1.10",
-]
-
-[[package]]
-name = "matchit"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
-
-[[package]]
-name = "memchr"
-version = "2.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
-
-[[package]]
-name = "mime"
-version = "0.3.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
-dependencies = [
- "adler2",
-]
-
-[[package]]
-name = "mio"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
-dependencies = [
- "hermit-abi",
- "libc",
- "wasi",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "multimap"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
-
-[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
-dependencies = [
- "overload",
- "winapi",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "object"
-version = "0.36.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
-
-[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
-name = "pbjson"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68"
-dependencies = [
- "base64 0.21.7",
- "serde",
-]
-
-[[package]]
-name = "pbjson-build"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9"
-dependencies = [
- "heck",
- "itertools",
- "prost",
- "prost-types",
-]
-
-[[package]]
-name = "pbjson-types"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887"
-dependencies = [
- "bytes",
- "chrono",
- "pbjson",
- "pbjson-build",
- "prost",
- "prost-build",
- "serde",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
-
-[[package]]
-name = "petgraph"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
-dependencies = [
- "fixedbitset",
- "indexmap 2.6.0",
-]
-
-[[package]]
-name = "pin-project"
-version = "1.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
-dependencies = [
- "zerocopy",
-]
-
-[[package]]
-name = "prettyplease"
-version = "0.2.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033"
-dependencies = [
- "proc-macro2",
- "syn",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.89"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "prost"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f"
-dependencies = [
- "bytes",
- "prost-derive",
-]
-
-[[package]]
-name = "prost-build"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15"
-dependencies = [
- "bytes",
- "heck",
- "itertools",
- "log",
- "multimap",
- "once_cell",
- "petgraph",
- "prettyplease",
- "prost",
- "prost-types",
- "regex",
- "syn",
- "tempfile",
-]
-
-[[package]]
-name = "prost-derive"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5"
-dependencies = [
- "anyhow",
- "itertools",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "prost-types"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670"
-dependencies = [
- "prost",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha",
- "rand_core",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "regex"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata 0.4.8",
- "regex-syntax 0.8.5",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax 0.6.29",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax 0.8.5",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-
-[[package]]
-name = "rustix"
-version = "0.38.38"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a"
-dependencies = [
- "bitflags",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
-
-[[package]]
-name = "ryu"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
-
-[[package]]
-name = "serde"
-version = "1.0.213"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.213"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.132"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
-dependencies = [
- "itoa",
- "memchr",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
-
-[[package]]
-name = "socket2"
-version = "0.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
-name = "syn"
-version = "2.0.85"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "sync_wrapper"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
-
-[[package]]
-name = "sync_wrapper"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
-
-[[package]]
-name = "tempfile"
-version = "3.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
-dependencies = [
- "cfg-if",
- "fastrand",
- "once_cell",
- "rustix",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
-dependencies = [
- "cfg-if",
- "once_cell",
-]
-
-[[package]]
-name = "tokio"
-version = "1.41.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb"
-dependencies = [
- "backtrace",
- "bytes",
- "libc",
- "mio",
- "pin-project-lite",
- "socket2",
- "tokio-macros",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tokio-util"
-version = "0.7.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a"
-dependencies = [
- "bytes",
- "futures-core",
- "futures-sink",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tonic"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52"
-dependencies = [
- "async-stream",
- "async-trait",
- "axum",
- "base64 0.22.1",
- "bytes",
- "h2",
- "http",
- "http-body",
- "http-body-util",
- "hyper",
- "hyper-timeout",
- "hyper-util",
- "percent-encoding",
- "pin-project",
- "prost",
- "socket2",
- "tokio",
- "tokio-stream",
- "tower 0.4.13",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tonic-build"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11"
-dependencies = [
- "prettyplease",
- "proc-macro2",
- "prost-build",
- "prost-types",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tower"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
-dependencies = [
- "futures-core",
- "futures-util",
- "indexmap 1.9.3",
- "pin-project",
- "pin-project-lite",
- "rand",
- "slab",
- "tokio",
- "tokio-util",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tower"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f"
-dependencies = [
- "futures-core",
- "futures-util",
- "pin-project-lite",
- "sync_wrapper 0.1.2",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "tower-layer"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
-
-[[package]]
-name = "tower-service"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
-
-[[package]]
-name = "tracing"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
-dependencies = [
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
-
-[[package]]
-name = "try-lock"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
-
-[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
-name = "want"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
-dependencies = [
- "try-lock",
-]
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.59.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_gnullvm",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-
-[[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",
-]
diff --git a/rust-runtime/Cargo.toml b/rust-runtime/Cargo.toml
deleted file mode 100644
index aa4d8f4939..0000000000
--- a/rust-runtime/Cargo.toml
+++ /dev/null
@@ -1,35 +0,0 @@
-[workspace]
-resolver = "2"
-
-members = [
- "ftl",
- "ftl_derive",
- "ftl_protos",
-]
-
-[workspace.dependencies]
-ftl = { path = "ftl" }
-ftl_derive = { path = "ftl_derive" }
-ftl_protos = { path = "ftl_protos" }
-
-clap = { version = "4.5.7", features = ["derive", "env"] }
-glob = "0.3.1"
-heck = "0.5.0"
-prettyplease = "0.2.20"
-pbjson = "0.7.0"
-pbjson-build = "0.7.0"
-pbjson-types = "0.7.0"
-proc-macro2 = "1.0.86"
-prost = "0.13.0"
-prost-build = "0.13.0"
-prost-types = "0.13.0"
-quote = "1.0.36"
-serde = { version = "1.0.203", features = ["derive"] }
-serde_json = "1.0.117"
-syn = { version = "2.0.66", features = ["full", "extra-traits"] }
-tokio = { version = "1.38.0", features = ["macros", "rt-multi-thread"] }
-tonic = "0.12.0"
-tonic-build = "0.12.0"
-tracing = "0.1.40"
-tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
-
diff --git a/rust-runtime/README.md b/rust-runtime/README.md
deleted file mode 100644
index f5bd394f87..0000000000
--- a/rust-runtime/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-This Rust runtime implementation needs a fair amount of work to be stable.
-
-Features:
-- Verb service and client.
-- Can answer verb call requests.
-- Can call out to verbs in other runtimes and process responses.
-- FTL can build and restart the runtime automatically.
-- Generates schema protos for verbs and args/return types recursively.
-
-Limitations:
-- Very limited functionality: Verbs only. No generics. Only a few types.
-- No error handling (unwraps everywhere).
-- No scaffolding generation.
-- No external module code generation.
-- Only struct types referenced by verb arguments and returns in the same module will correctly work.
-- Hardcoded paths to crate dependencies in Cargo.toml
diff --git a/rust-runtime/ftl/Cargo.toml b/rust-runtime/ftl/Cargo.toml
deleted file mode 100644
index f2ad77f1c0..0000000000
--- a/rust-runtime/ftl/Cargo.toml
+++ /dev/null
@@ -1,30 +0,0 @@
-[package]
-name = "ftl"
-version = "0.1.0"
-edition = "2021"
-default-run = "ftl"
-
-[[bin]]
-name = "ftl"
-path = "src/bin/ftl.rs"
-
-[lib]
-
-[dependencies]
-ftl_derive = { workspace = true }
-ftl_protos = { workspace = true }
-
-clap = { workspace = true }
-glob = { workspace = true }
-heck = { workspace = true }
-prettyplease = { workspace = true }
-proc-macro2 = { workspace = true }
-prost = { workspace = true }
-quote = { workspace = true }
-serde = { workspace = true }
-serde_json = { workspace = true }
-syn = { workspace = true }
-tracing = { workspace = true }
-tracing-subscriber = { workspace = true }
-tokio = { workspace = true }
-tonic = { workspace = true }
diff --git a/rust-runtime/ftl/src/bin/ftl.rs b/rust-runtime/ftl/src/bin/ftl.rs
deleted file mode 100644
index 78737150d9..0000000000
--- a/rust-runtime/ftl/src/bin/ftl.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use std::fs::File;
-use std::io::Write;
-use std::path::PathBuf;
-
-use clap::{Parser, Subcommand};
-use prost::Message;
-use tracing::{error, info};
-
-use ftl::parser;
-
-#[derive(Parser)]
-#[command(version, about, long_about = None)]
-struct Cli {
- #[command(subcommand)]
- command: Option,
-}
-
-#[derive(Subcommand)]
-enum Commands {
- BuildSchema { input: PathBuf, output: PathBuf },
- DumpModuleSchema { file: PathBuf },
-}
-
-#[tokio::main]
-async fn main() {
- let cli = Cli::parse();
- tracing_subscriber::fmt::init();
-
- match cli.command {
- Some(Commands::BuildSchema { input, output }) => {
- info!("Building schema from {:?}", input);
- let name = input.file_stem().unwrap().to_str().unwrap();
- let content = std::fs::read_to_string(&input).unwrap();
-
- let mut parser = parser::Parser::new();
- let module = parser::ModuleIdent::new(name);
- parser.add_module(&module, &content);
- let parsed = parser.parse();
-
- let proto = parsed.generate_module_proto(&module);
- let mut buf = Vec::new();
- proto.encode(&mut buf).unwrap();
-
- let mut file = File::create(output).unwrap();
- file.write_all(&buf).unwrap();
- }
- Some(Commands::DumpModuleSchema { file }) => {
- info!("Dumping {:?}", file);
- let reader = std::fs::File::open(&file).expect("unable to open file");
- let module = ftl::schema::binary_to_module(reader);
- serde_json::to_writer_pretty(std::io::stdout(), &module).unwrap();
- }
- None => {
- error!("No command given");
- }
- }
-}
diff --git a/rust-runtime/ftl/src/builder.rs b/rust-runtime/ftl/src/builder.rs
deleted file mode 100644
index c6c125548a..0000000000
--- a/rust-runtime/ftl/src/builder.rs
+++ /dev/null
@@ -1,80 +0,0 @@
-use std::env;
-use std::path::Path;
-
-use clap::Parser;
-use prost::Message;
-use tonic::transport::Uri;
-use tracing::info;
-use tracing_subscriber::{EnvFilter, fmt};
-
-use crate::{parser, runtime, verb_server};
-use crate::verb_server::CallImmediateFn;
-
-#[derive(clap::Parser, Debug)]
-#[command(version, about, long_about = None)]
-struct Cli {
- #[clap(short = 'e', env = "FTL_ENDPOINT", required = true)]
- ftl_endpoint_url: String,
- #[clap(short = 'b', env = "FTL_BIND", required = true)]
- bind: String,
- #[clap(short = 'c', env = "FTL_CONFIG", required = true)]
- config: Vec,
-}
-
-/// The entrypoint for the generated module.
-pub fn main(call_immediate: CallImmediateFn) {
- let filter =
- EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info,ftl=debug"));
- fmt::Subscriber::builder().with_env_filter(filter).init();
- info!("Starting module...");
-
- let cli = Cli::parse();
- info!("CLI: {:?}", cli);
-
- let bind_uri = cli.bind.parse::().unwrap();
- let bind_addr = bind_uri.authority().unwrap().to_string();
-
- let config = runtime::Config {
- verb_server_config: verb_server::Config {
- bind: bind_addr,
- call_immediate,
- },
- runner_url: cli.ftl_endpoint_url,
- };
- info!("Starting server with config: {:?}", config);
-
- // Create a tokio mt runtime
- let rt = tokio::runtime::Builder::new_multi_thread()
- .enable_all()
- .build()
- .unwrap();
-
- rt.block_on(runtime::run(config))
-}
-
-pub fn build(module_name: &str) {
- let module_dir = Path::new("..");
- let out_dir = env::var("OUT_DIR").unwrap();
-
- let src = module_dir.join("src").join("lib.rs");
- let call_immediate_path = Path::new(&out_dir).join("call_immediate.rs");
- let schema_path = module_dir
- .join("_ftl")
- .join("target")
- .join("debug")
- .join("schema.pb");
-
- let mut parser = parser::Parser::new();
- let module = parser::ModuleIdent::new(module_name);
- let code = std::fs::read_to_string(&src).unwrap();
- parser.add_module(&module, &code);
- let parsed = parser.parse();
- assert!(parsed.modules_count() > 0, "No modules found in {:?}", src);
- assert!(parsed.verb_count() > 0, "No modules found in {:?}", src);
- parsed.generate_call_immediate_file(&call_immediate_path);
-
- let module = parsed.generate_module_proto(&module);
- let mut encoded = Vec::new();
- module.encode(&mut encoded).unwrap();
- std::fs::write(schema_path, &encoded).unwrap();
-}
diff --git a/rust-runtime/ftl/src/generator.rs b/rust-runtime/ftl/src/generator.rs
deleted file mode 100644
index eabfb7f5da..0000000000
--- a/rust-runtime/ftl/src/generator.rs
+++ /dev/null
@@ -1,63 +0,0 @@
-use std::path::Path;
-
-use quote::quote;
-
-use crate::parser::{Parsed, VerbToken};
-
-impl Parsed {
- pub fn generate_call_immediate_file(&self, out_path: &Path) {
- let mut call_immediate_case_tokens = vec![];
- for verb_token in &self.verbs {
- call_immediate_case_tokens.push(Self::to_call_immediate_case_token(verb_token));
- }
-
- let token_stream = quote::quote! {
- // Output should be boxed trait of Deserializable
- pub fn call_immediate(ctx: ::ftl::Context, module: String, verb: String, request_body: String)
- -> ::std::pin::Pin + Send>> {
- let fut = async move {
- match (module.as_str(), verb.as_str()) {
- #(#call_immediate_case_tokens)*
- unknown => panic!("Unknown verb: {:?}", unknown),
- }
- };
-
- Box::pin(fut)
- }
- };
-
- eprintln!("Generated: {}", token_stream);
- let formatted_code = prettyplease::unparse(&syn::parse2(token_stream).unwrap());
-
- eprintln!("Generating to: {}", out_path.display());
- eprintln!("Generated: {}", formatted_code);
- std::fs::write(out_path, formatted_code).unwrap();
- }
-
- pub fn to_call_immediate_case_token(verb_token: &VerbToken) -> proc_macro2::TokenStream {
- let module_name = verb_token.module.0.clone();
- let verb_name = verb_token.func.sig.ident.clone();
- let module_name_str = module_name.to_string();
- let verb_name_str = verb_name.to_string();
- let request_type = &verb_token.request_ident;
- let response_type = &verb_token.response_ident;
-
- // request type only supports existing in the same module or unit
- dbg!(&verb_token.request_ident);
- // if verb_token.request_ident == syn::Ident::new("()", proc_macro2::Span::call_site()) {
- // quote! {
- // (#module_name_str, #verb_name_str) => {
- // #module_name::#verb_name(ctx, ()).await.unwrap();
- // }
- // }
- // } else {
- quote! {
- (#module_name_str, #verb_name_str) => {
- let request = ::serde_json::from_str::<#module_name::#request_type>(&request_body).unwrap();
- let response: #module_name::#response_type = #module_name::#verb_name(ctx, request).await;
- serde_json::to_string(&response).unwrap()
- }
- }
- // }
- }
-}
diff --git a/rust-runtime/ftl/src/lib.rs b/rust-runtime/ftl/src/lib.rs
deleted file mode 100644
index 50a6f11704..0000000000
--- a/rust-runtime/ftl/src/lib.rs
+++ /dev/null
@@ -1,65 +0,0 @@
-use serde::{de::DeserializeOwned, Serialize};
-
-pub use ftl_derive::verb;
-use ftl_protos::ftl::call_response::Response;
-use ftl_protos::ftl::CallRequest;
-use ftl_protos::ftl::verb_service_client::VerbServiceClient;
-use ftl_protos::schema::Ref;
-
-pub mod builder;
-pub mod generator;
-pub mod parser;
-pub mod runtime;
-pub mod schema;
-pub mod verb_server;
-
-pub trait VerbFn {
- type Request: Serialize;
- type Response: DeserializeOwned;
-
- fn module() -> &'static str;
- fn name() -> &'static str;
-}
-
-#[derive(Clone, Debug)]
-pub struct Context {
- verb_client: VerbServiceClient,
-}
-
-impl Context {
- pub fn new(verb_client: VerbServiceClient) -> Self {
- Self { verb_client }
- }
-
- pub async fn call(&mut self, _v: V, request: V::Request) -> V::Response
- where
- V: VerbFn,
- {
- let name = V::name().to_string();
- let module = V::module().to_string();
-
- let response = self
- .verb_client
- .call(tonic::Request::new(CallRequest {
- metadata: None,
- verb: Some(Ref {
- pos: None,
- name,
- module,
- type_parameters: vec![],
- }),
- body: serde_json::to_vec(&request).unwrap(),
- }))
- .await
- .unwrap()
- .into_inner();
-
- let response = response.response.unwrap();
- match response {
- Response::Body(vec) => serde_json::from_slice(&vec).unwrap(),
- Response::Error(err) => {
- panic!("Error: {:?}", err)
- }
- }
- }
-}
diff --git a/rust-runtime/ftl/src/parser.rs b/rust-runtime/ftl/src/parser.rs
deleted file mode 100644
index 9d2a42317f..0000000000
--- a/rust-runtime/ftl/src/parser.rs
+++ /dev/null
@@ -1,412 +0,0 @@
-use std::collections::{HashMap, HashSet, VecDeque};
-use std::path::{Path, PathBuf};
-
-use heck::ToLowerCamelCase;
-use proc_macro2::{Ident, Span};
-
-use ftl_protos::schema;
-
-#[derive(Debug)]
-pub struct Module {
- pub name: ModuleIdent,
- pub ast: syn::File,
-}
-
-#[derive(Default)]
-pub struct Parser {
- modules: Vec,
-}
-
-impl Parser {
- pub fn new() -> Self {
- Default::default()
- }
-
- pub fn add_module(&mut self, module_ident: &ModuleIdent, code: &str) {
- let ast = syn::parse_file(code).unwrap();
- self.modules.push(Module {
- name: module_ident.clone(),
- ast,
- });
- }
-
- pub fn add_glob(&mut self, path: &Path) {
- let sources = find_sources(path);
- for source in sources {
- let contents = std::fs::read_to_string(&source).unwrap();
- let file_name = source.file_stem().unwrap().to_str().unwrap();
- let mod_ident = ModuleIdent::new(file_name);
-
- self.add_module(&mod_ident, &contents);
- }
- }
-
- pub fn parse(self) -> Parsed {
- // Get all verbs.
- let verbs: Vec<_> = self
- .modules
- .iter()
- .flat_map(|module| extract_ast_verbs(&module.name, &module.ast))
- .collect();
-
- println!("Found {} verbs", verbs.len());
-
- // For each verb, queue request and response types.
- let mut type_queue = VecDeque::new();
- for verb in &verbs {
- type_queue.push_back(verb.request_ident.clone());
- type_queue.push_back(verb.response_ident.clone());
- }
-
- // Iterate queue until empty.
- let mut types = HashMap::new(); // Ident to AST node
- while let Some(ident) = type_queue.pop_front() {
- let (item, add_to_queue) = self.find_type_ast(&ident);
- if let Some(item) = item {
- println!("Found type: {:?}", ident);
- dbg!(&item);
- types.insert(ident.clone(), item);
- }
- for ident in add_to_queue {
- type_queue.push_back(ident);
- }
- println!("Types: {:?}", types);
- println!("Queue: {:?}", type_queue);
- }
-
- Parsed { verbs, types }
- }
-
- fn find_type_ast(&self, ident: &Ident) -> (Option, Vec) {
- let known_types = [
- "String", "bool", "u8", "u16", "u32", "u64", "i8", "i16", "i32", "i64",
- ];
-
- if known_types.contains(&ident.to_string().as_str()) {
- return (None, vec![]);
- }
-
- for module in &self.modules {
- for item in &module.ast.items {
- let syn::Item::Struct(item_struct) = item else {
- continue;
- };
-
- if item_struct.ident != *ident {
- continue;
- }
-
- // Get the ident of the Type for each field.
- let fields = item_struct
- .fields
- .iter()
- .map(|field| ident_from_type(&field.ty))
- .collect();
-
- return (Some(item.clone()), fields);
- }
- }
-
- panic!("Type not found: {:?}", ident);
- }
-}
-
-fn ident_from_path(path: &syn::Path) -> Ident {
- dbg!(&path);
- path.get_ident().unwrap().clone()
-}
-
-fn generics_from_path(path: &syn::Path) -> Vec {
- path.segments
- .iter()
- .map(|segment| segment.ident.clone())
- .collect()
-}
-
-pub fn ident_from_type(ty: &syn::Type) -> Ident {
- match ty {
- syn::Type::Path(path) => ident_from_path(&path.path),
- _ => panic!("Expected type path, got {:?}", ty),
- }
-}
-
-pub struct Parsed {
- pub verbs: Vec,
- pub types: HashMap,
-}
-
-impl Parsed {
- pub fn modules_count(&self) -> usize {
- self.verbs
- .iter()
- .map(|verb| &verb.module)
- .collect::>()
- .len()
- }
-
- pub fn verb_count(&self) -> usize {
- self.verbs.len()
- }
-}
-
-/// Find all .rs sources in src.
-fn find_sources(path: &Path) -> Vec {
- glob::glob(path.to_str().unwrap())
- .unwrap()
- .map(|entry| entry.unwrap())
- .map(|entry| entry.as_path().to_path_buf())
- .collect()
-}
-
-#[derive(Debug, Clone, Hash, Eq, PartialEq)]
-pub struct ModuleIdent(pub Ident);
-
-impl ModuleIdent {
- pub fn new(name: &str) -> Self {
- Self(Ident::new(name, Span::call_site()))
- }
-}
-
-#[derive(Debug, Clone)]
-pub struct VerbToken {
- pub module: ModuleIdent,
- pub func: syn::ItemFn,
- pub ident: Ident,
- pub request_ident: Ident,
- pub response_ident: Ident,
-}
-
-impl VerbToken {
- pub fn try_parse_any_item(module: &ModuleIdent, item: &syn::Item) -> Option {
- let func = match item {
- syn::Item::Fn(func) => func,
- // Quietly ignore non-functions.
- _ => return None,
- };
-
- let ftl_verb_path = syn::parse_str("ftl::verb").unwrap();
- if !has_meta_path(&func.attrs, &ftl_verb_path) {
- // No #[ftl::verb] annotation, ignore.
- return None;
- }
-
- ensure_arg_is_path(func, 0);
- ensure_arg_type_ident(func, 0, "Context");
- ensure_arg_is_path(func, 1);
- let request_type = get_arg_type(func, 1);
- let response_type = get_return_type_or_unit(func);
- let request_type_ident = ident_from_type(&request_type);
- let response_type_ident = ident_from_type(&response_type);
-
- Some(VerbToken {
- module: module.clone(),
- func: func.clone(),
- ident: func.sig.ident.clone(),
- request_ident: request_type_ident,
- response_ident: response_type_ident,
- })
- }
-
- pub fn to_verb_proto(&self) -> schema::Verb {
- let request = Some(schema::Type {
- value: Some(schema::r#type::Value::Ref(schema::Ref {
- pos: None,
- name: self.request_ident.to_string(),
- module: self.module.0.to_string(),
- type_parameters: vec![],
- })),
- });
- let response = Some(schema::Type {
- value: Some(schema::r#type::Value::Ref(schema::Ref {
- pos: None,
- name: self.response_ident.to_string(),
- module: self.module.0.to_string(),
- type_parameters: vec![],
- })),
- });
-
- schema::Verb {
- runtime: None,
- pos: None,
- comments: vec![],
- export: false,
- name: self.func.sig.ident.to_string().to_lower_camel_case(),
- request,
- response,
- metadata: vec![],
- }
- }
-}
-
-/// Extract functions that are annotated with #[ftl::verb] and extract the AST node.
-pub fn extract_ast_verbs(module: &ModuleIdent, ast: &syn::File) -> Vec {
- let mut verbs = vec![];
- for item in &ast.items {
- let Some(verb_token) = VerbToken::try_parse_any_item(module, item) else {
- continue;
- };
-
- verbs.push(verb_token);
- }
- verbs
-}
-
-fn ensure_arg_is_path(func: &syn::ItemFn, index: usize) {
- if func.sig.inputs.len() <= index {
- panic!("Function must have at least {} arguments", index + 1);
- }
- let arg = &func.sig.inputs[index];
-
- let syn::FnArg::Typed(pat) = arg else {
- panic!("Argument {} must not be a self argument", index);
- };
-
- let syn::Type::Path(_) = &*pat.ty else {
- panic!(
- "Argument {} must be of type Path instead of {:?}",
- index, pat.ty
- );
- };
-}
-
-fn ensure_arg_type_ident(func: &syn::ItemFn, index: usize, expected_ident: &str) {
- if func.sig.inputs.len() <= index {
- panic!("Function must have at least {} arguments", index + 1);
- }
- let arg = &func.sig.inputs[index];
-
- let syn::FnArg::Typed(pat) = arg else {
- panic!("Argument {} must not be a self argument", index);
- };
-
- let syn::Type::Path(path) = &*pat.ty else {
- panic!(
- "Argument {} must be of type Path instead of {:?}",
- index, pat.ty
- );
- };
-
- let ident = path.path.get_ident().unwrap();
- if ident != expected_ident {
- panic!(
- "Argument {} must be of type {} instead of {}",
- index, expected_ident, ident
- );
- }
-}
-
-fn get_arg_type(func: &syn::ItemFn, index: usize) -> syn::Type {
- if func.sig.inputs.len() <= index {
- panic!("Function must have at least {} arguments", index + 1);
- }
- let arg = &func.sig.inputs[index];
-
- let syn::FnArg::Typed(pat) = arg else {
- panic!("Argument {} must not be a self argument", index);
- };
-
- *pat.ty.clone()
-}
-
-fn get_return_type_or_unit(func: &syn::ItemFn) -> syn::Type {
- let syn::ReturnType::Type(_, ty) = &func.sig.output else {
- return syn::Type::Tuple(syn::TypeTuple {
- paren_token: syn::token::Paren::default(),
- elems: Default::default(),
- });
- };
-
- *ty.clone()
-}
-
-// Look for #[path_str] e.g. #[ftl::verb], and extract the function signature.
-fn has_meta_path(attrs: &[syn::Attribute], expected_path: &syn::Path) -> bool {
- attrs.iter().any(|attr| attr.meta.path() == expected_path)
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_basic_types() {
- let mut parser = Parser::new();
- parser.add_module(
- &ModuleIdent::new("test"),
- r#"
- pub struct User {
- pub name: String,
- pub age: u32,
- }
-
- pub struct Request {
- pub name: String,
- pub user: User,
- }
-
- pub struct Response {
- pub message: String,
- pub user: User,
- }
-
- #[ftl::verb]
- pub fn test_verb(ctx: Context, request: Request) -> Response {
- println!("Hello, world!");
- }
- "#,
- );
- let parsed = parser.parse();
-
- assert_eq!(parsed.modules_count(), 1);
- assert_eq!(parsed.verb_count(), 1);
- assert_eq!(parsed.types.len(), 3);
-
- let user = parsed.generate_module_proto(&ModuleIdent::new("test"));
- dbg!(user);
- }
-
- #[test]
- fn generic_types() {
- let mut parser = Parser::new();
- parser.add_module(
- &ModuleIdent::new("test"),
- r#"
- pub struct User {
- pub name: String,
- pub age: T,
- pub score: Y,
- }
-
- pub struct Request {
- pub name: String,
- pub user: User,
- }
-
- pub struct Response {
- pub message: String,
- pub user: User,
- }
-
- #[ftl::verb]
- pub fn test_verb(ctx: Context, request: Request) -> Response {
- let response = Response {
- message: "Hello, world!".to_string(),
- user: User {
- name: "Alice".to_string(),
- age: 42,
- score: 100f32,
- },
- };
- }
- "#,
- );
- let parsed = parser.parse();
-
- assert_eq!(parsed.modules_count(), 1);
- assert_eq!(parsed.verb_count(), 1);
- assert_eq!(parsed.types.len(), 3);
-
- let user = parsed.generate_module_proto(&ModuleIdent::new("test"));
- dbg!(user);
- }
-}
diff --git a/rust-runtime/ftl/src/runtime.rs b/rust-runtime/ftl/src/runtime.rs
deleted file mode 100644
index 40fecb0242..0000000000
--- a/rust-runtime/ftl/src/runtime.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-use tracing::info;
-
-use ftl_protos::ftl::verb_service_client::VerbServiceClient;
-
-use crate::verb_server;
-
-#[derive(Debug)]
-pub struct Config {
- pub verb_server_config: verb_server::Config,
- pub runner_url: String,
-}
-
-pub async fn run(config: Config) {
- info!("Starting");
-
- info!("Connecting to verb service at {}", config.runner_url);
- let verb_client = VerbServiceClient::connect(config.runner_url.clone())
- .await
- .unwrap();
- info!("Connected");
-
- verb_server::serve(config.verb_server_config, verb_client).await;
-}
diff --git a/rust-runtime/ftl/src/schema.rs b/rust-runtime/ftl/src/schema.rs
deleted file mode 100644
index d9b494c2e5..0000000000
--- a/rust-runtime/ftl/src/schema.rs
+++ /dev/null
@@ -1,212 +0,0 @@
-//! A crate for parsing/generating code to and from schema binary.
-use heck::ToLowerCamelCase;
-use prost::Message;
-
-use ftl_protos::schema;
-
-use crate::parser::{ident_from_type, ModuleIdent, Parsed, VerbToken};
-
-pub fn binary_to_module(mut reader: impl std::io::Read) -> schema::Module {
- let mut buf = Vec::new();
- reader.read_to_end(&mut buf).unwrap();
- schema::Module::decode(&buf[..]).unwrap()
-}
-
-impl Parsed {
- pub fn generate_module_proto(&self, module: &ModuleIdent) -> schema::Module {
- let mut decls = vec![];
-
- for verb_token in &self.verbs {
- decls.push(self.get_decl_for_verb(verb_token));
- }
- for ident in self.types.keys() {
- decls.push(self.get_decl_for_data(ident));
- }
-
- dbg!(&decls);
-
- schema::Module {
- runtime: None,
- pos: None,
- comments: vec![],
- builtin: false,
- name: module.0.to_string(),
- decls,
- }
- }
-
- fn get_decl_for_verb(&self, verb_token: &VerbToken) -> schema::Decl {
- let verb = verb_token.to_verb_proto();
- schema::Decl {
- value: Some(schema::decl::Value::Verb(verb)),
- }
- }
-
- fn get_decl_for_data(&self, ident: &syn::Ident) -> schema::Decl {
- let item = self.types.get(ident).unwrap();
- match item {
- syn::Item::Struct(item_struct) => {
- let mut fields = vec![];
-
- for field in &item_struct.fields {
- // let ident = field.ty;
- let type_ident = ident_from_type(&field.ty);
- fields.push(schema::Field {
- pos: None,
- comments: vec![],
- name: field
- .ident
- .as_ref()
- .unwrap()
- .to_string()
- .to_lower_camel_case(),
- r#type: Some(self.get_type_recursive(&type_ident)),
- metadata: vec![],
- });
- }
-
- let data = schema::Data {
- pos: None,
- comments: vec![],
- export: true,
- name: ident.to_string(),
- type_parameters: vec![],
- fields,
- metadata: vec![],
- };
-
- schema::Decl {
- value: Some(schema::decl::Value::Data(data)),
- }
- }
- _ => todo!(),
- }
- }
-
- fn get_type_recursive(&self, ident: &syn::Ident) -> schema::Type {
- let maybe_value = match ident.to_string().as_str() {
- "String" => Some(schema::r#type::Value::String(schema::String { pos: None })),
- "u32" => Some(schema::r#type::Value::Int(schema::Int { pos: None })),
- _ => None,
- };
- if let Some(value) = maybe_value {
- return schema::Type { value: Some(value) };
- }
-
- println!("maybe not an internal type: {:?}", ident);
-
- let item = self
- .types
- .get(ident)
- .expect(format!("type not found: {:?}", ident).as_str());
- let value = match item {
- syn::Item::Struct(_item_struct) => schema::r#type::Value::Ref(schema::Ref {
- pos: None,
- name: ident.to_string(),
- module: "".to_string(),
- type_parameters: vec![],
- }),
- unknown => todo!("unhandled type {:?}", unknown),
- // Item::Const(_) => {}
- // Item::Enum(_) => {}
- // Item::ExternCrate(_) => {}
- // Item::Fn(_) => {}
- // Item::ForeignMod(_) => {}
- // Item::Impl(_) => {}
- // Item::Macro(_) => {}
- // Item::Mod(_) => {}
- // Item::Static(_) => {}
- // Item::Trait(_) => {}
- // Item::TraitAlias(_) => {}
- // Item::Type(_) => {}
- // Item::Union(_) => {}
- // Item::Use(_) => {}
- // Item::Verbatim(_) => {}
- };
-
- schema::Type { value: Some(value) }
- }
-}
-
-#[cfg(test)]
-mod tests {
- use crate::parser::Parser;
-
- use super::*;
-
- #[test]
- fn it_works() {
- let config = schema::Config {
- pos: None,
- comments: vec![],
- name: "sup".to_string(),
- r#type: None,
- };
-
- let mut encoded = Vec::new();
- Message::encode(&config, &mut encoded).unwrap();
-
- let decoded = schema::Config::decode(&encoded[..]).unwrap();
- assert_eq!(config, decoded);
-
- dbg!(encoded);
- dbg!(decoded);
- }
-
- #[test]
- fn ast_to_proto() {
- //
- let code = r#"
- use ftl::Context;
-
- struct Request {
- pub name: String,
- pub age: u32,
- }
-
- struct Response {
- pub message: String,
- }
-
- #[ftl::verb]
- pub async fn test_verb(ctx: Context, request: Request) -> Result> {
- // let response = ctx.call(module::other_verb, request).await?;
-
- Ok(Response {
- message: format!("Hello {}!", request.name),
- })
- }
- "#;
-
- let mut parser = Parser::new();
- let moo = ModuleIdent::new("moo");
- parser.add_module(&moo, code);
- let parsed = parser.parse();
- let m = parsed.generate_module_proto(&moo);
-
- assert_eq!(
- m,
- schema::Module {
- runtime: None,
- pos: None,
- comments: vec![],
- builtin: false,
- name: "moo".to_string(),
- decls: vec![schema::Decl {
- value: Some(schema::decl::Value::Verb(schema::Verb {
- runtime: None,
- pos: None,
- comments: vec![],
- export: false,
- name: "test_verb".to_string(),
- request: None,
- response: None,
- metadata: vec![],
- })),
- },],
- }
- );
-
- dbg!(m);
- }
-}
diff --git a/rust-runtime/ftl/src/verb_server.rs b/rust-runtime/ftl/src/verb_server.rs
deleted file mode 100644
index 812873ecb5..0000000000
--- a/rust-runtime/ftl/src/verb_server.rs
+++ /dev/null
@@ -1,118 +0,0 @@
-use std::future::Future;
-use std::pin::Pin;
-
-use heck::ToSnakeCase;
-use prost::Message;
-use tonic::{Request, Response, Status, Streaming};
-use tonic::codegen::tokio_stream::Stream;
-use tonic::transport::{Channel, Server};
-
-use ftl_protos as protos;
-use ftl_protos::ftl::verb_service_client::VerbServiceClient;
-use ftl_protos::ftl::verb_service_server::VerbService;
-
-use crate::Context;
-
-pub type CallImmediateReturn = Pin + Send>>;
-
-pub type CallImmediateFn = fn(Context, String, String, String) -> CallImmediateReturn;
-
-#[derive(Debug)]
-pub struct Config {
- pub bind: String,
- pub call_immediate: CallImmediateFn,
-}
-
-impl Config {
- pub fn bind_url(&self) -> String {
- format!("http://{}", self.bind)
- }
-}
-
-pub async fn serve(config: Config, verb_client: VerbServiceClient) {
- let addr = config.bind.parse().unwrap();
- let service = FtlService {
- config,
- context: Context::new(verb_client),
- };
-
- Server::builder()
- .add_service(protos::ftl::verb_service_server::VerbServiceServer::new(
- service,
- ))
- .serve(addr)
- .await
- .unwrap();
-}
-
-#[derive(Debug)]
-pub struct FtlService {
- config: Config,
- context: Context,
-}
-
-type ModuleContextResponseStream =
- Pin> + Send>>;
-
-type AcquireLeaseStream =
- Pin> + Send>>;
-
-#[tonic::async_trait]
-impl VerbService for FtlService {
- async fn ping(
- &self,
- _request: Request,
- ) -> Result, Status> {
- Ok(Response::new(protos::ftl::PingResponse { not_ready: None }))
- }
-
- type GetModuleContextStream = ModuleContextResponseStream;
-
- async fn get_module_context(
- &self,
- _request: Request,
- ) -> Result, Status> {
- todo!()
- }
-
- type AcquireLeaseStream = AcquireLeaseStream;
-
- async fn acquire_lease(
- &self,
- _request: Request>,
- ) -> Result, Status> {
- todo!()
- }
-
- async fn publish_event(
- &self,
- _request: Request,
- ) -> Result, Status> {
- todo!()
- }
-
- async fn call(
- &self,
- request: Request,
- ) -> Result, Status> {
- let request = request.into_inner();
- let verb_ref = request.verb.unwrap();
- let module = verb_ref.module;
- let name = verb_ref.name.to_snake_case();
- let request_body: Vec = request.body;
- let request_body = String::from_utf8(request_body).unwrap();
- println!(
- "module: {}, name: {}, request_body: {}",
- module, name, request_body
- );
-
- let context = self.context.clone();
- let response = (self.config.call_immediate)(context, module, name, request_body).await;
-
- Ok(Response::new(protos::ftl::CallResponse {
- response: Some(protos::ftl::call_response::Response::Body(
- response.encode_to_vec(),
- )),
- }))
- }
-}
diff --git a/rust-runtime/ftl_derive/Cargo.toml b/rust-runtime/ftl_derive/Cargo.toml
deleted file mode 100644
index 56124f1d25..0000000000
--- a/rust-runtime/ftl_derive/Cargo.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[package]
-name = "ftl_derive"
-version = "0.1.0"
-edition = "2021"
-
-[lib]
-proc-macro = true
-
-[dependencies]
-proc-macro2 = { workspace = true }
-quote = { workspace = true }
diff --git a/rust-runtime/ftl_derive/src/lib.rs b/rust-runtime/ftl_derive/src/lib.rs
deleted file mode 100644
index 2b119e03a0..0000000000
--- a/rust-runtime/ftl_derive/src/lib.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-use proc_macro::TokenStream;
-
-/// ftl::verb is a "tag" only proc macro that does not generate any code, just keeps the original.
-#[proc_macro_attribute]
-pub fn verb(_: TokenStream, token_stream: TokenStream) -> TokenStream {
- token_stream
-}
-
-/// ftl::ingress
-#[proc_macro_attribute]
-pub fn ingress(_: TokenStream, token_stream: TokenStream) -> TokenStream {
- token_stream
-}
diff --git a/rust-runtime/ftl_protos/Cargo.toml b/rust-runtime/ftl_protos/Cargo.toml
deleted file mode 100644
index 5416cb7438..0000000000
--- a/rust-runtime/ftl_protos/Cargo.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-[package]
-name = "ftl_protos"
-version = "0.1.0"
-edition = "2021"
-
-[dependencies]
-pbjson = { workspace = true }
-pbjson-types = { workspace = true }
-prost = { workspace = true }
-serde = { workspace = true }
-tonic = { workspace = true }
-prost-types = { workspace = true }
-
-[build-dependencies]
-pbjson-build = { workspace = true }
-prost-build = { workspace = true }
-prost = { workspace = true }
-tonic-build = { workspace = true }
diff --git a/rust-runtime/ftl_protos/build.rs b/rust-runtime/ftl_protos/build.rs
deleted file mode 100644
index 9b59d04ec8..0000000000
--- a/rust-runtime/ftl_protos/build.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-use std::env;
-use std::path::PathBuf;
-
-fn main() -> Result<(), Box> {
- let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../backend/protos");
- let proto_files = vec![
- root.join("xyz/block/ftl/v1/schema/schema.proto"),
- root.join("xyz/block/ftl/v1/ftl.proto"),
- ];
-
- // Tell cargo to recompile if any of these proto files are changed
- for proto_file in &proto_files {
- println!("cargo:rerun-if-changed={}", proto_file.display());
- }
-
- let descriptor_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("proto_descriptor.bin");
-
- tonic_build::configure()
- .file_descriptor_set_path(&descriptor_path)
- // Override prost-types with pbjson-types
- .compile_well_known_types(true)
- .extern_path(".google.protobuf", "::pbjson_types")
- .compile(&proto_files, &[&root])?;
-
- let descriptor_set = std::fs::read(descriptor_path)?;
- pbjson_build::Builder::new()
- .register_descriptors(&descriptor_set)?
- .build(&[".xyz.block.ftl.v1.schema"])?;
-
- Ok(())
-}
diff --git a/rust-runtime/ftl_protos/src/lib.rs b/rust-runtime/ftl_protos/src/lib.rs
deleted file mode 100644
index 489bf56aa2..0000000000
--- a/rust-runtime/ftl_protos/src/lib.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-pub mod schema {
- // Generated by [`prost-build`]
- include!(concat!(env!("OUT_DIR"), "/xyz.block.ftl.v1.schema.rs"));
-
- // Generated by [`pbjson-build`]
- include!(concat!(
- env!("OUT_DIR"),
- "/xyz.block.ftl.v1.schema.serde.rs"
- ));
-}
-
-pub mod ftl {
- use crate::schema;
-
- // Generated by [`prost-build`]
- include!(concat!(env!("OUT_DIR"), "/xyz.block.ftl.v1.rs"));
- // tonic::include_proto!("xyz.block.ftl.v1");
-
- // Generated by [`pbjson-build`]
- // include!(concat!(env!("OUT_DIR"), "/xyz.block.ftl.v1.serde.rs"));
-}