Skip to content

Commit a2b7195

Browse files
loryrutagreenrobot
authored andcommitted
js: fix binding file (toFlatbuffers/fromFlatbuffers) #33
1 parent 09ef7e4 commit a2b7195

File tree

2 files changed

+177
-103
lines changed

2 files changed

+177
-103
lines changed

internal/generator/js/templates/binding-js.go

Lines changed: 48 additions & 99 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/generator/js/templates/functions.go

Lines changed: 129 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package templates
2222

2323
import (
24+
"fmt"
2425
"sort"
2526
"strings"
2627
"text/template"
@@ -52,7 +53,7 @@ var funcMap = template.FuncMap{
5253
// Get sorted flag names to avoid changes in the generated code. Go map iteration order is not guaranteed.
5354
for flag, name := range model.PropertyFlagNames {
5455
if val&flag != 0 { // if this flag is set
55-
result = append(result, "OBXPropertyFlags_"+cccToUc(name))
56+
result = append(result, "OBXPropertyFlags."+cccToUc(name))
5657
}
5758
}
5859

@@ -71,7 +72,7 @@ var funcMap = template.FuncMap{
7172
// Get sorted flag names to avoid changes in the generated code. Go map iteration order is not guaranteed.
7273
for flag, name := range model.EntityFlagNames {
7374
if val&flag != 0 { // if this flag is set
74-
result = append(result, "OBXEntityFlags_"+cccToUc(name))
75+
result = append(result, "OBXEntityFlags."+cccToUc(name))
7576
}
7677
}
7778

@@ -90,7 +91,7 @@ var funcMap = template.FuncMap{
9091
// Get sorted flag names to avoid changes in the generated code. Go map iteration order is not guaranteed.
9192
for flag, name := range model.HnswFlagNames {
9293
if val&flag != 0 { // if this flag is set
93-
result = append(result, "OBXHnswFlags_"+name)
94+
result = append(result, "OBXHnswFlags."+name)
9495
}
9596
}
9697

@@ -101,7 +102,7 @@ var funcMap = template.FuncMap{
101102
} else if len(result) > 0 {
102103
return result[0]
103104
}
104-
return "OBXHnswFlags_NONE"
105+
return "OBXHnswFlags.NONE"
105106
},
106107
"PrintComments": func(tabs int, comments []string) string {
107108
var result string
@@ -114,4 +115,128 @@ var funcMap = template.FuncMap{
114115
return optional == "std::unique_ptr" || optional == "std::shared_ptr"
115116
},
116117
"ToUpper": strings.ToUpper,
118+
119+
"AddField": func(property model.Property) string {
120+
varName := "object." + property.Name
121+
notSupportedComment := fmt.Sprint("// Not supported: ", model.PropertyTypeNames[property.Type])
122+
isNullable := (property.Flags & model.PropertyFlagNotNull) == 0
123+
124+
var str string
125+
126+
if isNullable {
127+
str += "if (" + varName + " != null) {\n"
128+
}
129+
130+
switch property.Type {
131+
case model.PropertyTypeBool:
132+
varVal := fmt.Sprint(varName, " ? 1 : 0")
133+
str += fmt.Sprintln("fbb.addFieldInt8(", property.FbSlot(), ", ", varVal, ");")
134+
case model.PropertyTypeByte:
135+
str += fmt.Sprintln("fbb.addFieldInt8(", property.FbSlot(), ", ", varName, ");")
136+
case model.PropertyTypeShort:
137+
str += fmt.Sprintln("fbb.addFieldInt16(", property.FbSlot(), ", ", varName, ");")
138+
case model.PropertyTypeChar:
139+
str += fmt.Sprintln("fbb.addFieldInt16(", property.FbSlot(), ", ", varName, ");")
140+
case model.PropertyTypeInt:
141+
str += fmt.Sprintln("fbb.addFieldInt32(", property.FbSlot(), ", ", varName, ");")
142+
case model.PropertyTypeLong:
143+
str += fmt.Sprintln("fbb.addFieldInt64(", property.FbSlot(), ", ", varName, ");")
144+
case model.PropertyTypeFloat:
145+
str += fmt.Sprintln("fbb.addFieldFloat32(", property.FbSlot(), ", ", varName, ");")
146+
case model.PropertyTypeDouble:
147+
str += fmt.Sprintln("fbb.addFieldFloat64(", property.FbSlot(), ", ", varName, ");")
148+
case model.PropertyTypeString:
149+
return "" // Not an inline field
150+
case model.PropertyTypeDate:
151+
str += fmt.Sprintln("fbb.addFieldInt64(", property.FbSlot(), ", ", varName, ");")
152+
case model.PropertyTypeRelation:
153+
return "" // Not an inline field
154+
case model.PropertyTypeDateNano:
155+
str += notSupportedComment
156+
case model.PropertyTypeByteVector:
157+
return "" // Not an inline field
158+
case model.PropertyTypeFloatVector:
159+
return "" // Not an inline field
160+
case model.PropertyTypeStringVector:
161+
return "" // Not an inline field
162+
default:
163+
panic("Unknown property type")
164+
}
165+
166+
if isNullable {
167+
str += "}"
168+
}
169+
return str
170+
},
171+
172+
"CreateOffsetProperty": func(property model.Property) string {
173+
offsetVar := property.Name + "_offset"
174+
fieldVar := "object." + property.Name
175+
176+
switch property.Type {
177+
case model.PropertyTypeString:
178+
return fmt.Sprint("const ", offsetVar, " = fbb.createString(", fieldVar, ");")
179+
case model.PropertyTypeByteVector:
180+
return fmt.Sprint("const ", offsetVar, " = fbb.createByteVector(Uint8Array.from(", fieldVar, "));")
181+
case model.PropertyTypeFloatVector:
182+
return fmt.Sprint("const ", offsetVar, " = fbb.createByteVector(new Uint8Array(Float32Array.from(", fieldVar, ")));")
183+
case model.PropertyTypeStringVector:
184+
return "" // TODO: string vectors not supported right now
185+
default:
186+
return ""
187+
}
188+
},
189+
190+
"AddFieldOffset": func(property model.Property) string {
191+
offsetVarName := property.Name + "_offset"
192+
return fmt.Sprint("fbb.addFieldOffset(", property.FbSlot(), ",", offsetVarName, ");")
193+
},
194+
195+
"WriteGetAssignOffset": func(property model.Property) string {
196+
value, err := property.FbvTableOffset()
197+
if err != nil {
198+
panic(err)
199+
}
200+
offsetVarName := property.Name + "_offset"
201+
return fmt.Sprint("const ", offsetVarName, " = bb.__offset(bbPos, ", value, ");")
202+
},
203+
204+
"ReadProperty": func(property model.Property) string {
205+
offsetVarName := property.Name + "_offset"
206+
assignLhs := "outObject." + property.Name + " = "
207+
switch property.Type {
208+
case model.PropertyTypeBool:
209+
return fmt.Sprint(assignLhs, "bb.readInt8(bbPos + ", offsetVarName, ") ? true : false;")
210+
case model.PropertyTypeByte:
211+
return fmt.Sprint(assignLhs, "bb.readInt8(bbPos + ", offsetVarName, ");")
212+
case model.PropertyTypeShort:
213+
return fmt.Sprint(assignLhs, "bb.readInt16(bbPos + ", offsetVarName, ");")
214+
case model.PropertyTypeChar:
215+
return fmt.Sprint(assignLhs, "bb.readInt16(bbPos + ", offsetVarName, ");")
216+
case model.PropertyTypeInt:
217+
return fmt.Sprint(assignLhs, "bb.readInt32(bbPos + ", offsetVarName, ");")
218+
case model.PropertyTypeLong:
219+
return fmt.Sprint(assignLhs, "bb.readInt64(bbPos + ", offsetVarName, ");")
220+
case model.PropertyTypeFloat:
221+
return fmt.Sprint(assignLhs, "bb.readFloat32(bbPos + ", offsetVarName, ");")
222+
case model.PropertyTypeDouble:
223+
return fmt.Sprint(assignLhs, "bb.readFloat64(bbPos + ", offsetVarName, ");")
224+
case model.PropertyTypeString:
225+
return fmt.Sprint(assignLhs, "bb.__string(bbPos + ", offsetVarName, ");")
226+
case model.PropertyTypeDate:
227+
return fmt.Sprint(assignLhs, "bb.readInt64(bbPos + ", offsetVarName, ");")
228+
case model.PropertyTypeRelation:
229+
return fmt.Sprint("// ", assignLhs, "PropertyTypeRelation") // TODO
230+
case model.PropertyTypeDateNano:
231+
return fmt.Sprint("// ", assignLhs, "PropertyTypeDateNano") // TODO
232+
case model.PropertyTypeByteVector:
233+
return fmt.Sprint("// ", assignLhs, "PropertyTypeByteVector") // TODO
234+
case model.PropertyTypeFloatVector:
235+
return fmt.Sprint("// ", assignLhs, "PropertyTypeFloatVector") // TODO
236+
case model.PropertyTypeStringVector:
237+
return fmt.Sprint("// ", assignLhs, "PropertyTypeStringVector") // TODO
238+
default:
239+
return ""
240+
}
241+
},
117242
}

0 commit comments

Comments
 (0)