#![doc(html_root_url = "https://docs.rs/rustygpb/")]
#![deny(
unused,
missing_debug_implementations,
unsafe_op_in_unsafe_fn,
rustdoc::broken_intra_doc_links,
missing_docs,
unconditional_recursion,
unstable_name_collisions,
clippy::useless_conversion,
clippy::missing_panics_doc,
clippy::mixed_case_hex_literals,
clippy::needless_bool,
clippy::needless_lifetimes
)]
#![allow(
clippy::uninlined_format_args,
clippy::should_implement_trait,
clippy::match_like_matches_macro,
clippy::too_many_arguments,
clippy::for_kv_map,
clippy::identity_op,
clippy::io_other_error,
clippy::manual_div_ceil,
clippy::needless_borrow
)]
#![cfg_attr(docsrs, feature(doc_cfg))]
mod buffer;
mod decoder;
mod encoder;
mod error;
mod message;
pub use buffer::{GpbBuffer, GpbReader, GpbWriter};
pub use decoder::{DecodeConfig, GpbDecoder};
pub use encoder::{EncodeConfig, GpbEncoder};
pub use error::{DecodeError, EncodeError, GpbError};
pub use message::{FieldValue, FixMessage, MessageType};
pub use prost::Message;
pub use prost_types::Timestamp;
pub mod prelude {
pub use crate::{
DecodeError, EncodeError, FieldValue, FixMessage, GpbDecoder, GpbEncoder, GpbError,
Message, MessageType,
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_functionality() -> Result<(), Box<dyn std::error::Error>> {
let mut encoder = GpbEncoder::new();
let decoder = GpbDecoder::new();
let message = FixMessage::new_order_single("BTCUSD".into(), 1000.0, 100.0, "BUY".into());
let encoded = encoder.encode(&message).map_err(|e| {
Box::<dyn std::error::Error>::from(format!("Encoding should work but failed: {e}"))
})?;
let decoded = decoder.decode(&encoded).map_err(|e| {
Box::<dyn std::error::Error>::from(format!("Decoding should work but failed: {e}"))
})?;
assert_eq!(message, decoded);
Ok(())
}
}