Message Encode(IKMessageContext <TNodeId> context, IKResponse <TNodeId> message) { var m = new Message(); m.Response = new Response(); m.Response.Header = Encode(context, message.Header); switch (message) { case KResponse <TNodeId, KPingResponse <TNodeId> > ping: m.Response.PingResponse = Encode(context, ping.Body.Value); break; case KResponse <TNodeId, KStoreResponse <TNodeId> > store: m.Response.StoreResponse = Encode(context, store.Body.Value); break; case KResponse <TNodeId, KFindNodeResponse <TNodeId> > findNode: m.Response.FindNodeResponse = Encode(context, findNode.Body.Value); break; case KResponse <TNodeId, KFindValueResponse <TNodeId> > findValue: m.Response.FindValueResponse = Encode(context, findValue.Body.Value); break; default: throw new InvalidOperationException(); } return(m); }
Message Encode(IKMessageContext <TNodeId> context, IKMessage <TNodeId> message) { return(message switch { IKRequest <TNodeId> request => Encode(context, request), IKResponse <TNodeId> response => Encode(context, response), _ => throw new InvalidOperationException(), });
void Write(Utf8JsonWriter writer, IKMessageContext <TNodeId> context, IKResponse <TNodeId> message) { writer.WriteStartObject(); writer.WritePropertyName("header"); Write(writer, context, message.Header); writer.WritePropertyName("status"); Write(writer, context, message.Status); writer.WritePropertyName("type"); switch (message) { case KResponse <TNodeId, KPingResponse <TNodeId> > ping: writer.WriteStringValue("PING_RESPONSE"); if (ping.Body.HasValue) { writer.WritePropertyName("body"); Write(writer, context, ping.Body.Value); } break; case KResponse <TNodeId, KStoreResponse <TNodeId> > store: writer.WriteStringValue("STORE_RESPONSE"); if (store.Body.HasValue) { writer.WritePropertyName("body"); Write(writer, context, store.Body.Value); } break; case KResponse <TNodeId, KFindNodeResponse <TNodeId> > findNode: writer.WriteStringValue("FIND_NODE_RESPONSE"); if (findNode.Body.HasValue) { writer.WritePropertyName("body"); Write(writer, context, findNode.Body.Value); } break; case KResponse <TNodeId, KFindValueResponse <TNodeId> > findValue: writer.WriteStringValue("FIND_VALUE_RESPONSE"); if (findValue.Body.HasValue) { writer.WritePropertyName("body"); Write(writer, context, findValue.Body.Value); } break; default: throw new InvalidOperationException(); } writer.WriteEndObject(); }