Convert `struct FromBytesWithNulError` into enum by nyurik · Pull Request #134143 · rust-lang/rust
This PR renames the former kind enum from FromBytesWithNulErrorKind to FromBytesWithNulError, and removes the original struct.
Possible Changes - TBD
- should the new
enum FromBytesWithNulErrorderiveCopy? - should there be any new/changed attributes?
- add some more tests
Problem
One of CStr constructors, CStr::from_bytes_with_nul(bytes: &[u8]) handles 3 cases:
byteshas one NULL as the last value - creates CStrbyteshas no NULL - errorbyteshas a NULL in some other position - error
The 3rd case is error that may require lossy conversion, but the 2nd case can easily be handled by the user code. Unfortunately, this function returns an opaque FromBytesWithNulError error in both 2nd and 3rd case, so the user cannot detect just the 2nd case - having to re-implement the entire function and bring in the memchr dependency.
Motivating examples or use cases
In this code, my FFI code needs to copy user's &[u8] into a C-allocated memory blob in a NUL-terminated CStr format. My code must first validate if &[u8] has a trailing NUL (case 1), no NUL (adds one on the fly - case 2), or NUL in the middle (3rd case - error). I had to re-implement from_bytes_with_nul and add memchrdependency just to handle the 2nd case.
r? @Amanieu