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  }