sdforge 0.3.0

Multi-protocol SDK framework with unified macro configuration
Documentation
[workspace]
members = ["."]
resolver = "2"

[workspace.package]
version = "0.3.0"
edition = "2021"
authors = ["Kirky.X"]
license = "MIT"
repository = "https://github.com/Kirky-X/sdforge"

[workspace.dependencies]
# 核心依赖
serde = { version = "~1.0", default-features = false, features = ["std", "derive"] }
serde_json = { version = "~1.0", default-features = false, features = ["std"] }
thiserror = { version = "~2.0", default-features = false }
log = { version = "~0.4", default-features = false, features = ["std"] }

# 过程宏依赖
proc-macro2 = { version = "~1.0", default-features = false, features = ["proc-macro"] }
syn = { version = "~2.0", default-features = false, features = ["full", "extra-traits", "parsing", "printing", "clone-impls", "proc-macro"] }
quote = { version = "~1.0", default-features = false, features = ["proc-macro"] }

# HTTP 依赖
axum = { version = "~0.8.9", default-features = false, features = ["http1", "json", "form", "matched-path", "original-uri", "query", "tokio", "tower-log", "tracing", "ws"] }
tower = { version = "~0.5", default-features = false, features = ["log", "util", "timeout", "limit", "load-shed", "retry"] }
tower-http = { version = "~0.7", default-features = false, features = ["cors", "limit", "timeout", "set-header", "compression-gzip", "compression-deflate"] }
inventory = { version = "~0.3", default-features = false }

# 异步依赖
tokio = { version = "~1.52", default-features = false, features = ["rt-multi-thread", "macros", "sync", "time", "net"] }
futures-util = { version = "~0.3", default-features = false, features = ["std", "async-await", "async-await-macro"] }
tokio-stream = { version = "~0.1", default-features = false }

# 工具依赖
uuid = { version = "~1.23", default-features = false, features = ["std", "v4"] }
chrono = { version = "~0.4", default-features = false, features = ["std", "serde", "clock"] }
regex = { version = "~1.12", default-features = false, features = ["std", "perf"] }
validator = { version = "~0.20", default-features = false, features = ["derive"] }
once_cell = { version = "~1.21", default-features = false, features = ["std"] }

# 安全依赖
hmac = { version = "~0.13", default-features = false }
sha2 = { version = "~0.11", default-features = false }
subtle = { version = "~2.6", default-features = false }
rand = { version = "~0.10", default-features = false, features = ["std", "std_rng"] }
hex = { version = "~0.4", default-features = false, features = ["alloc"] }
base64 = { version = "~0.22", default-features = false, features = ["std", "alloc"] }

# 配置依赖
toml = { version = "~1.1", default-features = false, features = ["parse", "display"] }

# 缓存依赖 - oxcache 0.3.2 用 minimal feature 提供内存后端 + 序列化 + tracing
oxcache = { version = "0.3.2", default-features = false, features = ["minimal"] }
http = { version = "~1.4", default-features = false }
bincode = { version = "~2.0", default-features = false, features = ["std", "serde"] }

# WebSocket 依赖
axum-extra = { version = "~0.12", default-features = false, features = ["typed-header"] }

# gRPC 依赖
tonic = { version = "~0.14", default-features = false, features = ["transport", "codegen", "router"] }
prost = { version = "~0.14", default-features = false, features = ["derive"] }
tonic-prost = { version = "~0.14", default-features = false }

# OpenAPI 依赖
utoipa = { version = "~5.5", default-features = false, features = ["macros"] }

# 其他依赖
url = { version = "~2.5", default-features = false }
simd-json = { version = "~0.17", default-features = false, features = ["serde_impl"] }

# 开发依赖
tempfile = { version = "~3.27", default-features = false }
serial_test = { version = "~3.5", default-features = false }
axum-test = { version = "~21", default-features = false, features = ["ws"] }
reqwest = { version = "~0.13", default-features = false, features = ["json"] }
criterion = { version = "~0.8", default-features = false }
trybuild = { version = "~1.0", default-features = false }
proptest = { version = "~1.11", default-features = false, features = ["std", "alloc", "bit-set"] }
pretty_assertions = { version = "~1.4", default-features = false, features = ["std"] }


