@@ -254,34 +254,38 @@ impl SessionMessageChunk {
254254pub struct SessionMessage {
255255 /// Identifier of this message within the enclosing session's transcript.
256256 pub message_id : MessageId ,
257- /// Optional sending session identity; omission or `null` retains a known value.
258- #[ serde_as( deserialize_as = "DefaultOnError" ) ]
257+ /// The sending session.
258+ ///
259+ /// Omitted leaves the stored value unchanged; `null` clears it; a value replaces it.
260+ #[ serde_as( deserialize_as = "DefaultOnError<MaybeUndefined<_>>" ) ]
259261 #[ cfg_attr( feature = "schemars" , schemars( extend( "x-deserialize-default-on-error" = true ) ) ) ]
260- #[ serde( default ) ]
261- pub sender_session_id : Option < SessionId > ,
262- /// Optional receiving session identity; omission or `null` retains a known value.
263- #[ serde_as( deserialize_as = "DefaultOnError" ) ]
262+ #[ serde( default , skip_serializing_if = "MaybeUndefined::is_undefined" ) ]
263+ pub sender_session_id : MaybeUndefined < SessionId > ,
264+ /// The receiving session.
265+ ///
266+ /// Omitted leaves the stored value unchanged; `null` clears it; a value replaces it.
267+ #[ serde_as( deserialize_as = "DefaultOnError<MaybeUndefined<_>>" ) ]
264268 #[ cfg_attr( feature = "schemars" , schemars( extend( "x-deserialize-default-on-error" = true ) ) ) ]
265- #[ serde( default ) ]
266- pub recipient_session_id : Option < SessionId > ,
269+ #[ serde( default , skip_serializing_if = "MaybeUndefined::is_undefined" ) ]
270+ pub recipient_session_id : MaybeUndefined < SessionId > ,
267271 /// On an incoming view, the `messageId` of the same message's outgoing view in the
268272 /// sender's transcript.
269273 ///
270- /// Optional and nullable: omission or `null` means not supplied and retains a known
271- /// value, so it can arrive after the message starts streaming.
272- #[ serde_as( deserialize_as = "DefaultOnError" ) ]
274+ /// Omitted leaves the stored value unchanged; `null` clears it; a value replaces it. It can arrive
275+ /// after the message starts streaming.
276+ #[ serde_as( deserialize_as = "DefaultOnError<MaybeUndefined<_>> " ) ]
273277 #[ cfg_attr( feature = "schemars" , schemars( extend( "x-deserialize-default-on-error" = true ) ) ) ]
274- #[ serde( default ) ]
275- pub sender_message_id : Option < MessageId > ,
278+ #[ serde( default , skip_serializing_if = "MaybeUndefined::is_undefined" ) ]
279+ pub sender_message_id : MaybeUndefined < MessageId > ,
276280 /// On an outgoing view, the `messageId` of the same message's incoming view in the
277281 /// recipient's transcript.
278282 ///
279- /// Optional and nullable: omission or `null` means not supplied and retains a known
280- /// value, so it can arrive after the message starts streaming.
281- #[ serde_as( deserialize_as = "DefaultOnError" ) ]
283+ /// Omitted leaves the stored value unchanged; `null` clears it; a value replaces it. It can arrive
284+ /// after the message starts streaming.
285+ #[ serde_as( deserialize_as = "DefaultOnError<MaybeUndefined<_>> " ) ]
282286 #[ cfg_attr( feature = "schemars" , schemars( extend( "x-deserialize-default-on-error" = true ) ) ) ]
283- #[ serde( default ) ]
284- pub recipient_message_id : Option < MessageId > ,
287+ #[ serde( default , skip_serializing_if = "MaybeUndefined::is_undefined" ) ]
288+ pub recipient_message_id : MaybeUndefined < MessageId > ,
285289 /// Omitted leaves content unchanged; `null` clears it; a concrete array
286290 /// replaces the whole content collection.
287291 #[ serde_as( deserialize_as = "DefaultOnError<MaybeUndefined<VecSkipError<_>>>" ) ]
@@ -313,46 +317,52 @@ impl SessionMessage {
313317 pub fn new ( message_id : impl Into < MessageId > ) -> Self {
314318 Self {
315319 message_id : message_id. into ( ) ,
316- sender_session_id : None ,
317- recipient_session_id : None ,
318- sender_message_id : None ,
319- recipient_message_id : None ,
320+ sender_session_id : MaybeUndefined :: Undefined ,
321+ recipient_session_id : MaybeUndefined :: Undefined ,
322+ sender_message_id : MaybeUndefined :: Undefined ,
323+ recipient_message_id : MaybeUndefined :: Undefined ,
320324 content : MaybeUndefined :: Undefined ,
321325 meta : MaybeUndefined :: Undefined ,
322326 }
323327 }
324328
325- /// Supplies the sending session identity, when known .
329+ /// Sets, clears, or leaves unchanged the sending session .
326330 #[ must_use]
327- pub fn sender_session_id ( mut self , sender_session_id : impl IntoOption < SessionId > ) -> Self {
328- self . sender_session_id = sender_session_id. into_option ( ) ;
331+ pub fn sender_session_id (
332+ mut self ,
333+ sender_session_id : impl IntoMaybeUndefined < SessionId > ,
334+ ) -> Self {
335+ self . sender_session_id = sender_session_id. into_maybe_undefined ( ) ;
329336 self
330337 }
331338
332- /// Supplies the receiving session identity, when known .
339+ /// Sets, clears, or leaves unchanged the receiving session .
333340 #[ must_use]
334341 pub fn recipient_session_id (
335342 mut self ,
336- recipient_session_id : impl IntoOption < SessionId > ,
343+ recipient_session_id : impl IntoMaybeUndefined < SessionId > ,
337344 ) -> Self {
338- self . recipient_session_id = recipient_session_id. into_option ( ) ;
345+ self . recipient_session_id = recipient_session_id. into_maybe_undefined ( ) ;
339346 self
340347 }
341348
342349 /// Links an incoming view to the outgoing view's message ID in the sender's transcript.
343350 #[ must_use]
344- pub fn sender_message_id ( mut self , sender_message_id : impl IntoOption < MessageId > ) -> Self {
345- self . sender_message_id = sender_message_id. into_option ( ) ;
351+ pub fn sender_message_id (
352+ mut self ,
353+ sender_message_id : impl IntoMaybeUndefined < MessageId > ,
354+ ) -> Self {
355+ self . sender_message_id = sender_message_id. into_maybe_undefined ( ) ;
346356 self
347357 }
348358
349359 /// Links an outgoing view to the incoming view's message ID in the recipient's transcript.
350360 #[ must_use]
351361 pub fn recipient_message_id (
352362 mut self ,
353- recipient_message_id : impl IntoOption < MessageId > ,
363+ recipient_message_id : impl IntoMaybeUndefined < MessageId > ,
354364 ) -> Self {
355- self . recipient_message_id = recipient_message_id. into_option ( ) ;
365+ self . recipient_message_id = recipient_message_id. into_maybe_undefined ( ) ;
356366 self
357367 }
358368
@@ -556,11 +566,20 @@ mod session_message_tests {
556566 let enriched = SessionMessage :: new ( "m1" )
557567 . sender_session_id ( SessionId :: new ( "parent" ) )
558568 . recipient_session_id ( SessionId :: new ( "child" ) ) ;
559- assert_eq ! ( enriched. sender_session_id, Some ( SessionId :: new( "parent" ) ) ) ;
560- assert_eq ! ( enriched. recipient_session_id, Some ( SessionId :: new( "child" ) ) ) ;
569+ assert_eq ! (
570+ enriched. sender_session_id,
571+ MaybeUndefined :: Value ( SessionId :: new( "parent" ) )
572+ ) ;
573+ assert_eq ! (
574+ enriched. recipient_session_id,
575+ MaybeUndefined :: Value ( SessionId :: new( "child" ) )
576+ ) ;
561577 let later = SessionMessage :: new ( "m1" ) . sender_session_id ( SessionId :: new ( "parent" ) ) ;
562- assert_eq ! ( later. sender_session_id, Some ( SessionId :: new( "parent" ) ) ) ;
563- assert_eq ! ( later. recipient_session_id, None ) ;
578+ assert_eq ! (
579+ later. sender_session_id,
580+ MaybeUndefined :: Value ( SessionId :: new( "parent" ) )
581+ ) ;
582+ assert_eq ! ( later. recipient_session_id, MaybeUndefined :: Undefined ) ;
564583 let more = SessionMessageChunk :: new ( "m1" , block) ;
565584 for update in [
566585 SessionUpdate :: SessionMessage ( minimal) ,
@@ -576,12 +595,11 @@ mod session_message_tests {
576595 }
577596
578597 #[ test]
579- fn invalid_or_null_endpoints_are_absent_but_message_id_is_required ( ) {
598+ fn null_endpoints_clear_invalid_are_absent_but_message_id_is_required ( ) {
580599 let mut base = json ! ( { "sessionUpdate" : "session_message" , "messageId" : "m1" ,
581600 "senderSessionId" : null, "recipientSessionId" : 42 } ) ;
582601 let decoded: SessionUpdate = serde_json:: from_value ( base. clone ( ) ) . unwrap ( ) ;
583602 let encoded = serde_json:: to_value ( decoded) . unwrap ( ) ;
584- base. as_object_mut ( ) . unwrap ( ) . remove ( "senderSessionId" ) ;
585603 base. as_object_mut ( ) . unwrap ( ) . remove ( "recipientSessionId" ) ;
586604 assert_eq ! ( encoded, base) ;
587605 for bad in [ Value :: Null , json ! ( 42 ) ] {
@@ -623,12 +641,11 @@ mod session_message_tests {
623641 let mut wire = json ! ( { "sessionUpdate" : "session_message" , "messageId" : "m1" ,
624642 "senderMessageId" : null, "recipientMessageId" : 42 } ) ;
625643 let decoded: SessionUpdate = serde_json:: from_value ( wire. clone ( ) ) . unwrap ( ) ;
626- wire. as_object_mut ( ) . unwrap ( ) . remove ( "senderMessageId" ) ;
627644 wire. as_object_mut ( ) . unwrap ( ) . remove ( "recipientMessageId" ) ;
628645 assert_eq ! (
629646 serde_json:: to_value( decoded) . unwrap( ) ,
630647 wire,
631- "null or malformed references mean not supplied"
648+ "null clears a reference and a malformed one is not supplied"
632649 ) ;
633650 }
634651}
0 commit comments