...

Source file src/github.com/aws/smithy-go/ptr/generate.go

Documentation: github.com/aws/smithy-go/ptr

     1  //go:build ignore
     2  // +build ignore
     3  
     4  package main
     5  
     6  import (
     7  	"fmt"
     8  	"log"
     9  	"os"
    10  	"text/template"
    11  
    12  	"github.com/aws/smithy-go/ptr"
    13  )
    14  
    15  func main() {
    16  	types := ptr.GetScalars()
    17  
    18  	for filename, tmplName := range map[string]string{
    19  		"to_ptr.go":   "scalar to pointer",
    20  		"from_ptr.go": "scalar from pointer",
    21  	} {
    22  		if err := generateFile(filename, tmplName, types); err != nil {
    23  			log.Fatalf("%s file generation failed, %v", filename, err)
    24  		}
    25  	}
    26  }
    27  
    28  func generateFile(filename string, tmplName string, types ptr.Scalars) (err error) {
    29  	f, err := os.Create(filename)
    30  	if err != nil {
    31  		return fmt.Errorf("failed to create %s file, %v", filename, err)
    32  	}
    33  
    34  	defer func() {
    35  		closeErr := f.Close()
    36  		if err == nil {
    37  			err = closeErr
    38  		} else if closeErr != nil {
    39  			err = fmt.Errorf("close error: %v, original error: %w", closeErr, err)
    40  		}
    41  	}()
    42  
    43  	if err = ptrTmpl.ExecuteTemplate(f, tmplName, types); err != nil {
    44  		return fmt.Errorf("failed to generate %s file, %v", filename, err)
    45  	}
    46  
    47  	return nil
    48  }
    49  
    50  var ptrTmpl = template.Must(template.New("ptrTmpl").Parse(`
    51  {{- define "header" }}
    52  	// Code generated by smithy-go/ptr/generate.go DO NOT EDIT.
    53  	package ptr
    54  
    55  	import (
    56  		{{- range $_, $import := $.Imports }}
    57  			"{{ $import.Path }}"
    58  		{{- end }}
    59  	)
    60  {{- end }}
    61  
    62  {{- define "scalar from pointer" }}
    63  	{{ template "header" $ }}
    64  
    65  	{{ range $_, $type := $ }}
    66  		{{ template "from pointer func" $type }}
    67  		{{ template "from pointers func" $type }}
    68  	{{- end }}
    69  {{- end }}
    70  
    71  {{- define "scalar to pointer" }}
    72  	{{ template "header" $ }}
    73  
    74  	{{ range $_, $type := $ }}
    75  		{{ template "to pointer func" $type }}
    76  		{{ template "to pointers func" $type }}
    77  	{{- end }}
    78  {{- end }}
    79  
    80  {{- define "to pointer func" }}
    81  	// {{ $.Name }} returns a pointer value for the {{ $.Symbol }} value passed in.
    82  	func {{ $.Name }}(v {{ $.Symbol }}) *{{ $.Symbol }} {
    83  		return &v
    84  	}
    85  {{- end }}
    86  
    87  {{- define "to pointers func" }}
    88  	// {{ $.Name }}Slice returns a slice of {{ $.Symbol }} pointers from the values
    89  	// passed in.
    90  	func {{ $.Name }}Slice(vs []{{ $.Symbol }}) []*{{ $.Symbol }} {
    91  		ps := make([]*{{ $.Symbol }}, len(vs))
    92  		for i, v := range vs {
    93  			vv := v
    94  			ps[i] = &vv
    95  		}
    96  
    97  		return ps
    98  	}
    99  
   100  	// {{ $.Name }}Map returns a map of {{ $.Symbol }} pointers from the values
   101  	// passed in.
   102  	func {{ $.Name }}Map(vs map[string]{{ $.Symbol }}) map[string]*{{ $.Symbol }} {
   103  		ps := make(map[string]*{{ $.Symbol }}, len(vs))
   104  		for k, v := range vs {
   105  			vv := v
   106  			ps[k] = &vv
   107  		}
   108  
   109  		return ps
   110  	}
   111  {{- end }}
   112  
   113  {{- define "from pointer func" }}
   114  	// To{{ $.Name }} returns {{ $.Symbol }} value dereferenced if the passed
   115  	// in pointer was not nil. Returns a {{ $.Symbol }} zero value if the
   116  	// pointer was nil.
   117  	func To{{ $.Name }}(p *{{ $.Symbol }}) (v {{ $.Symbol }}) {
   118  		if p == nil {
   119  			return v
   120  		}
   121  			
   122  		return *p
   123  	}
   124  {{- end }}
   125  
   126  {{- define "from pointers func" }}
   127  	// To{{ $.Name }}Slice returns a slice of {{ $.Symbol }} values, that are
   128  	// dereferenced if the passed in pointer was not nil. Returns a {{ $.Symbol }}
   129  	// zero value if the pointer was nil.
   130  	func To{{ $.Name }}Slice(vs []*{{ $.Symbol }}) []{{ $.Symbol }} {
   131  		ps := make([]{{ $.Symbol }}, len(vs))
   132  		for i, v := range vs {
   133  			ps[i] = To{{ $.Name }}(v)
   134  		}
   135  
   136  		return ps
   137  	}
   138  
   139  	// To{{ $.Name }}Map returns a map of {{ $.Symbol }} values, that are
   140  	// dereferenced if the passed in pointer was not nil. The {{ $.Symbol }}
   141  	// zero value is used if the pointer was nil.
   142  	func To{{ $.Name }}Map(vs map[string]*{{ $.Symbol }}) map[string]{{ $.Symbol }} {
   143  		ps := make(map[string]{{ $.Symbol }}, len(vs))
   144  		for k, v := range vs {
   145  			ps[k] = To{{ $.Name }}(v)
   146  		}
   147  
   148  		return ps
   149  	}
   150  {{- end }}
   151  `))
   152  

View as plain text