[package]
name = "sdforge"
version.workspace = true
edition.workspace = true
authors.workspace = true
license.workspace = true
repository.workspace = true
keywords = ["api", "http", "mcp", "macro", "framework"]
categories = ["web-programming", "development-tools"]
description = "Multi-protocol SDK framework with unified macro configuration"
documentation = "https://docs.rs/sdforge"

[lib]
path = "src/lib.rs"

# Performance verification examples — require `cache` feature for SyncCache.
# Declared with required-features so `cargo test --features http --workspace`
# does not attempt to compile them without the cache feature enabled.
[[example]]
name = "perf_regex_cache"
required-features = ["cache"]
[[example]]
name = "perf_lru_eviction"
required-features = ["cache"]
[[example]]
name = "perf_prefix_index"
required-features = ["cache"]
[[example]]
name = "perf_batch_ops"
required-features = ["cache"]

[dependencies]
# Core dependencies (always required)
serde = { workspace = true }
serde_json = { workspace = true }
thiserror = { workspace = true }
log = { workspace = true }
sdforge-macros = { version = "0.3.0", path = "./macros" }

# HTTP dependencies
axum = { workspace = true, optional = true }
tower = { workspace = true, optional = true }
tower-http = { workspace = true, optional = true }
inventory = { workspace = true, optional = true }
tokio = { workspace = true, optional = true }
axum-extra = { workspace = true, optional = true, features = ["typed-header"] }

# MCP dependencies (migrated from mcp-sdk 0.0.3 to official rmcp 2.1.0)
rmcp = { version = "~2.1", optional = true, default-features = false, features = ["server"] }
anyhow = { version = "1.0", optional = true, default-features = false, features = ["std"] }

# Streaming dependencies
tokio-stream = { workspace = true, optional = true }
futures-util = { workspace = true, optional = true }

# gRPC dependencies
tonic = { workspace = true, optional = true }
prost = { workspace = true, optional = true }
tonic-prost = { workspace = true, optional = true }

# OpenAPI dependencies
utoipa = { workspace = true, optional = true }

# Feature dependencies
chrono = { workspace = true, optional = true }

# Validation dependencies
validator = { workspace = true, optional = true }
regex = { workspace = true, optional = true }
once_cell = { workspace = true, optional = true }

# Security dependencies
uuid = { workspace = true, optional = true }
hmac = { workspace = true, optional = true }
sha2 = { workspace = true, optional = true }
subtle = { workspace = true, optional = true }
rand = { workspace = true, optional = true }
hex = { workspace = true, optional = true }
base64 = { workspace = true, optional = true }

# Configuration dependencies
toml = { workspace = true, optional = true }

# Cache dependencies - oxcache 0.3.2 用 memory feature 提供缓存后端
oxcache = { workspace = true, optional = true }
http = { workspace = true, optional = true }

# Serialization for SyncCache storage values
bincode = { workspace = true, optional = true }

# SIMD-accelerated JSON (optional, requires SIMD support)
simd-json = { workspace = true, optional = true }

[dev-dependencies]
tokio = { workspace = true }
tokio-stream = { workspace = true }
once_cell = { workspace = true }
sdforge-macros = { version = "0.3.0", path = "./macros" }
tempfile = { workspace = true }
serial_test = { workspace = true }
axum-test = { workspace = true }
reqwest = { workspace = true }
criterion = { workspace = true }
trybuild = { workspace = true }
proptest = { workspace = true }
url = { workspace = true }

[features]
default = ["http"]

# HTTP 特性 - 启用时编译 axum 等
http = [
    "axum",
    "tower",
    "tower-http",
    "inventory",
    "tokio",
    "axum-extra",
    "toml",
    "regex",
    "once_cell",
    "validator",
    "uuid",
]

# MCP 特性 (migrated to official rmcp SDK 2.1.0)
# http crate needed for MCP 2026-07-28 stateless HTTP header parsing (Mcp-Method/Mcp-Name)
mcp = ["rmcp", "inventory", "anyhow", "dep:http"]

