mod.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #![allow(unused)]
  2. use std::sync::atomic::AtomicUsize;
  3. use serde::{de::DeserializeOwned, Serialize};
  4. pub(crate) mod deserialize;
  5. pub(crate) mod serialize;
  6. #[derive(serde::Serialize, serde::Deserialize, Default)]
  7. pub(crate) struct HTMLData {
  8. pub data: Vec<Vec<u8>>,
  9. }
  10. impl HTMLData {
  11. pub(crate) fn push<T: Serialize>(&mut self, value: &T) {
  12. let serialized = postcard::to_allocvec(value).unwrap();
  13. self.data.push(serialized);
  14. }
  15. pub(crate) fn cursor(self) -> HTMLDataCursor {
  16. HTMLDataCursor {
  17. data: self.data,
  18. index: AtomicUsize::new(0),
  19. }
  20. }
  21. }
  22. pub(crate) struct HTMLDataCursor {
  23. data: Vec<Vec<u8>>,
  24. index: AtomicUsize,
  25. }
  26. impl HTMLDataCursor {
  27. pub fn take<T: DeserializeOwned>(&self) -> Option<T> {
  28. let current = self.index.load(std::sync::atomic::Ordering::SeqCst);
  29. if current >= self.data.len() {
  30. tracing::error!(
  31. "Tried to take more data than was available, len: {}, index: {}",
  32. self.data.len(),
  33. current
  34. );
  35. return None;
  36. }
  37. let mut cursor = &self.data[current];
  38. self.index.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
  39. match postcard::from_bytes(cursor) {
  40. Ok(x) => Some(x),
  41. Err(e) => {
  42. tracing::error!("Error deserializing data: {:?}", e);
  43. None
  44. }
  45. }
  46. }
  47. }
  48. #[test]
  49. fn serialized_and_deserializes() {
  50. use postcard::to_allocvec;
  51. #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)]
  52. struct Data {
  53. a: u32,
  54. b: String,
  55. bytes: Vec<u8>,
  56. nested: Nested,
  57. }
  58. #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)]
  59. struct Nested {
  60. a: u32,
  61. b: u16,
  62. c: u8,
  63. }
  64. for x in 0..10usize {
  65. for y in 0..10 {
  66. let mut as_string: Vec<u8> = Vec::new();
  67. let data = vec![
  68. Data {
  69. a: x as u32,
  70. b: "hello".to_string(),
  71. bytes: vec![0; x],
  72. nested: Nested {
  73. a: 1,
  74. b: x as u16,
  75. c: 3
  76. },
  77. };
  78. y
  79. ];
  80. serialize::serde_to_writable(&data, &mut as_string).unwrap();
  81. println!("{:?}", as_string);
  82. println!(
  83. "original size: {}",
  84. std::mem::size_of::<Data>() * data.len()
  85. );
  86. println!("serialized size: {}", to_allocvec(&data).unwrap().len());
  87. println!("compressed size: {}", as_string.len());
  88. let decoded: Vec<Data> = deserialize::serde_from_bytes(&as_string).unwrap();
  89. assert_eq!(data, decoded);
  90. }
  91. }
  92. }