Skip to content

Commit

Permalink
openapi3: introduce LoadFromIoReader (#906)
Browse files Browse the repository at this point in the history
* add loader from io.Reader

* fix docs

* fix whitespace

* fix loader := NewLoader()
  • Loading branch information
Reuven Harrison authored Feb 11, 2024
1 parent 439335c commit 3bbab36
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
3 changes: 3 additions & 0 deletions .github/docs/openapi3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,9 @@ func (loader *Loader) LoadFromDataWithPath(data []byte, location *url.URL) (*T,
func (loader *Loader) LoadFromFile(location string) (*T, error)
LoadFromFile loads a spec from a local file path

func (loader *Loader) LoadFromIoReader(reader io.Reader) (*T, error)
LoadFromStdin loads a spec from io.Reader

func (loader *Loader) LoadFromStdin() (*T, error)
LoadFromStdin loads a spec from stdin

Expand Down
13 changes: 11 additions & 2 deletions openapi3/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,18 @@ func (loader *Loader) readURL(location *url.URL) ([]byte, error) {

// LoadFromStdin loads a spec from stdin
func (loader *Loader) LoadFromStdin() (*T, error) {
data, err := io.ReadAll(os.Stdin)
return loader.LoadFromIoReader(os.Stdin)
}

// LoadFromStdin loads a spec from io.Reader
func (loader *Loader) LoadFromIoReader(reader io.Reader) (*T, error) {
if reader == nil {
return nil, fmt.Errorf("invalid reader: %v", reader)
}

data, err := io.ReadAll(reader)
if err != nil {
return nil, fmt.Errorf("read from stdin: %w", err)
return nil, err
}
return loader.LoadFromData(data)
}
Expand Down
51 changes: 51 additions & 0 deletions openapi3/loader_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package openapi3

import (
"bytes"
"fmt"
"net"
"net/http"
Expand Down Expand Up @@ -621,3 +622,53 @@ servers:
})
}
}

func TestReadFromIoReader(t *testing.T) {
buffer := bytes.NewReader([]byte(`openapi: 3.0.0
info:
title: An API
version: v1
components:
schemas:
NewItem:
required: [name]
properties:
name: {type: string}
tag: {type: string}
ErrorModel:
type: object
required: [code, message]
properties:
code: {type: integer}
message: {type: string}
paths:
/items:
put:
description: ''
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NewItem'
responses:
default: &defaultResponse # a YAML ref
description: unexpected error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorModel'`))

loader := NewLoader()
doc, err := loader.LoadFromIoReader(buffer)
require.NoError(t, err)

err = doc.Validate(loader.Context)
require.NoError(t, err)
}

func TestReadFromIoReader_Nil(t *testing.T) {
loader := NewLoader()
_, err := loader.LoadFromIoReader(nil)
require.EqualError(t, err, "invalid reader: <nil>")
}

0 comments on commit 3bbab36

Please sign in to comment.