pub struct CStringLiteralCodec;Expand description
Encodes and decodes byte-oriented C string literal fragments.
This codec is intended for textual formats that embed byte sequences with C
escapes, such as PK\003\004 or \xd0\xcf. It decodes into raw bytes and
does not require surrounding quotes.
Hexadecimal \x and \X escapes consume one or two digits. Octal escapes
consume one to three digits and retain only the low eight bits. Universal
\u and \U escapes require exactly four or eight hex digits,
respectively, and their values must fit in one byte. They produce that byte
directly rather than converting a Unicode code point to UTF-8. The decoder
does not remove surrounding quotes. Raw source text is limited to printable
ASCII, tab, line feed, vertical tab, and form feed; other bytes, including
non-ASCII text and raw carriage returns, must be escaped. An escaped space
(\ ) is also accepted.
The owned decode helper treats its input as complete text.
For streaming input, use Codec::decode_eof after confirming EOF to
resolve format-specific short escapes. Open-stream decoding requests more
input only when the visible escape prefix can still form a valid byte value.
For malformed input, a streaming skip/replace hook may consume the invalid
span visible in the current input chunk; recovery can therefore depend on
chunk boundaries. Valid input and strict decoding are unaffected.
See the English README
and Chinese README
for a safe streaming adapter example and the linked EOF short-escape test.
Its low-level Codec<Value = u8, Unit = u8> implementation handles one
raw byte or one C escape fragment. Whole-fragment iteration remains part of
the owned encode and decode helpers.
§Examples
use qubit_codec_misc::CStringLiteralCodec;
let codec = CStringLiteralCodec::new();
assert_eq!(codec.encode(b"Hi"), "Hi");
assert_eq!(codec.decode(r"\x48\x69").unwrap(), b"Hi");Implementations§
Source§impl CStringLiteralCodec
impl CStringLiteralCodec
Sourcepub fn decode(&self, text: &str) -> MiscCodecResult<Vec<u8>>
pub fn decode(&self, text: &str) -> MiscCodecResult<Vec<u8>>
Decodes a C string literal fragment into bytes.
§Parameters
text: C string literal fragment without surrounding quotes.
§Returns
Decoded raw bytes.
§Errors
Returns MiscCodecError::InvalidEscape for malformed escape
sequences, MiscCodecError::InvalidDigit for malformed
fixed-width numeric escapes,
and MiscCodecError::InvalidCharacter for unsupported raw source
characters.
Trait Implementations§
Source§impl Clone for CStringLiteralCodec
impl Clone for CStringLiteralCodec
Source§impl Codec for CStringLiteralCodec
impl Codec for CStringLiteralCodec
Source§type DecodeError = MiscCodecError
type DecodeError = MiscCodecError
Error type reported while decoding one fragment.
Source§type EncodeError = MiscCodecError
type EncodeError = MiscCodecError
Error type reported while encoding one byte; encoding is infallible.
Source§fn encode_len(&self, value: &u8) -> usize
fn encode_len(&self, value: &u8) -> usize
Source§unsafe fn decode(
&mut self,
input: &[u8],
input_index: usize,
) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
unsafe fn decode( &mut self, input: &[u8], input_index: usize, ) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
Decodes one raw byte or one C escape fragment.
§Safety
The caller must provide an input index with at least one readable unit and a slice satisfying the codec trait’s decode preconditions.
§Parameters
input: Encoded byte units to read.input_index: Index of the next encoded fragment.
§Returns
The decoded byte and number of consumed units.
§Errors
Returns a decoding failure for malformed input or an incomplete streaming escape.
Source§unsafe fn decode_eof(
&mut self,
input: &[u8],
input_index: usize,
) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
unsafe fn decode_eof( &mut self, input: &[u8], input_index: usize, ) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
Decodes one value after end of input has been confirmed.
§Safety
The caller must provide an input index with at least one readable unit and a slice satisfying the codec trait’s EOF decode preconditions.
§Parameters
input: Encoded byte units to read after EOF is confirmed.input_index: Index of the next encoded fragment.
§Returns
The decoded byte and number of consumed units.
§Errors
Returns a decoding failure when the EOF-confirmed fragment is malformed.
Source§unsafe fn encode(
&mut self,
value: &u8,
output: &mut [u8],
output_index: usize,
) -> Result<usize, Self::EncodeError>
unsafe fn encode( &mut self, value: &u8, output: &mut [u8], output_index: usize, ) -> Result<usize, Self::EncodeError>
Encodes one byte as a raw byte or C escape fragment.
§Safety
The caller must provide enough writable output units for
Self::encode_len.
§Parameters
value: Byte to encode.output: Destination unit buffer.output_index: Start index inoutput.
§Returns
Number of output units written.
§Errors
This implementation does not return an error for a valid output buffer.
Source§const MIN_UNITS_PER_VALUE: usize = 1
const MIN_UNITS_PER_VALUE: usize = 1
Source§const MAX_ENCODE_UNITS_PER_VALUE: usize = 4
const MAX_ENCODE_UNITS_PER_VALUE: usize = 4
Source§const MAX_DECODE_UNITS_PER_VALUE: usize = 10
const MAX_DECODE_UNITS_PER_VALUE: usize = 10
Source§const MAX_ENCODE_RESET_UNITS: usize = 0
const MAX_ENCODE_RESET_UNITS: usize = 0
Source§const MAX_ENCODE_FINISH_UNITS: usize = 0
const MAX_ENCODE_FINISH_UNITS: usize = 0
Source§const MAX_DECODE_RESET_VALUES: usize = 0
const MAX_DECODE_RESET_VALUES: usize = 0
Source§const MAX_DECODE_FINISH_VALUES: usize = 0
const MAX_DECODE_FINISH_VALUES: usize = 0
Source§fn can_encode_value(&self, _value: &Self::Value) -> bool
fn can_encode_value(&self, _value: &Self::Value) -> bool
value is in this codec’s encodable value domain. Read moreSource§unsafe fn encode_reset(
&mut self,
_output: &mut [Self::Unit],
_output_index: usize,
) -> Result<usize, Self::EncodeError>
unsafe fn encode_reset( &mut self, _output: &mut [Self::Unit], _output_index: usize, ) -> Result<usize, Self::EncodeError>
Source§unsafe fn encode_finish(
&mut self,
_output: &mut [Self::Unit],
_output_index: usize,
) -> Result<usize, Self::EncodeError>
unsafe fn encode_finish( &mut self, _output: &mut [Self::Unit], _output_index: usize, ) -> Result<usize, Self::EncodeError>
Source§unsafe fn decode_reset(
&mut self,
_output: &mut [Self::Value],
_output_index: usize,
) -> Result<usize, Self::DecodeError>
unsafe fn decode_reset( &mut self, _output: &mut [Self::Value], _output_index: usize, ) -> Result<usize, Self::DecodeError>
Source§unsafe fn decode_finish(
&mut self,
_output: &mut [Self::Value],
_output_index: usize,
) -> Result<usize, Self::DecodeError>
unsafe fn decode_finish( &mut self, _output: &mut [Self::Value], _output_index: usize, ) -> Result<usize, Self::DecodeError>
output. Read moreimpl Copy for CStringLiteralCodec
Source§impl Debug for CStringLiteralCodec
impl Debug for CStringLiteralCodec
Source§impl Default for CStringLiteralCodec
impl Default for CStringLiteralCodec
impl Eq for CStringLiteralCodec
Source§impl PartialEq for CStringLiteralCodec
impl PartialEq for CStringLiteralCodec
impl StructuralPartialEq for CStringLiteralCodec
Source§impl ValueDecoder<str> for CStringLiteralCodec
impl ValueDecoder<str> for CStringLiteralCodec
Source§type Error = MiscCodecError
type Error = MiscCodecError
Error type reported for malformed C string literal fragments.
Source§impl ValueEncoder<[u8]> for CStringLiteralCodec
impl ValueEncoder<[u8]> for CStringLiteralCodec
Source§type Error = MiscCodecError
type Error = MiscCodecError
Error type used when encoding fails; the current encoder is infallible.