Skip to content

Instantly share code, notes, and snippets.

@maxsei
Created July 4, 2024 21:56
Show Gist options
  • Select an option

  • Save maxsei/538a441b9d8512f80c72e3aa308b62d1 to your computer and use it in GitHub Desktop.

Select an option

Save maxsei/538a441b9d8512f80c72e3aa308b62d1 to your computer and use it in GitHub Desktop.
work in progress for generating nulls for gqlgen types
package main
import (
"fmt"
"go/importer"
"go/types"
"log"
"github.com/99designs/gqlgen/api"
"github.com/99designs/gqlgen/codegen/config"
"github.com/99designs/gqlgen/plugin"
"github.com/99designs/gqlgen/plugin/modelgen"
"github.com/vektah/gqlparser/v2/ast"
)
var (
sql_NullTime types.Type
sql_NullString types.Type
sql_Null types.Type
)
func init() {
{
pkg, err := importer.Default().Import("database/sql")
if err != nil {
panic(err)
}
sql_NullTime = pkg.Scope().Lookup("NullTime").Type()
sql_NullString = pkg.Scope().Lookup("NullString").Type()
sql_NullString = pkg.Scope().Lookup("Null").Type()
}
}
func main() {
cfg, err := config.LoadConfigFromDefaultLocations()
if err != nil {
log.Fatal(err)
}
if err := api.Generate(cfg, ReplaceModelgen()); err != nil {
log.Fatal(err)
}
}
func ReplaceModelgen() api.Option {
m := (modelgen.New()).(*modelgen.Plugin)
m.FieldHook = FieldHook
p := &Plugin{m}
return api.ReplacePlugin(p)
}
var _ plugin.ConfigMutator = &Plugin{}
type Plugin struct {
m *modelgen.Plugin
}
func (p *Plugin) Name() string { return p.m.Name() }
func (p *Plugin) MutateConfig(cfg *config.Config) error {
return p.m.MutateConfig(cfg)
}
func FieldHook(td *ast.Definition, fd *ast.FieldDefinition, f *modelgen.Field) (*modelgen.Field, error) {
if !fd.Type.NonNull {
if p, ok := f.Type.(*types.Pointer); ok {
switch v := p.Elem().(type) {
case *types.Basic:
switch v.Kind() {
case types.String:
f.Type = sql_NullString
default:
return f, fmt.Errorf("do not support nulls for basic type: %v", v)
}
case *types.Named:
pkg := v.Obj().Pkg()
switch pkgPath := pkg.Name(); pkgPath {
case "time":
switch name := v.Obj().Name(); name {
case "Time":
f.Type = sql_NullTime
default:
return f, fmt.Errorf("do not support null types in package %s for type: %v", pkgPath, name)
}
default:
return f, fmt.Errorf("do not support null types for package: %v", pkgPath)
}
default:
return f, fmt.Errorf("do not support nulls for type: %T", v)
}
}
}
// fd.Type = f.Type
return modelgen.DefaultFieldMutateHook(td, fd, f)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment