feat(tvix/nix-compat/wire): have write_bytes accept AsRef<[u8]> payloads
This includes String, &str etc. An example testcase with &str is provided. Change-Id: I900186d6ceb52f52bd41ef4596524c1f5b52470b Reviewed-on: https://cl.tvl.fyi/c/depot/+/11376 Autosubmit: flokli <flokli@flokli.de> Tested-by: BuildkiteCI Reviewed-by: picnoir picnoir <picnoir@alternativebit.fr>
This commit is contained in:
		
							parent
							
								
									acee489866
								
							
						
					
					
						commit
						71a3855f09
					
				
					 2 changed files with 21 additions and 5 deletions
				
			
		| 
						 | 
					@ -89,20 +89,25 @@ where
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Writes a "bytes wire packet" to a (hopefully buffered) [AsyncWriteExt].
 | 
					/// Writes a "bytes wire packet" to a (hopefully buffered) [AsyncWriteExt].
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
 | 
					/// Accepts anything implementing AsRef<[u8]> as payload.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
/// See [read_bytes] for a description of the format.
 | 
					/// See [read_bytes] for a description of the format.
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// Note: if performance matters to you, make sure your
 | 
					/// Note: if performance matters to you, make sure your
 | 
				
			||||||
/// [AsyncWriteExt] handle is buffered. This function is quite
 | 
					/// [AsyncWriteExt] handle is buffered. This function is quite
 | 
				
			||||||
/// write-intesive.
 | 
					/// write-intesive.
 | 
				
			||||||
pub async fn write_bytes<W: AsyncWriteExt + Unpin>(w: &mut W, b: &[u8]) -> std::io::Result<()> {
 | 
					pub async fn write_bytes<W: AsyncWriteExt + Unpin, B: AsRef<[u8]>>(
 | 
				
			||||||
 | 
					    w: &mut W,
 | 
				
			||||||
 | 
					    b: B,
 | 
				
			||||||
 | 
					) -> std::io::Result<()> {
 | 
				
			||||||
    // write the size packet.
 | 
					    // write the size packet.
 | 
				
			||||||
    primitive::write_u64(w, b.len() as u64).await?;
 | 
					    primitive::write_u64(w, b.as_ref().len() as u64).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // write the payload
 | 
					    // write the payload
 | 
				
			||||||
    w.write_all(b).await?;
 | 
					    w.write_all(b.as_ref()).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // write padding if needed
 | 
					    // write padding if needed
 | 
				
			||||||
    let padding_len = padding_len(b.len() as u64) as usize;
 | 
					    let padding_len = padding_len(b.as_ref().len() as u64) as usize;
 | 
				
			||||||
    if padding_len != 0 {
 | 
					    if padding_len != 0 {
 | 
				
			||||||
        w.write_all(&EMPTY_BYTES[..padding_len]).await?;
 | 
					        w.write_all(&EMPTY_BYTES[..padding_len]).await?;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -209,4 +214,15 @@ mod tests {
 | 
				
			||||||
            .build();
 | 
					            .build();
 | 
				
			||||||
        assert_ok!(write_bytes(&mut mock, &input).await)
 | 
					        assert_ok!(write_bytes(&mut mock, &input).await)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[tokio::test]
 | 
				
			||||||
 | 
					    async fn test_write_string() {
 | 
				
			||||||
 | 
					        let input = "Hello, World!";
 | 
				
			||||||
 | 
					        let len = input.len() as u64;
 | 
				
			||||||
 | 
					        let mut mock = Builder::new()
 | 
				
			||||||
 | 
					            .write(&len.to_le_bytes())
 | 
				
			||||||
 | 
					            .write(&hex!("48656c6c6f2c20576f726c6421000000"))
 | 
				
			||||||
 | 
					            .build();
 | 
				
			||||||
 | 
					        assert_ok!(write_bytes(&mut mock, &input).await)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,7 +165,7 @@ where
 | 
				
			||||||
            // good idea.
 | 
					            // good idea.
 | 
				
			||||||
            debug!("write version");
 | 
					            debug!("write version");
 | 
				
			||||||
            // Plain str padded to 64 bits.
 | 
					            // Plain str padded to 64 bits.
 | 
				
			||||||
            bytes::write_bytes(&mut conn, "2.3.17".as_bytes()).await?;
 | 
					            bytes::write_bytes(&mut conn, "2.3.17").await?;
 | 
				
			||||||
            conn.flush().await?;
 | 
					            conn.flush().await?;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if protocol_minor >= 35 {
 | 
					        if protocol_minor >= 35 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue