diff --git a/Cargo.toml b/Cargo.toml index 9c110f6..ea79a1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,12 +9,10 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" humantime-serde = "1.1" chrono = { version = "0.4.26", features = ["serde"] } -bytes = "1.8" +bytes = "1.10" byteorder = "1.4" hex = "0.4.3" nom = "7.1.3" +autoerr = "0.0.3" daqbuf-err = { path = "../daqbuf-err" } netpod = { path = "../daqbuf-netpod", package = "daqbuf-netpod" } - -[patch.crates-io] -thiserror = { git = "https://github.com/dominikwerder/thiserror.git", branch = "cstm" } diff --git a/src/api1_parse.rs b/src/api1_parse.rs index 99fcfa2..d6c714d 100644 --- a/src/api1_parse.rs +++ b/src/api1_parse.rs @@ -1,6 +1,5 @@ use crate::channelconfig::CompressionMethod; use crate::nom; -use daqbuf_err as err; use netpod::log::*; use netpod::ScalarType; use netpod::Shape; @@ -132,7 +131,11 @@ pub struct Api1ChannelHeader { byte_order: Api1ByteOrder, #[serde(default)] shape: Vec, - #[serde(default, skip_serializing_if = "Option::is_none", with = "serde_compression_method")] + #[serde( + default, + skip_serializing_if = "Option::is_none", + with = "serde_compression_method" + )] compression: Option, } @@ -201,7 +204,10 @@ mod serde_compression_method { match v { 0 => Ok(None), 1 => Ok(Some(CompressionMethod::BitshuffleLZ4)), - _ => Err(de::Error::unknown_variant("compression variant index", &["0"])), + _ => Err(de::Error::unknown_variant( + "compression variant index", + &["0"], + )), } } } @@ -264,7 +270,12 @@ fn basic_header_ser_01() { }; let js = serde_json::to_string(&h).unwrap(); let vals = serde_json::from_str::(&js).unwrap(); - let x = vals.as_object().unwrap().get("compression").unwrap().as_i64(); + let x = vals + .as_object() + .unwrap() + .get("compression") + .unwrap() + .as_i64(); assert_eq!(x, Some(1)) } @@ -284,14 +295,16 @@ fn basic_header_deser_01() { #[test] fn basic_header_deser_02() { - let js = r#"{ "name": "ch1", "type": "float64", "byteOrder": "LITTLE_ENDIAN", "compression": 0 }"#; + let js = + r#"{ "name": "ch1", "type": "float64", "byteOrder": "LITTLE_ENDIAN", "compression": 0 }"#; let h: Api1ChannelHeader = serde_json::from_str(js).unwrap(); assert!(h.compression.is_none()); } #[test] fn basic_header_deser_03() { - let js = r#"{ "name": "ch1", "type": "float64", "byteOrder": "LITTLE_ENDIAN", "compression": 1 }"#; + let js = + r#"{ "name": "ch1", "type": "float64", "byteOrder": "LITTLE_ENDIAN", "compression": 1 }"#; let h: Api1ChannelHeader = serde_json::from_str(js).unwrap(); assert!(h.compression.is_some()); assert_eq!(h.compression, Some(CompressionMethod::BitshuffleLZ4)); @@ -299,7 +312,8 @@ fn basic_header_deser_03() { #[test] fn basic_header_deser_04() { - let js = r#"{ "name": "ch1", "type": "float64", "byteOrder": "LITTLE_ENDIAN", "compression": 2 }"#; + let js = + r#"{ "name": "ch1", "type": "float64", "byteOrder": "LITTLE_ENDIAN", "compression": 2 }"#; let res = serde_json::from_str::(js); assert!(res.is_err()); } @@ -354,7 +368,7 @@ pub enum Api1Frame { Data(Data), } -fn fail_on_input<'a, T, E>(inp: &'a [u8]) -> Nres +fn fail_on_input<'a, T, E>(inp: &'a [u8]) -> Nres<'a, T, E> where E: ParseError<&'a [u8]>, { @@ -362,7 +376,7 @@ where IResult::Err(Err::Failure(e)) } -fn header<'a, E>(inp: &'a [u8]) -> Nres +fn header<'a, E>(inp: &'a [u8]) -> Nres<'a, Header, E> where E: ParseError<&'a [u8]> + ContextError<&'a [u8]>, { @@ -380,12 +394,14 @@ where } } -fn data<'a, E>(inp: &'a [u8]) -> Nres +fn data<'a, E>(inp: &'a [u8]) -> Nres<'a, Data, E> where E: ParseError<&'a [u8]>, { if inp.len() < 16 { - IResult::Err(Err::Incomplete(Needed::Size(NonZeroUsize::new(16).unwrap()))) + IResult::Err(Err::Incomplete(Needed::Size( + NonZeroUsize::new(16).unwrap(), + ))) } else { let (inp, ts) = be_u64(inp)?; let (inp, pulse) = be_u64(inp)?; @@ -396,7 +412,7 @@ where } } -fn api1_frame_complete<'a, E>(inp: &'a [u8]) -> Nres +fn api1_frame_complete<'a, E>(inp: &'a [u8]) -> Nres<'a, Api1Frame, E> where E: ParseError<&'a [u8]> + ContextError<&'a [u8]>, { @@ -423,14 +439,17 @@ where } } -fn api1_frame<'a, E>(inp: &'a [u8]) -> Nres +fn api1_frame<'a, E>(inp: &'a [u8]) -> Nres<'a, Api1Frame, E> where E: ParseError<&'a [u8]> + ContextError<&'a [u8]>, { let inp_orig = inp; let (inp, len) = be_u32(inp)?; if len < 1 { - IResult::Err(Err::Failure(ParseError::from_error_kind(inp, ErrorKind::Fail))) + IResult::Err(Err::Failure(ParseError::from_error_kind( + inp, + ErrorKind::Fail, + ))) } else { if inp.len() < len as usize + 4 { let e = Err::Incomplete(Needed::Size(NonZeroUsize::new(len as _).unwrap())); @@ -439,7 +458,10 @@ where let (inp, payload) = nom::bytes::complete::take(len)(inp)?; let (inp, len2) = be_u32(inp)?; if len != len2 { - IResult::Err(Err::Failure(ParseError::from_error_kind(inp_orig, ErrorKind::Fail))) + IResult::Err(Err::Failure(ParseError::from_error_kind( + inp_orig, + ErrorKind::Fail, + ))) } else { let (left, res) = api1_frame_complete(payload)?; if left.len() != 0 { @@ -452,7 +474,7 @@ where } } -pub fn api1_frames<'a, E>(inp: &'a [u8]) -> Nres, E> +pub fn api1_frames<'a, E>(inp: &'a [u8]) -> Nres<'a, Vec, E> where E: ParseError<&'a [u8]> + ContextError<&'a [u8]>, { diff --git a/src/channelconfig.rs b/src/channelconfig.rs index 2ac31b1..3b346a6 100644 --- a/src/channelconfig.rs +++ b/src/channelconfig.rs @@ -2,13 +2,10 @@ use daqbuf_err as err; use err::*; use netpod::log::*; use netpod::range::evrange::NanoRange; -use netpod::timeunits::DAY; use netpod::timeunits::MS; use netpod::ByteOrder; use netpod::DtNano; -use netpod::NodeConfigCached; use netpod::ScalarType; -use netpod::SfDbChannel; use netpod::Shape; use netpod::TsNano; use nom::bytes::complete::take; @@ -21,21 +18,20 @@ use nom::Needed; use serde::Deserialize; use serde::Serialize; use std::fmt; -use std::path::PathBuf; use std::time::Duration; use std::time::SystemTime; -#[derive(Debug, ThisError)] -#[cstm(name = "ConfigParse")] -pub enum ConfigParseError { - NotSupportedOnNode, - FileNotFound, - #[error("PermissionDenied({0:?})")] - PermissionDenied(PathBuf), - IO, - ParseError(String), - NotSupported, -} +autoerr::create_error_v1!( + name(ConfigParseError, "ConfigParse"), + enum variants { + NotSupportedOnNode, + FileNotFound, + PermissionDenied(String), + IO, + ParseError(String), + NotSupported, + }, +); impl From> for ConfigParseError { fn from(k: nom::Err) -> Self { @@ -239,24 +235,24 @@ pub fn parse_entry(inp: &[u8]) -> NRes> { pulse, ks, bs, - split_count: split_count, + split_count, status, bb, modulo, offset, precision, scalar_type, - is_compressed: is_compressed, - is_array: is_array, - is_shaped: is_shaped, + is_compressed, + is_array, + is_shaped, byte_order, - compression_method: compression_method, + compression_method, shape, - source_name: source_name, + source_name, unit, description, - optional_fields: optional_fields, - value_converter: value_converter, + optional_fields, + value_converter, }), )) }