func (i *Interface) GetDescription() string {
	return i.Description
}
/*
GetDescription returns the description of the interface
package gql
import (
	"context"
	"fmt"
	"reflect"
	"strings"
	"github.com/rigglo/gql/pkg/language/ast"
)
type Schema struct {
	Query           *Object
	Mutation        *Object
	Subscription    *Object
	Directives      TypeSystemDirectives
	AdditionalTypes []Type
	RootValue       interface{}
}
func (s Schema) SDL() string {
	b := newSDLBuilder(&s)
	return b.Build()
}
type TypeKind uint
const (
	ScalarKind TypeKind = iota
	ObjectKind
	InterfaceKind
	UnionKind
	EnumKind
	InputObjectKind
	NonNullKind
	ListKind
)
type Type interface {
	GetName() string
	GetDescription() string
	GetKind() TypeKind
	String() string
}
func isInputType(t Type) bool {
	if t.GetKind() == ListKind || t.GetKind() == NonNullKind {
		return isInputType(t.(WrappingType).Unwrap())
	}
	if t.GetKind() == ScalarKind || t.GetKind() == EnumKind || t.GetKind() == InputObjectKind {
		return true
	}
	return false
}
func isOutputType(t Type) bool {
	if t.GetKind() == ListKind || t.GetKind() == NonNullKind {
		return isOutputType(t.(WrappingType).Unwrap())
	}
	if t.GetKind() == ScalarKind || t.GetKind() == ObjectKind || t.GetKind() == InterfaceKind || t.GetKind() == UnionKind || t.GetKind() == EnumKind {
		return true
	}
	return false
}
type List struct {
	Name        string
	Description string
	Wrapped     Type
}
func NewList(t Type) Type {
	return &List{
		Name:        "List",
		Description: "Built-in 'List' type",
		Wrapped:     t,
	}
}
func (l *List) GetName() string {
	return l.Name
}
func (l *List) GetDescription() string {
	return l.Description
}
func (l *List) GetKind() TypeKind {
	return ListKind
}
func (l *List) Unwrap() Type {
	return l.Wrapped
}
func (l *List) String() string {
	return fmt.Sprintf("[%s]", l.Wrapped.String())
}
type NonNull struct {
	Name        string
	Description string
	Wrapped     Type
}
func NewNonNull(t Type) Type {
	return &NonNull{
		Name:        "NonNull",
		Description: "Built-in 'NonNull' type",
		Wrapped:     t,
	}
}
func (l *NonNull) GetName() string {
	return l.Name
}
func (l *NonNull) GetDescription() string {
	return l.Description
}
func (l *NonNull) GetKind() TypeKind {
	return NonNullKind
}
func (l *NonNull) Unwrap() Type {
	return l.Wrapped
}
func (l *NonNull) String() string {
	return fmt.Sprintf("%s!", l.Wrapped.String())
}
type CoerceResultFunc func(interface{}) (interface{}, error)
type CoerceInputFunc func(interface{}) (interface{}, error)
type ScalarAstValueValidator func(ast.Value) error
type Scalar struct {
	Name             string
	Description      string
	Directives       TypeSystemDirectives
	CoerceResultFunc CoerceResultFunc
	CoerceInputFunc  CoerceInputFunc
	AstValidator     ScalarAstValueValidator
}
func (s *Scalar) GetName() string {
	return s.Name
}
func (s *Scalar) GetDescription() string {
	return s.Description
}
func (s *Scalar) GetKind() TypeKind {
	return ScalarKind
}
func (s *Scalar) GetDirectives() []TypeSystemDirective {
	return s.Directives
}
func (s *Scalar) CoerceResult(i interface{}) (interface{}, error) {
	return s.CoerceResultFunc(i)
}
func (s *Scalar) CoerceInput(i interface{}) (interface{}, error) {
	return s.CoerceInputFunc(i)
}
func (s *Scalar) String() string {
	return s.Name
}
type Enum struct {
	Name        string
	Description string
	Directives  TypeSystemDirectives
	Values      EnumValues
}
func (e *Enum) GetDescription() string {
	return e.Description
}
func (e *Enum) GetName() string {
	return e.Name
}
func (e *Enum) GetDirectives() []TypeSystemDirective {
	return e.Directives
}
func (e *Enum) GetKind() TypeKind {
	return EnumKind
}
func (e *Enum) GetValues() []*EnumValue {
	return e.Values
}
func (e *Enum) String() string {
	return e.Name
}
type EnumValues []*EnumValue
type EnumValue struct {
	Name        string
	Description string
	Directives  TypeSystemDirectives
	Value       interface{}
}
func (e EnumValue) GetDescription() string {
	return e.Description
}
func (e EnumValue) GetDirectives() []TypeSystemDirective {
	return e.Directives
}
func (e EnumValue) GetValue() interface{} {
	return e.Value
}
func (e EnumValue) IsDeprecated() bool {
	for _, d := range e.Directives {
		if _, ok := d.(*deprecated); ok {
			return true
		}
	}
	return false
}
type Object struct {
	Description string
	Name        string
	Implements  Interfaces
	Directives  TypeSystemDirectives
	Fields      Fields
}
func (o *Object) GetDescription() string {
	return o.Description
}
func (o *Object) GetName() string {
	return o.Name
}
func (o *Object) GetKind() TypeKind {
	return ObjectKind
}
func (o *Object) GetInterfaces() []*Interface {
	return o.Implements
}
func (o *Object) GetDirectives() []TypeSystemDirective {
	return o.Directives
}
func (o *Object) GetFields() map[string]*Field {
	return o.Fields
}
func (o *Object) AddField(name string, f *Field) {
	o.Fields[name] = f
}
func (o *Object) DoesImplement(i *Interface) bool {
	for _, in := range o.Implements {
		if in.Name == i.Name {
			return true
		}
	}
	return false
}
func (o *Object) String() string {
	return o.Name
}
type Interfaces []*Interface
type Interface struct {
	Description  string
	Name         string
	Directives   TypeSystemDirectives
	Fields       Fields
	TypeResolver TypeResolver
}
type TypeResolver func(context.Context, interface{}) *Object