File: generator.go

package info (click to toggle)
golang-github-aws-aws-sdk-go-v2 1.24.1-2~bpo12%2B1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-backports
  • size: 554,032 kB
  • sloc: java: 15,941; makefile: 419; sh: 175
file content (113 lines) | stat: -rw-r--r-- 2,556 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"path"
)

// Import is a Go package import and associated alias
type Import struct {
	Package string
	Alias   string
}

type generationContext struct {
	PackageName  string
	ResolverName string
	Imports      map[Import]struct{}
	Config       SDKDefaultConfig
}

func (g *generationContext) AddImport(pkg, alias string) (s string) {
	if g.Imports == nil {
		g.Imports = make(map[Import]struct{})
	}

	g.Imports[Import{
		Package: pkg,
		Alias:   alias,
	}] = struct{}{}

	return s
}

func (g *generationContext) AddSDKImport(pkg, alias string) (s string) {
	if g.Imports == nil {
		g.Imports = make(map[Import]struct{})
	}

	g.Imports[Import{
		Package: path.Join("github.com/aws/aws-sdk-go-v2", pkg),
		Alias:   alias,
	}] = struct{}{}

	return s
}

func generateConfigPackage(jsonFile, outputFile, packageName, resolverName string) (err error) {
	config, err := ioutil.ReadFile(jsonFile)
	if err != nil {
		return fmt.Errorf("failed to read configuration file: %w", err)
	}

	decoder := newDecoder(config)

	var schemaVersion SchemaVersion
	if err = decoder.Decode(&schemaVersion); err != nil {
		return fmt.Errorf("failed to get schema version: %w", err)
	}

	decoder = newDecoder(config)

	if schemaVersion.Version != 1 {
		return fmt.Errorf("generator only supports version 1 schema, got %d", schemaVersion.Version)
	}

	var defaultConfig SDKDefaultConfig
	if err := decoder.Decode(&defaultConfig); err != nil {
		return fmt.Errorf("failed to decode config: %w", err)
	}

	oFile, err := os.OpenFile(outputFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
	if err != nil {
		return fmt.Errorf("failed to open file: %w", err)
	}
	defer func() {
		if cErr := oFile.Close(); cErr != nil && err == nil {
			err = fmt.Errorf("failed to close file: %w", cErr)
		}
	}()

	configContent := bytes.NewBuffer(nil)

	data := &generationContext{
		PackageName:  packageName,
		ResolverName: resolverName,
		Config:       defaultConfig,
	}

	if err := tmpl.ExecuteTemplate(configContent, "config", data); err != nil {
		return fmt.Errorf("failed to execute template: %w", err)
	}

	if err := tmpl.ExecuteTemplate(oFile, "header", data); err != nil {
		return fmt.Errorf("failed to execute template: %w", err)
	}

	if _, err := io.Copy(oFile, configContent); err != nil {
		return fmt.Errorf("failed to copy to output file: %w", err)
	}

	return nil
}

func newDecoder(data []byte) *json.Decoder {
	decoder := json.NewDecoder(bytes.NewReader(data))
	decoder.UseNumber()
	return decoder
}