# ModelStruct
A Rust crate that provides a derive macro `Model` to automatically generate SQL `CREATE TABLE IF NOT EXISTS` statements from struct definitions.
## Features
- **Automatic SQL Generation**: Derive the `Model` trait to generate SQL table creation statements
- **Type Safety**: Only supports a limited set of Rust types that can be safely mapped to SQL types
- **Nullable Support**: Handles `Option<T>` types as nullable columns
- **Simple API**: Just derive `Model` and call `create_table_sql()` or `table_name()`
## Supported Types
| `i8`, `i16`, `i32` | `INTEGER` | 32-bit integers |
| `i64` | `BIGINT` | 64-bit integers |
| `u8`, `u16`, `u32` | `INTEGER` | Unsigned integers |
| `u64` | `BIGINT` | Unsigned 64-bit integers |
| `f32`, `f64` | `REAL` | Floating point numbers |
| `bool` | `BOOLEAN` | Boolean values |
| `String` | `TEXT` | String values |
| `str` | `TEXT` | String slices |
| `Option<T>` | `T NULL` | Nullable columns |
## Usage
### Basic Example
```rust
use modelstruct::Model;
#[derive(Model)]
struct User {
id: i32,
name: String,
email: String,
age: Option<i32>,
is_active: bool,
created_at: String,
}
fn main() {
// Generate the SQL statement
let sql = User::create_table_sql();
println!("{}", sql);
// Get the table name
let table_name = User::table_name();
println!("Table name: {}", table_name);
}
```
This will generate SQL like:
```sql
CREATE TABLE IF NOT EXISTS user (
id INTEGER,
name TEXT,
email TEXT,
age INTEGER NULL,
is_active BOOLEAN,
created_at TEXT
);
```
### Generated Methods
When you derive `Model`, the following methods are automatically implemented:
- `create_table_sql() -> String`: Returns the complete SQL statement to create the table
- `table_name() -> String`: Returns the table name (struct name in lowercase)
## Installation
Add this to your `Cargo.toml`:
```toml
[dependencies]
modelstruct = "0.1.0"
```
## Examples
See the `examples/` directory for more usage examples.
## Limitations
- Only supports structs (not enums or unions)
- Only supports the limited set of types listed above
- Table names are automatically generated from struct names (lowercase)
- No support for custom column names or constraints yet
## License
MIT