---
title: Feature Flags Reference
description: Complete guide to Spring Batch RS feature flags and optional dependencies
sidebar:
  order: 1
---

import { Card, CardGrid, Aside } from '@astrojs/starlight/components';

Spring Batch RS uses feature flags to enable optional functionality. This keeps the core library lean while allowing you to opt into specific capabilities.

## Core Features (Always Available)

These features are always included and require no feature flags:

<CardGrid>
  <Card title="Core Traits" icon="star">
    ItemReader, ItemWriter, ItemProcessor, Tasklet
  </Card>
  <Card title="Job & Step" icon="puzzle">
    JobBuilder, StepBuilder, execution management
  </Card>
  <Card title="Error Handling" icon="warning">
    BatchError, fault tolerance, skip/retry logic
  </Card>
  <Card title="Logger Writer" icon="pencil">
    LoggerWriter for debugging output
  </Card>
</CardGrid>

---

## File Format Features

### CSV

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["csv"] }
```

**Provides:**
- `CsvItemReader<R>` - Read CSV files and strings
- `CsvItemWriter<O, W>` - Write CSV files

**Use for:**
- Comma/tab/custom-delimited files
- Headers or headerless CSV
- Data import/export pipelines

**Dependencies:**
- `csv` crate

---

### JSON

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["json"] }
```

**Provides:**
- `JsonItemReader<I, R>` - Streaming JSON array reader
- `JsonItemWriter<O, W>` - JSON array writer with pretty-printing

**Use for:**
- REST API data processing
- Configuration file manipulation
- JSON data transformation

**Dependencies:**
- `serde_json` crate

---

### XML

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["xml"] }
```

**Provides:**
- `XmlItemReader<R, I>` - Extract elements by tag name
- `XmlItemWriter<O, W>` - Generate XML documents

**Use for:**
- SOAP/XML API integration
- RSS/Atom feed processing
- Legacy XML data migration

**Dependencies:**
- `quick-xml` crate
- `serde-xml-rs` crate

---

## Database Features

### PostgreSQL

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["rdbc-postgres"] }
sqlx = { version = "0.7", features = ["runtime-tokio-native-tls", "postgres"] }
```

**Provides:**
- `PostgresRdbcItemReader<I>` - Paginated PostgreSQL queries
- `PostgresItemWriter<O>` - Bulk PostgreSQL inserts

**Use for:**
- Reading from PostgreSQL tables
- ETL from PostgreSQL to other systems
- Bulk data loading

**Dependencies:**
- `sqlx` with PostgreSQL support
- `tokio` async runtime

---

### MySQL

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["rdbc-mysql"] }
sqlx = { version = "0.7", features = ["runtime-tokio-native-tls", "mysql"] }
```

**Provides:**
- `MysqlRdbcItemReader<I>` - Paginated MySQL queries
- `MysqlItemWriter<O>` - Bulk MySQL inserts

**Use for:**
- MySQL/MariaDB data extraction
- Database migrations
- Reporting queries

**Dependencies:**
- `sqlx` with MySQL support
- `tokio` async runtime

---

### SQLite

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["rdbc-sqlite"] }
sqlx = { version = "0.7", features = ["runtime-tokio-native-tls", "sqlite"] }
```

**Provides:**
- `SqliteRdbcItemReader<I>` - Paginated SQLite queries
- `SqliteItemWriter<O>` - Bulk SQLite inserts

**Use for:**
- Embedded database processing
- Local data stores
- Testing and development

**Dependencies:**
- `sqlx` with SQLite support
- `tokio` async runtime

---

## NoSQL Features

### MongoDB

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["mongodb"] }
mongodb = "2.8"
```

**Provides:**
- `MongodbItemReader<I>` - Cursor-based MongoDB queries
- `MongodbItemWriter<O>` - Bulk MongoDB inserts

**Use for:**
- Document database processing
- MongoDB data migration
- Collection transformations

**Dependencies:**
- `mongodb` official driver
- Requires `WithObjectId` trait implementation

---

## ORM Feature

### SeaORM

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["orm"] }
sea-orm = { version = "0.12", features = ["sqlx-postgres", "runtime-tokio-native-tls"] }
```

**Provides:**
- `OrmItemReader<I>` - Read using SeaORM entities
- `OrmItemWriter<O>` - Write using SeaORM entities

**Use for:**
- Type-safe database access
- Working with existing SeaORM models
- Complex query building

**Dependencies:**
- `sea-orm` with appropriate database backend

---

## Tasklet Features

### ZIP Compression

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["zip"] }
```

**Provides:**
- `ZipTasklet` - Compress files and directories

**Capabilities:**
- Configurable compression levels (0-9)
- File filtering with glob patterns
- Directory structure preservation
- Single file or directory compression

**Use for:**
- Backup operations
- Log file archival
- Report packaging

**Dependencies:**
- `zip` crate

---

### FTP Transfers

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["ftp"] }
```

**Provides:**
- `FtpTasklet` - Upload/download via FTP/FTPS

