Skip to content

Commit 6293455

Browse files
domenkozarclaude
andcommitted
Consolidate architecture and rename define_secrets to declare_secrets
- Merge secretspec-core into secretspec as src/config.rs - Migrate from proc macro #[provider] to declarative macro register_provider\! - Rename define_secrets\! to declare_secrets\! for better semantic accuracy - Update all documentation and examples to reflect changes - Fix UI test expectations for the renamed macro This simplifies the codebase from 3 crates to 2 while maintaining clear separation between the main library and derive macro functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 541829a commit 6293455

36 files changed

+186
-313
lines changed

CLAUDE.md

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,12 @@ cd docs && npm run dev
4444

4545
## Architecture
4646

47-
The project is organized as a Rust workspace with three interdependent crates:
47+
The project is organized as a Rust workspace with two crates:
4848

4949
1. **secretspec** (src/): Main CLI and library
5050
- `main.rs`: CLI entry point with command definitions (init, config, set/get, check, run, import)
5151
- `lib.rs`: Core library with `Secrets` struct, validation logic, and CRUD operations
52+
- `config.rs`: Core configuration types (Config, Secret), TOML parsing, and inheritance logic
5253
- `provider/`: Storage backend implementations with trait-based plugin architecture
5354

5455
2. **secretspec-derive**: Proc macro for type-safe code generation
@@ -57,12 +58,6 @@ The project is organized as a Rust workspace with three interdependent crates:
5758
- Supports both union types (safe for any profile) and profile-specific types
5859
- Validates secret names produce valid Rust identifiers
5960

60-
3. **secretspec-core**: Shared type definitions
61-
- Core configuration types (Config, Secret)
62-
- TOML parsing and serialization
63-
- Config file inheritance logic with circular dependency detection
64-
- Provider enum definitions
65-
6661
## Provider System
6762

6863
The provider system uses a trait-based architecture defined in `src/provider/mod.rs`. When implementing new providers:
@@ -140,5 +135,4 @@ Note: Some providers (like `env`) are read-only and will skip write tests.
140135
- `src/main.rs`: CLI command definitions
141136
- `src/lib.rs`: Core SecretSpec implementation
142137
- `secretspec-derive/src/lib.rs`: Code generation macro implementation
143-
- `secretspec-core/src/lib.rs`: Shared type definitions
144138
- `tests/integration/provider_tests.rs`: Generic provider test suite

Cargo.lock

Lines changed: 1 addition & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
[workspace]
2-
members = ["secretspec", "secretspec-derive", "secretspec-core", "examples/derive"]
2+
members = [
3+
"secretspec",
4+
"secretspec-derive",
5+
"examples/derive",
6+
]
37
resolver = "2"
48

59
[workspace.package]
@@ -31,8 +35,7 @@ trybuild = "1.0"
3135
insta = "1.34"
3236
linkme = "0.3"
3337
secretspec-derive = { version = "0.1.0", path = "./secretspec-derive" }
34-
secretspec-core = { version = "0.1.0", path = "./secretspec-core" }
35-
secretspec = { version = "0.1.0", path = "./secretspec", features = ["macros"] }
38+
secretspec = { version = "0.1.0", path = "./secretspec" }
3639

3740
# The profile that 'dist' will build with
3841
[profile.dist]

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ Generate strongly-typed Rust structs from your `secretspec.toml`:
137137

138138
```rust
139139
// Generate typed structs from secretspec.toml
140-
secretspec::define_secrets!("secretspec.toml");
140+
secretspec_derive::declare_secrets!("secretspec.toml");
141141

142142
fn main() -> Result<(), Box<dyn std::error::Error>> {
143143
// Load secrets with type safety

docs/src/content/docs/index.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ The Rust SDK generates strongly-typed structs from your `secretspec.toml`, ensur
142142

143143
```rust
144144
// Generate typed structs from secretspec.toml
145-
secretspec::define_secrets!("secretspec.toml");
145+
secretspec_derive::declare_secrets!("secretspec.toml");
146146

