# reqsign-core
Core components for signing API requests.
---
This crate provides the foundational types and traits for the reqsign ecosystem. It defines the core abstractions that enable flexible and extensible request signing.
## Quick Start
```rust
use reqsign_core::{Context, Signer, ProvideCredential, SignRequest};
// Create a context with your implementations
let ctx = Context::default();
// Create a signer with credential loader and request builder
let signer = Signer::new(ctx, credential_loader, request_builder);
// Sign your requests
let mut parts = /* your request parts */;
signer.sign(&mut parts, None).await?;
```
## Features
- **Flexible Architecture**: Define your own credential types and signing logic
- **Async Support**: Built with async/await for modern Rust applications
- **Environment Integration**: Access environment variables through the Context
- **Type Safety**: Strong typing ensures compile-time correctness
## Core Concepts
### Context
The `Context` struct serves as a container for runtime dependencies:
- File system access via `FileRead` trait
- HTTP client via `HttpSend` trait
- Environment variables via `Env` trait
### Traits
- **`ProvideCredential`**: Load credentials from various sources
- **`SignRequest`**: Build service-specific signing requests
- **`SigningCredential`**: Validate credential validity
- **`FileRead`**: Async file reading operations
- **`HttpSend`**: HTTP request execution
- **`Env`**: Environment variable access
### Signer
The `Signer` orchestrates the signing process by:
1. Loading credentials using the provided loader
2. Building signing requests with the builder
3. Applying signatures to HTTP requests
## Examples
Check out the [custom_signer example](examples/custom_signer.rs) to see how to implement your own signing logic.
```bash
cargo run --example custom_signer
```
## Integration
This crate is typically used with service-specific implementations:
- `reqsign-aws-v4` for AWS services
- `reqsign-aliyun-oss` for Aliyun OSS
- `reqsign-azure-storage` for Azure Storage
- And more...
## License
Licensed under [Apache License, Version 2.0](./LICENSE).