From b13fa5a23cc5b4e8f54b35086875dde74ddcd410 Mon Sep 17 00:00:00 2001 From: jihtsan <15151999611@163.com> Date: Sun, 18 Oct 2026 18:15:38 +0800 Subject: [PATCH] fix: reject overflow when scanning SQL enum numbers (#252) --- example/noparse_sql_enum.go | 39 +- example/sql_enum.go | 76 +- example/sql_int_enum.go | 76 +- example/sql_str_enum.go | 39 +- .../Test118CustomPrefixExampleFile-1.18 | 78 +- .../Test118CustomPrefixExampleFile-og | 978 ++++++++++-------- generator/.snapshots/Test118ExampleFile-1.18 | 41 +- generator/.snapshots/Test118ExampleFile-og | 485 ++++++--- .../Test118ExampleFileMoreOptions-1.18 | 41 +- .../Test118ExampleFileMoreOptions-og | 485 ++++++--- .../.snapshots/TestCustomPrefixExampleFile | 978 ++++++++++-------- generator/.snapshots/TestExampleFile | 485 ++++++--- .../.snapshots/TestExampleFileEmptyHeaders | 485 ++++++--- .../.snapshots/TestExampleFileMoreOptions | 485 ++++++--- .../TestExampleFileMoreOptionsWithForceUpper | 485 ++++++--- generator/enum.tmpl | 86 +- generator/sql_integer_test.go | 128 +++ 17 files changed, 3709 insertions(+), 1761 deletions(-) create mode 100644 generator/sql_integer_test.go diff --git a/example/noparse_sql_enum.go b/example/noparse_sql_enum.go index 3ba72d3..21deabe 100644 --- a/example/noparse_sql_enum.go +++ b/example/noparse_sql_enum.go @@ -13,6 +13,8 @@ import ( "database/sql/driver" "errors" "fmt" + "math" + "strconv" ) const ( @@ -163,11 +165,28 @@ func (x *UnparsedSqlValues) Scan(value interface{}) (err error) { return } + // Parse integers using the enum's width before converting to avoid overflow. + scanInteger := func(value string) error { + parsed, err := strconv.ParseUint(value, 10, 8) + if err != nil { + return err + } + *x = UnparsedSqlValues(parsed) + return nil + } + scanFloat := func(value float64) error { + truncated := math.Trunc(value) + if truncated == 0 { + return scanInteger("0") + } + return scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64)) + } + // A wider range of scannable types. // driver.Value values at the top of the list for expediency switch v := value.(type) { case int64: - *x = UnparsedSqlValues(v) + return scanInteger(strconv.FormatInt(v, 10)) case string: *x, err = parseUnparsedSqlValues(v) case []byte: @@ -175,43 +194,43 @@ func (x *UnparsedSqlValues) Scan(value interface{}) (err error) { case UnparsedSqlValues: *x = v case int: - *x = UnparsedSqlValues(v) + return scanInteger(strconv.FormatInt(int64(v), 10)) case *UnparsedSqlValues: if v == nil { return errUnparsedSqlValuesNilPtr } *x = *v case uint: - *x = UnparsedSqlValues(v) + return scanInteger(strconv.FormatUint(uint64(v), 10)) case uint64: - *x = UnparsedSqlValues(v) + return scanInteger(strconv.FormatUint(v, 10)) case *int: if v == nil { return errUnparsedSqlValuesNilPtr } - *x = UnparsedSqlValues(*v) + return scanInteger(strconv.FormatInt(int64(*v), 10)) case *int64: if v == nil { return errUnparsedSqlValuesNilPtr } - *x = UnparsedSqlValues(*v) + return scanInteger(strconv.FormatInt(*v, 10)) case float64: // json marshals everything as a float64 if it's a number - *x = UnparsedSqlValues(v) + return scanFloat(v) case *float64: // json marshals everything as a float64 if it's a number if v == nil { return errUnparsedSqlValuesNilPtr } - *x = UnparsedSqlValues(*v) + return scanFloat(*v) case *uint: if v == nil { return errUnparsedSqlValuesNilPtr } - *x = UnparsedSqlValues(*v) + return scanInteger(strconv.FormatUint(uint64(*v), 10)) case *uint64: if v == nil { return errUnparsedSqlValuesNilPtr } - *x = UnparsedSqlValues(*v) + return scanInteger(strconv.FormatUint(*v, 10)) case *string: if v == nil { return errUnparsedSqlValuesNilPtr diff --git a/example/sql_enum.go b/example/sql_enum.go index 0ca0008..4c501b3 100644 --- a/example/sql_enum.go +++ b/example/sql_enum.go @@ -14,6 +14,7 @@ import ( json "encoding/json" "errors" "fmt" + "math" "strconv" ) @@ -102,78 +103,91 @@ func (x *ProjectStatus) Scan(value interface{}) (err error) { return } + // Parse integers using the enum's width before converting to avoid overflow. + scanInteger := func(value string) error { + parsed, err := strconv.ParseInt(value, 10, strconv.IntSize) + if err != nil { + return err + } + *x = ProjectStatus(parsed) + return nil + } + scanFloat := func(value float64) error { + truncated := math.Trunc(value) + if truncated == 0 { + return scanInteger("0") + } + return scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64)) + } + + scanString := func(value string) error { + parsed, err := ParseProjectStatus(value) + if err == nil { + *x = parsed + return nil + } + if intErr := scanInteger(value); intErr == nil { + return nil + } else if errors.Is(intErr, strconv.ErrRange) { + return intErr + } + return err + } + // A wider range of scannable types. // driver.Value values at the top of the list for expediency switch v := value.(type) { case int64: - *x = ProjectStatus(v) + return scanInteger(strconv.FormatInt(v, 10)) case string: - *x, err = ParseProjectStatus(v) - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(v); verr == nil { - *x, err = ProjectStatus(val), nil - } - } + return scanString(v) case []byte: - *x, err = ParseProjectStatus(string(v)) - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(string(v)); verr == nil { - *x, err = ProjectStatus(val), nil - } - } + return scanString(string(v)) case ProjectStatus: *x = v case int: - *x = ProjectStatus(v) + return scanInteger(strconv.FormatInt(int64(v), 10)) case *ProjectStatus: if v == nil { return errProjectStatusNilPtr } *x = *v case uint: - *x = ProjectStatus(v) + return scanInteger(strconv.FormatUint(uint64(v), 10)) case uint64: - *x = ProjectStatus(v) + return scanInteger(strconv.FormatUint(v, 10)) case *int: if v == nil { return errProjectStatusNilPtr } - *x = ProjectStatus(*v) + return scanInteger(strconv.FormatInt(int64(*v), 10)) case *int64: if v == nil { return errProjectStatusNilPtr } - *x = ProjectStatus(*v) + return scanInteger(strconv.FormatInt(*v, 10)) case float64: // json marshals everything as a float64 if it's a number - *x = ProjectStatus(v) + return scanFloat(v) case *float64: // json marshals everything as a float64 if it's a number if v == nil { return errProjectStatusNilPtr } - *x = ProjectStatus(*v) + return scanFloat(*v) case *uint: if v == nil { return errProjectStatusNilPtr } - *x = ProjectStatus(*v) + return scanInteger(strconv.FormatUint(uint64(*v), 10)) case *uint64: if v == nil { return errProjectStatusNilPtr } - *x = ProjectStatus(*v) + return scanInteger(strconv.FormatUint(*v, 10)) case *string: if v == nil { return errProjectStatusNilPtr } - *x, err = ParseProjectStatus(*v) - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(*v); verr == nil { - *x, err = ProjectStatus(val), nil - } - } + return scanString(*v) } return diff --git a/example/sql_int_enum.go b/example/sql_int_enum.go index 6a4695b..a13f2b9 100644 --- a/example/sql_int_enum.go +++ b/example/sql_int_enum.go @@ -13,6 +13,7 @@ import ( "database/sql/driver" "errors" "fmt" + "math" "strconv" ) @@ -81,78 +82,91 @@ func (x *ImageType) Scan(value interface{}) (err error) { return } + // Parse integers using the enum's width before converting to avoid overflow. + scanInteger := func(value string) error { + parsed, err := strconv.ParseInt(value, 10, strconv.IntSize) + if err != nil { + return err + } + *x = ImageType(parsed) + return nil + } + scanFloat := func(value float64) error { + truncated := math.Trunc(value) + if truncated == 0 { + return scanInteger("0") + } + return scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64)) + } + + scanString := func(value string) error { + parsed, err := ParseImageType(value) + if err == nil { + *x = parsed + return nil + } + if intErr := scanInteger(value); intErr == nil { + return nil + } else if errors.Is(intErr, strconv.ErrRange) { + return intErr + } + return err + } + // A wider range of scannable types. // driver.Value values at the top of the list for expediency switch v := value.(type) { case int64: - *x = ImageType(v) + return scanInteger(strconv.FormatInt(v, 10)) case string: - *x, err = ParseImageType(v) - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(v); verr == nil { - *x, err = ImageType(val), nil - } - } + return scanString(v) case []byte: - *x, err = ParseImageType(string(v)) - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(string(v)); verr == nil { - *x, err = ImageType(val), nil - } - } + return scanString(string(v)) case ImageType: *x = v case int: - *x = ImageType(v) + return scanInteger(strconv.FormatInt(int64(v), 10)) case *ImageType: if v == nil { return errImageTypeNilPtr } *x = *v case uint: - *x = ImageType(v) + return scanInteger(strconv.FormatUint(uint64(v), 10)) case uint64: - *x = ImageType(v) + return scanInteger(strconv.FormatUint(v, 10)) case *int: if v == nil { return errImageTypeNilPtr } - *x = ImageType(*v) + return scanInteger(strconv.FormatInt(int64(*v), 10)) case *int64: if v == nil { return errImageTypeNilPtr } - *x = ImageType(*v) + return scanInteger(strconv.FormatInt(*v, 10)) case float64: // json marshals everything as a float64 if it's a number - *x = ImageType(v) + return scanFloat(v) case *float64: // json marshals everything as a float64 if it's a number if v == nil { return errImageTypeNilPtr } - *x = ImageType(*v) + return scanFloat(*v) case *uint: if v == nil { return errImageTypeNilPtr } - *x = ImageType(*v) + return scanInteger(strconv.FormatUint(uint64(*v), 10)) case *uint64: if v == nil { return errImageTypeNilPtr } - *x = ImageType(*v) + return scanInteger(strconv.FormatUint(*v, 10)) case *string: if v == nil { return errImageTypeNilPtr } - *x, err = ParseImageType(*v) - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(*v); verr == nil { - *x, err = ImageType(val), nil - } - } + return scanString(*v) } return diff --git a/example/sql_str_enum.go b/example/sql_str_enum.go index a9402df..ff37d9d 100644 --- a/example/sql_str_enum.go +++ b/example/sql_str_enum.go @@ -13,6 +13,8 @@ import ( "database/sql/driver" "errors" "fmt" + "math" + "strconv" ) const ( @@ -76,11 +78,28 @@ func (x *JobState) Scan(value interface{}) (err error) { return } + // Parse integers using the enum's width before converting to avoid overflow. + scanInteger := func(value string) error { + parsed, err := strconv.ParseInt(value, 10, strconv.IntSize) + if err != nil { + return err + } + *x = JobState(parsed) + return nil + } + scanFloat := func(value float64) error { + truncated := math.Trunc(value) + if truncated == 0 { + return scanInteger("0") + } + return scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64)) + } + // A wider range of scannable types. // driver.Value values at the top of the list for expediency switch v := value.(type) { case int64: - *x = JobState(v) + return scanInteger(strconv.FormatInt(v, 10)) case string: *x, err = ParseJobState(v) case []byte: @@ -88,43 +107,43 @@ func (x *JobState) Scan(value interface{}) (err error) { case JobState: *x = v case int: - *x = JobState(v) + return scanInteger(strconv.FormatInt(int64(v), 10)) case *JobState: if v == nil { return errJobStateNilPtr } *x = *v case uint: - *x = JobState(v) + return scanInteger(strconv.FormatUint(uint64(v), 10)) case uint64: - *x = JobState(v) + return scanInteger(strconv.FormatUint(v, 10)) case *int: if v == nil { return errJobStateNilPtr } - *x = JobState(*v) + return scanInteger(strconv.FormatInt(int64(*v), 10)) case *int64: if v == nil { return errJobStateNilPtr } - *x = JobState(*v) + return scanInteger(strconv.FormatInt(*v, 10)) case float64: // json marshals everything as a float64 if it's a number - *x = JobState(v) + return scanFloat(v) case *float64: // json marshals everything as a float64 if it's a number if v == nil { return errJobStateNilPtr } - *x = JobState(*v) + return scanFloat(*v) case *uint: if v == nil { return errJobStateNilPtr } - *x = JobState(*v) + return scanInteger(strconv.FormatUint(uint64(*v), 10)) case *uint64: if v == nil { return errJobStateNilPtr } - *x = JobState(*v) + return scanInteger(strconv.FormatUint(*v, 10)) case *string: if v == nil { return errJobStateNilPtr diff --git a/generator/.snapshots/Test118CustomPrefixExampleFile-1.18 b/generator/.snapshots/Test118CustomPrefixExampleFile-1.18 index 6bd1043..8752755 100644 --- a/generator/.snapshots/Test118CustomPrefixExampleFile-1.18 +++ b/generator/.snapshots/Test118CustomPrefixExampleFile-1.18 @@ -1,4 +1,4 @@ -([]string) (len=296) { +([]string) (len=310) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -12,6 +12,7 @@ (string) (len=21) "\tjson \"encoding/json\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", @@ -104,78 +105,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = ChangeType(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=39) "\t\tparsed, err := ParseChangeType(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=30) "\t\t*x, err = ParseChangeType(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = ChangeType(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=38) "\t\t*x, err = ParseChangeType(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = ChangeType(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=17) "\tcase ChangeType:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *ChangeType:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=31) "\t\t*x, err = ParseChangeType(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = ChangeType(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", diff --git a/generator/.snapshots/Test118CustomPrefixExampleFile-og b/generator/.snapshots/Test118CustomPrefixExampleFile-og index 7a30863..d80f6a4 100644 --- a/generator/.snapshots/Test118CustomPrefixExampleFile-og +++ b/generator/.snapshots/Test118CustomPrefixExampleFile-og @@ -1,4 +1,4 @@ -([]string) (len=4174) { +([]string) (len=4344) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -12,6 +12,7 @@ (string) (len=21) "\tjson \"encoding/json\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", @@ -104,78 +105,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=35) "\t\tparsed, err := ParseAnimal(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=26) "\t\t*x, err = ParseAnimal(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=30) "\t\t\t\t*x, err = Animal(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=34) "\t\t*x, err = ParseAnimal(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=30) "\t\t\t\t*x, err = Animal(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x, err = ParseAnimal(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=30) "\t\t\t\t*x, err = Animal(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -383,78 +397,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=34) "\t\tparsed, err := ParseCases(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=25) "\t\t*x, err = ParseCases(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Cases(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=33) "\t\t*x, err = ParseCases(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Cases(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=26) "\t\t*x, err = ParseCases(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Cases(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -682,78 +709,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=34) "\t\tparsed, err := ParseColor(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=25) "\t\t*x, err = ParseColor(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Color(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=33) "\t\t*x, err = ParseColor(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Color(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=26) "\t\t*x, err = ParseColor(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Color(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -982,78 +1022,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=45) "\t\tparsed, err := ParseColorWithComment(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=40) "\t\t\t\t*x, err = ColorWithComment(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=44) "\t\t*x, err = ParseColorWithComment(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=40) "\t\t\t\t*x, err = ColorWithComment(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=37) "\t\t*x, err = ParseColorWithComment(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=40) "\t\t\t\t*x, err = ColorWithComment(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -1282,78 +1335,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=46) "\t\tparsed, err := ParseColorWithComment2(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment2(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=45) "\t\t*x, err = ParseColorWithComment2(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment2(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=38) "\t\t*x, err = ParseColorWithComment2(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment2(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -1598,78 +1664,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=46) "\t\tparsed, err := ParseColorWithComment3(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment3(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=45) "\t\t*x, err = ParseColorWithComment3(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment3(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=38) "\t\t*x, err = ParseColorWithComment3(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment3(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -1914,78 +1993,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=46) "\t\tparsed, err := ParseColorWithComment4(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment4(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=45) "\t\t*x, err = ParseColorWithComment4(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment4(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=38) "\t\t*x, err = ParseColorWithComment4(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment4(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -2253,78 +2345,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=38) "\t\tparsed, err := ParseEnum64bit(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=33) "\t\t\t\t*x, err = Enum64bit(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=37) "\t\t*x, err = ParseEnum64bit(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=33) "\t\t\t\t*x, err = Enum64bit(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=30) "\t\t*x, err = ParseEnum64bit(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=33) "\t\t\t\t*x, err = Enum64bit(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -2536,78 +2641,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=34) "\t\tparsed, err := ParseModel(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=25) "\t\t*x, err = ParseModel(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Model(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=33) "\t\t*x, err = ParseModel(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Model(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=26) "\t\t*x, err = ParseModel(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Model(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -2815,78 +2933,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=37) "\t\tparsed, err := ParseNonASCII(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=32) "\t\t\t\t*x, err = NonASCII(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=36) "\t\t*x, err = ParseNonASCII(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=32) "\t\t\t\t*x, err = NonASCII(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=29) "\t\t*x, err = ParseNonASCII(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=32) "\t\t\t\t*x, err = NonASCII(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -3114,78 +3245,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=39) "\t\tparsed, err := ParseSanitizing(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = Sanitizing(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=38) "\t\t*x, err = ParseSanitizing(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = Sanitizing(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=31) "\t\t*x, err = ParseSanitizing(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = Sanitizing(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -3393,78 +3537,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=33) "\t\tparsed, err := ParseSoda(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=24) "\t\t*x, err = ParseSoda(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=28) "\t\t\t\t*x, err = Soda(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=32) "\t\t*x, err = ParseSoda(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=28) "\t\t\t\t*x, err = Soda(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=25) "\t\t*x, err = ParseSoda(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=28) "\t\t\t\t*x, err = Soda(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -3667,78 +3824,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=41) "\t\tparsed, err := ParseStartNotZero(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=36) "\t\t\t\t*x, err = StartNotZero(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=40) "\t\t*x, err = ParseStartNotZero(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=36) "\t\t\t\t*x, err = StartNotZero(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=33) "\t\t*x, err = ParseStartNotZero(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=36) "\t\t\t\t*x, err = StartNotZero(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", diff --git a/generator/.snapshots/Test118ExampleFile-1.18 b/generator/.snapshots/Test118ExampleFile-1.18 index c49bc61..33803e9 100644 --- a/generator/.snapshots/Test118ExampleFile-1.18 +++ b/generator/.snapshots/Test118ExampleFile-1.18 @@ -1,4 +1,4 @@ -([]string) (len=180) { +([]string) (len=199) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -11,6 +11,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -115,11 +117,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = ChangeType(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseChangeType(v)", (string) (len=13) "\tcase []byte:", @@ -127,43 +146,43 @@ (string) (len=17) "\tcase ChangeType:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *ChangeType:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", diff --git a/generator/.snapshots/Test118ExampleFile-og b/generator/.snapshots/Test118ExampleFile-og index fd28e15..c2548af 100644 --- a/generator/.snapshots/Test118ExampleFile-og +++ b/generator/.snapshots/Test118ExampleFile-og @@ -1,4 +1,4 @@ -([]string) (len=2532) { +([]string) (len=2755) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -11,6 +11,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -115,11 +117,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=26) "\t\t*x, err = ParseAnimal(v)", (string) (len=13) "\tcase []byte:", @@ -127,43 +146,43 @@ (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", @@ -280,11 +299,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseCases(v)", (string) (len=13) "\tcase []byte:", @@ -292,43 +328,43 @@ (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", @@ -469,11 +505,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseColor(v)", (string) (len=13) "\tcase []byte:", @@ -481,43 +534,43 @@ (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", @@ -659,11 +712,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", (string) (len=13) "\tcase []byte:", @@ -671,43 +741,43 @@ (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", @@ -849,11 +919,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", (string) (len=13) "\tcase []byte:", @@ -861,43 +948,43 @@ (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", @@ -1058,11 +1145,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", (string) (len=13) "\tcase []byte:", @@ -1070,43 +1174,43 @@ (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", @@ -1266,11 +1370,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", (string) (len=13) "\tcase []byte:", @@ -1278,43 +1399,43 @@ (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", @@ -1503,11 +1624,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", (string) (len=13) "\tcase []byte:", @@ -1515,43 +1653,43 @@ (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", @@ -1672,11 +1810,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseModel(v)", (string) (len=13) "\tcase []byte:", @@ -1684,43 +1839,43 @@ (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", @@ -1837,11 +1992,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", (string) (len=13) "\tcase []byte:", @@ -1849,43 +2021,43 @@ (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", @@ -2026,11 +2198,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", (string) (len=13) "\tcase []byte:", @@ -2038,43 +2227,43 @@ (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", @@ -2191,11 +2380,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=24) "\t\t*x, err = ParseSoda(v)", (string) (len=13) "\tcase []byte:", @@ -2203,43 +2409,43 @@ (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", @@ -2350,11 +2556,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", (string) (len=13) "\tcase []byte:", @@ -2362,43 +2585,43 @@ (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", diff --git a/generator/.snapshots/Test118ExampleFileMoreOptions-1.18 b/generator/.snapshots/Test118ExampleFileMoreOptions-1.18 index c26252f..6865d5f 100644 --- a/generator/.snapshots/Test118ExampleFileMoreOptions-1.18 +++ b/generator/.snapshots/Test118ExampleFileMoreOptions-1.18 @@ -1,4 +1,4 @@ -([]string) (len=197) { +([]string) (len=216) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -11,6 +11,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -124,11 +126,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = ChangeType(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseChangeType(v)", (string) (len=13) "\tcase []byte:", @@ -136,43 +155,43 @@ (string) (len=17) "\tcase ChangeType:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *ChangeType:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = ChangeType(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = ChangeType(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errChangeTypeNilPtr", diff --git a/generator/.snapshots/Test118ExampleFileMoreOptions-og b/generator/.snapshots/Test118ExampleFileMoreOptions-og index 919acf3..99e5c23 100644 --- a/generator/.snapshots/Test118ExampleFileMoreOptions-og +++ b/generator/.snapshots/Test118ExampleFileMoreOptions-og @@ -1,4 +1,4 @@ -([]string) (len=2770) { +([]string) (len=2993) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -11,6 +11,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -124,11 +126,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=26) "\t\t*x, err = ParseAnimal(v)", (string) (len=13) "\tcase []byte:", @@ -136,43 +155,43 @@ (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", @@ -306,11 +325,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseCases(v)", (string) (len=13) "\tcase []byte:", @@ -318,43 +354,43 @@ (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", @@ -512,11 +548,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseColor(v)", (string) (len=13) "\tcase []byte:", @@ -524,43 +577,43 @@ (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", @@ -719,11 +772,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", (string) (len=13) "\tcase []byte:", @@ -731,43 +801,43 @@ (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", @@ -926,11 +996,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", (string) (len=13) "\tcase []byte:", @@ -938,43 +1025,43 @@ (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", @@ -1152,11 +1239,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", (string) (len=13) "\tcase []byte:", @@ -1164,43 +1268,43 @@ (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", @@ -1377,11 +1481,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", (string) (len=13) "\tcase []byte:", @@ -1389,43 +1510,43 @@ (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", @@ -1631,11 +1752,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", (string) (len=13) "\tcase []byte:", @@ -1643,43 +1781,43 @@ (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", @@ -1817,11 +1955,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseModel(v)", (string) (len=13) "\tcase []byte:", @@ -1829,43 +1984,43 @@ (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", @@ -1999,11 +2154,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", (string) (len=13) "\tcase []byte:", @@ -2011,43 +2183,43 @@ (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", @@ -2205,11 +2377,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", (string) (len=13) "\tcase []byte:", @@ -2217,43 +2406,43 @@ (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", @@ -2387,11 +2576,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=24) "\t\t*x, err = ParseSoda(v)", (string) (len=13) "\tcase []byte:", @@ -2399,43 +2605,43 @@ (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", @@ -2563,11 +2769,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", (string) (len=13) "\tcase []byte:", @@ -2575,43 +2798,43 @@ (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", diff --git a/generator/.snapshots/TestCustomPrefixExampleFile b/generator/.snapshots/TestCustomPrefixExampleFile index 7a30863..d80f6a4 100644 --- a/generator/.snapshots/TestCustomPrefixExampleFile +++ b/generator/.snapshots/TestCustomPrefixExampleFile @@ -1,4 +1,4 @@ -([]string) (len=4174) { +([]string) (len=4344) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -12,6 +12,7 @@ (string) (len=21) "\tjson \"encoding/json\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", @@ -104,78 +105,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=35) "\t\tparsed, err := ParseAnimal(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=26) "\t\t*x, err = ParseAnimal(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=30) "\t\t\t\t*x, err = Animal(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=34) "\t\t*x, err = ParseAnimal(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=30) "\t\t\t\t*x, err = Animal(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x, err = ParseAnimal(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=30) "\t\t\t\t*x, err = Animal(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -383,78 +397,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=34) "\t\tparsed, err := ParseCases(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=25) "\t\t*x, err = ParseCases(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Cases(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=33) "\t\t*x, err = ParseCases(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Cases(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=26) "\t\t*x, err = ParseCases(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Cases(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -682,78 +709,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=34) "\t\tparsed, err := ParseColor(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=25) "\t\t*x, err = ParseColor(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Color(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=33) "\t\t*x, err = ParseColor(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Color(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=26) "\t\t*x, err = ParseColor(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Color(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -982,78 +1022,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=45) "\t\tparsed, err := ParseColorWithComment(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=40) "\t\t\t\t*x, err = ColorWithComment(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=44) "\t\t*x, err = ParseColorWithComment(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=40) "\t\t\t\t*x, err = ColorWithComment(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=37) "\t\t*x, err = ParseColorWithComment(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=40) "\t\t\t\t*x, err = ColorWithComment(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -1282,78 +1335,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=46) "\t\tparsed, err := ParseColorWithComment2(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment2(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=45) "\t\t*x, err = ParseColorWithComment2(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment2(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=38) "\t\t*x, err = ParseColorWithComment2(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment2(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -1598,78 +1664,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=46) "\t\tparsed, err := ParseColorWithComment3(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment3(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=45) "\t\t*x, err = ParseColorWithComment3(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment3(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=38) "\t\t*x, err = ParseColorWithComment3(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment3(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -1914,78 +1993,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=46) "\t\tparsed, err := ParseColorWithComment4(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment4(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=45) "\t\t*x, err = ParseColorWithComment4(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment4(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=38) "\t\t*x, err = ParseColorWithComment4(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=41) "\t\t\t\t*x, err = ColorWithComment4(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -2253,78 +2345,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=38) "\t\tparsed, err := ParseEnum64bit(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=33) "\t\t\t\t*x, err = Enum64bit(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=37) "\t\t*x, err = ParseEnum64bit(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=33) "\t\t\t\t*x, err = Enum64bit(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=30) "\t\t*x, err = ParseEnum64bit(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=33) "\t\t\t\t*x, err = Enum64bit(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -2536,78 +2641,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=34) "\t\tparsed, err := ParseModel(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=25) "\t\t*x, err = ParseModel(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Model(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=33) "\t\t*x, err = ParseModel(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Model(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=26) "\t\t*x, err = ParseModel(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=29) "\t\t\t\t*x, err = Model(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -2815,78 +2933,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=37) "\t\tparsed, err := ParseNonASCII(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=32) "\t\t\t\t*x, err = NonASCII(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=36) "\t\t*x, err = ParseNonASCII(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=32) "\t\t\t\t*x, err = NonASCII(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=29) "\t\t*x, err = ParseNonASCII(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=32) "\t\t\t\t*x, err = NonASCII(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -3114,78 +3245,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=39) "\t\tparsed, err := ParseSanitizing(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = Sanitizing(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=38) "\t\t*x, err = ParseSanitizing(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = Sanitizing(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=31) "\t\t*x, err = ParseSanitizing(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=34) "\t\t\t\t*x, err = Sanitizing(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -3393,78 +3537,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=33) "\t\tparsed, err := ParseSoda(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=24) "\t\t*x, err = ParseSoda(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=28) "\t\t\t\t*x, err = Soda(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=32) "\t\t*x, err = ParseSoda(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=28) "\t\t\t\t*x, err = Soda(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=25) "\t\t*x, err = ParseSoda(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=28) "\t\t\t\t*x, err = Soda(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", @@ -3667,78 +3824,91 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", + (string) (len=41) "\tscanString := func(value string) error {", + (string) (len=41) "\t\tparsed, err := ParseStartNotZero(value)", + (string) (len=17) "\t\tif err == nil {", + (string) (len=14) "\t\t\t*x = parsed", + (string) (len=13) "\t\t\treturn nil", + (string) (len=3) "\t\t}", + (string) (len=50) "\t\tif intErr := scanInteger(value); intErr == nil {", + (string) (len=13) "\t\t\treturn nil", + (string) (len=49) "\t\t} else if errors.Is(intErr, strconv.ErrRange) {", + (string) (len=16) "\t\t\treturn intErr", + (string) (len=3) "\t\t}", + (string) (len=12) "\t\treturn err", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", - (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=49) "\t\t\tif val, verr := strconv.Atoi(v); verr == nil {", - (string) (len=36) "\t\t\t\t*x, err = StartNotZero(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=22) "\t\treturn scanString(v)", (string) (len=13) "\tcase []byte:", - (string) (len=40) "\t\t*x, err = ParseStartNotZero(string(v))", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=57) "\t\t\tif val, verr := strconv.Atoi(string(v)); verr == nil {", - (string) (len=36) "\t\t\t\t*x, err = StartNotZero(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=30) "\t\treturn scanString(string(v))", (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=33) "\t\t*x, err = ParseStartNotZero(*v)", - (string) (len=17) "\t\tif err != nil {", - (string) (len=47) "\t\t\t// try parsing the integer value as a string", - (string) (len=50) "\t\t\tif val, verr := strconv.Atoi(*v); verr == nil {", - (string) (len=36) "\t\t\t\t*x, err = StartNotZero(val), nil", - (string) (len=4) "\t\t\t}", - (string) (len=3) "\t\t}", + (string) (len=23) "\t\treturn scanString(*v)", (string) (len=2) "\t}", (string) "", (string) (len=7) "\treturn", diff --git a/generator/.snapshots/TestExampleFile b/generator/.snapshots/TestExampleFile index fd28e15..c2548af 100644 --- a/generator/.snapshots/TestExampleFile +++ b/generator/.snapshots/TestExampleFile @@ -1,4 +1,4 @@ -([]string) (len=2532) { +([]string) (len=2755) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -11,6 +11,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -115,11 +117,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=26) "\t\t*x, err = ParseAnimal(v)", (string) (len=13) "\tcase []byte:", @@ -127,43 +146,43 @@ (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", @@ -280,11 +299,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseCases(v)", (string) (len=13) "\tcase []byte:", @@ -292,43 +328,43 @@ (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", @@ -469,11 +505,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseColor(v)", (string) (len=13) "\tcase []byte:", @@ -481,43 +534,43 @@ (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", @@ -659,11 +712,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", (string) (len=13) "\tcase []byte:", @@ -671,43 +741,43 @@ (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", @@ -849,11 +919,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", (string) (len=13) "\tcase []byte:", @@ -861,43 +948,43 @@ (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", @@ -1058,11 +1145,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", (string) (len=13) "\tcase []byte:", @@ -1070,43 +1174,43 @@ (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", @@ -1266,11 +1370,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", (string) (len=13) "\tcase []byte:", @@ -1278,43 +1399,43 @@ (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", @@ -1503,11 +1624,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", (string) (len=13) "\tcase []byte:", @@ -1515,43 +1653,43 @@ (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", @@ -1672,11 +1810,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseModel(v)", (string) (len=13) "\tcase []byte:", @@ -1684,43 +1839,43 @@ (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", @@ -1837,11 +1992,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", (string) (len=13) "\tcase []byte:", @@ -1849,43 +2021,43 @@ (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", @@ -2026,11 +2198,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", (string) (len=13) "\tcase []byte:", @@ -2038,43 +2227,43 @@ (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", @@ -2191,11 +2380,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=24) "\t\t*x, err = ParseSoda(v)", (string) (len=13) "\tcase []byte:", @@ -2203,43 +2409,43 @@ (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", @@ -2350,11 +2556,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", (string) (len=13) "\tcase []byte:", @@ -2362,43 +2585,43 @@ (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", diff --git a/generator/.snapshots/TestExampleFileEmptyHeaders b/generator/.snapshots/TestExampleFileEmptyHeaders index 37f1c01..0ec350f 100644 --- a/generator/.snapshots/TestExampleFileEmptyHeaders +++ b/generator/.snapshots/TestExampleFileEmptyHeaders @@ -1,4 +1,4 @@ -([]string) (len=2528) { +([]string) (len=2751) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) "", (string) (len=17) "package generator", @@ -7,6 +7,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -111,11 +113,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=26) "\t\t*x, err = ParseAnimal(v)", (string) (len=13) "\tcase []byte:", @@ -123,43 +142,43 @@ (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", @@ -276,11 +295,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseCases(v)", (string) (len=13) "\tcase []byte:", @@ -288,43 +324,43 @@ (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", @@ -465,11 +501,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseColor(v)", (string) (len=13) "\tcase []byte:", @@ -477,43 +530,43 @@ (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", @@ -655,11 +708,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", (string) (len=13) "\tcase []byte:", @@ -667,43 +737,43 @@ (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", @@ -845,11 +915,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", (string) (len=13) "\tcase []byte:", @@ -857,43 +944,43 @@ (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", @@ -1054,11 +1141,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", (string) (len=13) "\tcase []byte:", @@ -1066,43 +1170,43 @@ (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", @@ -1262,11 +1366,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", (string) (len=13) "\tcase []byte:", @@ -1274,43 +1395,43 @@ (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", @@ -1499,11 +1620,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", (string) (len=13) "\tcase []byte:", @@ -1511,43 +1649,43 @@ (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", @@ -1668,11 +1806,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseModel(v)", (string) (len=13) "\tcase []byte:", @@ -1680,43 +1835,43 @@ (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", @@ -1833,11 +1988,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", (string) (len=13) "\tcase []byte:", @@ -1845,43 +2017,43 @@ (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", @@ -2022,11 +2194,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", (string) (len=13) "\tcase []byte:", @@ -2034,43 +2223,43 @@ (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", @@ -2187,11 +2376,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=24) "\t\t*x, err = ParseSoda(v)", (string) (len=13) "\tcase []byte:", @@ -2199,43 +2405,43 @@ (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", @@ -2346,11 +2552,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", (string) (len=13) "\tcase []byte:", @@ -2358,43 +2581,43 @@ (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", diff --git a/generator/.snapshots/TestExampleFileMoreOptions b/generator/.snapshots/TestExampleFileMoreOptions index 919acf3..99e5c23 100644 --- a/generator/.snapshots/TestExampleFileMoreOptions +++ b/generator/.snapshots/TestExampleFileMoreOptions @@ -1,4 +1,4 @@ -([]string) (len=2770) { +([]string) (len=2993) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -11,6 +11,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -124,11 +126,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=26) "\t\t*x, err = ParseAnimal(v)", (string) (len=13) "\tcase []byte:", @@ -136,43 +155,43 @@ (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", @@ -306,11 +325,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseCases(v)", (string) (len=13) "\tcase []byte:", @@ -318,43 +354,43 @@ (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", @@ -512,11 +548,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseColor(v)", (string) (len=13) "\tcase []byte:", @@ -524,43 +577,43 @@ (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", @@ -719,11 +772,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", (string) (len=13) "\tcase []byte:", @@ -731,43 +801,43 @@ (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", @@ -926,11 +996,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", (string) (len=13) "\tcase []byte:", @@ -938,43 +1025,43 @@ (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", @@ -1152,11 +1239,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", (string) (len=13) "\tcase []byte:", @@ -1164,43 +1268,43 @@ (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", @@ -1377,11 +1481,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", (string) (len=13) "\tcase []byte:", @@ -1389,43 +1510,43 @@ (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", @@ -1631,11 +1752,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", (string) (len=13) "\tcase []byte:", @@ -1643,43 +1781,43 @@ (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", @@ -1817,11 +1955,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseModel(v)", (string) (len=13) "\tcase []byte:", @@ -1829,43 +1984,43 @@ (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", @@ -1999,11 +2154,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", (string) (len=13) "\tcase []byte:", @@ -2011,43 +2183,43 @@ (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", @@ -2205,11 +2377,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", (string) (len=13) "\tcase []byte:", @@ -2217,43 +2406,43 @@ (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", @@ -2387,11 +2576,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=24) "\t\t*x, err = ParseSoda(v)", (string) (len=13) "\tcase []byte:", @@ -2399,43 +2605,43 @@ (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", @@ -2563,11 +2769,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", (string) (len=13) "\tcase []byte:", @@ -2575,43 +2798,43 @@ (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", diff --git a/generator/.snapshots/TestExampleFileMoreOptionsWithForceUpper b/generator/.snapshots/TestExampleFileMoreOptionsWithForceUpper index d31448c..f196fac 100644 --- a/generator/.snapshots/TestExampleFileMoreOptionsWithForceUpper +++ b/generator/.snapshots/TestExampleFileMoreOptionsWithForceUpper @@ -1,4 +1,4 @@ -([]string) (len=2635) { +([]string) (len=2858) { (string) (len=41) "// Code generated by go-enum DO NOT EDIT.", (string) (len=13) "// Version: -", (string) (len=14) "// Revision: -", @@ -11,6 +11,8 @@ (string) (len=22) "\t\"database/sql/driver\"", (string) (len=9) "\t\"errors\"", (string) (len=6) "\t\"fmt\"", + (string) (len=7) "\t\"math\"", + (string) (len=10) "\t\"strconv\"", (string) (len=10) "\t\"strings\"", (string) (len=1) ")", (string) "", @@ -117,11 +119,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=21) "\t\t*x = Animal(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=26) "\t\t*x, err = ParseAnimal(v)", (string) (len=13) "\tcase []byte:", @@ -129,43 +148,43 @@ (string) (len=13) "\tcase Animal:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=14) "\tcase *Animal:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=16) "\t\t*x = Animal(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", (string) (len=3) "\t\t}", - (string) (len=17) "\t\t*x = Animal(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=25) "\t\t\treturn errAnimalNilPtr", @@ -292,11 +311,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Cases(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseCases(v)", (string) (len=13) "\tcase []byte:", @@ -304,43 +340,43 @@ (string) (len=12) "\tcase Cases:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Cases:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Cases(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Cases(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errCasesNilPtr", @@ -487,11 +523,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Color(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseColor(v)", (string) (len=13) "\tcase []byte:", @@ -499,43 +552,43 @@ (string) (len=12) "\tcase Color:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Color:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Color(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Color(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errColorNilPtr", @@ -683,11 +736,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=31) "\t\t*x = ColorWithComment(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=36) "\t\t*x, err = ParseColorWithComment(v)", (string) (len=13) "\tcase []byte:", @@ -695,43 +765,43 @@ (string) (len=23) "\tcase ColorWithComment:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=24) "\tcase *ColorWithComment:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=26) "\t\t*x = ColorWithComment(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", (string) (len=3) "\t\t}", - (string) (len=27) "\t\t*x = ColorWithComment(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=35) "\t\t\treturn errColorWithCommentNilPtr", @@ -879,11 +949,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment2(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment2(v)", (string) (len=13) "\tcase []byte:", @@ -891,43 +978,43 @@ (string) (len=24) "\tcase ColorWithComment2:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment2:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment2(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment2(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment2NilPtr", @@ -1091,11 +1178,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment3(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment3(v)", (string) (len=13) "\tcase []byte:", @@ -1103,43 +1207,43 @@ (string) (len=24) "\tcase ColorWithComment3:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment3:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment3(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment3(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment3NilPtr", @@ -1303,11 +1407,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=32) "\t\t*x = ColorWithComment4(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=37) "\t\t*x, err = ParseColorWithComment4(v)", (string) (len=13) "\tcase []byte:", @@ -1315,43 +1436,43 @@ (string) (len=24) "\tcase ColorWithComment4:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=25) "\tcase *ColorWithComment4:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=27) "\t\t*x = ColorWithComment4(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", (string) (len=3) "\t\t}", - (string) (len=28) "\t\t*x = ColorWithComment4(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=36) "\t\t\treturn errColorWithComment4NilPtr", @@ -1538,11 +1659,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=49) "\t\tparsed, err := strconv.ParseUint(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=24) "\t\t*x = Enum64bit(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=29) "\t\t*x, err = ParseEnum64bit(v)", (string) (len=13) "\tcase []byte:", @@ -1550,43 +1688,43 @@ (string) (len=16) "\tcase Enum64bit:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=17) "\tcase *Enum64bit:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=19) "\t\t*x = Enum64bit(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", (string) (len=3) "\t\t}", - (string) (len=20) "\t\t*x = Enum64bit(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=28) "\t\t\treturn errEnum64bitNilPtr", @@ -1717,11 +1855,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 32)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=20) "\t\t*x = Model(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=25) "\t\t*x, err = ParseModel(v)", (string) (len=13) "\tcase []byte:", @@ -1729,43 +1884,43 @@ (string) (len=12) "\tcase Model:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=13) "\tcase *Model:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=15) "\t\t*x = Model(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", (string) (len=3) "\t\t}", - (string) (len=16) "\t\t*x = Model(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=24) "\t\t\treturn errModelNilPtr", @@ -1892,11 +2047,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=61) "\t\tparsed, err := strconv.ParseInt(value, 10, strconv.IntSize)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=23) "\t\t*x = NonASCII(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=28) "\t\t*x, err = ParseNonASCII(v)", (string) (len=13) "\tcase []byte:", @@ -1904,43 +2076,43 @@ (string) (len=15) "\tcase NonASCII:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=16) "\tcase *NonASCII:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=18) "\t\t*x = NonASCII(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", (string) (len=3) "\t\t}", - (string) (len=19) "\t\t*x = NonASCII(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=27) "\t\t\treturn errNonASCIINilPtr", @@ -2087,11 +2259,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=25) "\t\t*x = Sanitizing(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=30) "\t\t*x, err = ParseSanitizing(v)", (string) (len=13) "\tcase []byte:", @@ -2099,43 +2288,43 @@ (string) (len=17) "\tcase Sanitizing:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=18) "\tcase *Sanitizing:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=20) "\t\t*x = Sanitizing(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", (string) (len=3) "\t\t}", - (string) (len=21) "\t\t*x = Sanitizing(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=29) "\t\t\treturn errSanitizingNilPtr", @@ -2262,11 +2451,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=19) "\t\t*x = Soda(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=24) "\t\t*x, err = ParseSoda(v)", (string) (len=13) "\tcase []byte:", @@ -2274,43 +2480,43 @@ (string) (len=11) "\tcase Soda:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=12) "\tcase *Soda:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=14) "\t\t*x = Soda(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", (string) (len=3) "\t\t}", - (string) (len=15) "\t\t*x = Soda(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=23) "\t\t\treturn errSodaNilPtr", @@ -2432,11 +2638,28 @@ (string) (len=8) "\t\treturn", (string) (len=2) "\t}", (string) "", + (string) (len=78) "\t// Parse integers using the enum's width before converting to avoid overflow.", + (string) (len=42) "\tscanInteger := func(value string) error {", + (string) (len=48) "\t\tparsed, err := strconv.ParseInt(value, 10, 64)", + (string) (len=17) "\t\tif err != nil {", + (string) (len=13) "\t\t\treturn err", + (string) (len=3) "\t\t}", + (string) (len=27) "\t\t*x = StartNotZero(parsed)", + (string) (len=12) "\t\treturn nil", + (string) (len=2) "\t}", + (string) (len=41) "\tscanFloat := func(value float64) error {", + (string) (len=32) "\t\ttruncated := math.Trunc(value)", + (string) (len=21) "\t\tif truncated == 0 {", + (string) (len=26) "\t\t\treturn scanInteger(\"0\")", + (string) (len=3) "\t\t}", + (string) (len=64) "\t\treturn scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64))", + (string) (len=2) "\t}", + (string) "", (string) (len=37) "\t// A wider range of scannable types.", (string) (len=61) "\t// driver.Value values at the top of the list for expediency", (string) (len=27) "\tswitch v := value.(type) {", (string) (len=12) "\tcase int64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=46) "\t\treturn scanInteger(strconv.FormatInt(v, 10))", (string) (len=13) "\tcase string:", (string) (len=32) "\t\t*x, err = ParseStartNotZero(v)", (string) (len=13) "\tcase []byte:", @@ -2444,43 +2667,43 @@ (string) (len=19) "\tcase StartNotZero:", (string) (len=8) "\t\t*x = v", (string) (len=10) "\tcase int:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=53) "\t\treturn scanInteger(strconv.FormatInt(int64(v), 10))", (string) (len=20) "\tcase *StartNotZero:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", (string) (len=9) "\t\t*x = *v", (string) (len=11) "\tcase uint:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=55) "\t\treturn scanInteger(strconv.FormatUint(uint64(v), 10))", (string) (len=13) "\tcase uint64:", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatUint(v, 10))", (string) (len=11) "\tcase *int:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=54) "\t\treturn scanInteger(strconv.FormatInt(int64(*v), 10))", (string) (len=13) "\tcase *int64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=47) "\t\treturn scanInteger(strconv.FormatInt(*v, 10))", (string) (len=72) "\tcase float64: // json marshals everything as a float64 if it's a number", - (string) (len=22) "\t\t*x = StartNotZero(v)", + (string) (len=21) "\t\treturn scanFloat(v)", (string) (len=73) "\tcase *float64: // json marshals everything as a float64 if it's a number", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=22) "\t\treturn scanFloat(*v)", (string) (len=12) "\tcase *uint:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=56) "\t\treturn scanInteger(strconv.FormatUint(uint64(*v), 10))", (string) (len=14) "\tcase *uint64:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", (string) (len=3) "\t\t}", - (string) (len=23) "\t\t*x = StartNotZero(*v)", + (string) (len=48) "\t\treturn scanInteger(strconv.FormatUint(*v, 10))", (string) (len=14) "\tcase *string:", (string) (len=15) "\t\tif v == nil {", (string) (len=31) "\t\t\treturn errStartNotZeroNilPtr", diff --git a/generator/enum.tmpl b/generator/enum.tmpl index 43b13c3..ee1160a 100644 --- a/generator/enum.tmpl +++ b/generator/enum.tmpl @@ -132,78 +132,102 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) { return } + // Parse integers using the enum's width before converting to avoid overflow. + scanInteger := func(value string) error { +{{if has .enum.Type (list "int" "int8" "int16" "int32" "int64" "uint" "uint8" "uint16" "uint32" "uint64" "uintptr" "byte" "rune")}} parsed, err := strconv.{{if or (hasPrefix "u" .enum.Type) (eq .enum.Type "byte")}}ParseUint{{else}}ParseInt{{end}}(value, 10, {{if or (eq .enum.Type "int") (eq .enum.Type "uint") (eq .enum.Type "uintptr")}}strconv.IntSize{{else if eq .enum.Type "byte"}}8{{else if eq .enum.Type "rune"}}32{{else}}{{trimPrefix "int" (trimPrefix "u" .enum.Type)}}{{end}}){{else}} + // Named integer types retain their underlying width and signedness. + if ^{{.enum.Name}}(0) > 0 { + parsed, err := strconv.ParseUint(value, 10, reflect.TypeOf(*x).Bits()) + if err != nil { + return err + } + *x = {{.enum.Name}}(parsed) + return nil + } + parsed, err := strconv.ParseInt(value, 10, reflect.TypeOf(*x).Bits()){{end}} + if err != nil { + return err + } + *x = {{.enum.Name}}(parsed) + return nil + } + scanFloat := func(value float64) error { + truncated := math.Trunc(value) + if truncated == 0 { + return scanInteger("0") + } + return scanInteger(strconv.FormatFloat(truncated, 'f', 0, 64)) + } +{{if .sqlnullint }} + scanString := func(value string) error { + parsed, err := {{.parseName}}{{.enum.Name}}(value) + if err == nil { + *x = parsed + return nil + } + if intErr := scanInteger(value); intErr == nil { + return nil + } else if errors.Is(intErr, strconv.ErrRange) { + return intErr + } + return err + } +{{end}} + // A wider range of scannable types. // driver.Value values at the top of the list for expediency switch v := value.(type) { case int64: - *x = {{.enum.Name}}(v) + return scanInteger(strconv.FormatInt(v, 10)) case string: - *x, err = {{.parseName}}{{.enum.Name}}(v){{if .sqlnullint }} - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(v); verr == nil { - *x, err = {{.enum.Name}}(val), nil - } - }{{end}} +{{if .sqlnullint }} return scanString(v){{else}} *x, err = {{.parseName}}{{.enum.Name}}(v){{end}} case []byte: - *x, err = {{.parseName}}{{.enum.Name}}(string(v)){{if .sqlnullint }} - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(string(v)); verr == nil { - *x, err = {{.enum.Name}}(val), nil - } - }{{end}} +{{if .sqlnullint }} return scanString(string(v)){{else}} *x, err = {{.parseName}}{{.enum.Name}}(string(v)){{end}} case {{.enum.Name}}: *x = v case int: - *x = {{.enum.Name}}(v) + return scanInteger(strconv.FormatInt(int64(v), 10)) case *{{.enum.Name}}: if v == nil{ return err{{.enum.Name}}NilPtr } *x = *v case uint: - *x = {{.enum.Name}}(v) + return scanInteger(strconv.FormatUint(uint64(v), 10)) case uint64: - *x = {{.enum.Name}}(v) + return scanInteger(strconv.FormatUint(v, 10)) case *int: if v == nil{ return err{{.enum.Name}}NilPtr } - *x = {{.enum.Name}}(*v) + return scanInteger(strconv.FormatInt(int64(*v), 10)) case *int64: if v == nil{ return err{{.enum.Name}}NilPtr } - *x = {{.enum.Name}}(*v) + return scanInteger(strconv.FormatInt(*v, 10)) case float64: // json marshals everything as a float64 if it's a number - *x = {{.enum.Name}}(v) + return scanFloat(v) case *float64: // json marshals everything as a float64 if it's a number if v == nil{ return err{{.enum.Name}}NilPtr } - *x = {{.enum.Name}}(*v) + return scanFloat(*v) case *uint: if v == nil{ return err{{.enum.Name}}NilPtr } - *x = {{.enum.Name}}(*v) + return scanInteger(strconv.FormatUint(uint64(*v), 10)) case *uint64: if v == nil{ return err{{.enum.Name}}NilPtr } - *x = {{.enum.Name}}(*v) + return scanInteger(strconv.FormatUint(*v, 10)) case *string: if v == nil{ return err{{.enum.Name}}NilPtr } - *x, err = {{.parseName}}{{.enum.Name}}(*v){{if .sqlnullint }} - if err != nil { - // try parsing the integer value as a string - if val, verr := strconv.Atoi(*v); verr == nil { - *x, err = {{.enum.Name}}(val), nil - } - }{{end}} +{{if .sqlnullint }} return scanString(*v){{else}} *x, err = {{.parseName}}{{.enum.Name}}(*v){{end}} } return diff --git a/generator/sql_integer_test.go b/generator/sql_integer_test.go new file mode 100644 index 0000000..9d1fd73 --- /dev/null +++ b/generator/sql_integer_test.go @@ -0,0 +1,128 @@ +package generator + +import ( + "fmt" + "go/parser" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +// Exercise the generated Scanner, including conversions that wrap to a named value. +func TestSQLIntegerOverflow(t *testing.T) { + input := "package bounds\n\ntype CustomSigned int8\ntype CustomUnsigned uint8\n" + types := []string{"int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64", "uintptr", "byte", "rune", "CustomSigned", "CustomUnsigned"} + for i, typ := range types { + input += fmt.Sprintf("// ENUM(Zero, One)\ntype Number%d %s\n", i, typ) + } + for _, mode := range []struct { + name string + option Option + numericStrings bool + }{ + {"sql", WithSQLDriver(), false}, + {"sqlnullstr", WithSQLNullStr(), false}, + {"sqlnullint", WithSQLNullInt(), true}, + } { + t.Run(mode.name, func(t *testing.T) { + g := NewGenerator(mode.option) + f, err := parser.ParseFile(g.fileSet, "bounds.go", input, parser.ParseComments) + require.NoError(t, err) + output, err := g.Generate(f) + require.NoError(t, err) + dir := t.TempDir() + for name, contents := range map[string]string{ + "go.mod": "module bounds\n\ngo 1.25.0\n", + "bounds.go": input, + "bounds_enum.go": string(output), + "bounds_test.go": strings.ReplaceAll(sqlIntegerBoundsTest, "NUMERIC_STRINGS", fmt.Sprint(mode.numericStrings)), + } { + require.NoError(t, os.WriteFile(filepath.Join(dir, name), []byte(contents), 0600)) + } + cmd := exec.Command("go", "test", "-count=1", "./...") + cmd.Dir = dir + result, err := cmd.CombinedOutput() + require.NoError(t, err, "%s", result) + }) + } +} + +const sqlIntegerBoundsTest = `package bounds +import ( + "fmt" + "math" + "reflect" + "strconv" + "testing" +) +type scanner interface { Scan(interface{}) error } +func TestBounds(t *testing.T) { + cases := []struct { + name string + create func() scanner + invalid []interface{} + maximum interface{} + }{ +{"int", func() scanner { x := Number0One; return &x }, []interface{}{uint64(math.MaxUint64)}, int64(1 << (strconv.IntSize-2))}, +{"int8", func() scanner { x := Number1One; return &x }, []interface{}{uint64(math.MaxUint64), int64(math.MaxInt8)+1, int64(math.MinInt8)-1}, int64(math.MaxInt8)}, +{"int16", func() scanner { x := Number2One; return &x }, []interface{}{uint64(math.MaxUint64), int64(math.MaxInt16)+1, int64(math.MinInt16)-1}, int64(math.MaxInt16)}, +{"int32", func() scanner { x := Number3One; return &x }, []interface{}{uint64(math.MaxUint64), int64(math.MaxInt32)+1, int64(math.MinInt32)-1}, int64(math.MaxInt32)}, +{"int64", func() scanner { x := Number4One; return &x }, []interface{}{uint64(math.MaxUint64)}, int64(math.MaxInt64)}, +{"uint", func() scanner { x := Number5One; return &x }, []interface{}{int64(-1)}, uint64(1 << (strconv.IntSize-1))}, +{"uint8", func() scanner { x := Number6One; return &x }, []interface{}{int64(-1), uint64(1)<<8}, uint64(math.MaxUint8)}, +{"uint16", func() scanner { x := Number7One; return &x }, []interface{}{int64(-1), uint64(1)<<16}, uint64(math.MaxUint16)}, +{"uint32", func() scanner { x := Number8One; return &x }, []interface{}{int64(-1), uint64(1)<<32}, uint64(math.MaxUint32)}, +{"uint64", func() scanner { x := Number9One; return &x }, []interface{}{int64(-1)}, uint64(math.MaxUint64)}, +{"CustomSigned", func() scanner { x := Number13One; return &x }, []interface{}{int64(-129), int64(128), uint64(256)}, int64(127)}, +{"CustomUnsigned", func() scanner { x := Number14One; return &x }, []interface{}{int64(-1), int64(256), uint64(256)}, uint64(255)}, +{"byte", func() scanner { x := Number11One; return &x }, []interface{}{int64(-1), int64(256), uint64(256)}, uint64(math.MaxUint8)}, +{"rune", func() scanner { x := Number12One; return &x }, []interface{}{int64(math.MinInt32)-1, int64(math.MaxInt32)+1, uint64(math.MaxUint64)}, int64(math.MaxInt32)}, +{"uintptr", func() scanner { x := Number10One; return &x }, []interface{}{int64(-1)}, uint64(1 << (strconv.IntSize-1))}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + for _, invalid := range append(tc.invalid, math.NaN(), math.Inf(1), math.Inf(-1), math.Exp2(64), -math.Exp2(64)) { + inputs := []interface{}{invalid} + ptr := reflect.New(reflect.TypeOf(invalid)); ptr.Elem().Set(reflect.ValueOf(invalid)) + inputs = append(inputs, ptr.Interface()) + if NUMERIC_STRINGS && reflect.TypeOf(invalid).Kind() != reflect.Float64 { + text := fmt.Sprint(invalid) + inputs = append(inputs, text, []byte(text), &text) + } + for _, value := range inputs { + x := tc.create() + if err := x.Scan(value); err == nil { t.Errorf("Scan(%T %v) accepted overflow", value, value) } + if number(x) != "1" { t.Errorf("Scan(%T %v) changed receiver: %s", value, value, number(x)) } + } + } + inputs := []interface{}{int(1), int64(1), uint(1), uint64(1), float64(1.75), "One", []byte("One"), tc.maximum} + for _, value := range append([]interface{}{}, inputs...) { + if reflect.TypeOf(value).Kind() != reflect.Slice { + ptr := reflect.New(reflect.TypeOf(value)); ptr.Elem().Set(reflect.ValueOf(value)) + inputs = append(inputs, ptr.Interface()) + } + } + for _, value := range inputs { + x := tc.create() + if err := x.Scan(value); err != nil { t.Errorf("Scan(%T %v): %v", value, value, err) } + expected := "1" + plain := value + if reflect.TypeOf(value).Kind() == reflect.Ptr { plain = reflect.ValueOf(value).Elem().Interface() } + if reflect.TypeOf(plain) == reflect.TypeOf(tc.maximum) && fmt.Sprint(plain) == fmt.Sprint(tc.maximum) { expected = fmt.Sprint(tc.maximum) } + if got := number(x); got != expected { t.Errorf("Scan(%T %v) = %s, want %s", value, value, got, expected) } + } + x := tc.create() + if err := x.Scan(nil); err != nil || number(x) != "0" { t.Errorf("nil Scan = %s, %v", number(x), err) } + }) + } +} +func number(x scanner) string { + v := reflect.ValueOf(x).Elem() + if v.Kind() >= reflect.Uint && v.Kind() <= reflect.Uintptr { return strconv.FormatUint(v.Uint(),10) } + return strconv.FormatInt(v.Int(),10) +} +`