Re: [go-nuts] Add string Parser to x/tools/stringer

2020-06-08 Thread Ian Lance Taylor
On Sun, Jun 7, 2020 at 12:04 PM Diego Augusto Molina
 wrote:
>
> Very often I use the stringer command to generate lists of enumerated values, 
> which is great btw.
> But one thing that I see myself also writing after this is a Parse method or 
> function to validate strings that are received.
> The use case is that I have a list of possible values for a controlled field 
> in a RESTful API. I receive and deliver string values from the API by I have 
> a tight control inside the API itself.
> I declare a new type (generally an uint8 alias) and then declare a bunch of 
> auto incremental constants, starting with the zero value that I always set to 
> "Invalid" which is used as a control value.
> The stringer command makes the dull work but immediately after I write a 
> Parse function or method. The following is a full example:
> //go:generate stringer -linecomment -output=enum_string.go -type=MyEnum
> package enum
>
> type MyEnum uint8
>
> const (
> // Reserved for internal use
> MyEnumInvalid MyEnum = iota // Invalid
>
> MyEnumValue1 // Value #1
> MyEnumValue2 // Value #2
> MyEnumValue3 // Value #3
> MyEnumValue4 // Value #4
> MyEnumValue5 // Value #5
> )
>
> func (e *MyEnum) Parse(value string) MyEnum {
> for lenIdx, lenVal, i := len(_MyEnum_index), uint8(len(value)), 1; i < 
> lenIdx; i++ {
> if _MyEnum_index[i]-_MyEnum_index[i-1] == lenVal && // Maybe too 
> small optimization to be perceptible/useful(?)
> _MyEnum_name[_MyEnum_index[i-1]:_MyEnum_index[i]] == value {
> *e = MyEnum(i - 1)
> return *e
> }
> }
> return MyEnum(0)
> }
>
> So this couples a lot to my workflow, of course. This way I can do something 
> like:
> receivedVal = new(MyEnum).Parse(receivedStr)
> Or:
> var val *MyEnum
> for _, strVal := range strValues {
> if val.Parse(strVal) == MyEnumInvalid {
> return fmt.Errorf("Invalid value for enum: %v", strVal)
> }
> }
>
> So I started to write this function within the stringer command, which I 
> modified to do so. So I don't know if this is for some use to the community. 
> I know that in order for it to be useful to everyone it should be more 
> general. So I'm looking at alternatives and, of course, if it's worth working 
> on that. I it would be of some use there are two alternatives where this 
> could live:
>
> As an option to the stringer command
> As a separate command (because it would exceed the stringer interface and 
> would be misleading, since "Parse" is not part of the "Stringer" interface)
>
> And I'm only using here the stringer command to create series of consecutive 
> numbers, so I would need to write extra code to fulfill the sparsiness of 
> values (cases where stringer creates up to 10 different slices and after that 
> just creates a map). It wouldn't be much work, actually, just read the code 
> in the command.
> And instead of writing a new method for the type (breaking the idea of the 
> "stringer" interface), I thought it could just be a "ParseT" function.
>
> Thoughts? Comments? Should I keep it for myself (hahaha)?

There are many different possible enhancements that can be made to
stringer.  We've decided to keep the tool simple rather than add
additional knobs.  Thanks.

I encourage you to make your tool available for anybody who wants to use it.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcV8PwDGcf4Np5vr44TsFsSOv8tuJ3NpKOK1km%2B%2BFcPSJQ%40mail.gmail.com.


[go-nuts] Add string Parser to x/tools/stringer

2020-06-07 Thread Diego Augusto Molina
Very often I use the stringer command to generate lists of enumerated 
values, which is great btw.
But one thing that I see myself also writing after this is a Parse method 
or function to validate strings that are received.
The use case is that I have a list of possible values for a controlled 
field in a RESTful API. I receive and deliver string values from the API by 
I have a tight control inside the API itself.
I declare a new type (generally an uint8 alias) and then declare a bunch of 
auto incremental constants, starting with the zero value that I always set 
to "Invalid" which is used as a control value.
The stringer command makes the dull work but immediately after I write a 
Parse function or method. The following is a full example:
//go:generate stringer -linecomment -output=enum_string.go -type=MyEnum
package enum

type MyEnum uint8

const (
// Reserved for internal use
MyEnumInvalid MyEnum = iota // Invalid

MyEnumValue1 // Value #1
MyEnumValue2 // Value #2
MyEnumValue3 // Value #3
MyEnumValue4 // Value #4
MyEnumValue5 // Value #5
)

func (e *MyEnum) Parse(value string) MyEnum {
for lenIdx, lenVal, i := len(_MyEnum_index), uint8(len(value)), 1; i < 
lenIdx; i++ {
if _MyEnum_index[i]-_MyEnum_index[i-1] == lenVal && // Maybe too 
small optimization to be perceptible/useful(?)
_MyEnum_name[_MyEnum_index[i-1]:_MyEnum_index[i]] == value {
*e = MyEnum(i - 1)
return *e
}
}
return MyEnum(0)
}

So this couples a lot to my workflow, of course. This way I can do 
something like:
receivedVal = new(MyEnum).Parse(receivedStr)
Or:
var val *MyEnum
for _, strVal := range strValues {
if val.Parse(strVal) == MyEnumInvalid {
return fmt.Errorf("Invalid value for enum: %v", strVal)
}
}

So I started to write this function within the stringer command, which I 
modified to do so. So I don't know if this is for some use to the 
community. I know that in order for it to be useful to everyone it should 
be more general. So I'm looking at alternatives and, of course, if it's 
worth working on that. I it would be of some use there are two alternatives 
where this could live:

   - As an option to the stringer command
   - As a separate command (because it would exceed the stringer interface 
   and would be misleading, since "Parse" is not part of the "Stringer" 
   interface)

And I'm only using here the stringer command to create series of 
consecutive numbers, so I would need to write extra code to fulfill the 
sparsiness of values (cases where stringer creates up to 10 different 
slices and after that just creates a map). It wouldn't be much work, 
actually, just read the code in the command.
And instead of writing a new method for the type (breaking the idea of the 
"stringer" interface), I thought it could just be a "ParseT" function.

Thoughts? Comments? Should I keep it for myself (hahaha)?

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/8b1d284c-9874-4e36-8883-a61c8eb218e7o%40googlegroups.com.