Files
genqlient/generate/parse.go
T
2020-01-02 18:48:29 -08:00

53 lines
1.6 KiB
Go

package generate
import (
"fmt"
"io/ioutil"
"github.com/vektah/gqlparser"
"github.com/vektah/gqlparser/ast"
"github.com/vektah/gqlparser/parser"
"github.com/vektah/gqlparser/validator"
)
func getSchema(filename string) (*ast.Schema, error) {
// TODO: IRL we have to get the schema from GraphQL (maybe we can generate
// that once we can bootstrap) where it comes as JSON, not SDL, so we have
// to convert (or add gqlparser support to convert)
text, err := ioutil.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("unreadable schema file %v: %v", filename, err)
}
schema, graphqlError := gqlparser.LoadSchema(
&ast.Source{Name: filename, Input: string(text)})
if graphqlError != nil {
return nil, fmt.Errorf("invalid schema file %v: %v",
filename, graphqlError)
}
return schema, nil
}
func getAndValidateQueries(filename string, schema *ast.Schema) (*ast.QueryDocument, error) {
text, err := ioutil.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("unreadable query-spec file %v: %v", filename, err)
}
// The following is more or less gqlparser.LoadQuery, but we can provide a
// name so we might as well (and we break out the two errors).
document, graphqlError := parser.ParseQuery(
&ast.Source{Name: filename, Input: string(text)})
if graphqlError != nil { // ParseQuery returns type *graphql.Error, yuck
return nil, fmt.Errorf("invalid query-spec file %v: %v", filename, graphqlError)
}
graphqlErrors := validator.Validate(schema, document)
if graphqlErrors != nil {
return nil, fmt.Errorf("query-spec does not match schema: %v", graphqlErrors)
}
return document, nil
}