mod.rs 3.0 KB

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