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
}
|