# JSON Reader

Reads database schema definitions from JSON files.

## Overview

The JSON Reader parses JSON files that define database schemas in RelSpec's canonical JSON format and converts them into RelSpec's internal database model representation.

## Features

- Reads RelSpec's standard JSON schema format
- Supports complete schema representation including:
  - Databases and schemas
  - Tables, columns, and data types
  - Constraints (PK, FK, unique, check)
  - Indexes
  - Relationships
  - Views and sequences

## Usage

### Basic Example

```go
package main

import (
    "fmt"
    "git.warky.dev/wdevs/relspecgo/pkg/readers"
    "git.warky.dev/wdevs/relspecgo/pkg/readers/json"
)

func main() {
    options := &readers.ReaderOptions{
        FilePath: "/path/to/schema.json",
    }

    reader := json.NewReader(options)
    db, err := reader.ReadDatabase()
    if err != nil {
        panic(err)
    }

    fmt.Printf("Found %d schemas\n", len(db.Schemas))
}
```

### CLI Example

```bash
# Read JSON schema and convert to GORM models
relspec --input json --in-file schema.json --output gorm --out-file models.go

# Convert JSON to PostgreSQL DDL
relspec --input json --in-file database.json --output pgsql --out-file schema.sql

# Transform JSON to YAML
relspec --input json --in-file schema.json --output yaml --out-file schema.yaml
```

## Example JSON Schema

```json
{
  "name": "myapp",
  "database_type": "postgresql",
  "schemas": [
    {
      "name": "public",
      "tables": [
        {
          "name": "users",
          "schema": "public",
          "columns": {
            "id": {
              "name": "id",
              "type": "bigint",
              "not_null": true,
              "is_primary_key": true,
              "auto_increment": true,
              "sequence": 1
            },
            "username": {
              "name": "username",
              "type": "varchar",
              "length": 50,
              "not_null": true,
              "sequence": 2
            },
            "email": {
              "name": "email",
              "type": "varchar",
              "length": 100,
              "not_null": true,
              "sequence": 3
            }
          },
          "constraints": {
            "pk_users": {
              "name": "pk_users",
              "type": "PRIMARY KEY",
              "columns": ["id"]
            },
            "uq_users_username": {
              "name": "uq_users_username",
              "type": "UNIQUE",
              "columns": ["username"]
            }
          },
          "indexes": {
            "idx_users_email": {
              "name": "idx_users_email",
              "columns": ["email"],
              "unique": false,
              "type": "btree"
            }
          }
        }
      ]
    }
  ]
}
```

## Schema Structure

The JSON format follows RelSpec's internal model structure:

- `Database` - Top-level container
  - `name` - Database name
  - `database_type` - Database system (postgresql, mysql, etc.)
  - `schemas[]` - Array of schemas

- `Schema` - Schema/namespace
  - `name` - Schema name
  - `tables[]` - Array of tables
  - `views[]` - Array of views
  - `sequences[]` - Array of sequences

- `Table` - Table definition
  - `name` - Table name
  - `columns{}` - Map of columns
  - `constraints{}` - Map of constraints
  - `indexes{}` - Map of indexes
  - `relationships{}` - Map of relationships

## Notes

- This is RelSpec's native interchange format
- Preserves complete schema information
- Ideal for version control and schema documentation
- Can be used as an intermediate format for transformations