147147
fn main() -> Result<(), Box<dyn std::error::Error>> {
148148
// Load secrets with type-safe struct

docs/src/content/docs/reference/adding-providers.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub trait Provider: Send + Sync {
2020

2121
1. **Create provider module** in `src/provider/mybackend.rs`
2222
2. **Define config struct** with `Serialize`, `Deserialize`, `Default`, and `TryFrom<&Url>`
23-
3. **Implement provider struct** with the `#[provider]` macro for automatic registration
23+
3. **Implement provider struct** and use the `register_provider!` macro for automatic registration
2424
4. **Implement Provider trait** for your provider struct
2525
5. **Export from mod.rs**: Add `pub mod mybackend;`
2626

@@ -60,16 +60,19 @@ impl TryFrom<&Url> for MyBackendConfig {
6060
}
6161
}
6262

63-
#[crate::provider(
64-
name = "mybackend",
65-
description = "My custom backend provider",
66-
schemes = ["mybackend"],
67-
examples = ["mybackend://api.example.com", "mybackend://localhost:8080"],
68-
)]
6963
pub struct MyBackendProvider {
7064
config: MyBackendConfig,
7165
}
7266

67+
crate::register_provider! {
68+
struct: MyBackendProvider,
69+
config: MyBackendConfig,
70+
name: "mybackend",
71+
description: "My custom backend provider",
72+
schemes: ["mybackend"],
73+
examples: ["mybackend://api.example.com", "mybackend://localhost:8080"],
74+
}
75+
7376
impl MyBackendProvider {
7477
pub fn new(config: MyBackendConfig) -> Self {
7578
Self { config }

docs/src/content/docs/sdk/rust.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ Add to your `Cargo.toml`:
1212
```toml
1313
[dependencies]
1414
secretspec = { version = "0.1" }
15+
secretspec-derive = { version = "0.1" }
1516
```
1617

1718
Basic example:
1819

1920
```rust
2021
// Generate typed structs from secretspec.toml
21-
secretspec::define_secrets!("secretspec.toml");
22+
secretspec_derive::declare_secrets!("secretspec.toml");
2223

2324
fn main() -> Result<(), Box<dyn std::error::Error>> {
2425
// Load secrets using the builder pattern
@@ -51,7 +52,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
5152
The `load_profile()` method on the builder provides profile-specific types for your secrets:
5253

5354
```rust
54-
secretspec::define_secrets!("secretspec.toml");
55+
secretspec_derive::declare_secrets!("secretspec.toml");
5556

5657
fn main() -> Result<(), Box<dyn std::error::Error>> {
5758
// Load secrets with profile-specific types

examples/derive/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ edition.workspace = true
55

66
[dependencies]
77
secretspec.workspace = true
8+
secretspec-derive.workspace = true
89
url.workspace = true
910
serde.workspace = true
1011

examples/derive/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This example demonstrates how to use SecretSpec's proc macro to create strongly-
44

55
## How it works
66

7-
1. The `secretspec::define_secrets!()` macro generates Rust structs from `secretspec.toml` at compile time
7+
1. The `secretspec_derive::declare_secrets!()` macro generates Rust structs from `secretspec.toml` at compile time
88
2. The generated types include:
99
- `SecretSpec` struct with union types (safe for any profile)
1010
- `SecretSpecProfile` enum with profile-specific field types

examples/derive/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Use the proc macro to generate typed structs from secretspec.toml
22
// This generates: SecretSpec, SecretSpecProfile, Profile, and Provider types
3-
secretspec::define_secrets!("secretspec.toml");
3+
secretspec_derive::declare_secrets!("secretspec.toml");
44

55
fn main() -> Result<(), Box<dyn std::error::Error>> {
66
println!("SecretSpec Code Generation Example\n");

0 commit comments

Comments
 (0)