use super::{ChangeSet, IChangeSet};
use crate::cache::VirtualResponse;
use std::fmt;
use std::ops::Deref;
pub trait IVirtualChangeSet<T>: IChangeSet<T> {
fn response(&self) -> &VirtualResponse;
}
pub struct VirtualChangeSet<T> {
changes: ChangeSet<T>,
response: VirtualResponse,
}
impl<T> Clone for VirtualChangeSet<T> {
fn clone(&self) -> Self {
Self { changes: self.changes.clone(), response: self.response }
}
}
impl<T> VirtualChangeSet<T> {
pub fn new(changes: ChangeSet<T>, response: VirtualResponse) -> Self {
Self { changes, response }
}
pub fn response(&self) -> &VirtualResponse {
&self.response
}
pub fn changes(&self) -> &ChangeSet<T> {
&self.changes
}
}
impl<T> Deref for VirtualChangeSet<T> {
type Target = ChangeSet<T>;
fn deref(&self) -> &Self::Target {
&self.changes
}
}
impl<'a, T> IntoIterator for &'a VirtualChangeSet<T> {
type Item = &'a super::Change<T>;
type IntoIter = std::slice::Iter<'a, super::Change<T>>;
fn into_iter(self) -> Self::IntoIter {
self.changes.changes().iter()
}
}
impl<T: 'static> IChangeSet<T> for VirtualChangeSet<T> {
fn change_set(&self) -> &ChangeSet<T> {
&self.changes
}
}
impl<T: 'static> IVirtualChangeSet<T> for VirtualChangeSet<T> {
fn response(&self) -> &VirtualResponse {
&self.response
}
}
impl<T: PartialEq> PartialEq for VirtualChangeSet<T> {
fn eq(&self, other: &Self) -> bool {
self.changes == other.changes && self.response == other.response
}
}
impl<T: fmt::Debug> fmt::Debug for VirtualChangeSet<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("VirtualChangeSet").field("changes", &self.changes).field("response", &self.response).finish()
}
}