(buf *bytes.Buffer, field *FieldInfo, fieldAccess string)
| 228 | } |
| 229 | |
| 230 | func generateOptionWriteTyped(buf *bytes.Buffer, field *FieldInfo, fieldAccess string) error { |
| 231 | elemType := field.OptionalElem |
| 232 | if elemType == nil { |
| 233 | fmt.Fprintf(buf, "\tctx.WriteValue(reflect.ValueOf(%s), fory.RefModeTracking, true)\n", fieldAccess) |
| 234 | return nil |
| 235 | } |
| 236 | fmt.Fprintf(buf, "\tif !%s.IsSome() {\n", fieldAccess) |
| 237 | fmt.Fprintf(buf, "\t\tbuf.WriteInt8(fory.NullFlag)\n") |
| 238 | fmt.Fprintf(buf, "\t} else {\n") |
| 239 | fmt.Fprintf(buf, "\t\toptValue := %s.Unwrap()\n", fieldAccess) |
| 240 | if isReferencableType(elemType) { |
| 241 | fmt.Fprintf(buf, "\t\tif ctx.TrackRef() {\n") |
| 242 | fmt.Fprintf(buf, "\t\t\trefWritten, err := ctx.RefResolver().WriteRefOrNull(buf, reflect.ValueOf(optValue))\n") |
| 243 | fmt.Fprintf(buf, "\t\t\tif err != nil {\n") |
| 244 | fmt.Fprintf(buf, "\t\t\t\treturn err\n") |
| 245 | fmt.Fprintf(buf, "\t\t\t}\n") |
| 246 | fmt.Fprintf(buf, "\t\t\tif refWritten {\n") |
| 247 | fmt.Fprintf(buf, "\t\t\t\treturn nil\n") |
| 248 | fmt.Fprintf(buf, "\t\t\t}\n") |
| 249 | fmt.Fprintf(buf, "\t\t} else {\n") |
| 250 | fmt.Fprintf(buf, "\t\t\tbuf.WriteInt8(fory.NotNullValueFlag)\n") |
| 251 | fmt.Fprintf(buf, "\t\t}\n") |
| 252 | } else { |
| 253 | fmt.Fprintf(buf, "\t\tbuf.WriteInt8(fory.NotNullValueFlag)\n") |
| 254 | } |
| 255 | if err := generateOptionValueWrite(buf, elemType, "optValue"); err != nil { |
| 256 | return err |
| 257 | } |
| 258 | fmt.Fprintf(buf, "\t}\n") |
| 259 | return nil |
| 260 | } |
| 261 | |
| 262 | func generateOptionValueWrite(buf *bytes.Buffer, elemType types.Type, valueExpr string) error { |
| 263 | // Handle special named types first |
no test coverage detected