package yaml import ( "fmt" "os" "gopkg.in/yaml.v3" "git.warky.dev/wdevs/relspecgo/pkg/models" "git.warky.dev/wdevs/relspecgo/pkg/readers" ) // Reader implements the readers.Reader interface for YAML format type Reader struct { options *readers.ReaderOptions } // NewReader creates a new YAML reader with the given options func NewReader(options *readers.ReaderOptions) *Reader { return &Reader{ options: options, } } // ReadDatabase reads and parses YAML input, returning a Database model func (r *Reader) ReadDatabase() (*models.Database, error) { if r.options.FilePath == "" { return nil, fmt.Errorf("file path is required for YAML reader") } content, err := os.ReadFile(r.options.FilePath) if err != nil { return nil, fmt.Errorf("failed to read file: %w", err) } var db models.Database if err := yaml.Unmarshal(content, &db); err != nil { return nil, fmt.Errorf("failed to unmarshal YAML: %w", err) } return &db, nil } // ReadSchema reads and parses YAML input, returning a Schema model func (r *Reader) ReadSchema() (*models.Schema, error) { if r.options.FilePath == "" { return nil, fmt.Errorf("file path is required for YAML reader") } content, err := os.ReadFile(r.options.FilePath) if err != nil { return nil, fmt.Errorf("failed to read file: %w", err) } var schema models.Schema if err := yaml.Unmarshal(content, &schema); err != nil { return nil, fmt.Errorf("failed to unmarshal YAML: %w", err) } return &schema, nil } // ReadTable reads and parses YAML input, returning a Table model func (r *Reader) ReadTable() (*models.Table, error) { if r.options.FilePath == "" { return nil, fmt.Errorf("file path is required for YAML reader") } content, err := os.ReadFile(r.options.FilePath) if err != nil { return nil, fmt.Errorf("failed to read file: %w", err) } var table models.Table if err := yaml.Unmarshal(content, &table); err != nil { return nil, fmt.Errorf("failed to unmarshal YAML: %w", err) } return &table, nil }