use std::{
borrow::{Borrow, Cow},
fmt::Debug,
iter::FromIterator,
};
use serde::{Deserialize, Serialize};
use crate::{RawArray, RawBsonRef, RawDocumentBuf};
use super::{bson::RawBson, serde::OwnedOrBorrowedRawArray, RawArrayIter};
#[derive(Clone, PartialEq)]
pub struct RawArrayBuf {
inner: RawDocumentBuf,
len: usize,
}
impl RawArrayBuf {
pub fn new() -> RawArrayBuf {
Self {
inner: RawDocumentBuf::new(),
len: 0,
}
}
pub(crate) fn from_raw_document_buf(doc: RawDocumentBuf) -> Self {
let len = doc.iter().count();
Self { inner: doc, len }
}
pub fn push(&mut self, value: impl Into<RawBson>) {
self.inner.append(self.len.to_string(), value);
self.len += 1;
}
pub(crate) fn into_vec(self) -> Vec<u8> {
self.inner.into_bytes()
}
}
impl Debug for RawArrayBuf {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RawArrayBuf")
.field("data", &hex::encode(self.as_bytes()))
.field("len", &self.len)
.finish()
}
}
impl std::ops::Deref for RawArrayBuf {
type Target = RawArray;
fn deref(&self) -> &Self::Target {
RawArray::from_doc(&self.inner)
}
}
impl AsRef<RawArray> for RawArrayBuf {
fn as_ref(&self) -> &RawArray {
RawArray::from_doc(&self.inner)
}
}
impl Borrow<RawArray> for RawArrayBuf {
fn borrow(&self) -> &RawArray {
self.as_ref()
}
}
impl<'a> IntoIterator for &'a RawArrayBuf {
type IntoIter = RawArrayIter<'a>;
type Item = super::Result<RawBsonRef<'a>>;
fn into_iter(self) -> RawArrayIter<'a> {
self.as_ref().into_iter()
}
}
impl<'a> From<RawArrayBuf> for Cow<'a, RawArray> {
fn from(rd: RawArrayBuf) -> Self {
Cow::Owned(rd)
}
}
impl<'a> From<&'a RawArrayBuf> for Cow<'a, RawArray> {
fn from(rd: &'a RawArrayBuf) -> Self {
Cow::Borrowed(rd.as_ref())
}
}
impl<T: Into<RawBson>> FromIterator<T> for RawArrayBuf {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let mut array_buf = RawArrayBuf::new();
for item in iter {
array_buf.push(item);
}
array_buf
}
}
impl<'de> Deserialize<'de> for RawArrayBuf {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(OwnedOrBorrowedRawArray::deserialize(deserializer)?.into_owned())
}
}
impl Serialize for RawArrayBuf {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.as_ref().serialize(serializer)
}
}
impl Default for RawArrayBuf {
fn default() -> Self {
Self::new()
}
}