[package]
name = "rs-zero"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
description = "Rust-first microservice framework inspired by go-zero engineering practices"
authors.workspace = true
readme = "README.md"
repository = "https://github.com/tonyher0/rs-zero"
homepage = "https://github.com/tonyher0/rs-zero"
documentation = "https://docs.rs/rs-zero"
keywords = ["microservice", "go-zero", "axum", "tonic", "sqlx"]
categories = ["web-programming", "network-programming", "database"]
exclude = [".helloagents/**", "*.orig"]
[workspace]
members = [
"crates/rs-zero-cli",
"examples/rest-hello",
"examples/rpc-hello",
]
resolver = "2"
[workspace.package]
version = "0.2.6"
edition = "2024"
rust-version = "1.87"
license = "MIT"
authors = ["Hey"]
[workspace.dependencies]
anyhow = "1"
async-trait = "0.1"
axum = { version = "0.8", features = ["macros"] }
bytes = "1"
chrono = { version = "0.4", features = ["serde"] }
clap = { version = "4", features = ["derive"] }
config = "0.15"
futures = "0.3"
http = "1"
jsonwebtoken = "9"
prost = "0.14"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite", "macros"] }
tempfile = "3"
thiserror = "2"
tokio = { version = "1", features = ["rt-multi-thread", "macros", "signal", "net", "time", "sync"] }
tonic = "0.14"
tonic-health = "0.14"
tower = { version = "0.5", features = ["util", "timeout", "limit"] }
tower-http = { version = "0.6", features = ["trace", "request-id", "sensitive-headers", "limit"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "json"] }
uuid = { version = "1", features = ["v4", "serde"] }
[features]
default = ["core", "rest", "rpc", "resil", "cache", "discovery", "observability", "db-sqlite"]
core = ["dep:config", "dep:serde", "dep:serde_json", "dep:thiserror", "dep:tokio", "dep:tracing", "dep:tracing-subscriber"]
rest = ["core", "dep:axum", "dep:bytes", "dep:http", "dep:jsonwebtoken", "dep:serde", "dep:serde_json", "dep:thiserror", "dep:tokio", "dep:tower", "dep:tower-http", "dep:tracing", "dep:uuid"]
rpc = ["core", "dep:futures", "dep:http", "dep:http-body", "dep:thiserror", "dep:tokio", "dep:tonic", "dep:tonic-health", "dep:tower", "dep:tracing", "dep:uuid"]
resil = ["dep:thiserror", "dep:tokio"]
observability = ["dep:axum", "dep:http", "dep:thiserror", "dep:tokio", "dep:tracing", "dep:tracing-subscriber"]
observability-prometheus-client = ["observability", "dep:prometheus-client"]
otlp = ["observability", "dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp", "dep:tracing-opentelemetry", "dep:tonic"]
profiling = ["core", "dep:pyroscope"]
db = ["dep:sqlx", "dep:thiserror", "dep:tokio"]
db-sqlite = ["db", "sqlx/sqlite"]
db-postgres = ["db", "sqlx/postgres"]
db-mysql = ["db", "sqlx/mysql"]
cache = ["dep:async-trait", "dep:serde", "dep:serde_json", "dep:thiserror", "dep:tokio"]
cache-redis = ["cache", "resil", "dep:redis", "dep:sha1_smol", "dep:uuid"]
discovery = ["dep:async-trait", "dep:serde", "dep:serde_json", "dep:thiserror", "dep:tokio"]
discovery-etcd = ["discovery", "dep:etcd-client"]
discovery-kube = ["discovery", "dep:kube", "dep:k8s-openapi", "dep:tokio-stream", "k8s-openapi/v1_30"]
[dependencies]
async-trait = { workspace = true, optional = true }
axum = { workspace = true, optional = true }
bytes = { workspace = true, optional = true }
config = { workspace = true, optional = true }
etcd-client = { version = "0.17", optional = true }
futures = { workspace = true, optional = true }
http = { workspace = true, optional = true }
http-body = { version = "1", optional = true }
jsonwebtoken = { workspace = true, optional = true }
kube = { version = "2", features = ["runtime", "client", "derive"], optional = true }
k8s-openapi = { version = "0.26", optional = true }
opentelemetry = { version = "0.31", optional = true }
opentelemetry_sdk = { version = "0.31", optional = true }
opentelemetry-otlp = { version = "0.31", default-features = false, features = ["trace", "grpc-tonic", "http-proto", "reqwest-blocking-client"], optional = true }
prometheus-client = { version = "0.24", optional = true }
pyroscope = { version = "2", features = ["backend-pprof-rs"], optional = true }
redis = { version = "0.32", features = ["aio", "tokio-comp", "cluster-async"], optional = true }
serde = { workspace = true, optional = true }
serde_json = { workspace = true, optional = true }
sha1_smol = { version = "1", optional = true }
sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio"], optional = true }
thiserror = { workspace = true, optional = true }
tokio = { workspace = true, optional = true }
tokio-stream = { version = "0.1", optional = true }
tonic = { workspace = true, optional = true }
tonic-health = { workspace = true, optional = true }
tower = { workspace = true, optional = true }
tower-http = { workspace = true, optional = true }
tracing = { workspace = true, optional = true }
tracing-opentelemetry = { version = "0.32", optional = true }
tracing-subscriber = { workspace = true, optional = true }
uuid = { workspace = true, optional = true }
[dev-dependencies]
axum.workspace = true
jsonwebtoken.workspace = true
serde.workspace = true
tempfile.workspace = true
tokio.workspace = true
tonic.workspace = true
tonic-health.workspace = true
tower.workspace = true
serde_json.workspace = true
sqlx.workspace = true