#![allow(clippy::missing_safety_doc)]
-use std::collections::TryReserveError;
use std::ffi::CStr;
use std::os::raw::c_char;
use std::str::Utf8Error;
pub enum JsonError {
InvalidState,
Utf8Error(Utf8Error),
- Memory,
}
impl std::error::Error for JsonError {}
match self {
JsonError::InvalidState => write!(f, "invalid state"),
JsonError::Utf8Error(ref e) => e.fmt(f),
- JsonError::Memory => write!(f, "memory error"),
}
}
}
-impl From<TryReserveError> for JsonError {
- fn from(_: TryReserveError) -> Self {
- JsonError::Memory
- }
-}
-
impl From<Utf8Error> for JsonError {
fn from(e: Utf8Error) -> Self {
JsonError::Utf8Error(e)
};
match std::str::from_utf8(val) {
Ok(s) => self.set_string(key, s),
- Err(_) => self.set_string(key, &try_string_from_bytes(val)?),
+ Err(_) => self.set_string(key, &string_from_bytes(val)),
}
}
return out;
}
-/// A Suricata specific function to create a string from bytes when UTF-8 decoding fails.
-///
-/// For bytes over 0x0f, we encode as hex like "\xf2".
-fn try_string_from_bytes(input: &[u8]) -> Result<String, JsonError> {
- let mut out = String::new();
-
- // Allocate enough data to handle the worst case scenario of every
- // byte needing to be presented as a byte.
- out.try_reserve(input.len() * 4)?;
-
- for b in input.iter() {
- if *b < 128 {
- out.push(*b as char);
- } else {
- out.push_str(&format!("\\x{:02x}", *b));
- }
- }
- return Ok(out);
-}
-
#[no_mangle]
pub extern "C" fn jb_new_object() -> *mut JsonBuilder {
let boxed = Box::new(JsonBuilder::new_object());