111 lines
3.6 KiB
Markdown
111 lines
3.6 KiB
Markdown
|
|
# Mail2Couch Rust Implementation
|
||
|
|
|
||
|
|
This directory contains the Rust implementation of mail2couch, which will provide the same functionality as the Go implementation while maintaining full compatibility with the CouchDB document schemas.
|
||
|
|
|
||
|
|
## Current Status
|
||
|
|
|
||
|
|
🚧 **Work in Progress** - The Rust implementation is planned for future development.
|
||
|
|
|
||
|
|
Currently available:
|
||
|
|
- ✅ **CouchDB Schema Definitions**: Complete Rust structs that match the Go implementation
|
||
|
|
- ✅ **Serialization Support**: Full serde integration for JSON handling
|
||
|
|
- ✅ **Type Safety**: Strongly typed structures for all CouchDB documents
|
||
|
|
- ✅ **Compatibility Tests**: Validated against example documents
|
||
|
|
- ✅ **Database Naming**: Same database naming logic as Go implementation
|
||
|
|
|
||
|
|
## Schema Compatibility
|
||
|
|
|
||
|
|
The Rust implementation uses the same CouchDB document schemas as the Go implementation:
|
||
|
|
|
||
|
|
### Mail Documents
|
||
|
|
```rust
|
||
|
|
use mail2couch::{MailDocument, generate_database_name};
|
||
|
|
|
||
|
|
let mut doc = MailDocument::new(
|
||
|
|
"123".to_string(), // IMAP UID
|
||
|
|
"INBOX".to_string(), // Mailbox
|
||
|
|
vec!["sender@example.com".to_string()], // From
|
||
|
|
vec!["recipient@example.com".to_string()], // To
|
||
|
|
"Subject".to_string(), // Subject
|
||
|
|
Utc::now(), // Date
|
||
|
|
"Body content".to_string(), // Body
|
||
|
|
HashMap::new(), // Headers
|
||
|
|
false, // Has attachments
|
||
|
|
);
|
||
|
|
|
||
|
|
doc.set_id(); // Sets ID to "INBOX_123"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Sync Metadata
|
||
|
|
```rust
|
||
|
|
use mail2couch::SyncMetadata;
|
||
|
|
|
||
|
|
let metadata = SyncMetadata::new(
|
||
|
|
"INBOX".to_string(), // Mailbox
|
||
|
|
Utc::now(), // Last sync time
|
||
|
|
456, // Last message UID
|
||
|
|
100, // Message count
|
||
|
|
);
|
||
|
|
// ID automatically set to "sync_metadata_INBOX"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Database Naming
|
||
|
|
```rust
|
||
|
|
use mail2couch::generate_database_name;
|
||
|
|
|
||
|
|
let db_name = generate_database_name("Personal Gmail", "");
|
||
|
|
// Returns: "m2c_personal_gmail"
|
||
|
|
|
||
|
|
let db_name = generate_database_name("", "user@example.com");
|
||
|
|
// Returns: "m2c_user_example_com"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Dependencies
|
||
|
|
|
||
|
|
The Rust implementation uses these key dependencies:
|
||
|
|
|
||
|
|
- **serde**: JSON serialization/deserialization
|
||
|
|
- **chrono**: Date/time handling with ISO8601 support
|
||
|
|
- **reqwest**: HTTP client for CouchDB API
|
||
|
|
- **tokio**: Async runtime
|
||
|
|
- **anyhow/thiserror**: Error handling
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
Run the schema compatibility tests:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cargo test
|
||
|
|
```
|
||
|
|
|
||
|
|
All tests validate that the Rust structures produce JSON compatible with the Go implementation and documented schemas.
|
||
|
|
|
||
|
|
## Future Implementation
|
||
|
|
|
||
|
|
The planned Rust implementation will include:
|
||
|
|
|
||
|
|
- **IMAP Client**: Connect to mail servers and retrieve messages
|
||
|
|
- **CouchDB Integration**: Store documents using native Rust CouchDB client
|
||
|
|
- **Configuration**: Same JSON config format as Go implementation
|
||
|
|
- **CLI Interface**: Compatible command-line interface
|
||
|
|
- **Performance**: Leveraging Rust's performance characteristics
|
||
|
|
- **Memory Safety**: Rust's ownership model for reliable operation
|
||
|
|
|
||
|
|
## Schema Documentation
|
||
|
|
|
||
|
|
See the following files for complete schema documentation:
|
||
|
|
|
||
|
|
- [`../couchdb-schemas.md`](../couchdb-schemas.md): Complete schema specification
|
||
|
|
- [`../examples/`](../examples/): JSON example documents
|
||
|
|
- [`src/schemas.rs`](src/schemas.rs): Rust type definitions
|
||
|
|
|
||
|
|
## Cross-Implementation Compatibility
|
||
|
|
|
||
|
|
Both Go and Rust implementations:
|
||
|
|
- Use identical CouchDB document schemas
|
||
|
|
- Generate the same database names
|
||
|
|
- Store documents with the same field names and types
|
||
|
|
- Support incremental sync with compatible metadata
|
||
|
|
- Handle attachments using CouchDB native attachment storage
|
||
|
|
|
||
|
|
This ensures that databases created by either implementation can be used interchangeably.
|