# 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.