jppe/decode/
impls_string.rs1use crate::std::*;
2use crate::{BorrowByteDecode, ByteDecode, InputTrait};
3use crate::{FieldAttrModifiers, ContainerAttrModifiers};
4use crate::decode::impls_bytes::parse_bytes;
5use crate::parser::errors::{ErrorKind, JResult, make_error};
6#[inline]
10fn parse_string<'a>(input: &'a [u8], cattr: Option<&ContainerAttrModifiers>, fattr: Option<&FieldAttrModifiers>) -> JResult<&'a [u8], String> {
11 let value_tmp;
12 let input_tmp;
13
14 if let Ok((input, value)) = parse_bytes(input, cattr, fattr) {
15 input_tmp = input;
16 value_tmp = Some(value);
17 }
18 else {
23 let (input, length) = input.to_be_bits_usize(1)?;
24 let (input, value) = input.input_take(length)?;
25 input_tmp = input;
26 value_tmp = Some(value);
27 }
28
29 if let Some(value) = value_tmp {
30 match str::from_utf8(value) {
38 Ok(v) => return Ok((input_tmp, v.to_string())),
39 Err(_e) => return Err(make_error(input_tmp, ErrorKind::Fail { offset: input_tmp.len() })),
40 }
41 }
42
43 Err(make_error(input_tmp, ErrorKind::InvalidByteLength { offset: input_tmp.len() }))
44}
45
46
47impl ByteDecode for String {
48 fn decode<'da>(input: &'da [u8], cattr: Option<&ContainerAttrModifiers>, fattr: Option<&FieldAttrModifiers>) -> JResult<&'da [u8], Self>
49 where
50 Self: Sized
51 {
52 let (input, value) = parse_string(input, cattr, fattr)?;
53
54 Ok((input, value))
55 }
56}
57
58
59impl<'de> BorrowByteDecode<'de> for String {
60 fn decode<'da: 'de>(input: &'da [u8], cattr: Option<&ContainerAttrModifiers>, fattr: Option<&FieldAttrModifiers>) -> JResult<&'da [u8], Self>
61 where
62 Self: Sized
63 {
64 let (input, value) = parse_string(input, cattr, fattr)?;
65
66 Ok((input, value))
67 }
68}
69
70
71impl<'de> BorrowByteDecode<'de> for &'de str {
72 #[inline]
73 fn decode<'da: 'de, 'db>(input: &'da [u8], cattr: Option<&'db ContainerAttrModifiers>, fattr: Option<&'db FieldAttrModifiers>) -> JResult<&'da [u8], Self>
74 where
75 Self: Sized
76 {
77 let (input, value) = if let Ok((input, value)) = parse_bytes(input, cattr, fattr) {
78 (input, value)
79 }
80 else {
81 let (input, length) = input.to_be_bits_usize(1)?;
82 let (input, value) = input.input_take(length)?;
83 (input, value)
84 };
85
86 match str::from_utf8(value) {
87 Ok(v) => return Ok((input, v)),
88 Err(_e) => return Err(make_error(input, ErrorKind::Fail { offset: input.len() })),
89 }
90 }
91}