use new number type to be compatible with dynamo

This commit is contained in:
2026-02-16 08:45:30 -05:00
parent 089ef39bd9
commit f8b0b1c3ae
7 changed files with 680 additions and 45 deletions

View File

@@ -85,7 +85,16 @@ parse_attribute_value :: proc(value: json.Value) -> (Attribute_Value, bool) {
if !str_ok {
return nil, false
}
return Number(strings.clone(string(str))), true
// Parse into DDB_Number
ddb_num, num_ok := parse_ddb_number(string(str))
if !num_ok {
return nil, false
}
// Clone the string fields since they're slices of the input
owned_num := clone_ddb_number(ddb_num)
return owned_num, true
}
// Binary (base64 string)
@@ -147,22 +156,38 @@ parse_attribute_value :: proc(value: json.Value) -> (Attribute_Value, bool) {
return nil, false
}
numbers_arr := make([]string, len(arr))
numbers_arr := make([]DDB_Number, len(arr))
for item, i in arr {
str, str_ok := item.(json.String)
if !str_ok {
// Cleanup on error
for j in 0..<i {
delete(numbers_arr[j])
// Clean up DDB_Numbers
delete(numbers_arr[j].integer_part)
delete(numbers_arr[j].fractional_part)
}
delete(numbers_arr)
return nil, false
}
numbers_arr[i] = strings.clone(string(str))
// Parse into DDB_Number
ddb_num, num_ok := parse_ddb_number(string(str))
if !num_ok {
// Cleanup on error
for j in 0..<i {
delete(numbers_arr[j].integer_part)
delete(numbers_arr[j].fractional_part)
}
delete(numbers_arr)
return nil, false
}
// Clone and store
numbers_arr[i] = clone_ddb_number(ddb_num)
}
return Number_Set(numbers_arr), true
return DDB_Number_Set(numbers_arr), true
}
// Binary Set
@@ -302,6 +327,10 @@ serialize_attribute_value :: proc(b: ^strings.Builder, attr: Attribute_Value) {
case Number:
fmt.sbprintf(b, `{"N":"%s"}`, string(v))
case DDB_Number:
num_str := format_ddb_number(v)
fmt.sbprintf(b, `{"N":"%s"}`, num_str)
case Binary:
fmt.sbprintf(b, `{"B":"%s"}`, string(v))
@@ -331,6 +360,17 @@ serialize_attribute_value :: proc(b: ^strings.Builder, attr: Attribute_Value) {
}
strings.write_string(b, "]}")
case DDB_Number_Set:
strings.write_string(b, `{"NS":[`)
for num, i in v {
if i > 0 {
strings.write_string(b, ",")
}
num_str := format_ddb_number(num)
fmt.sbprintf(b, `"%s"`, num_str)
}
strings.write_string(b, "]}")
case Binary_Set:
strings.write_string(b, `{"BS":[`)
for bin, i in v {