# Streaming 特性
streaming = ["http", "tokio-stream", "futures-util", "chrono"]

# Timestamp 特性
timestamp = ["chrono"]

# Security 特性
security = [
    "http",
    "uuid",
    "hmac",
    "sha2",
    "chrono",
    "tokio",
    "subtle",
    "once_cell",
    "rand",
    "regex",
    "oxcache/minimal",
    "bincode",
    "cache",
    "hex",
    "base64",
]

# WebSocket 特性
websocket = ["http", "streaming", "axum-extra", "chrono"]

# gRPC 特性
grpc = ["http", "tonic", "prost", "tonic-prost"]

# OpenAPI 特性 - 自动生成 OpenAPI 3.1 规范
openapi = ["utoipa", "http"]

# Cache 特性 - oxcache 0.3.2 用 minimal feature 提供缓存后端
cache = ["dep:http", "oxcache/minimal"]

# Logging 特性
logging = ["chrono", "tokio"]

# SIMD JSON 特性 - 使用 SIMD 加速的 JSON 序列化/反序列化
simd-json = ["dep:simd-json"]

# Full 特性
full = [
    "http",
    "mcp",
    "streaming",
    "timestamp",
    "security",
    "cache",
    "websocket",
    "grpc",
    "logging",
    "openapi",
]
hex = ["dep:hex"]

[build-dependencies]
tonic-build = "0.14"
tonic-prost-build = "0.14"

[package.metadata.docs.rs]
all-features = true

[[bench]]
name = "axiom_bench"
path = "src/benches/sdforge_bench.rs"
harness = false

# Cache tests
[[test]]
name = "cache_tests"
path = "tests/integration/cache_tests.rs"

# Integration tests
[[test]]
name = "feature_combinations"
path = "tests/integration/feature_combinations.rs"

[[test]]
name = "grpc_tests"
path = "tests/integration/grpc_tests.rs"

[[test]]
name = "http_integration"
path = "tests/integration/http_integration.rs"

[[test]]
name = "mcp_integration"
path = "tests/integration/mcp_integration.rs"

[[test]]
name = "mcp_protocol_tests"
path = "tests/integration/mcp_protocol_tests.rs"

[[test]]
name = "security_headers_tests"
path = "tests/integration/security_headers_tests.rs"

[[test]]
name = "security_middleware_tests"
path = "tests/integration/security_middleware_tests.rs"

[[test]]
name = "security_tests"
path = "tests/integration/security_tests.rs"

[[test]]
name = "streaming_tests"
path = "tests/integration/streaming_tests.rs"

[[test]]
name = "uat_tests"
path = "tests/integration/uat_tests.rs"

[[test]]
name = "websocket_integration_tests"
path = "tests/integration/websocket_integration_tests.rs"

[[test]]
name = "websocket_tests"
path = "tests/integration/websocket_tests.rs"

[[test]]
name = "integration_http_mcp"
path = "tests/integration_http_mcp.rs"

[[test]]
name = "http_tests"
path = "tests/integration/http_tests.rs"

# Unit tests
[[test]]
name = "config_tests"
path = "tests/unit/config_tests.rs"

[[test]]
name = "core_tests"
path = "tests/unit/core_tests.rs"

[[test]]
name = "edge_case_tests"
path = "tests/unit/edge_case_tests.rs"

[[test]]
name = "http_version_routing_tests"
path = "tests/unit/http_version_routing_tests.rs"

[[test]]
name = "mcp_tool_instance_tests"
path = "tests/unit/mcp_tool_instance_tests.rs"

[[test]]
name = "error_handling_tests"
path = "tests/integration/error_handling_tests.rs"

# OpenAPI integration tests
[[test]]
name = "openapi_tests"
path = "tests/integration/openapi_tests.rs"
required-features = ["http", "openapi"]

[[test]]
name = "macro_tests"
path = "tests/macros/macro_tests.rs"

[profile.release]
lto = true
codegen-units = 1
opt-level = "z"

[profile.dev]
debug = true

[profile.dev.package."*"]
opt-level = 2