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 }