git.sr.ht/~sircmpwn/gqlgen@v0.0.0-20200522192042-c84d29a1c940/codegen/config/resolver.go (about)

     1  package config
     2  
     3  import (
     4  	"fmt"
     5  	"go/types"
     6  	"path/filepath"
     7  	"strings"
     8  
     9  	"git.sr.ht/~sircmpwn/gqlgen/internal/code"
    10  )
    11  
    12  type ResolverConfig struct {
    13  	Filename string         `yaml:"filename,omitempty"`
    14  	Package  string         `yaml:"package,omitempty"`
    15  	Type     string         `yaml:"type,omitempty"`
    16  	Layout   ResolverLayout `yaml:"layout,omitempty"`
    17  	DirName  string         `yaml:"dir"`
    18  }
    19  
    20  type ResolverLayout string
    21  
    22  var (
    23  	LayoutSingleFile   ResolverLayout = "single-file"
    24  	LayoutFollowSchema ResolverLayout = "follow-schema"
    25  )
    26  
    27  func (r *ResolverConfig) Check() error {
    28  	if r.Layout == "" {
    29  		r.Layout = LayoutSingleFile
    30  	}
    31  	if r.Type == "" {
    32  		r.Type = "Resolver"
    33  	}
    34  
    35  	switch r.Layout {
    36  	case LayoutSingleFile:
    37  		if r.Filename == "" {
    38  			return fmt.Errorf("filename must be specified with layout=%s", r.Layout)
    39  		}
    40  		if !strings.HasSuffix(r.Filename, ".go") {
    41  			return fmt.Errorf("filename should be path to a go source file with layout=%s", r.Layout)
    42  		}
    43  		r.Filename = abs(r.Filename)
    44  	case LayoutFollowSchema:
    45  		if r.DirName == "" {
    46  			return fmt.Errorf("dirname must be specified with layout=%s", r.Layout)
    47  		}
    48  		r.DirName = abs(r.DirName)
    49  		if r.Filename == "" {
    50  			r.Filename = filepath.Join(r.DirName, "resolver.go")
    51  		} else {
    52  			r.Filename = abs(r.Filename)
    53  		}
    54  	default:
    55  		return fmt.Errorf("invalid layout %s. must be %s or %s", r.Layout, LayoutSingleFile, LayoutFollowSchema)
    56  	}
    57  
    58  	if strings.ContainsAny(r.Package, "./\\") {
    59  		return fmt.Errorf("package should be the output package name only, do not include the output filename")
    60  	}
    61  
    62  	if r.Package == "" && r.Dir() != "" {
    63  		r.Package = code.NameForDir(r.Dir())
    64  	}
    65  
    66  	return nil
    67  }
    68  
    69  func (r *ResolverConfig) ImportPath() string {
    70  	if r.Dir() == "" {
    71  		return ""
    72  	}
    73  	return code.ImportPathForDir(r.Dir())
    74  }
    75  
    76  func (r *ResolverConfig) Dir() string {
    77  	switch r.Layout {
    78  	case LayoutSingleFile:
    79  		if r.Filename == "" {
    80  			return ""
    81  		}
    82  		return filepath.Dir(r.Filename)
    83  	case LayoutFollowSchema:
    84  		return r.DirName
    85  	default:
    86  		panic("invalid layout " + r.Layout)
    87  	}
    88  }
    89  
    90  func (r *ResolverConfig) Pkg() *types.Package {
    91  	if r.Dir() == "" {
    92  		return nil
    93  	}
    94  	return types.NewPackage(r.ImportPath(), r.Package)
    95  }
    96  
    97  func (r *ResolverConfig) IsDefined() bool {
    98  	return r.Filename != "" || r.DirName != ""
    99  }