Skip to content

Commit

Permalink
fix(go): use generic for nullable types (#3209)
Browse files Browse the repository at this point in the history
  • Loading branch information
millotp authored Jun 19, 2024
1 parent 9ad5c8c commit 7fd687f
Show file tree
Hide file tree
Showing 7 changed files with 15 additions and 364 deletions.
297 changes: 13 additions & 284 deletions clients/algoliasearch-client-go/algolia/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,314 +9,43 @@ import (
"github.com/algolia/algoliasearch-client-go/v4/algolia/errs"
)

// PtrBool is a helper routine that returns a pointer to given boolean value.
func PtrBool(v bool) *bool { return &v }

// PtrInt is a helper routine that returns a pointer to given integer value.
func PtrInt(v int) *int { return &v }

// PtrInt32 is a helper routine that returns a pointer to given integer value.
func PtrInt32(v int32) *int32 { return &v }

// PtrInt64 is a helper routine that returns a pointer to given integer value.
func PtrInt64(v int64) *int64 { return &v }

// PtrFloat32 is a helper routine that returns a pointer to given float value.
func PtrFloat32(v float32) *float32 { return &v }

// PtrFloat64 is a helper routine that returns a pointer to given float value.
func PtrFloat64(v float64) *float64 { return &v }

// PtrString is a helper routine that returns a pointer to given string value.
func PtrString(v string) *string { return &v }

// PtrTime is helper routine that returns a pointer to given Time value.
func PtrTime(v time.Time) *time.Time { return &v }

type NullableBool struct {
value *bool
isSet bool
}

func (v NullableBool) Get() *bool {
return v.value
}

func (v *NullableBool) Set(val *bool) {
v.value = val
v.isSet = true
}

func (v NullableBool) IsSet() bool {
return v.isSet
}

func (v *NullableBool) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableBool(val *bool) *NullableBool {
return &NullableBool{value: val, isSet: true}
}

func (v NullableBool) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value)
}

func (v *NullableBool) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
}

type NullableInt struct {
value *int
isSet bool
}

func (v NullableInt) Get() *int {
return v.value
}

func (v *NullableInt) Set(val *int) {
v.value = val
v.isSet = true
}

func (v NullableInt) IsSet() bool {
return v.isSet
}

func (v *NullableInt) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableInt(val *int) *NullableInt {
return &NullableInt{value: val, isSet: true}
}

func (v NullableInt) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value)
}

func (v *NullableInt) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
// ToPtr is a helper routine that returns a pointer to the given value.
func ToPtr[T any](v T) *T {
return &v
}

type NullableInt32 struct {
value *int32
type Nullable[T any] struct {
value *T
isSet bool
}

func (v NullableInt32) Get() *int32 {
func (v Nullable[T]) Get() *T {
return v.value
}

func (v *NullableInt32) Set(val *int32) {
func (v *Nullable[T]) Set(val *T) {
v.value = val
v.isSet = true
}

func (v NullableInt32) IsSet() bool {
func (v Nullable[T]) IsSet() bool {
return v.isSet
}

func (v *NullableInt32) Unset() {
func (v *Nullable[T]) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableInt32(val *int32) *NullableInt32 {
return &NullableInt32{value: val, isSet: true}
func NewNullable[T any](val *T) *Nullable[T] {
return &Nullable[T]{value: val, isSet: true}
}

func (v NullableInt32) MarshalJSON() ([]byte, error) {
func (v Nullable[T]) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value)
}

func (v *NullableInt32) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
}

type NullableInt64 struct {
value *int64
isSet bool
}

func (v NullableInt64) Get() *int64 {
return v.value
}

func (v *NullableInt64) Set(val *int64) {
v.value = val
v.isSet = true
}

func (v NullableInt64) IsSet() bool {
return v.isSet
}

func (v *NullableInt64) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableInt64(val *int64) *NullableInt64 {
return &NullableInt64{value: val, isSet: true}
}

func (v NullableInt64) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value)
}

func (v *NullableInt64) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
}

type NullableFloat32 struct {
value *float32
isSet bool
}

func (v NullableFloat32) Get() *float32 {
return v.value
}

func (v *NullableFloat32) Set(val *float32) {
v.value = val
v.isSet = true
}

func (v NullableFloat32) IsSet() bool {
return v.isSet
}

func (v *NullableFloat32) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableFloat32(val *float32) *NullableFloat32 {
return &NullableFloat32{value: val, isSet: true}
}

func (v NullableFloat32) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value)
}

