package json import ( "encoding/json" "fmt" "os" "git.warky.dev/wdevs/relspecgo/pkg/models" "git.warky.dev/wdevs/relspecgo/pkg/writers" ) // Writer implements the writers.Writer interface for JSON format type Writer struct { options *writers.WriterOptions } // NewWriter creates a new JSON writer with the given options func NewWriter(options *writers.WriterOptions) *Writer { return &Writer{ options: options, } } // WriteDatabase writes a complete database as JSON func (w *Writer) WriteDatabase(db *models.Database) error { // Pretty print JSON with indentation data, err := json.MarshalIndent(db, "", " ") if err != nil { return fmt.Errorf("failed to marshal database to JSON: %w", err) } return w.writeOutput(data) } // WriteSchema writes a schema as JSON func (w *Writer) WriteSchema(schema *models.Schema) error { data, err := json.MarshalIndent(schema, "", " ") if err != nil { return fmt.Errorf("failed to marshal schema to JSON: %w", err) } return w.writeOutput(data) } // WriteTable writes a single table as JSON func (w *Writer) WriteTable(table *models.Table) error { data, err := json.MarshalIndent(table, "", " ") if err != nil { return fmt.Errorf("failed to marshal table to JSON: %w", err) } return w.writeOutput(data) } // writeOutput writes the content to file or stdout func (w *Writer) writeOutput(data []byte) error { if w.options.OutputPath != "" { return os.WriteFile(w.options.OutputPath, data, 0644) } // Print to stdout fmt.Println(string(data)) return nil }