package runtime
import (
"encoding/base64"
"fmt"
"strconv"
"strings"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/types/known/durationpb"
"google.golang.org/protobuf/types/known/timestamppb"
"google.golang.org/protobuf/types/known/wrapperspb"
)
func String (val string ) (string , error ) {
return val , nil
}
func StringSlice (val , sep string ) ([]string , error ) {
return strings .Split (val , sep ), nil
}
func Bool (val string ) (bool , error ) {
return strconv .ParseBool (val )
}
func BoolSlice (val , sep string ) ([]bool , error ) {
s := strings .Split (val , sep )
values := make ([]bool , len (s ))
for i , v := range s {
value , err := Bool (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Float64 (val string ) (float64 , error ) {
return strconv .ParseFloat (val , 64 )
}
func Float64Slice (val , sep string ) ([]float64 , error ) {
s := strings .Split (val , sep )
values := make ([]float64 , len (s ))
for i , v := range s {
value , err := Float64 (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Float32 (val string ) (float32 , error ) {
f , err := strconv .ParseFloat (val , 32 )
if err != nil {
return 0 , err
}
return float32 (f ), nil
}
func Float32Slice (val , sep string ) ([]float32 , error ) {
s := strings .Split (val , sep )
values := make ([]float32 , len (s ))
for i , v := range s {
value , err := Float32 (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Int64 (val string ) (int64 , error ) {
return strconv .ParseInt (val , 0 , 64 )
}
func Int64Slice (val , sep string ) ([]int64 , error ) {
s := strings .Split (val , sep )
values := make ([]int64 , len (s ))
for i , v := range s {
value , err := Int64 (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Int32 (val string ) (int32 , error ) {
i , err := strconv .ParseInt (val , 0 , 32 )
if err != nil {
return 0 , err
}
return int32 (i ), nil
}
func Int32Slice (val , sep string ) ([]int32 , error ) {
s := strings .Split (val , sep )
values := make ([]int32 , len (s ))
for i , v := range s {
value , err := Int32 (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Uint64 (val string ) (uint64 , error ) {
return strconv .ParseUint (val , 0 , 64 )
}
func Uint64Slice (val , sep string ) ([]uint64 , error ) {
s := strings .Split (val , sep )
values := make ([]uint64 , len (s ))
for i , v := range s {
value , err := Uint64 (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Uint32 (val string ) (uint32 , error ) {
i , err := strconv .ParseUint (val , 0 , 32 )
if err != nil {
return 0 , err
}
return uint32 (i ), nil
}
func Uint32Slice (val , sep string ) ([]uint32 , error ) {
s := strings .Split (val , sep )
values := make ([]uint32 , len (s ))
for i , v := range s {
value , err := Uint32 (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Bytes (val string ) ([]byte , error ) {
b , err := base64 .StdEncoding .DecodeString (val )
if err != nil {
b , err = base64 .URLEncoding .DecodeString (val )
if err != nil {
return nil , err
}
}
return b , nil
}
func BytesSlice (val , sep string ) ([][]byte , error ) {
s := strings .Split (val , sep )
values := make ([][]byte , len (s ))
for i , v := range s {
value , err := Bytes (v )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func Timestamp (val string ) (*timestamppb .Timestamp , error ) {
var r timestamppb .Timestamp
val = strconv .Quote (strings .Trim (val , `"` ))
unmarshaler := &protojson .UnmarshalOptions {}
if err := unmarshaler .Unmarshal ([]byte (val ), &r ); err != nil {
return nil , err
}
return &r , nil
}
func Duration (val string ) (*durationpb .Duration , error ) {
var r durationpb .Duration
val = strconv .Quote (strings .Trim (val , `"` ))
unmarshaler := &protojson .UnmarshalOptions {}
if err := unmarshaler .Unmarshal ([]byte (val ), &r ); err != nil {
return nil , err
}
return &r , nil
}
func Enum (val string , enumValMap map [string ]int32 ) (int32 , error ) {
e , ok := enumValMap [val ]
if ok {
return e , nil
}
i , err := Int32 (val )
if err != nil {
return 0 , fmt .Errorf ("%s is not valid" , val )
}
for _ , v := range enumValMap {
if v == i {
return i , nil
}
}
return 0 , fmt .Errorf ("%s is not valid" , val )
}
func EnumSlice (val , sep string , enumValMap map [string ]int32 ) ([]int32 , error ) {
s := strings .Split (val , sep )
values := make ([]int32 , len (s ))
for i , v := range s {
value , err := Enum (v , enumValMap )
if err != nil {
return nil , err
}
values [i ] = value
}
return values , nil
}
func StringValue (val string ) (*wrapperspb .StringValue , error ) {
return wrapperspb .String (val ), nil
}
func FloatValue (val string ) (*wrapperspb .FloatValue , error ) {
parsedVal , err := Float32 (val )
return wrapperspb .Float (parsedVal ), err
}
func DoubleValue (val string ) (*wrapperspb .DoubleValue , error ) {
parsedVal , err := Float64 (val )
return wrapperspb .Double (parsedVal ), err
}
func BoolValue (val string ) (*wrapperspb .BoolValue , error ) {
parsedVal , err := Bool (val )
return wrapperspb .Bool (parsedVal ), err
}
func Int32Value (val string ) (*wrapperspb .Int32Value , error ) {
parsedVal , err := Int32 (val )
return wrapperspb .Int32 (parsedVal ), err
}
func UInt32Value (val string ) (*wrapperspb .UInt32Value , error ) {
parsedVal , err := Uint32 (val )
return wrapperspb .UInt32 (parsedVal ), err
}
func Int64Value (val string ) (*wrapperspb .Int64Value , error ) {
parsedVal , err := Int64 (val )
return wrapperspb .Int64 (parsedVal ), err
}
func UInt64Value (val string ) (*wrapperspb .UInt64Value , error ) {
parsedVal , err := Uint64 (val )
return wrapperspb .UInt64 (parsedVal ), err
}
func BytesValue (val string ) (*wrapperspb .BytesValue , error ) {
parsedVal , err := Bytes (val )
return wrapperspb .Bytes (parsedVal ), err
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .