From: Jason Ish Date: Fri, 10 Jul 2020 19:46:41 +0000 (-0600) Subject: jsonbuilder: set_float, append_float methods X-Git-Tag: suricata-6.0.0-beta1~201 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03efbccfe6ec40efa9870775dc6c2644a0c19f67;p=thirdparty%2Fsuricata.git jsonbuilder: set_float, append_float methods New methods for setting and appending float values. --- diff --git a/rust/src/jsonbuilder.rs b/rust/src/jsonbuilder.rs index 75cce54f32..15ac0ff0b3 100644 --- a/rust/src/jsonbuilder.rs +++ b/rust/src/jsonbuilder.rs @@ -330,6 +330,23 @@ impl JsonBuilder { Ok(self) } + pub fn append_float(&mut self, val: f64) -> Result<&mut Self, JsonError> { + match self.current_state() { + State::ArrayFirst => { + self.set_state(State::ArrayNth); + } + State::ArrayNth => { + self.buf.push(','); + } + _ => { + debug_validate_fail!("invalid state"); + return Err(JsonError::InvalidState); + } + } + self.buf.push_str(&val.to_string()); + Ok(self) + } + pub fn set_object(&mut self, key: &str, js: &JsonBuilder) -> Result<&mut Self, JsonError> { match self.current_state() { State::ObjectNth => { @@ -467,6 +484,26 @@ impl JsonBuilder { Ok(self) } + pub fn set_float(&mut self, key: &str, val: f64) -> Result<&mut Self, JsonError> { + match self.current_state() { + State::ObjectNth => { + self.buf.push(','); + } + State::ObjectFirst => { + self.set_state(State::ObjectNth); + } + _ => { + debug_validate_fail!("invalid state"); + return Err(JsonError::InvalidState); + } + } + self.buf.push('"'); + self.buf.push_str(key); + self.buf.push_str("\":"); + self.buf.push_str(&val.to_string()); + Ok(self) + } + pub fn set_bool(&mut self, key: &str, val: bool) -> Result<&mut Self, JsonError> { match self.current_state() { State::ObjectNth => { @@ -714,6 +751,11 @@ pub unsafe extern "C" fn jb_append_uint(js: &mut JsonBuilder, val: u64) -> bool return js.append_uint(val).is_ok(); } +#[no_mangle] +pub unsafe extern "C" fn jb_append_float(js: &mut JsonBuilder, val: f64) -> bool { + return js.append_float(val).is_ok(); +} + #[no_mangle] pub unsafe extern "C" fn jb_set_uint(js: &mut JsonBuilder, key: *const c_char, val: u64) -> bool { if let Ok(key) = CStr::from_ptr(key).to_str() { @@ -722,6 +764,14 @@ pub unsafe extern "C" fn jb_set_uint(js: &mut JsonBuilder, key: *const c_char, v return false; } +#[no_mangle] +pub unsafe extern "C" fn jb_set_float(js: &mut JsonBuilder, key: *const c_char, val: f64) -> bool { + if let Ok(key) = CStr::from_ptr(key).to_str() { + return js.set_float(key, val).is_ok(); + } + return false; +} + #[no_mangle] pub unsafe extern "C" fn jb_set_bool(js: &mut JsonBuilder, key: *const c_char, val: bool) -> bool { if let Ok(key) = CStr::from_ptr(key).to_str() { @@ -1030,6 +1080,24 @@ mod test { jb.close().unwrap(); assert_eq!(jb.buf, r#"{"foo":"bar","bar":"foo"}"#); } + + #[test] + fn test_set_float() { + let mut jb = JsonBuilder::new_object(); + jb.set_float("one", 1.1).unwrap(); + jb.set_float("two", 2.2).unwrap(); + jb.close().unwrap(); + assert_eq!(jb.buf, r#"{"one":1.1,"two":2.2}"#); + } + + #[test] + fn test_append_float() { + let mut jb = JsonBuilder::new_array(); + jb.append_float(1.1).unwrap(); + jb.append_float(2.2).unwrap(); + jb.close().unwrap(); + assert_eq!(jb.buf, r#"[1.1,2.2]"#); + } } // Escape table as seen in serde-json (MIT/Apache license)