jppe/decode/
impls_string.rs

1use 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// use crate::parse_subsequence;
7
8
9#[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 if let Ok((input, value)) = parse_subsequence(input, b"\n", false) {
19    //     input_tmp = input;
20    //     value_tmp = Some(value);
21    // }
22    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        // let value = value.trim_ascii_end().to_vec().extract_if(|v| *v != 0).collect::<Vec<_>>();
31        // std::str::from_utf8(value).unwrap().to_string()
32        // match String::from_utf8(value) {
33        //     Ok(v) => return Ok((input_tmp, v)),
34        //     Err(_e) => return Err(make_error(input_tmp, ErrorKind::Fail { offset: input_tmp.len() })),
35        // }
36
37        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}