**Capabilities:**
- FTP and FTPS (TLS) support
- Upload and download operations
- Authentication support
- Connection management

**Use for:**
- File distribution
- Remote backup
- Legacy system integration

**Dependencies:**
- `ftp` crate

---

### Amazon S3 Transfers

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["s3"] }
```

**Provides:**
- `S3PutTasklet` - Upload a local file to an S3 object
- `S3GetTasklet` - Download an S3 object to a local file

**Capabilities:**
- Single-file and multipart uploads (auto-selected by file size, default threshold 8 MiB)
- Streaming downloads (safe for large files — no full-file buffering)
- Explicit credentials or AWS default credential chain
- Custom endpoint URL for S3-compatible services (MinIO, LocalStack)
- Configurable AWS region

**Use for:**
- Cloud file ingestion / export
- ETL pipelines with S3 staging
- Backup and archival to object storage

**Dependencies:**
- `aws-sdk-s3` crate
- `aws-config` crate
- `tokio` async runtime

---

## Testing Feature

### Fake Data Generation

```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["fake"] }
```

**Provides:**
- `PersonReader` - Generate fake person data
- `Person` struct with realistic test data

**Use for:**
- Testing batch jobs
- Development without real data
- Performance testing

**Dependencies:**
- `fake` crate

---

## Feature Combinations

### Common Combinations

<Card title="File Processing">
  ```toml
  features = ["csv", "json", "xml"]
  ```
  Process all common file formats
</Card>

<Card title="Database ETL">
  ```toml
  features = ["rdbc-postgres", "rdbc-mysql", "csv", "json"]
  ```
  Database to file exports and imports
</Card>

<Card title="Complete Pipeline">
  ```toml
  features = ["csv", "json", "rdbc-postgres", "zip", "ftp"]
  ```
  End-to-end data pipeline with delivery
</Card>

<Card title="NoSQL Processing">
  ```toml
  features = ["mongodb", "json", "csv"]
  ```
  MongoDB data transformation
</Card>

---

## Dependency Impact

### Compile Time

| Feature Combination | Additional Compile Time |
|---------------------|------------------------|
| Core only | Baseline |
| + csv, json, xml | +10-15 seconds |
| + Single database | +30-45 seconds (sqlx) |
| + All databases | +45-60 seconds |
| + mongodb | +20-30 seconds |
| + All features | +60-90 seconds |

### Binary Size

| Feature Combination | Approximate Size (Release) |
|---------------------|---------------------------|
| Core only | ~1 MB |
| + File formats | ~2 MB |
| + Single database | ~4-5 MB |
| + All databases | ~7-9 MB |
| + All features | ~10-12 MB |

<Aside type="tip">
  Enable only the features you need to minimize compile times and binary size.
</Aside>

---

## Advanced Configuration

### Feature-Gated Code

Use conditional compilation for feature-specific code:

```rust
#[cfg(feature = "csv")]
use spring_batch_rs::item::csv::CsvItemReaderBuilder;

#[cfg(feature = "rdbc-postgres")]
use spring_batch_rs::item::rdbc::postgres::PostgresItemWriterBuilder;

fn create_reader() -> Box<dyn ItemReader<MyType>> {
    #[cfg(feature = "csv")]
    {
        Box::new(CsvItemReaderBuilder::new().from_path("data.csv").unwrap())
    }

    #[cfg(not(feature = "csv"))]
    {
        panic!("CSV feature not enabled")
    }
}
```

### Runtime Feature Detection

Check available features at runtime:

```rust
fn check_features() {
    println!("CSV support: {}", cfg!(feature = "csv"));
    println!("JSON support: {}", cfg!(feature = "json"));
    println!("PostgreSQL support: {}", cfg!(feature = "rdbc-postgres"));
}
```

---

## Migration Guide

### Upgrading from Minimal to Full Features

**Before:**
```toml
[dependencies]
spring-batch-rs = "0.1"
```

**After:**
```toml
[dependencies]
spring-batch-rs = { version = "0.1", features = ["csv", "json", "rdbc-postgres"] }
sqlx = { version = "0.7", features = ["runtime-tokio-native-tls", "postgres"] }
```

### Removing Unused Features

If your project grows and you want to optimize:

1. Audit your imports and identify which readers/writers you use
2. Map them to feature flags using the tables above
3. Remove unused features from `Cargo.toml`
4. Run `cargo clean` and rebuild

---

## Feature Request Guidelines

Can't find a feature you need? We welcome contributions!

<Aside type="note">
**Contribution Areas:**

- Additional database backends (Oracle, MSSQL, etc.)
- Cloud storage (Azure Blob, GCS)
- Message queues (Kafka, RabbitMQ, Redis)
- Additional file formats (Parquet, Avro, Protobuf)
- Network protocols (SFTP, SCP, HTTP/S)
</Aside>

## See Also

- [Getting Started](/spring-batch-rs/getting-started/) - Basic setup
- [Examples](/spring-batch-rs/examples/) - Feature-specific examples
- [API Reference](/spring-batch-rs/api/) - Complete API documentation