func (v *NullableFloat32) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
}

type NullableFloat64 struct {
value *float64
isSet bool
}

func (v NullableFloat64) Get() *float64 {
return v.value
}

func (v *NullableFloat64) Set(val *float64) {
v.value = val
v.isSet = true
}

func (v NullableFloat64) IsSet() bool {
return v.isSet
}

func (v *NullableFloat64) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableFloat64(val *float64) *NullableFloat64 {
return &NullableFloat64{value: val, isSet: true}
}

func (v NullableFloat64) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value)
}

func (v *NullableFloat64) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
}

type NullableString struct {
value *string
isSet bool
}

func (v NullableString) Get() *string {
return v.value
}

func (v *NullableString) Set(val *string) {
v.value = val
v.isSet = true
}

func (v NullableString) IsSet() bool {
return v.isSet
}

func (v *NullableString) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableString(val *string) *NullableString {
return &NullableString{value: val, isSet: true}
}

func (v NullableString) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value)
}

func (v *NullableString) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
}

type NullableTime struct {
value *time.Time
isSet bool
}

func (v NullableTime) Get() *time.Time {
return v.value
}

func (v *NullableTime) Set(val *time.Time) {
v.value = val
v.isSet = true
}

func (v NullableTime) IsSet() bool {
return v.isSet
}

func (v *NullableTime) Unset() {
v.value = nil
v.isSet = false
}

func NewNullableTime(val *time.Time) *NullableTime {
return &NullableTime{value: val, isSet: true}
}

func (v NullableTime) MarshalJSON() ([]byte, error) {
return v.value.MarshalJSON()
}

func (v *NullableTime) UnmarshalJSON(src []byte) error {
func (v *Nullable[T]) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,11 @@ public ModelsMap postProcessModels(ModelsMap objs) {
}

for (CodegenProperty param : Iterables.concat(model.vars, model.allVars, model.requiredVars, model.optionalVars)) {
if (
!param.isNullable || !param.isPrimitiveType || param.isContainer || param.isFreeFormObject || (param.isAnyType && !param.isModel)
) {
if (!param.isNullable || param.isContainer || param.isFreeFormObject || (param.isAnyType && !param.isModel)) {
continue;
}

param.dataType = "utils." + param.dataType;
param.dataType = "utils.Nullable[" + param.vendorExtensions.get("x-go-base-type") + "]";
}
}

Expand Down
2 changes: 0 additions & 2 deletions templates/go/model_anyof.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -77,5 +77,3 @@ func (src *{{classname}}) MarshalJSON() ([]byte, error) {
{{/anyOf}}
return nil, nil // no data in anyOf schemas
}

{{> nullable_model}}
36 changes: 0 additions & 36 deletions templates/go/model_enum.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -63,39 +63,3 @@ func (v {{{classname}}}) IsValid() bool {
func (v {{{classname}}}) Ptr() *{{{classname}}} {
return &v
}

type Nullable{{{classname}}} struct {
value *{{{classname}}}
isSet bool
}

func (v Nullable{{classname}}) Get() *{{classname}} {
return v.value
}

func (v *Nullable{{classname}}) Set(val *{{classname}}) {
v.value = val
v.isSet = true
}

func (v Nullable{{classname}}) IsSet() bool {
return v.isSet
}

func (v *Nullable{{classname}}) Unset() {
v.value = nil
v.isSet = false
}

func NewNullable{{classname}}(val *{{classname}}) *Nullable{{classname}} {
return &Nullable{{classname}}{value: val, isSet: true}
}

func (v Nullable{{{classname}}}) MarshalJSON() ([]byte, error) {
return json.Marshal(v.value) //nolint:wrapcheck
}

func (v *Nullable{{{classname}}}) UnmarshalJSON(src []byte) error {
v.isSet = true
return json.Unmarshal(src, &v.value) //nolint:wrapcheck
}
2 changes: 0 additions & 2 deletions templates/go/model_oneof.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -194,5 +194,3 @@ func (obj {{classname}}) GetActualInstance() (any) {
// all schemas are nil
return nil
}

{{> nullable_model}}
Loading

1 comment on commit 7fd687f

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.