github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/generators/client/template_helpers.go (about) 1 // Copyright (c) 2019-2022, R.I. Pienaar and the Choria Project contributors 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package client 6 7 import ( 8 "encoding/base64" 9 "fmt" 10 "sort" 11 "strings" 12 "text/template" 13 14 "github.com/choria-io/go-choria/choria" 15 "github.com/choria-io/go-choria/providers/agent/mcorpc/ddl/common" 16 "golang.org/x/text/cases" 17 "golang.org/x/text/language" 18 19 addl "github.com/choria-io/go-choria/providers/agent/mcorpc/ddl/agent" 20 ) 21 22 func (g *Generator) templFSnakeToCamel(v string) string { 23 parts := strings.Split(v, "_") 24 out := []string{} 25 for _, s := range parts { 26 out = append(out, cases.Title(language.AmericanEnglish).String(s)) 27 } 28 29 return strings.Join(out, "") 30 } 31 32 func (g *Generator) templFSnakeToCamelUnexported(v string) string { 33 parts := strings.Split(v, "_") 34 out := []string{} 35 for i, s := range parts { 36 if i == 0 { 37 out = append(out, strings.ToLower(s)) 38 } else { 39 out = append(out, cases.Title(language.AmericanEnglish).String(s)) 40 } 41 } 42 43 return strings.Join(out, "") 44 } 45 46 func (g *Generator) templFChoriaTypeToValOfType(v string) string { 47 switch v { 48 case "string", "list": 49 return "val.(string)" 50 case "integer": 51 return "val.(int64)" 52 case "number", "float": 53 return "val.(float64)" 54 case "boolean": 55 return "val.(bool)" 56 case "hash": 57 return "val.(map[string]any)" 58 case "array": 59 return "val.([]any)" 60 default: 61 return "val.(any)" 62 } 63 } 64 65 func (g *Generator) templFChoriaRequiredInputsToFuncArgs(act *addl.Action) string { 66 inputs := g.optionalInputSelect(act, false) 67 var parts []string 68 69 names := []string{} 70 for name := range inputs { 71 names = append(names, name) 72 } 73 sort.Strings(names) 74 75 for _, name := range names { 76 input := inputs[name] 77 goType := g.templFChoriaTypeToGo(input.Type) 78 parts = append(parts, fmt.Sprintf("input%s %s", g.templFSnakeToCamel(name), goType)) 79 } 80 81 return strings.Join(parts, ", ") 82 } 83 84 func (g *Generator) templFChoriaTypeToGo(v string) string { 85 switch v { 86 case "string", "list": 87 return "string" 88 case "integer": 89 return "int64" 90 case "number", "float": 91 return "float64" 92 case "boolean": 93 return "bool" 94 case "hash": 95 return "map[string]any" 96 case "array": 97 return "[]any" 98 default: 99 return "any" 100 } 101 } 102 103 func (g *Generator) templFChoriaOptionalInputs(act *addl.Action) map[string]*common.InputItem { 104 return g.optionalInputSelect(act, true) 105 } 106 107 func (g *Generator) templFChoriaRequiredInputs(act *addl.Action) map[string]*common.InputItem { 108 return g.optionalInputSelect(act, false) 109 } 110 111 func (g *Generator) templFBase64Encode(v string) string { 112 return base64.StdEncoding.EncodeToString([]byte(v)) 113 } 114 115 func (g *Generator) templFGeneratedWarning() string { 116 meta := g.agent.DDL.Metadata 117 return fmt.Sprintf(`// generated code; DO NOT EDIT 118 // 119 // Client for Choria RPC Agent '%s' Version %s generated using Choria version %s`, meta.Name, meta.Version, choria.BuildInfo().Version()) 120 } 121 122 func (g *Generator) funcMap() template.FuncMap { 123 return template.FuncMap{ 124 "GeneratedWarning": g.templFGeneratedWarning, 125 "Base64Encode": g.templFBase64Encode, 126 "Capitalize": cases.Title(language.AmericanEnglish).String, 127 "ToLower": strings.ToLower, 128 "SnakeToCamel": g.templFSnakeToCamel, 129 "SnakeToCamelUnexported": g.templFSnakeToCamelUnexported, 130 "ChoriaRequiredInputs": g.templFChoriaRequiredInputs, 131 "ChoriaOptionalInputs": g.templFChoriaOptionalInputs, 132 "ChoriaRequiredInputsToFuncArgs": g.templFChoriaRequiredInputsToFuncArgs, 133 "ChoriaTypeToGoType": g.templFChoriaTypeToGo, 134 "ChoriaTypeToValOfType": g.templFChoriaTypeToValOfType, 135 } 136 }