initSSEData initializes the SSE related data in ed.
(ed *EndpointData, e *expr.HTTPEndpointExpr, sd *ServiceData)
| 64 | |
| 65 | // initSSEData initializes the SSE related data in ed. |
| 66 | func initSSEData(ed *EndpointData, e *expr.HTTPEndpointExpr, sd *ServiceData) { |
| 67 | if e.SSE == nil { |
| 68 | return |
| 69 | } |
| 70 | |
| 71 | md := ed.Method |
| 72 | svc := sd.Service |
| 73 | |
| 74 | // Use streaming result type if different from result |
| 75 | var eventType *ResultData |
| 76 | var eventAttr *expr.AttributeExpr |
| 77 | if e.MethodExpr.HasMixedResults() && e.MethodExpr.StreamingResult != nil { |
| 78 | // For mixed results, use StreamingResult for SSE events |
| 79 | eventAttr = e.MethodExpr.StreamingResult |
| 80 | eventType = &ResultData{ |
| 81 | Name: md.StreamingResult, |
| 82 | Ref: sd.Service.Scope.GoFullTypeRef(eventAttr, svc.PkgName), |
| 83 | IsStruct: expr.IsObject(eventAttr.Type), |
| 84 | } |
| 85 | } else { |
| 86 | // Use Result for SSE events (backward compatibility) |
| 87 | eventType = ed.Result |
| 88 | eventAttr = e.MethodExpr.Result |
| 89 | } |
| 90 | |
| 91 | sendDesc := fmt.Sprintf("%s streams instances of %q to the %q endpoint SSE connection.", md.ServerStream.SendName, eventType.Name, md.Name) |
| 92 | sendWithContextDesc := fmt.Sprintf("%s streams instances of %q to the %q endpoint SSE connection with context.", md.ServerStream.SendWithContextName, eventType.Name, md.Name) |
| 93 | recvDesc := fmt.Sprintf("%s connects to the %q SSE endpoint and streams events.", md.ServerStream.RecvName, md.Name) |
| 94 | |
| 95 | // Convert attribute names to Go field names |
| 96 | var dataFieldVar, dataFieldTypeRef, idFieldVar, eventFieldVar, retryFieldVar string |
| 97 | if obj := expr.AsObject(eventAttr.Type); obj != nil { |
| 98 | for _, nat := range *obj { |
| 99 | switch nat.Name { |
| 100 | case e.SSE.IDField: |
| 101 | idFieldVar = codegen.GoifyAtt(nat.Attribute, nat.Name, true) |
| 102 | case e.SSE.EventField: |
| 103 | eventFieldVar = codegen.GoifyAtt(nat.Attribute, nat.Name, true) |
| 104 | case e.SSE.RetryField: |
| 105 | retryFieldVar = codegen.GoifyAtt(nat.Attribute, nat.Name, true) |
| 106 | case e.SSE.DataField: |
| 107 | dataFieldVar = codegen.GoifyAtt(nat.Attribute, nat.Name, true) |
| 108 | dataFieldTypeRef = sd.Service.Scope.GoFullTypeRef(nat.Attribute, svc.PkgName) |
| 109 | } |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | // Determine if the Last-Event-ID mapped payload attribute is a primitive pointer |
| 114 | ridPtr := false |
| 115 | if e.SSE.RequestIDField != "" { |
| 116 | ridPtr = e.MethodExpr.Payload.IsPrimitivePointer(e.SSE.RequestIDField, true) |
| 117 | } |
| 118 | |
| 119 | ed.SSE = &SSEData{ |
| 120 | StructName: md.ServerStream.VarName, |
| 121 | Interface: fmt.Sprintf("%s.%s", svc.PkgName, md.ServerStream.Interface), |
| 122 | SendName: md.ServerStream.SendName, |
| 123 | SendDesc: sendDesc, |
no test coverage detected