Add transform to MACRO_CASE and phrase

This commit is contained in:
Adam Bouqdib 2019-08-21 14:35:35 +01:00
parent d27f80ae12
commit b59fe7c6e6
5 changed files with 20 additions and 11 deletions

View File

@ -14,7 +14,7 @@ After that, the `enumer` executable will be in "$GOPATH/bin" folder and you can
## Generated functions and methods ## Generated functions and methods
When Enumer is applied to a type, it will generate: When Enumer is applied to a type, it will generate:
* The following basic methods/functions: * The following basic methods/functions:
* Method `String()`: returns the string representation of the enum value. This makes the enum conform * Method `String()`: returns the string representation of the enum value. This makes the enum conform
the `Stringer` interface, so whenever you print an enum value, you'll get the string name instead of a number. the `Stringer` interface, so whenever you print an enum value, you'll get the string name instead of a number.
@ -27,7 +27,7 @@ be almost meaningless or hard to trace or use by a human.
* When the flag `json` is provided, two additional methods will be generated, `MarshalJSON()` and `UnmarshalJSON()`. These make * When the flag `json` is provided, two additional methods will be generated, `MarshalJSON()` and `UnmarshalJSON()`. These make
the enum conform to the `json.Marshaler` and `json.Unmarshaler` interfaces. Very useful to use it in JSON APIs. the enum conform to the `json.Marshaler` and `json.Unmarshaler` interfaces. Very useful to use it in JSON APIs.
* When the flag `text` is provided, two additional methods will be generated, `MarshalText()` and `UnmarshalText()`. These make * When the flag `text` is provided, two additional methods will be generated, `MarshalText()` and `UnmarshalText()`. These make
the enum conform to the `encoding.TextMarshaler` and `encoding.TextUnmarshaler` interfaces. the enum conform to the `encoding.TextMarshaler` and `encoding.TextUnmarshaler` interfaces.
**Note:** If you use your enum values as keys in a map and you encode the map as _JSON_, you need this flag set to true to properly **Note:** If you use your enum values as keys in a map and you encode the map as _JSON_, you need this flag set to true to properly
convert the map keys to json (strings). If not, the numeric values will be used instead convert the map keys to json (strings). If not, the numeric values will be used instead
* When the flag `yaml` is provided, two additional methods will be generated, `MarshalYAML()` and `UnmarshalYAML()`. These make * When the flag `yaml` is provided, two additional methods will be generated, `MarshalYAML()` and `UnmarshalYAML()`. These make
@ -49,19 +49,19 @@ const (
``` ```
executing `enumer -type=Pill -json` will generate a new file with four basic methods and two extra for JSON: executing `enumer -type=Pill -json` will generate a new file with four basic methods and two extra for JSON:
```go ```go
func (i Pill) String() string { func (i Pill) String() string {
//... //...
} }
func PillString(s string) (Pill, error) { func PillString(s string) (Pill, error) {
//... //...
} }
func PillValues() []Pill { func PillValues() []Pill {
//... //...
} }
func (i Pill) IsAPill() bool { func (i Pill) IsAPill() bool {
//... //...
} }
@ -128,7 +128,7 @@ For example, the command `enumer -type=MyType -json -transform=snake` would gene
```go ```go
name := MyTypeValue.String() // name => "my_type_value" name := MyTypeValue.String() // name => "my_type_value"
``` ```
**Note**: The transformation only works form CamelCase to snake_case or kebab-case, not the other way around. **Note**: The transformation only works from CamelCase to snake_case or kebab-case, not the other way around.
## How to use ## How to use
The usage of Enumer is the same as Stringer, so you can refer to the [Stringer docs](https://godoc.org/golang.org/x/tools/cmd/stringer) The usage of Enumer is the same as Stringer, so you can refer to the [Stringer docs](https://godoc.org/golang.org/x/tools/cmd/stringer)
@ -139,7 +139,8 @@ There are four boolean flags: `json`, `text`, `yaml` and `sql`. You can use any
For enum string representation transformation the `transform` and `trimprefix` flags For enum string representation transformation the `transform` and `trimprefix` flags
were added (i.e. `enumer -type=MyType -json -transform=snake`). were added (i.e. `enumer -type=MyType -json -transform=snake`).
Possible transform values are `snake` and `kebab` for transformation to snake_case and kebab-case accordingly. Possible transform values are `snake`, `kebab` `macro` and `phrase` for transformation
to snake_case, kebab-case, MACRO_CASE or a phrase (i.e. space-separated words) accordingly.
The default value for `transform` flag is `noop` which means no transformation will be performed. The default value for `transform` flag is `noop` which means no transformation will be performed.
If a prefix is provided via the `trimprefix` flag, it will be trimmed from the start of each name (before If a prefix is provided via the `trimprefix` flag, it will be trimmed from the start of each name (before

View File

@ -122,4 +122,4 @@ func runInDir(dir, name string, arg ...string) error {
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
return cmd.Run() return cmd.Run()
} }

View File

@ -39,7 +39,7 @@ func (i %[1]s) IsA%[1]s() bool {
// [1]: type name // [1]: type name
const stringBelongsMethodSet = `// IsA%[1]s returns "true" if the value is listed in the enum definition. "false" otherwise const stringBelongsMethodSet = `// IsA%[1]s returns "true" if the value is listed in the enum definition. "false" otherwise
func (i %[1]s) IsA%[1]s() bool { func (i %[1]s) IsA%[1]s() bool {
_, ok := _%[1]sMap[i] _, ok := _%[1]sMap[i]
return ok return ok
} }
` `

2
sql.go
View File

@ -26,7 +26,7 @@ const scanMethod = `func (i *%[1]s) Scan(value interface{}) error {
if err != nil { if err != nil {
return err return err
} }
*i = val *i = val
return nil return nil
} }

View File

@ -316,6 +316,14 @@ func (g *Generator) transformValueNames(values []Value, transformMethod string)
sep = '_' sep = '_'
case "kebab": case "kebab":
sep = '-' sep = '-'
case "phrase":
sep = ' '
case "macro":
sep = '_'
for i := range values {
values[i].name = strings.ToUpper(name.Delimit(values[i].name, sep))
}
return
default: default:
return return
} }